Implements TCanvas.BrushCopy, adds a test to it in the canvas tests and also adds full CopyMode tests there

git-svn-id: trunk@35134 -
This commit is contained in:
sekelsenmat 2012-02-04 18:46:34 +00:00
parent aa3560ea0f
commit eed2fffb55
5 changed files with 299 additions and 49 deletions

View File

@ -33,17 +33,16 @@
<PackageName Value="LCL"/>
</Item1>
</RequiredPackages>
<Units Count="73">
<Units Count="76">
<Unit0>
<Filename Value="canvastest.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="canvastest"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="6"/>
<CursorPos X="33" Y="28"/>
<UsageCount Value="94"/>
<UsageCount Value="95"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit0>
@ -53,10 +52,13 @@
<ComponentName Value="frmCanvasTest"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="canvastestunit"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="81"/>
<CursorPos X="1" Y="106"/>
<UsageCount Value="94"/>
<UsageCount Value="95"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
<Unit2>
<Filename Value="../../../../lazarus/lcl/include/canvas.inc"/>
@ -139,7 +141,7 @@
<WindowIndex Value="0"/>
<TopLine Value="3"/>
<CursorPos X="1" Y="28"/>
<UsageCount Value="93"/>
<UsageCount Value="94"/>
</Unit13>
<Unit14>
<Filename Value="brushtest.pas"/>
@ -150,7 +152,7 @@
<WindowIndex Value="0"/>
<TopLine Value="79"/>
<CursorPos X="1" Y="104"/>
<UsageCount Value="93"/>
<UsageCount Value="94"/>
</Unit14>
<Unit15>
<Filename Value="fonttest.pas"/>
@ -161,7 +163,7 @@
<WindowIndex Value="0"/>
<TopLine Value="103"/>
<CursorPos X="1" Y="126"/>
<UsageCount Value="93"/>
<UsageCount Value="94"/>
</Unit15>
<Unit16>
<Filename Value="rectanglestest.pas"/>
@ -172,7 +174,7 @@
<WindowIndex Value="0"/>
<TopLine Value="56"/>
<CursorPos X="1" Y="79"/>
<UsageCount Value="93"/>
<UsageCount Value="94"/>
</Unit16>
<Unit17>
<Filename Value="../../../../usr/local/share/fpcsrc/packages/fcl-image/src/fpcanvas.pp"/>
@ -278,7 +280,7 @@
<WindowIndex Value="0"/>
<TopLine Value="21"/>
<CursorPos X="1" Y="53"/>
<UsageCount Value="55"/>
<UsageCount Value="56"/>
</Unit32>
<Unit33>
<Filename Value="../../../../lazarus/lcl/include/winapih.inc"/>
@ -330,7 +332,7 @@
<Filename Value="../../../../lazarus/lcl/interfaces/carbon/carbonlclintf.inc"/>
<TopLine Value="143"/>
<CursorPos X="3" Y="145"/>
<UsageCount Value="20"/>
<UsageCount Value="21"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit40>
@ -368,7 +370,7 @@
<WindowIndex Value="0"/>
<TopLine Value="32"/>
<CursorPos X="1" Y="55"/>
<UsageCount Value="35"/>
<UsageCount Value="36"/>
</Unit45>
<Unit46>
<Filename Value="screenshotunit.pas"/>
@ -380,7 +382,7 @@
<WindowIndex Value="0"/>
<TopLine Value="24"/>
<CursorPos X="1" Y="31"/>
<UsageCount Value="35"/>
<UsageCount Value="36"/>
</Unit46>
<Unit47>
<Filename Value="drawtest.pas"/>
@ -388,10 +390,14 @@
<ComponentName Value="frmDraw"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="drawtest"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="31"/>
<CursorPos X="1" Y="54"/>
<UsageCount Value="34"/>
<TopLine Value="105"/>
<CursorPos X="1" Y="122"/>
<UsageCount Value="35"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit47>
<Unit48>
<Filename Value="../../../../lazarus/lcl/interfaces/gtk/gtkproc.inc"/>
@ -425,13 +431,15 @@
<ComponentName Value="frmImage"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="imagetest"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="222"/>
<CursorPos X="1" Y="247"/>
<UsageCount Value="27"/>
<CursorPos X="15" Y="224"/>
<UsageCount Value="28"/>
<Bookmarks Count="1">
<Item0 X="39" Y="137" ID="1"/>
</Bookmarks>
<Loaded Value="True"/>
</Unit52>
<Unit53>
<Filename Value="../../../../lazarus/lcl/include/jpegimage.inc"/>
@ -506,10 +514,12 @@
<Unit63>
<Filename Value="../../lcl/intfgraphics.pas"/>
<UnitName Value="IntfGraphics"/>
<EditorIndex Value="6"/>
<WindowIndex Value="0"/>
<TopLine Value="228"/>
<CursorPos X="25" Y="250"/>
<UsageCount Value="10"/>
<TopLine Value="101"/>
<CursorPos X="3" Y="113"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit63>
<Unit64>
<Filename Value="../../lcl/include/lclintf.inc"/>
@ -577,52 +587,159 @@
<CursorPos X="8" Y="28"/>
<UsageCount Value="10"/>
</Unit72>
<Unit73>
<Filename Value="../../lcl/graphics.pp"/>
<UnitName Value="Graphics"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="400"/>
<CursorPos X="1" Y="424"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit73>
<Unit74>
<Filename Value="../../lcl/include/canvas.inc"/>
<EditorIndex Value="5"/>
<WindowIndex Value="0"/>
<TopLine Value="716"/>
<CursorPos X="88" Y="726"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit74>
<Unit75>
<Filename Value="../../../fpctrunk/packages/fcl-image/src/fpcanvas.pp"/>
<UnitName Value="FPCanvas"/>
<WindowIndex Value="0"/>
<TopLine Value="321"/>
<CursorPos X="15" Y="333"/>
<UsageCount Value="10"/>
</Unit75>
</Units>
<JumpHistory Count="10" HistoryIndex="9">
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="canvastest.lpr"/>
<Caret Line="19" Column="34" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="724" Column="1" TopLine="706"/>
</Position1>
<Position2>
<Filename Value="canvastest.lpr"/>
<Caret Line="20" Column="30" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="725" Column="1" TopLine="706"/>
</Position2>
<Position3>
<Filename Value="canvastest.lpr"/>
<Caret Line="21" Column="32" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="726" Column="1" TopLine="706"/>
</Position3>
<Position4>
<Filename Value="canvastest.lpr"/>
<Caret Line="22" Column="31" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="724" Column="1" TopLine="706"/>
</Position4>
<Position5>
<Filename Value="canvastest.lpr"/>
<Caret Line="23" Column="35" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="725" Column="1" TopLine="706"/>
</Position5>
<Position6>
<Filename Value="canvastest.lpr"/>
<Caret Line="24" Column="39" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="726" Column="1" TopLine="706"/>
</Position6>
<Position7>
<Filename Value="canvastest.lpr"/>
<Caret Line="25" Column="32" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="724" Column="1" TopLine="706"/>
</Position7>
<Position8>
<Filename Value="canvastest.lpr"/>
<Caret Line="26" Column="30" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="725" Column="1" TopLine="706"/>
</Position8>
<Position9>
<Filename Value="canvastest.lpr"/>
<Caret Line="27" Column="32" TopLine="4"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="726" Column="1" TopLine="706"/>
</Position9>
<Position10>
<Filename Value="canvastest.lpr"/>
<Caret Line="28" Column="33" TopLine="6"/>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="724" Column="1" TopLine="706"/>
</Position10>
<Position11>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="725" Column="1" TopLine="706"/>
</Position11>
<Position12>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="726" Column="1" TopLine="706"/>
</Position12>
<Position13>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="724" Column="1" TopLine="706"/>
</Position13>
<Position14>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="725" Column="1" TopLine="706"/>
</Position14>
<Position15>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="726" Column="1" TopLine="706"/>
</Position15>
<Position16>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="724" Column="1" TopLine="706"/>
</Position16>
<Position17>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="725" Column="1" TopLine="706"/>
</Position17>
<Position18>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="726" Column="1" TopLine="706"/>
</Position18>
<Position19>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="724" Column="1" TopLine="706"/>
</Position19>
<Position20>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="725" Column="1" TopLine="706"/>
</Position20>
<Position21>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="726" Column="1" TopLine="706"/>
</Position21>
<Position22>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="724" Column="1" TopLine="706"/>
</Position22>
<Position23>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="725" Column="1" TopLine="706"/>
</Position23>
<Position24>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="744" Column="5" TopLine="720"/>
</Position24>
<Position25>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="710" Column="47" TopLine="696"/>
</Position25>
<Position26>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="734" Column="27" TopLine="724"/>
</Position26>
<Position27>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="751" Column="17" TopLine="729"/>
</Position27>
<Position28>
<Filename Value="../../lcl/include/canvas.inc"/>
<Caret Line="728" Column="32" TopLine="716"/>
</Position28>
<Position29>
<Filename Value="drawtest.pas"/>
<Caret Line="64" Column="29" TopLine="50"/>
</Position29>
<Position30>
<Filename Value="drawtest.pas"/>
<Caret Line="78" Column="31" TopLine="57"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
<Version Value="10"/>
<Version Value="11"/>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
</SearchPaths>

View File

@ -1,10 +1,10 @@
object frmDraw: TfrmDraw
Left = 290
Height = 274
Height = 429
Top = 197
Width = 460
Width = 566
Caption = 'frmDraw'
OnCreate = FormCreate
OnPaint = FormPaint
LCLVersion = '0.9.29'
LCLVersion = '0.9.31'
end

View File

@ -40,9 +40,85 @@ begin
Bmp.Canvas.Brush.Color := clBlue;
Bmp.Canvas.Rectangle(0, 0, 50, 50);
Canvas.TextOut(50, 30, 'cmDstInvert');
// BrushCopy
Canvas.TextOut(50, 30, 'CopyBrush simple');
Canvas.Brush.Color := clYellow;
Canvas.BrushCopy(Bounds(50, 50, 50, 50), Bmp, Bounds(0, 0, 50, 50), clBlue);
Canvas.TextOut(200, 30, 'CopyBrush stretch');
Canvas.Brush.Color := clYellow;
Canvas.BrushCopy(Bounds(200, 50, 20, 20), Bmp, Bounds(0, 0, 50, 50), clBlue);
Canvas.TextOut(350, 30, 'CopyBrush SrcRect');
Canvas.Brush.Color := clYellow;
Canvas.BrushCopy(Bounds(350, 50, 20, 20), Bmp, Bounds(30, 30, 20, 20), clBlue);
// CopyMode
Canvas.TextOut(50, 130, 'cmBlackness');
Canvas.CopyMode := cmBlackness;
Canvas.Draw(50, 150, Bmp);
Canvas.TextOut(150, 130, 'cmDstInvert');
Canvas.CopyMode := cmDstInvert;
Canvas.Draw(50, 50, Bmp);
Canvas.Draw(150, 150, Bmp);
Canvas.TextOut(250, 130, 'cmMergeCopy');
Canvas.CopyMode := cmMergeCopy;
Canvas.Draw(250, 150, Bmp);
Canvas.TextOut(350, 130, 'cmMergePaint');
Canvas.CopyMode := cmMergePaint;
Canvas.Draw(350, 150, Bmp);
Canvas.TextOut(450, 130, 'cmNotSrcCopy');
Canvas.CopyMode := cmNotSrcCopy;
Canvas.Draw(450, 150, Bmp);
// CopyMode line 2
Canvas.TextOut(50, 230, 'cmNotSrcErase');
Canvas.CopyMode := cmNotSrcErase;
Canvas.Draw(50, 250, Bmp);
Canvas.TextOut(150, 230, 'cmPatCopy');
Canvas.CopyMode := cmPatCopy;
Canvas.Draw(150, 250, Bmp);
Canvas.TextOut(250, 230, 'cmPatInvert');
Canvas.CopyMode := cmPatInvert;
Canvas.Draw(250, 250, Bmp);
Canvas.TextOut(350, 230, 'cmPatPaint');
Canvas.CopyMode := cmPatPaint;
Canvas.Draw(350, 250, Bmp);
Canvas.TextOut(450, 230, 'cmSrcAnd');
Canvas.CopyMode := cmSrcAnd;
Canvas.Draw(450, 250, Bmp);
// CopyMode line 3
Canvas.TextOut(50, 330, 'cmSrcCopy');
Canvas.CopyMode := cmSrcCopy;
Canvas.Draw(50, 350, Bmp);
Canvas.TextOut(150, 330, 'cmSrcErase');
Canvas.CopyMode := cmSrcErase;
Canvas.Draw(150, 350, Bmp);
Canvas.TextOut(250, 330, 'cmSrcInvert');
Canvas.CopyMode := cmSrcInvert;
Canvas.Draw(250, 350, Bmp);
Canvas.TextOut(350, 330, 'cmSrcPaint');
Canvas.CopyMode := cmSrcPaint;
Canvas.Draw(350, 350, Bmp);
Canvas.TextOut(450, 330, 'cmWhiteness');
Canvas.CopyMode := cmWhiteness;
Canvas.Draw(450, 350, Bmp);
Bmp.Free;
end;

View File

@ -1110,8 +1110,8 @@ type
// extra drawing methods (there are more in the ancestor TFPCustomCanvas)
procedure Arc(ALeft, ATop, ARight, ABottom, Angle16Deg, Angle16DegLength: Integer); virtual; {$IFDEF HasFPCanvas1}reintroduce;{$ENDIF}
procedure Arc(ALeft, ATop, ARight, ABottom, SX, SY, EX, EY: Integer); virtual; {$IFDEF HasFPCanvas1}reintroduce;{$ENDIF}
//procedure BrushCopy(Dest: TRect; InternalImages: TBitmap; Src: TRect;
// TransparentColor: TColor); virtual;
procedure BrushCopy(ADestRect: TRect; ABitmap: TBitmap; ASourceRect: TRect;
ATransparentColor: TColor); virtual;
procedure Chord(x1, y1, x2, y2,
Angle16Deg, Angle16DegLength: Integer); virtual; {$IFDEF HasFPCanvas1}reintroduce;{$ENDIF}
procedure Chord(x1, y1, x2, y2, SX, SY, EX, EY: Integer); virtual; {$IFDEF HasFPCanvas1}reintroduce;{$ENDIF}

View File

@ -694,6 +694,63 @@ begin
Changed;
end;
{------------------------------------------------------------------------------
Method: TCanvas.BrushCopy
Params: ADestRect, ABitmap, ASourceRect, ATransparentColor
Returns: Nothing
Makes a stretch draw operation while substituting a color of the source bitmap
with the color of the brush of the canvas
------------------------------------------------------------------------------}
procedure TCanvas.BrushCopy(ADestRect: TRect; ABitmap: TBitmap; ASourceRect: TRect;
ATransparentColor: TColor);
var
lIntfImage: TLazIntfImage;
lTransparentColor, lBrushColor, lPixelColor: TFPColor;
lPaintedBitmap: TBitmap;
x, y: Integer;
lDestWidth, lDestHeight, lSrcWidth, lSrcHeight: Integer;
begin
// Preparation of data
lDestWidth := ADestRect.Right - ADestRect.Left;
lDestHeight := ADestRect.Bottom - ADestRect.Top;
lSrcWidth := ASourceRect.Right - ASourceRect.Left;
lSrcHeight := ASourceRect.Bottom - ASourceRect.Top;
lTransparentColor := TColorToFPColor(ColorToRGB(ATransparentColor));
lBrushColor := TColorToFPColor(ColorToRGB(Brush.Color));
lPaintedBitmap := TBitmap.Create;
lIntfImage := TLazIntfImage.Create(0, 0);
try
// First copy the source rectangle to another bitmap
// So that we don't have to iterate in pixels which wont be used changing the color
lPaintedBitmap.Width := lSrcWidth;
lPaintedBitmap.Height := lSrcHeight;
lPaintedBitmap.Canvas.Draw(-ASourceRect.Left, -ASourceRect.Top, ABitmap);
// Next copy the bitmap to a intfimage to be able to make the color change
lIntfImage.LoadFromBitmap(lPaintedBitmap.Handle, 0);
for x := 0 to lSrcWidth-1 do
for y := 0 to lSrcHeight-1 do
begin
lPixelColor := lIntfImage.Colors[x, y];
if (lPixelColor.red = lTransparentColor.red) and
(lPixelColor.green = lTransparentColor.green) and
(lPixelColor.blue = lTransparentColor.blue) then
lIntfImage.Colors[x, y] := lBrushColor;
end;
// Now obtain a bitmap with the new image
lPaintedBitmap.LoadFromIntfImage(lIntfImage);
// And stretch draw it
Self.StretchDraw(ADestRect, lPaintedBitmap);
finally
lIntfImage.Free;
lPaintedBitmap.Free;
end;
end;
{------------------------------------------------------------------------------
Method: TCanvas.RadialPie
Params: x1, y1, x2, y2, StartAngle16Deg, EndAngle16Deg: Integer