Changeset 506 for trunk/Packages/DpiControls
- Timestamp:
- Dec 25, 2023, 11:35:51 AM (11 months ago)
- Location:
- trunk/Packages/DpiControls
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Packages/DpiControls/Dpi.Graphics.pas
r487 r506 706 706 SrcPtr.SetXY(Min(ScaleFromNative(xx), Src.Width - 1), 707 707 Min(ScaleFromNative(yy), Src.Height - 1)); 708 DstPtr.Pixel ^.B := SrcPtr.Pixel^.B;709 DstPtr.Pixel ^.G := SrcPtr.Pixel^.G;710 DstPtr.Pixel ^.R := SrcPtr.Pixel^.R;708 DstPtr.PixelB := SrcPtr.PixelB; 709 DstPtr.PixelG := SrcPtr.PixelG; 710 DstPtr.PixelR := SrcPtr.PixelR; 711 711 DstPtr.NextPixel; 712 712 end; … … 720 720 DstWidth := ScaleToNative(SrcX + 1) - ScaleToNative(SrcX); 721 721 for DstX := 0 to DstWidth - 1 do begin 722 DstPtr.Pixel ^.B := SrcPtr.Pixel^.B;723 DstPtr.Pixel ^.G := SrcPtr.Pixel^.G;724 DstPtr.Pixel ^.R := SrcPtr.Pixel^.R;722 DstPtr.PixelB := SrcPtr.PixelB; 723 DstPtr.PixelG := SrcPtr.PixelG; 724 DstPtr.PixelR := SrcPtr.PixelR; 725 725 DstPtr.NextPixel; 726 726 end; -
trunk/Packages/DpiControls/Dpi.PixelPointer.pas
r501 r506 9 9 TColor32 = type Cardinal; 10 10 TColor32Component = (ccBlue, ccGreen, ccRed, ccAlpha); 11 TColor32Planes = array[0..3] of Byte; 11 12 12 13 { TPixel32 } … … 14 15 TPixel32 = packed record 15 16 private 16 procedure SetRGB(AValue: Cardinal); 17 function GetRGB: Cardinal; 17 procedure SetRGB(AValue: Cardinal); inline; 18 function GetRGB: Cardinal; inline; 18 19 public 19 20 property RGB: Cardinal read GetRGB write SetRGB; … … 21 22 0: (B, G, R, A: Byte); 22 23 1: (ARGB: TColor32); 23 2: (Planes: array[0..3] of Byte);24 2: (Planes: TColor32Planes); 24 25 3: (Components: array[TColor32Component] of Byte); 25 26 end; … … 29 30 30 31 TPixelPointer = record 32 private 33 function GetPixelARGB: TColor32; inline; 34 function GetPixelB: Byte; inline; 35 function GetPixelG: Byte; inline; 36 function GetPixelPlane(Index: Byte): Byte; 37 function GetPixelR: Byte; inline; 38 function GetPixelA: Byte; inline; 39 function GetPixelPlanes: TColor32Planes; 40 function GetPixelRGB: Cardinal; 41 procedure SetPixelARGB(Value: TColor32); inline; 42 procedure SetPixelB(Value: Byte); inline; 43 procedure SetPixelG(Value: Byte); inline; 44 procedure SetPixelPlane(Index: Byte; AValue: Byte); 45 procedure SetPixelR(Value: Byte); inline; 46 procedure SetPixelA(Value: Byte); inline; 47 procedure SetPixelRGB(Value: Cardinal); 48 public 31 49 Base: PPixel32; 32 50 Pixel: PPixel32; … … 46 64 procedure CheckRange; inline; // Check if current pixel position is not out of range 47 65 class function Create(Bitmap: TRasterImage; BaseX: Integer = 0; BaseY: Integer = 0): TPixelPointer; static; 66 property PixelARGB: TColor32 read GetPixelARGB write SetPixelARGB; 67 property PixelRGB: Cardinal read GetPixelRGB write SetPixelRGB; 68 property PixelB: Byte read GetPixelB write SetPixelB; 69 property PixelG: Byte read GetPixelG write SetPixelG; 70 property PixelR: Byte read GetPixelR write SetPixelR; 71 property PixelA: Byte read GetPixelA write SetPixelA; 72 property PixelPlane[Index: Byte]: Byte read GetPixelPlane write SetPixelPlane; 48 73 end; 49 74 PPixelPointer = ^TPixelPointer; … … 91 116 Line := Pointer(Line) + BytesPerLine; 92 117 Pixel := Line; 93 CheckRange;94 118 end; 95 119 … … 98 122 Line := Pointer(Line) - BytesPerLine; 99 123 Pixel := Line; 100 CheckRange;101 124 end; 102 125 … … 104 127 begin 105 128 Pixel := Pointer(Pixel) + BytesPerPixel; 106 CheckRange;107 129 end; 108 130 … … 110 132 begin 111 133 Pixel := Pointer(Pixel) - BytesPerPixel; 112 CheckRange;113 134 end; 114 135 … … 122 143 begin 123 144 Pixel := Pointer(Line) + X * BytesPerPixel; 124 CheckRange;125 145 end; 126 146 127 147 procedure TPixelPointer.CheckRange; 148 {$IFOPT R+} 128 149 var 129 150 X: Integer; 130 151 Y: Integer; 152 {$ENDIF} 131 153 begin 132 154 {$IFOPT R+} 133 155 if (PByte(Pixel) < PByte(Data)) or 134 (PByte(Pixel) >= PByte(Data) + Height * BytesPerLine + BytesPerLine) then begin156 (PByte(Pixel) >= PByte(Data) + Height * BytesPerLine) then begin 135 157 X := PByte(Pixel) - PByte(Data); 136 158 Y := Floor(X / BytesPerLine); … … 140 162 end; 141 163 {$ENDIF} 164 end; 165 166 function TPixelPointer.GetPixelPlanes: TColor32Planes; 167 begin 168 CheckRange; 169 Result := Pixel^.Planes; 170 end; 171 172 function TPixelPointer.GetPixelRGB: Cardinal; 173 begin 174 CheckRange; 175 Result := Pixel^.RGB; 176 end; 177 178 procedure TPixelPointer.SetPixelARGB(Value: TColor32); 179 begin 180 CheckRange; 181 Pixel^.ARGB := Value; 182 end; 183 184 procedure TPixelPointer.SetPixelB(Value: Byte); 185 begin 186 CheckRange; 187 Pixel^.B := Value; 188 end; 189 190 procedure TPixelPointer.SetPixelG(Value: Byte); 191 begin 192 CheckRange; 193 Pixel^.G := Value; 194 end; 195 196 procedure TPixelPointer.SetPixelPlane(Index: Byte; AValue: Byte); 197 begin 198 CheckRange; 199 Pixel^.Planes[Index] := AValue; 200 end; 201 202 procedure TPixelPointer.SetPixelR(Value: Byte); 203 begin 204 CheckRange; 205 Pixel^.R := Value; 206 end; 207 208 procedure TPixelPointer.SetPixelA(Value: Byte); 209 begin 210 CheckRange; 211 Pixel^.A := Value; 212 end; 213 214 function TPixelPointer.GetPixelARGB: TColor32; 215 begin 216 CheckRange; 217 Result := Pixel^.ARGB; 218 end; 219 220 function TPixelPointer.GetPixelB: Byte; 221 begin 222 CheckRange; 223 Result := Pixel^.B; 224 end; 225 226 function TPixelPointer.GetPixelG: Byte; 227 begin 228 CheckRange; 229 Result := Pixel^.G; 230 end; 231 232 function TPixelPointer.GetPixelPlane(Index: Byte): Byte; 233 begin 234 CheckRange; 235 Result := Pixel^.Planes[Index]; 236 end; 237 238 function TPixelPointer.GetPixelR: Byte; 239 begin 240 CheckRange; 241 Result := Pixel^.R; 242 end; 243 244 function TPixelPointer.GetPixelA: Byte; 245 begin 246 CheckRange; 247 Result := Pixel^.A; 248 end; 249 250 procedure TPixelPointer.SetPixelRGB(Value: Cardinal); 251 begin 252 CheckRange; 253 Pixel^.RGB := Value; 142 254 end; 143 255 … … 154 266 for Y := 0 to DstRect.Height - 1 do begin 155 267 for X := 0 to DstRect.Width - 1 do begin 156 DstPtr.Pixel ^.ARGB := SrcPtr.Pixel^.ARGB;268 DstPtr.PixelARGB := SrcPtr.PixelARGB; 157 269 SrcPtr.NextPixel; 158 270 DstPtr.NextPixel; … … 190 302 DstPtr.SetXY(X, Y); 191 303 SrcPtr.SetXY(R.Left, R.Top); 192 C := SrcPtr.Pixel ^.ARGB;193 DstPtr.Pixel ^.ARGB := C;304 C := SrcPtr.PixelARGB; 305 DstPtr.PixelARGB := C; 194 306 for YY := 0 to R.Height - 1 do begin 195 307 for XX := 0 to R.Width - 1 do begin 196 DstPtr.Pixel ^.ARGB := C;308 DstPtr.PixelARGB := C; 197 309 DstPtr.NextPixel; 198 310 end; … … 214 326 for Y := 0 to Bitmap.Height - 1 do begin 215 327 for X := 0 to Bitmap.Width - 1 do begin 216 Ptr.Pixel ^.ARGB := Color;328 Ptr.PixelARGB := Color; 217 329 Ptr.NextPixel; 218 330 end; … … 231 343 for Y := 0 to Rect.Height - 1 do begin 232 344 for X := 0 to Rect.Width - 1 do begin 233 Ptr.Pixel ^.ARGB := Color;345 Ptr.PixelARGB := Color; 234 346 Ptr.NextPixel; 235 347 end; … … 248 360 for Y := 0 to Bitmap.Height - 1 do begin 249 361 for X := 0 to Bitmap.Width - 1 do begin 250 Ptr.Pixel ^.ARGB := SwapRedBlue(Ptr.Pixel^.ARGB);362 Ptr.PixelARGB := SwapRedBlue(Ptr.PixelARGB); 251 363 Ptr.NextPixel; 252 364 end; … … 265 377 for Y := 0 to Bitmap.Height - 1 do begin 266 378 for X := 0 to Bitmap.Width - 1 do begin 267 Ptr.Pixel ^.ARGB := Ptr.Pixel^.ARGB xor $ffffff;379 Ptr.PixelARGB := Ptr.PixelARGB xor $ffffff; 268 380 Ptr.NextPixel; 269 381 end; … … 285 397 for Y := 0 to Bitmap.Height - 1 do begin 286 398 for X := 0 to Bitmap.Width - 1 do begin 287 A := Ptr.Pixel ^.A; //(Ptr.Pixel^.A + Pixel.A) shr 1;288 R := (Ptr.Pixel ^.R + Pixel.R) shr 1;289 G := (Ptr.Pixel ^.G + Pixel.G) shr 1;290 B := (Ptr.Pixel ^.B + Pixel.B) shr 1;291 Ptr.Pixel ^.ARGB := Color32(A, R, G, B);399 A := Ptr.PixelA; //(Ptr.PixelA + Pixel.A) shr 1; 400 R := (Ptr.PixelR + Pixel.R) shr 1; 401 G := (Ptr.PixelG + Pixel.G) shr 1; 402 B := (Ptr.PixelB + Pixel.B) shr 1; 403 Ptr.PixelARGB := Color32(A, R, G, B); 292 404 Ptr.NextPixel; 293 405 end; -
trunk/Packages/DpiControls/NativePixelPointer.pas
r487 r506 4 4 5 5 uses 6 Classes, SysUtils, Graphics;6 Math, Classes, SysUtils, Graphics; 7 7 8 8 type 9 9 TColor32 = type Cardinal; 10 10 TColor32Component = (ccBlue, ccGreen, ccRed, ccAlpha); 11 TColor32Planes = array[0..3] of Byte; 11 12 12 13 { TPixel32 } 13 14 14 15 TPixel32 = packed record 15 procedure SetRGB(Color: TColor32); 16 function GetRGB: TColor32; 16 private 17 procedure SetRGB(AValue: Cardinal); inline; 18 function GetRGB: Cardinal; inline; 19 public 20 property RGB: Cardinal read GetRGB write SetRGB; 17 21 case Integer of 18 22 0: (B, G, R, A: Byte); 19 23 1: (ARGB: TColor32); 20 2: (Planes: array[0..3] of Byte);24 2: (Planes: TColor32Planes); 21 25 3: (Components: array[TColor32Component] of Byte); 22 26 end; … … 26 30 27 31 TPixelPointer = record 32 private 33 function GetPixelARGB: TColor32; inline; 34 function GetPixelB: Byte; inline; 35 function GetPixelG: Byte; inline; 36 function GetPixelPlane(Index: Byte): Byte; 37 function GetPixelR: Byte; inline; 38 function GetPixelA: Byte; inline; 39 function GetPixelPlanes: TColor32Planes; 40 function GetPixelRGB: Cardinal; 41 procedure SetPixelARGB(Value: TColor32); inline; 42 procedure SetPixelB(Value: Byte); inline; 43 procedure SetPixelG(Value: Byte); inline; 44 procedure SetPixelPlane(Index: Byte; AValue: Byte); 45 procedure SetPixelR(Value: Byte); inline; 46 procedure SetPixelA(Value: Byte); inline; 47 procedure SetPixelRGB(Value: Cardinal); 48 public 28 49 Base: PPixel32; 29 50 Pixel: PPixel32; … … 43 64 procedure CheckRange; inline; // Check if current pixel position is not out of range 44 65 class function Create(Bitmap: TRasterImage; BaseX: Integer = 0; BaseY: Integer = 0): TPixelPointer; static; 66 property PixelARGB: TColor32 read GetPixelARGB write SetPixelARGB; 67 property PixelRGB: Cardinal read GetPixelRGB write SetPixelRGB; 68 property PixelB: Byte read GetPixelB write SetPixelB; 69 property PixelG: Byte read GetPixelG write SetPixelG; 70 property PixelR: Byte read GetPixelR write SetPixelR; 71 property PixelA: Byte read GetPixelA write SetPixelA; 72 property PixelPlane[Index: Byte]: Byte read GetPixelPlane write SetPixelPlane; 45 73 end; 46 74 PPixelPointer = ^TPixelPointer; 47 75 76 function SwapRedBlue(Color: TColor32): TColor32; 77 procedure BitmapCopyRect(DstBitmap: TRasterImage; DstRect: TRect; SrcBitmap: TRasterImage; SrcPos: TPoint); 78 procedure BitmapStretchRect(DstBitmap: TRasterImage; DstRect: TRect; 79 SrcBitmap: TRasterImage; SrcRect: TRect); 80 procedure BitmapFill(Bitmap: TRasterImage; Color: TColor32); 81 procedure BitmapFillRect(Bitmap: TRasterImage; Color: TColor32; Rect: TRect); 82 procedure BitmapSwapRedBlue(Bitmap:TRasterImage); 83 procedure BitmapInvert(Bitmap: TRasterImage); 84 procedure BitmapBlendColor(Bitmap: TRasterImage; Color: TColor32); 85 function Color32(A, R, G, B: Byte): TColor32; 86 function Color32ToPixel32(Color: TColor32): TPixel32; 87 function Pixel32ToColor32(Color: TPixel32): TColor32; 48 88 function Color32ToColor(Color: TColor32): TColor; 49 89 function ColorToColor32(Color: TColor): TColor32; … … 53 93 54 94 resourcestring 55 SOutOfRange = 'Pixel pointer out of range ';95 SOutOfRange = 'Pixel pointer out of range [X: %d. Y: %d]'; 56 96 SWrongBitmapSize = 'Wrong bitmap size [width: %d, height: %d]'; 57 97 58 { TPixel32 } 59 60 procedure TPixel32.SetRGB(Color: TColor32); 61 begin 62 B := Color and $ff; 63 G := (Color shr 8) and $ff; 64 R := (Color shr 16) and $ff; 65 end; 66 67 function TPixel32.GetRGB: TColor32; 98 { TPixel32 } 99 100 function TPixel32.GetRGB: Cardinal; 68 101 begin 69 102 Result := ARGB and $ffffff; 103 end; 104 105 procedure TPixel32.SetRGB(AValue: Cardinal); 106 begin 107 R := (AValue shr 16) and $ff; 108 G := (AValue shr 8) and $ff; 109 B := (AValue shr 0) and $ff; 70 110 end; 71 111 … … 106 146 107 147 procedure TPixelPointer.CheckRange; 148 {$IFOPT R+} 149 var 150 X: Integer; 151 Y: Integer; 152 {$ENDIF} 108 153 begin 109 154 {$IFOPT R+} 110 155 if (PByte(Pixel) < PByte(Data)) or 111 (PByte(Pixel) >= PByte(Data) + (Width + Height * BytesPerLine) * BytesPerPixel) then 112 raise Exception.Create(SOutOfRange); 156 (PByte(Pixel) >= PByte(Data) + Height * BytesPerLine) then begin 157 X := PByte(Pixel) - PByte(Data); 158 Y := Floor(X / BytesPerLine); 159 X := X - Y * BytesPerLine; 160 X := Floor(X / BytesPerPixel); 161 raise Exception.Create(Format(SOutOfRange, [X, Y])); 162 end; 113 163 {$ENDIF} 164 end; 165 166 function TPixelPointer.GetPixelPlanes: TColor32Planes; 167 begin 168 CheckRange; 169 Result := Pixel^.Planes; 170 end; 171 172 function TPixelPointer.GetPixelRGB: Cardinal; 173 begin 174 CheckRange; 175 Result := Pixel^.RGB; 176 end; 177 178 procedure TPixelPointer.SetPixelARGB(Value: TColor32); 179 begin 180 CheckRange; 181 Pixel^.ARGB := Value; 182 end; 183 184 procedure TPixelPointer.SetPixelB(Value: Byte); 185 begin 186 CheckRange; 187 Pixel^.B := Value; 188 end; 189 190 procedure TPixelPointer.SetPixelG(Value: Byte); 191 begin 192 CheckRange; 193 Pixel^.G := Value; 194 end; 195 196 procedure TPixelPointer.SetPixelPlane(Index: Byte; AValue: Byte); 197 begin 198 CheckRange; 199 Pixel^.Planes[Index] := AValue; 200 end; 201 202 procedure TPixelPointer.SetPixelR(Value: Byte); 203 begin 204 CheckRange; 205 Pixel^.R := Value; 206 end; 207 208 procedure TPixelPointer.SetPixelA(Value: Byte); 209 begin 210 CheckRange; 211 Pixel^.A := Value; 212 end; 213 214 function TPixelPointer.GetPixelARGB: TColor32; 215 begin 216 CheckRange; 217 Result := Pixel^.ARGB; 218 end; 219 220 function TPixelPointer.GetPixelB: Byte; 221 begin 222 CheckRange; 223 Result := Pixel^.B; 224 end; 225 226 function TPixelPointer.GetPixelG: Byte; 227 begin 228 CheckRange; 229 Result := Pixel^.G; 230 end; 231 232 function TPixelPointer.GetPixelPlane(Index: Byte): Byte; 233 begin 234 CheckRange; 235 Result := Pixel^.Planes[Index]; 236 end; 237 238 function TPixelPointer.GetPixelR: Byte; 239 begin 240 CheckRange; 241 Result := Pixel^.R; 242 end; 243 244 function TPixelPointer.GetPixelA: Byte; 245 begin 246 CheckRange; 247 Result := Pixel^.A; 248 end; 249 250 procedure TPixelPointer.SetPixelRGB(Value: Cardinal); 251 begin 252 CheckRange; 253 Pixel^.RGB := Value; 254 end; 255 256 procedure BitmapCopyRect(DstBitmap: TRasterImage; DstRect: TRect; 257 SrcBitmap: TRasterImage; SrcPos: TPoint); 258 var 259 SrcPtr, DstPtr: TPixelPointer; 260 X, Y: Integer; 261 begin 262 SrcBitmap.BeginUpdate(True); 263 DstBitmap.BeginUpdate(True); 264 SrcPtr := TPixelPointer.Create(SrcBitmap, SrcPos.X, SrcPos.Y); 265 DstPtr := TPixelPointer.Create(DstBitmap, DstRect.Left, DstRect.Top); 266 for Y := 0 to DstRect.Height - 1 do begin 267 for X := 0 to DstRect.Width - 1 do begin 268 DstPtr.PixelARGB := SrcPtr.PixelARGB; 269 SrcPtr.NextPixel; 270 DstPtr.NextPixel; 271 end; 272 SrcPtr.NextLine; 273 DstPtr.NextLine; 274 end; 275 SrcBitmap.EndUpdate; 276 DstBitmap.EndUpdate; 277 end; 278 279 procedure BitmapStretchRect(DstBitmap: TRasterImage; DstRect: TRect; 280 SrcBitmap: TRasterImage; SrcRect: TRect); 281 var 282 SrcPtr, DstPtr: TPixelPointer; 283 X, Y: Integer; 284 XX, YY: Integer; 285 R: TRect; 286 C: TColor32; 287 begin 288 if (DstRect.Width = SrcRect.Width) and (DstRect.Height = SrcRect.Height) then begin 289 BitmapCopyRect(DstBitmap, DstRect, SrcBitmap, Point(SrcRect.Left, SrcRect.Top)); 290 Exit; 291 end; 292 SrcBitmap.BeginUpdate(True); 293 DstBitmap.BeginUpdate(True); 294 SrcPtr := TPixelPointer.Create(SrcBitmap, SrcRect.Left, SrcRect.Top); 295 DstPtr := TPixelPointer.Create(DstBitmap, DstRect.Left, DstRect.Top); 296 for Y := 0 to DstRect.Height - 1 do begin 297 for X := 0 to DstRect.Width - 1 do begin 298 R := Rect(Trunc(X * SrcRect.Width / DstRect.Width), 299 Trunc(Y * SrcRect.Height / DstRect.Height), 300 Trunc((X + 1) * SrcRect.Width / DstRect.Width), 301 Trunc((Y + 1) * SrcRect.Height / DstRect.Height)); 302 DstPtr.SetXY(X, Y); 303 SrcPtr.SetXY(R.Left, R.Top); 304 C := SrcPtr.PixelARGB; 305 DstPtr.PixelARGB := C; 306 for YY := 0 to R.Height - 1 do begin 307 for XX := 0 to R.Width - 1 do begin 308 DstPtr.PixelARGB := C; 309 DstPtr.NextPixel; 310 end; 311 DstPtr.NextLine; 312 end; 313 end; 314 end; 315 SrcBitmap.EndUpdate; 316 DstBitmap.EndUpdate; 317 end; 318 319 procedure BitmapFill(Bitmap: TRasterImage; Color: TColor32); 320 var 321 X, Y: Integer; 322 Ptr: TPixelPointer; 323 begin 324 Bitmap.BeginUpdate(True); 325 Ptr := TPixelPointer.Create(Bitmap); 326 for Y := 0 to Bitmap.Height - 1 do begin 327 for X := 0 to Bitmap.Width - 1 do begin 328 Ptr.PixelARGB := Color; 329 Ptr.NextPixel; 330 end; 331 Ptr.NextLine; 332 end; 333 Bitmap.EndUpdate; 334 end; 335 336 procedure BitmapFillRect(Bitmap: TRasterImage; Color: TColor32; Rect: TRect); 337 var 338 X, Y: Integer; 339 Ptr: TPixelPointer; 340 begin 341 Bitmap.BeginUpdate(True); 342 Ptr := TPixelPointer.Create(Bitmap, Rect.Left, Rect.Top); 343 for Y := 0 to Rect.Height - 1 do begin 344 for X := 0 to Rect.Width - 1 do begin 345 Ptr.PixelARGB := Color; 346 Ptr.NextPixel; 347 end; 348 Ptr.NextLine; 349 end; 350 Bitmap.EndUpdate; 351 end; 352 353 procedure BitmapSwapRedBlue(Bitmap: TRasterImage); 354 var 355 X, Y: Integer; 356 Ptr: TPixelPointer; 357 begin 358 Bitmap.BeginUpdate(True); 359 Ptr := TPixelPointer.Create(Bitmap); 360 for Y := 0 to Bitmap.Height - 1 do begin 361 for X := 0 to Bitmap.Width - 1 do begin 362 Ptr.PixelARGB := SwapRedBlue(Ptr.PixelARGB); 363 Ptr.NextPixel; 364 end; 365 Ptr.NextLine; 366 end; 367 Bitmap.EndUpdate; 368 end; 369 370 procedure BitmapInvert(Bitmap: TRasterImage); 371 var 372 X, Y: Integer; 373 Ptr: TPixelPointer; 374 begin 375 Bitmap.BeginUpdate(True); 376 Ptr := TPixelPointer.Create(Bitmap); 377 for Y := 0 to Bitmap.Height - 1 do begin 378 for X := 0 to Bitmap.Width - 1 do begin 379 Ptr.PixelARGB := Ptr.PixelARGB xor $ffffff; 380 Ptr.NextPixel; 381 end; 382 Ptr.NextLine; 383 end; 384 Bitmap.EndUpdate; 385 end; 386 387 procedure BitmapBlendColor(Bitmap: TRasterImage; Color: TColor32); 388 var 389 X, Y: Integer; 390 Ptr: TPixelPointer; 391 A, R, G, B: Word; 392 Pixel: TPixel32; 393 begin 394 Pixel := Color32ToPixel32(Color); 395 Bitmap.BeginUpdate(True); 396 Ptr := TPixelPointer.Create(Bitmap); 397 for Y := 0 to Bitmap.Height - 1 do begin 398 for X := 0 to Bitmap.Width - 1 do begin 399 A := Ptr.PixelA; //(Ptr.PixelA + Pixel.A) shr 1; 400 R := (Ptr.PixelR + Pixel.R) shr 1; 401 G := (Ptr.PixelG + Pixel.G) shr 1; 402 B := (Ptr.PixelB + Pixel.B) shr 1; 403 Ptr.PixelARGB := Color32(A, R, G, B); 404 Ptr.NextPixel; 405 end; 406 Ptr.NextLine; 407 end; 408 Bitmap.EndUpdate; 409 end; 410 411 function Color32(A, R, G, B: Byte): TColor32; 412 begin 413 Result := ((A and $ff) shl 24) or ((R and $ff) shl 16) or 414 ((G and $ff) shl 8) or ((B and $ff) shl 0); 415 end; 416 417 function Color32ToPixel32(Color: TColor32): TPixel32; 418 begin 419 Result.ARGB := Color; 420 end; 421 422 function Pixel32ToColor32(Color: TPixel32): TColor32; 423 begin 424 Result := Color.ARGB; 425 end; 426 427 function Color32ToColor(Color: TColor32): TColor; 428 begin 429 Result := ((Color shr 16) and $ff) or (Color and $00ff00) or 430 ((Color and $ff) shl 16); 431 end; 432 433 function ColorToColor32(Color: TColor): TColor32; 434 begin 435 Result := $ff000000 or ((Color shr 16) and $ff) or (Color and $00ff00) or 436 ((Color and $ff) shl 16); 114 437 end; 115 438 … … 129 452 end; 130 453 131 function Color32ToColor(Color: TColor32): TColor; 132 begin 133 Result := ((Color shr 16) and $ff) or (Color and $00ff00) or 134 ((Color and $ff) shl 16); 135 end; 136 137 function ColorToColor32(Color: TColor): TColor32; 138 begin 139 Result := $ff000000 or ((Color shr 16) and $ff) or (Color and $00ff00) or 140 ((Color and $ff) shl 16); 454 function SwapRedBlue(Color: TColor32): TColor32; 455 begin 456 Result := (Color and $ff00ff00) or ((Color and $ff) shl 16) or ((Color shr 16) and $ff); 141 457 end; 142 458 143 459 end. 144
Note:
See TracChangeset
for help on using the changeset viewer.