Color institution brush tool works.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1612 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
yangjixian
2011-05-05 02:21:34 +00:00
parent 055d42cf99
commit eddb292da9
6 changed files with 854 additions and 756 deletions

View File

@ -68,6 +68,7 @@ type
procedure Brightness(ValueChange: integer);
procedure Contrast(ValueChange: integer);
procedure ColorReplace(ColorFrom, ColorTo: TColor);
procedure ReplaceRectColor(ColorFrom, ColorTo: TColor; aRect: TRect; R: integer; Shape: TShapeType);
property ScanLine[Row: integer]: pRGBATriple read GetScanLine;
procedure FillEllipse(X1, Y1, X2, Y2: integer); virtual;
procedure CutToClipboard; virtual;
@ -539,6 +540,32 @@ begin
DLBMPColorReplace(Self, ColorFrom, ColorTo);
end;
procedure TDLBitmap.ReplaceRectColor(ColorFrom, ColorTo: TColor; aRect: TRect; R: integer; Shape: TShapeType);
var maskbmp: TDLBitmap; i, j: integer;
begin
maskbmp := TDLBitmap.Create;
maskbmp.Width := aRect.Right - aRect.Left;
maskbmp.Height := aRect.Bottom - aRect.Top;
maskbmp.Canvas.Brush.Color := clWhite;
maskbmp.Canvas.Brush.Style := bsSolid;
maskbmp.Canvas.Pen.Color := clWhite;
maskbmp.Canvas.Rectangle(0, 0, Width, Height);
maskbmp.Canvas.Brush.Color := clBlack;
maskbmp.Canvas.Pen.Color := clBlack;
case Shape of
stRectangle: maskbmp.Canvas.Rectangle(0, 0, maskbmp.Width, maskbmp.Height);
stRoundRect: maskbmp.Canvas.RoundRect(0, 0, maskbmp.Width, maskbmp.Height, R, R);
stEllipse : maskbmp.Canvas.Ellipse(0, 0, maskbmp.Width, maskbmp.Height);
end;
for i := 0 to maskbmp.Width do
for j := 0 to maskbmp.Height do
if maskbmp.Pixels[i, j] = clBlack then
if Pixels[aRect.Left + i, aRect.Top + j] = ColorFrom then
Pixels[aRect.Left + i, aRect.Top + j] := ColorTo;
InvalidateScanline;
maskbmp.Free;
end;
constructor TTextEdit.Create(AOwner: TComponent);
begin
inherited;

View File

@ -41,7 +41,7 @@
<PackageName Value="LCL"/>
</Item3>
</RequiredPackages>
<Units Count="44">
<Units Count="45">
<Unit0>
<Filename Value="lazimageeditor.pas"/>
<IsPartOfProject Value="True"/>
@ -49,7 +49,7 @@
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="14" Y="4"/>
<UsageCount Value="77"/>
<UsageCount Value="78"/>
</Unit0>
<Unit1>
<Filename Value="main.pas"/>
@ -60,21 +60,20 @@
<UnitName Value="Main"/>
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="801"/>
<CursorPos X="34" Y="812"/>
<UsageCount Value="77"/>
<TopLine Value="1348"/>
<CursorPos X="87" Y="1356"/>
<UsageCount Value="78"/>
<Loaded Value="True"/>
<LoadedDesigner Value="True"/>
</Unit1>
<Unit2>
<Filename Value="picturectrls.pas"/>
<UnitName Value="PictureCtrls"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="1"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="874"/>
<CursorPos X="17" Y="890"/>
<UsageCount Value="32"/>
<TopLine Value="897"/>
<CursorPos X="41" Y="904"/>
<UsageCount Value="33"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
@ -177,10 +176,12 @@
<Unit13>
<Filename Value="picturemanager.pas"/>
<UnitName Value="PictureManager"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="95" Y="2"/>
<TopLine Value="30"/>
<CursorPos X="53" Y="46"/>
<UsageCount Value="33"/>
<Loaded Value="True"/>
</Unit13>
<Unit14>
<Filename Value="T:\ajlazctrls\dbdemo\bmprgbgraph.pas"/>
@ -241,11 +242,11 @@
<Unit21>
<Filename Value="bmprgbtypes.pas"/>
<UnitName Value="BmpRGBTypes"/>
<EditorIndex Value="2"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="107"/>
<CursorPos X="46" Y="116"/>
<UsageCount Value="28"/>
<TopLine Value="1"/>
<CursorPos X="97" Y="5"/>
<UsageCount Value="29"/>
<Loaded Value="True"/>
</Unit21>
<Unit22>
@ -356,11 +357,12 @@
<Unit35>
<Filename Value="DLBitmap.pas"/>
<UnitName Value="DLBitmap"/>
<EditorIndex Value="3"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="42"/>
<CursorPos X="1" Y="52"/>
<UsageCount Value="16"/>
<TopLine Value="541"/>
<CursorPos X="69" Y="558"/>
<UsageCount Value="17"/>
<Loaded Value="True"/>
</Unit35>
<Unit36>
@ -389,11 +391,11 @@
</Unit38>
<Unit39>
<Filename Value="DLBmpUtils.inc"/>
<EditorIndex Value="4"/>
<EditorIndex Value="5"/>
<WindowIndex Value="0"/>
<TopLine Value="672"/>
<CursorPos X="11" Y="686"/>
<UsageCount Value="14"/>
<UsageCount Value="15"/>
<Loaded Value="True"/>
</Unit39>
<Unit40>
@ -426,127 +428,135 @@
<CursorPos X="15" Y="29"/>
<UsageCount Value="10"/>
</Unit43>
<Unit44>
<Filename Value="T:\fpclaz\laz\lcl\extctrls.pp"/>
<UnitName Value="ExtCtrls"/>
<WindowIndex Value="0"/>
<TopLine Value="427"/>
<CursorPos X="14" Y="444"/>
<UsageCount Value="10"/>
</Unit44>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="DLBmpUtils.inc"/>
<Caret Line="695" Column="61" TopLine="676"/>
<Filename Value="main.pas"/>
<Caret Line="3" Column="95" TopLine="1"/>
</Position1>
<Position2>
<Filename Value="picturectrls.pas"/>
<Caret Line="4" Column="90" TopLine="1"/>
<Filename Value="main.pas"/>
<Caret Line="503" Column="8" TopLine="487"/>
</Position2>
<Position3>
<Filename Value="picturectrls.pas"/>
<Caret Line="114" Column="63" TopLine="88"/>
<Filename Value="main.pas"/>
<Caret Line="308" Column="22" TopLine="292"/>
</Position3>
<Position4>
<Filename Value="picturectrls.pas"/>
<Caret Line="174" Column="20" TopLine="157"/>
<Caret Line="123" Column="21" TopLine="113"/>
</Position4>
<Position5>
<Filename Value="picturectrls.pas"/>
<Caret Line="438" Column="10" TopLine="427"/>
<Filename Value="picturemanager.pas"/>
<Caret Line="3" Column="93" TopLine="34"/>
</Position5>
<Position6>
<Filename Value="picturectrls.pas"/>
<Caret Line="643" Column="19" TopLine="617"/>
<Filename Value="picturemanager.pas"/>
<Caret Line="46" Column="30" TopLine="34"/>
</Position6>
<Position7>
<Filename Value="picturectrls.pas"/>
<Caret Line="663" Column="21" TopLine="637"/>
<Filename Value="main.pas"/>
<Caret Line="308" Column="22" TopLine="292"/>
</Position7>
<Position8>
<Filename Value="picturectrls.pas"/>
<Caret Line="739" Column="15" TopLine="713"/>
<Filename Value="main.pas"/>
<Caret Line="503" Column="7" TopLine="487"/>
</Position8>
<Position9>
<Filename Value="picturectrls.pas"/>
<Caret Line="757" Column="15" TopLine="731"/>
<Filename Value="main.pas"/>
<Caret Line="308" Column="22" TopLine="292"/>
</Position9>
<Position10>
<Filename Value="picturectrls.pas"/>
<Caret Line="841" Column="84" TopLine="824"/>
<Filename Value="picturemanager.pas"/>
<Caret Line="98" Column="41" TopLine="87"/>
</Position10>
<Position11>
<Filename Value="picturectrls.pas"/>
<Caret Line="842" Column="25" TopLine="824"/>
<Filename Value="picturemanager.pas"/>
<Caret Line="40" Column="3" TopLine="24"/>
</Position11>
<Position12>
<Filename Value="picturectrls.pas"/>
<Caret Line="887" Column="25" TopLine="873"/>
<Filename Value="main.pas"/>
<Caret Line="308" Column="22" TopLine="292"/>
</Position12>
<Position13>
<Filename Value="picturectrls.pas"/>
<Caret Line="911" Column="30" TopLine="885"/>
<Filename Value="main.pas"/>
<Caret Line="503" Column="49" TopLine="487"/>
</Position13>
<Position14>
<Filename Value="picturectrls.pas"/>
<Caret Line="3" Column="85" TopLine="1"/>
<Filename Value="main.pas"/>
<Caret Line="1123" Column="10" TopLine="1106"/>
</Position14>
<Position15>
<Filename Value="picturectrls.pas"/>
<Caret Line="78" Column="20" TopLine="52"/>
<Filename Value="main.pas"/>
<Caret Line="324" Column="41" TopLine="308"/>
</Position15>
<Position16>
<Filename Value="picturectrls.pas"/>
<Caret Line="114" Column="33" TopLine="91"/>
<Caret Line="174" Column="28" TopLine="163"/>
</Position16>
<Position17>
<Filename Value="picturectrls.pas"/>
<Caret Line="172" Column="20" TopLine="146"/>
<Caret Line="644" Column="35" TopLine="618"/>
</Position17>
<Position18>
<Filename Value="picturectrls.pas"/>
<Caret Line="477" Column="35" TopLine="451"/>
<Caret Line="666" Column="37" TopLine="640"/>
</Position18>
<Position19>
<Filename Value="picturectrls.pas"/>
<Caret Line="479" Column="20" TopLine="453"/>
<Filename Value="main.pas"/>
<Caret Line="324" Column="41" TopLine="308"/>
</Position19>
<Position20>
<Filename Value="picturectrls.pas"/>
<Caret Line="640" Column="20" TopLine="614"/>
<Filename Value="main.pas"/>
<Caret Line="4" Column="101" TopLine="1"/>
</Position20>
<Position21>
<Filename Value="picturectrls.pas"/>
<Caret Line="661" Column="23" TopLine="635"/>
<Filename Value="main.pas"/>
<Caret Line="156" Column="58" TopLine="150"/>
</Position21>
<Position22>
<Filename Value="picturectrls.pas"/>
<Caret Line="191" Column="95" TopLine="185"/>
<Filename Value="main.pas"/>
<Caret Line="176" Column="22" TopLine="150"/>
</Position22>
<Position23>
<Filename Value="picturectrls.pas"/>
<Caret Line="640" Column="21" TopLine="614"/>
<Filename Value="main.pas"/>
<Caret Line="278" Column="32" TopLine="252"/>
</Position23>
<Position24>
<Filename Value="picturectrls.pas"/>
<Caret Line="661" Column="23" TopLine="635"/>
<Filename Value="main.pas"/>
<Caret Line="69" Column="94" TopLine="66"/>
</Position24>
<Position25>
<Filename Value="picturectrls.pas"/>
<Caret Line="890" Column="30" TopLine="874"/>
<Filename Value="main.pas"/>
<Caret Line="503" Column="37" TopLine="480"/>
</Position25>
<Position26>
<Filename Value="bmprgbtypes.pas"/>
<Caret Line="123" Column="21" TopLine="107"/>
<Filename Value="main.pas"/>
<Caret Line="29" Column="75" TopLine="23"/>
</Position26>
<Position27>
<Filename Value="DLBitmap.pas"/>
<Caret Line="72" Column="26" TopLine="56"/>
<Filename Value="main.pas"/>
<Caret Line="45" Column="17" TopLine="23"/>
</Position27>
<Position28>
<Filename Value="DLBitmap.pas"/>
<Caret Line="533" Column="32" TopLine="515"/>
<Filename Value="picturectrls.pas"/>
<Caret Line="904" Column="41" TopLine="899"/>
</Position28>
<Position29>
<Filename Value="DLBitmap.pas"/>
<Caret Line="534" Column="32" TopLine="517"/>
<Filename Value="picturectrls.pas"/>
<Caret Line="214" Column="38" TopLine="198"/>
</Position29>
<Position30>
<Filename Value="DLBitmap.pas"/>
<Caret Line="532" Column="27" TopLine="514"/>
<Filename Value="main.pas"/>
<Caret Line="503" Column="87" TopLine="80"/>
</Position30>
</JumpHistory>
</ProjectOptions>

View File

@ -1,10 +1,10 @@
object MainForm: TMainForm
Left = 150
Left = 90
Height = 681
Top = 63
Top = 90
Width = 920
Caption = 'Lazarus Image Editor'
ClientHeight = 661
ClientHeight = 659
ClientWidth = 920
Font.CharSet = GB2312_CHARSET
Font.Height = -13
@ -18,18 +18,18 @@
LCLVersion = '0.9.31'
object PanelTools: TPanel
Left = 0
Height = 534
Height = 532
Top = 105
Width = 40
Align = alLeft
BevelOuter = bvNone
ClientHeight = 534
ClientHeight = 532
ClientWidth = 40
ParentColor = False
TabOrder = 0
object ToolBarTools: TToolBar
Left = 0
Height = 534
Height = 532
Top = 0
Width = 40
Align = alLeft
@ -160,22 +160,32 @@
Grouped = True
ImageIndex = 5
OnClick = ToolBrushClick
Style = tbsCheck
end
object ToolText: TToolButton
Left = 0
Hint = 'Text'
Top = 442
Caption = 'ToolBrush'
Grouped = True
ImageIndex = 5
OnClick = ToolTextClick
Style = tbsCheck
end
object ToolcolorReplacer: TToolButton
Left = 0
Hint = 'Institute Color'
Top = 482
Grouped = True
ImageIndex = 5
OnClick = ToolcolorReplacerClick
Style = tbsCheck
end
end
end
object StatusBar: TStatusBar
Left = 0
Height = 22
Top = 639
Top = 637
Width = 920
Panels = <
item
@ -202,18 +212,18 @@
end
object PanelPallete: TPanel
Left = 845
Height = 534
Height = 532
Top = 105
Width = 75
Align = alRight
AutoSize = True
BevelOuter = bvNone
ClientHeight = 534
ClientHeight = 532
ClientWidth = 75
TabOrder = 1
object Palette: TColorPalette
Left = 0
Height = 534
Height = 532
Top = 0
Width = 75
Align = alClient
@ -1375,9 +1385,9 @@
TabOrder = 5
object checkFuzzy: TCheckBox
Left = 4
Height = 21
Height = 23
Top = 5
Width = 22
Width = 24
OnChange = checkFuzzyChange
TabOrder = 0
end
@ -1386,7 +1396,7 @@
end
object PanelPictures: TPanel
Left = 40
Height = 534
Height = 532
Top = 105
Width = 805
Align = alClient

File diff suppressed because it is too large Load Diff

View File

@ -173,6 +173,7 @@ type
ToolBrush: TToolButton;
ToolButton1: TToolButton;
ToolText: TToolButton;
ToolcolorReplacer: TToolButton;
ZoomInBtn: TToolButton;
ZoomOutBtn: TToolButton;
ToolCircleShape: TSpeedButton;
@ -274,6 +275,7 @@ type
procedure spinFillAlphaChange(Sender: TObject);
procedure ToolBarToolsClick(Sender: TObject);
procedure ToolBrushClick(Sender: TObject);
procedure ToolcolorReplacerClick(Sender: TObject);
procedure ToolTextClick(Sender: TObject);
procedure ZoomInBtnClick(Sender: TObject);
procedure ZoomOutBtnClick(Sender: TObject);
@ -493,6 +495,14 @@ begin
ChangeTool(ptBrush);
end;
procedure TMainForm.ToolcolorReplacerClick(Sender: TObject);
begin
if not Pictures.CanEdit then
Exit;
ChangeTool(ptColorReplacer);
ActivePictureEdit.ChangeColor(BtnFromColor.ButtonColor, BtnToColor.ButtonColor);
end;
procedure TMainForm.ToolTextClick(Sender: TObject);
begin
if not Pictures.CanEdit then
@ -1343,7 +1353,7 @@ end;
procedure TMainForm.BtnToColorClick(Sender: TObject);
begin
ActivePictureEdit.ChangeColor(BtnFromColor.ButtonColor, BtnToColor.ButtonColor);
end;
procedure TMainForm.EditSizeChange(Sender: TObject);

View File

@ -111,7 +111,7 @@ type
tdRoundRectangle, tdPolygon);
TPictureEditTool = (ptLine, ptPen, ptRectangle, ptFloodFill, ptEllipse,
ptMask, ptColorPick, ptEraser, ptSpray, ptPolygon, ptBrush, ptText);
ptMask, ptColorPick, ptEraser, ptSpray, ptPolygon, ptBrush, ptText, ptColorReplacer);
TPicturePos = (ppTopLeft, ppTopCenter, ppTopRight, ppCenterLeft, ppCentered,
ppCenterRight, ppBottomLeft, ppBottomCenter, ppBottomRight);
@ -147,6 +147,7 @@ type
procedure SetPaperColor(const AValue: TColor);
procedure SetTool(const AValue: TPictureEditTool);
protected
FromColor, ToColor: TColor;
procedure Change; dynamic;
procedure ColorChange; dynamic;
procedure PictureSizeChange; dynamic;
@ -170,6 +171,7 @@ type
procedure FloodFill(X, Y: integer; Shift: TShiftState = [ssLeft]);
procedure MaskFloodFill(X, Y: integer; Shift: TShiftState = [ssLeft]);
procedure Eraser(X, Y: integer; Shift: TShiftState = [ssLeft]);
procedure ColorReplacer(X, Y: integer; Shift: TShiftState = [ssLeft]);
procedure Spray(X, Y: integer; Shift: TShiftState = [ssLeft]);
procedure Brush(X, Y: integer; Shift: TShiftState = [ssLeft]);
procedure Line(X1, Y1, X2, Y2: integer; Shift: TShiftState = [ssLeft]);
@ -209,6 +211,7 @@ type
procedure BeginDraw;
procedure EndDraw;
procedure UpdatePicture;
procedure ChangeColor(FrColor, taColor: TColor);
public
TextEditor: TTextEditor;
property DrawMode: TDrawMode read FDrawMode write FDrawMode;
@ -638,6 +641,7 @@ begin
MaskFloodFill(X, Y, Shift);
ptColorPick: ColorPick(X, Y, Shift);
ptEraser: Eraser(X, Y, Shift);
ptColorReplacer: ColorReplacer(X, Y, Shift);
ptSpray: Spray(X, Y, Shift);
ptText: ProcessEditorText(X, Y, X, Y);
ptBrush: Brush(X, Y, Shift);
@ -659,6 +663,7 @@ begin
Line(FTempPos.X, FTempPos.Y, X, Y, Shift);
end;
ptEraser: Eraser(X, Y, Shift);
ptColorReplacer: ColorReplacer(X, Y, Shift);
ptSpray: Spray(X, Y, Shift);
ptBrush: Brush(X, Y, Shift);
ptColorPick: ColorPick(X, Y, Shift);
@ -896,6 +901,39 @@ begin
InvalidatePictureRect(R);
end;
procedure TCustomPictureEdit.ChangeColor(FrColor, TaColor: TColor);
begin
FromColor := FrColor;
ToColor := TaColor;
end;
procedure TCustomPictureEdit.ColorReplacer(X, Y: integer; Shift: TShiftState = [ssLeft]);
var
R: TRect;
begin
if Picture = nil then
Exit;
BeginDraw;
if ssLeft in Shift then
Picture.EraseMode := ermErase;
if ssRight in Shift then
Picture.EraseMode := ermReplace;
try
R := Bounds(X - FSize div 2, Y - FSize div 2, FSize, FSize);
Picture.Canvas.Pen.Color := FPaperColor;
Picture.Canvas.Brush.Color := FpaperColor;
case Shape of
psRect: Picture.ReplaceRectColor(FromColor, ToColor, R, 6, stRoundRect);
psCircle: Picture.ReplaceRectColor(FromColor, ToColor, R, 6, stEllipse);
end;
finally
Picture.EraseMode := ermNone;
EndDraw;
end;
InvalidatePictureRect(R);
end;
procedure TCustomPictureEdit.Spray(X, Y: integer; Shift: TShiftState);
var
R: TRect;