Changeset 506 for trunk/Packages
- Timestamp:
- Dec 25, 2023, 11:35:51 AM (11 months ago)
- Location:
- trunk/Packages
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Packages/CevoComponents/ScreenTools.pas
r505 r506 404 404 for Y := 0 to ScaleToNative(Src.Height - 1) do begin 405 405 for X := 0 to ScaleToNative(Src.Width - 1) do begin 406 DstPtr.Pixel ^.B := SrcPtr.Pixel^.B;407 DstPtr.Pixel ^.G := SrcPtr.Pixel^.B;408 DstPtr.Pixel ^.R := SrcPtr.Pixel^.B;406 DstPtr.PixelB := SrcPtr.PixelB; 407 DstPtr.PixelG := SrcPtr.PixelB; 408 DstPtr.PixelR := SrcPtr.PixelB; 409 409 SrcPtr.NextPixel; 410 410 DstPtr.NextPixel; … … 536 536 for Y := 0 to ScaleToNative(Result.Data.Height) - 1 do begin 537 537 for X := 0 to ScaleToNative(Result.Data.Width) - 1 do begin 538 OriginalColor := DataPixel.Pixel ^.ARGB and $FFFFFF;538 OriginalColor := DataPixel.PixelARGB and $FFFFFF; 539 539 if (OriginalColor = TransparentColor1) or (OriginalColor = TransparentColor2) then begin 540 MaskPixel.Pixel ^.R := $FF;541 MaskPixel.Pixel ^.G := $FF;542 MaskPixel.Pixel ^.B := $FF;543 DataPixel.Pixel ^.R := 0;544 DataPixel.Pixel ^.G := 0;545 DataPixel.Pixel ^.B := 0;540 MaskPixel.PixelR := $FF; 541 MaskPixel.PixelG := $FF; 542 MaskPixel.PixelB := $FF; 543 DataPixel.PixelR := 0; 544 DataPixel.PixelG := 0; 545 DataPixel.PixelB := 0; 546 546 end else begin 547 MaskPixel.Pixel ^.R := $00;548 MaskPixel.Pixel ^.G := $00;549 MaskPixel.Pixel ^.B := $00;547 MaskPixel.PixelR := $00; 548 MaskPixel.PixelG := $00; 549 MaskPixel.PixelB := $00; 550 550 end; 551 551 DataPixel.NextPixel; … … 579 579 for YY := 0 to ScaleToNative(Height) - 1 do begin 580 580 for XX := 0 to ScaleToNative(Width) - 1 do begin 581 if PixelPtr.Pixel ^.RGB = SwapRedBlue(OldColor) then begin582 PixelPtr.Pixel ^.RGB := SwapRedBlue(NewColor);581 if PixelPtr.PixelRGB = SwapRedBlue(OldColor) then begin 582 PixelPtr.PixelRGB := SwapRedBlue(NewColor); 583 583 end; 584 584 PixelPtr.NextPixel; … … 598 598 for yy := 0 to ScaleToNative(Height) - 1 do begin 599 599 for xx := 0 to ScaleToNative(Width) - 1 do begin 600 PixelPtr.Pixel ^.B := PixelPtr.Pixel^.B div 2;601 PixelPtr.Pixel ^.G := PixelPtr.Pixel^.G div 2;602 PixelPtr.Pixel ^.R := PixelPtr.Pixel^.R div 2;600 PixelPtr.PixelB := PixelPtr.PixelB div 2; 601 PixelPtr.PixelG := PixelPtr.PixelG div 2; 602 PixelPtr.PixelR := PixelPtr.PixelR div 2; 603 603 PixelPtr.NextPixel; 604 604 end; … … 618 618 for YY := 0 to ScaleToNative(Height) - 1 do begin 619 619 for XX := 0 to ScaleToNative(Width) - 1 do begin 620 Gray := (Integer(PixelPtr.Pixel ^.B) + Integer(PixelPtr.Pixel^.G) +621 Integer(PixelPtr.Pixel ^.R)) * 85 shr 8;622 PixelPtr.Pixel ^.B := 0;623 PixelPtr.Pixel ^.G := 0;624 PixelPtr.Pixel ^.R := Gray; // 255-(255-gray) div 2;620 Gray := (Integer(PixelPtr.PixelB) + Integer(PixelPtr.PixelG) + 621 Integer(PixelPtr.PixelR)) * 85 shr 8; 622 PixelPtr.PixelB := 0; 623 PixelPtr.PixelG := 0; 624 PixelPtr.PixelR := Gray; // 255-(255-gray) div 2; 625 625 PixelPtr.NextPixel; 626 626 end; … … 670 670 for Y := 0 to Height - 1 do begin 671 671 for X := 0 to Width - 1 do begin 672 Brightness := PixelSrc.Pixel ^.B; // One byte for 8-bit color673 Test := (PixelDst.Pixel ^.R * Brightness) shr 7;672 Brightness := PixelSrc.PixelB; // One byte for 8-bit color 673 Test := (PixelDst.PixelR * Brightness) shr 7; 674 674 if Test >= 256 then 675 PixelDst.Pixel ^.R := 255675 PixelDst.PixelR := 255 676 676 else 677 PixelDst.Pixel ^.R := Test; // Red678 Test := (PixelDst.Pixel ^.G * Brightness) shr 7;677 PixelDst.PixelR := Test; // Red 678 Test := (PixelDst.PixelG * Brightness) shr 7; 679 679 if Test >= 256 then 680 PixelDst.Pixel ^.G := 255680 PixelDst.PixelG := 255 681 681 else 682 PixelDst.Pixel ^.G := Test; // Green683 Test := (PixelDst.Pixel ^.B * Brightness) shr 7;682 PixelDst.PixelG := Test; // Green 683 Test := (PixelDst.PixelB * Brightness) shr 7; 684 684 if Test >= 256 then 685 PixelDst.Pixel ^.R := 255685 PixelDst.PixelR := 255 686 686 else 687 PixelDst.Pixel ^.B := Test; // Blue687 PixelDst.PixelB := Test; // Blue 688 688 PixelDst.NextPixel; 689 689 PixelSrc.NextPixel; … … 736 736 for iy := 0 to Height - 1 do begin 737 737 for ix := 0 to Width - 1 do begin 738 trans := SrcPixel.Pixel ^.B * 2; // green channel = transparency739 amp1 := SrcPixel.Pixel ^.G * 2;740 amp2 := SrcPixel.Pixel ^.R * 2;738 trans := SrcPixel.PixelB * 2; // green channel = transparency 739 amp1 := SrcPixel.PixelG * 2; 740 amp2 := SrcPixel.PixelR * 2; 741 741 if trans <> $FF then begin 742 Value := (DstPixel.Pixel ^.B * trans + ((Color2 shr 16) and $FF) *742 Value := (DstPixel.PixelB * trans + ((Color2 shr 16) and $FF) * 743 743 amp2 + ((Color1 shr 16) and $FF) * amp1) div $FF; 744 DstPixel.Pixel ^.B := Min(Value, 255);745 746 Value := (DstPixel.Pixel ^.G * trans + ((Color2 shr 8) and $FF) *744 DstPixel.PixelB := Min(Value, 255); 745 746 Value := (DstPixel.PixelG * trans + ((Color2 shr 8) and $FF) * 747 747 amp2 + ((Color1 shr 8) and $FF) * amp1) div $FF; 748 DstPixel.Pixel ^.G := Min(Value, 255);749 750 Value := (DstPixel.Pixel ^.R * trans + (Color2 and $FF) *748 DstPixel.PixelG := Min(Value, 255); 749 750 Value := (DstPixel.PixelR * trans + (Color2 and $FF) * 751 751 amp2 + (Color1 and $FF) * amp1) div $FF; 752 DstPixel.Pixel ^.R := Min(Value, 255);752 DstPixel.PixelR := Min(Value, 255); 753 753 end; 754 754 … … 793 793 for iy := 0 to Height - 1 do begin 794 794 for ix := 0 to Width - 1 do begin 795 trans := SrcPixel.Pixel ^.B * 2; // green channel = transparency796 amp0 := SrcPixel.Pixel ^.G * 2;797 amp1 := SrcPixel.Pixel ^.R * 2;795 trans := SrcPixel.PixelB * 2; // green channel = transparency 796 amp0 := SrcPixel.PixelG * 2; 797 amp1 := SrcPixel.PixelR * 2; 798 798 if trans <> $FF then begin 799 Value := (DstPixel.Pixel ^.B * trans + (Color2 shr 16 and $FF) * amp1 +799 Value := (DstPixel.PixelB * trans + (Color2 shr 16 and $FF) * amp1 + 800 800 (Color0 shr 16 and $FF) * amp0) div $FF; 801 DstPixel.Pixel ^.B := Min(Value, 255);802 803 Value := (DstPixel.Pixel ^.G * trans + (Color2 shr 8 and $FF) * amp1 +801 DstPixel.PixelB := Min(Value, 255); 802 803 Value := (DstPixel.PixelG * trans + (Color2 shr 8 and $FF) * amp1 + 804 804 (Color0 shr 8 and $FF) * amp0) div $FF; 805 DstPixel.Pixel ^.G := Min(Value, 255);806 807 Value := (DstPixel.Pixel ^.R * trans + (Color2 and $FF) * amp1 +805 DstPixel.PixelG := Min(Value, 255); 806 807 Value := (DstPixel.PixelR * trans + (Color2 and $FF) * amp1 + 808 808 (Color0 and $FF) * amp0) div $FF; 809 DstPixel.Pixel ^.R := Min(Value, 255);809 DstPixel.PixelR := Min(Value, 255); 810 810 end; 811 811 SrcPixel.NextPixel; … … 846 846 for YY := 0 to Height - 1 do begin 847 847 for XX := 0 to Width - 1 do begin 848 Red := ((PixelPtr.Pixel ^.B * (Color0 and $0000FF) + PixelPtr.Pixel^.G *849 (Color1 and $0000FF) + PixelPtr.Pixel ^.R * (Color2 and $0000FF)) shr 8) and $ff;850 Green := ((PixelPtr.Pixel ^.B * ((Color0 shr 8) and $0000FF) +851 PixelPtr.Pixel ^.G * ((Color1 shr 8) and $0000FF) + PixelPtr.Pixel^.R *848 Red := ((PixelPtr.PixelB * (Color0 and $0000FF) + PixelPtr.PixelG * 849 (Color1 and $0000FF) + PixelPtr.PixelR * (Color2 and $0000FF)) shr 8) and $ff; 850 Green := ((PixelPtr.PixelB * ((Color0 shr 8) and $0000FF) + 851 PixelPtr.PixelG * ((Color1 shr 8) and $0000FF) + PixelPtr.PixelR * 852 852 ((Color2 shr 8) and $0000FF)) shr 8) and $ff; 853 PixelPtr.Pixel ^.B := ((PixelPtr.Pixel^.B * ((Color0 shr 16) and $0000FF) +854 PixelPtr.Pixel ^.G * ((Color1 shr 16) and $0000FF) + PixelPtr.Pixel^.R *853 PixelPtr.PixelB := ((PixelPtr.PixelB * ((Color0 shr 16) and $0000FF) + 854 PixelPtr.PixelG * ((Color1 shr 16) and $0000FF) + PixelPtr.PixelR * 855 855 ((Color2 shr 16) and $0000FF)) shr 8) and $ff; // Blue 856 PixelPtr.Pixel ^.G := Green;857 PixelPtr.Pixel ^.R := Red;856 PixelPtr.PixelG := Green; 857 PixelPtr.PixelR := Red; 858 858 PixelPtr.NextPixel; 859 859 end; … … 1035 1035 if R < DpiGlowRange then 1036 1036 for ch := 0 to 2 do 1037 DstPtr.Pixel ^.Planes[2 - ch] :=1038 (DstPtr.Pixel ^.Planes[2 - ch] * (R - 1) + (cl shr (8 * ch) and $FF) *1037 DstPtr.PixelPlane[2 - ch] := 1038 (DstPtr.PixelPlane[2 - ch] * (R - 1) + (cl shr (8 * ch) and $FF) * 1039 1039 (DpiGlowRange - R)) div (DpiGlowRange - 1); 1040 1040 DstPtr.NextPixel; … … 1063 1063 for Y := 0 to ScaleToNative(Ornament.Height) - 1 do begin 1064 1064 for X := 0 to ScaleToNative(Ornament.Width) - 1 do begin 1065 P := Color32ToColor(PixelPtr.Pixel ^.RGB);1066 if P = $0000FF then PixelPtr.Pixel ^.RGB := Light1067 else if P = $FF0000 then PixelPtr.Pixel ^.RGB := Shade;1065 P := Color32ToColor(PixelPtr.PixelRGB); 1066 if P = $0000FF then PixelPtr.PixelRGB := Light 1067 else if P = $FF0000 then PixelPtr.PixelRGB := Shade; 1068 1068 PixelPtr.NextPixel; 1069 1069 end; … … 1073 1073 for Y := 0 to ScaleToNative(Ornament.Height) - 1 do begin 1074 1074 for X := 0 to ScaleToNative(Ornament.Width) - 1 do begin 1075 P := Color32ToColor(PixelPtr.Pixel ^.ARGB);1076 if P = $0000FF then PixelPtr.Pixel ^.ARGB := Light1077 else if P = $FF0000 then PixelPtr.Pixel ^.ARGB := Shade;1075 P := Color32ToColor(PixelPtr.PixelARGB); 1076 if P = $0000FF then PixelPtr.PixelARGB := Light 1077 else if P = $FF0000 then PixelPtr.PixelARGB := Shade; 1078 1078 PixelPtr.NextPixel; 1079 1079 end; … … 1616 1616 for Y := 0 to ScaleToNative(Dest.Height) - 1 do begin 1617 1617 for X := 0 to ScaleToNative(Dest.Width) - 1 do begin 1618 if (DstPixel.Pixel ^.ARGB and $FFFFFF) = TransparentColor then begin1618 if (DstPixel.PixelARGB and $FFFFFF) = TransparentColor then begin 1619 1619 SrcPixel.SetXY(X mod TexWidth, Y mod TexHeight); 1620 DstPixel.Pixel ^.B := SrcPixel.Pixel^.B;1621 DstPixel.Pixel ^.G := SrcPixel.Pixel^.G;1622 DstPixel.Pixel ^.R := SrcPixel.Pixel^.R;1620 DstPixel.PixelB := SrcPixel.PixelB; 1621 DstPixel.PixelG := SrcPixel.PixelG; 1622 DstPixel.PixelR := SrcPixel.PixelR; 1623 1623 end; 1624 1624 DstPixel.NextPixel; … … 1638 1638 for Y := 0 to ScaleToNative(Bitmap.Height) - 1 do begin 1639 1639 for X := 0 to ScaleToNative(Bitmap.Width) - 1 do begin 1640 PicturePixel.Pixel ^.B := Max(PicturePixel.Pixel^.B - Change, 0);1641 PicturePixel.Pixel ^.G := Max(PicturePixel.Pixel^.G - Change, 0);1642 PicturePixel.Pixel ^.R := Max(PicturePixel.Pixel^.R - Change, 0);1640 PicturePixel.PixelB := Max(PicturePixel.PixelB - Change, 0); 1641 PicturePixel.PixelG := Max(PicturePixel.PixelG - Change, 0); 1642 PicturePixel.PixelR := Max(PicturePixel.PixelR - Change, 0); 1643 1643 PicturePixel.NextPixel; 1644 1644 end; -
trunk/Packages/Common/Languages/PixelPointer.pot
r487 r506 3 3 4 4 #: pixelpointer.soutofrange 5 msgid "Pixel pointer out of range" 5 #, object-pascal-format 6 msgid "Pixel pointer out of range [X: %d. Y: %d]" 6 7 msgstr "" 7 8 -
trunk/Packages/Common/PixelPointer.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 } … … 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; … … 68 93 69 94 resourcestring 70 SOutOfRange = 'Pixel pointer out of range ';95 SOutOfRange = 'Pixel pointer out of range [X: %d. Y: %d]'; 71 96 SWrongBitmapSize = 'Wrong bitmap size [width: %d, height: %d]'; 72 97 … … 121 146 122 147 procedure TPixelPointer.CheckRange; 148 {$IFOPT R+} 149 var 150 X: Integer; 151 Y: Integer; 152 {$ENDIF} 123 153 begin 124 154 {$IFOPT R+} 125 155 if (PByte(Pixel) < PByte(Data)) or 126 (PByte(Pixel) >= PByte(Data) + (Width + Height * BytesPerLine) * BytesPerPixel) then 127 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; 128 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; 129 254 end; 130 255 … … 141 266 for Y := 0 to DstRect.Height - 1 do begin 142 267 for X := 0 to DstRect.Width - 1 do begin 143 DstPtr.Pixel ^.ARGB := SrcPtr.Pixel^.ARGB;268 DstPtr.PixelARGB := SrcPtr.PixelARGB; 144 269 SrcPtr.NextPixel; 145 270 DstPtr.NextPixel; … … 177 302 DstPtr.SetXY(X, Y); 178 303 SrcPtr.SetXY(R.Left, R.Top); 179 C := SrcPtr.Pixel ^.ARGB;180 DstPtr.Pixel ^.ARGB := C;304 C := SrcPtr.PixelARGB; 305 DstPtr.PixelARGB := C; 181 306 for YY := 0 to R.Height - 1 do begin 182 307 for XX := 0 to R.Width - 1 do begin 183 DstPtr.Pixel ^.ARGB := C;308 DstPtr.PixelARGB := C; 184 309 DstPtr.NextPixel; 185 310 end; … … 201 326 for Y := 0 to Bitmap.Height - 1 do begin 202 327 for X := 0 to Bitmap.Width - 1 do begin 203 Ptr.Pixel ^.ARGB := Color;328 Ptr.PixelARGB := Color; 204 329 Ptr.NextPixel; 205 330 end; … … 218 343 for Y := 0 to Rect.Height - 1 do begin 219 344 for X := 0 to Rect.Width - 1 do begin 220 Ptr.Pixel ^.ARGB := Color;345 Ptr.PixelARGB := Color; 221 346 Ptr.NextPixel; 222 347 end; … … 235 360 for Y := 0 to Bitmap.Height - 1 do begin 236 361 for X := 0 to Bitmap.Width - 1 do begin 237 Ptr.Pixel ^.ARGB := SwapRedBlue(Ptr.Pixel^.ARGB);362 Ptr.PixelARGB := SwapRedBlue(Ptr.PixelARGB); 238 363 Ptr.NextPixel; 239 364 end; … … 252 377 for Y := 0 to Bitmap.Height - 1 do begin 253 378 for X := 0 to Bitmap.Width - 1 do begin 254 Ptr.Pixel ^.ARGB := Ptr.Pixel^.ARGB xor $ffffff;379 Ptr.PixelARGB := Ptr.PixelARGB xor $ffffff; 255 380 Ptr.NextPixel; 256 381 end; … … 272 397 for Y := 0 to Bitmap.Height - 1 do begin 273 398 for X := 0 to Bitmap.Width - 1 do begin 274 A := Ptr.Pixel ^.A; //(Ptr.Pixel^.A + Pixel.A) shr 1;275 R := (Ptr.Pixel ^.R + Pixel.R) shr 1;276 G := (Ptr.Pixel ^.G + Pixel.G) shr 1;277 B := (Ptr.Pixel ^.B + Pixel.B) shr 1;278 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); 279 404 Ptr.NextPixel; 280 405 end; -
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.