spray and brush work.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1594 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
yangjixian
2011-04-21 14:42:45 +00:00
parent 0ba18ce46a
commit 8a6f96b85d
7 changed files with 912 additions and 609 deletions

View File

@ -1,4 +1,4 @@
unit DLBitmap; unit DLBitmap;
{$mode objfpc}{$H+} {$mode objfpc}{$H+}
@ -65,7 +65,8 @@ type
procedure CopyToClipboard; virtual; procedure CopyToClipboard; virtual;
procedure PasteFromClipboard; virtual; procedure PasteFromClipboard; virtual;
procedure Delete; virtual; procedure Delete; virtual;
procedure FloodFill (x,y:integer); procedure FloodFill(x, y: integer);
procedure Spray(x, y, radian: integer; PColor: TColor);
property FillColor: TColor read GetFillColor write SetFillColor; property FillColor: TColor read GetFillColor write SetFillColor;
property OutlineColor: TColor read GetOutlineColor write SetOutlineColor; property OutlineColor: TColor read GetOutlineColor write SetOutlineColor;
property PaperColor: TColor read GetPaperColor write SetPaperColor; property PaperColor: TColor read GetPaperColor write SetPaperColor;
@ -83,6 +84,10 @@ procedure InvertBitmap(aBitmap: TDLBitmap);
procedure ChangeRGB(SrcBmp: TDLBitmap; RedChange, GreenChange, BlueChange: integer); procedure ChangeRGB(SrcBmp: TDLBitmap; RedChange, GreenChange, BlueChange: integer);
procedure ChangeBrightness(SrcBmp: TDLBitmap; ValueChange: integer); procedure ChangeBrightness(SrcBmp: TDLBitmap; ValueChange: integer);
procedure ChangeContrast(SrcBmp: TDLBitmap; ValueChange: integer); procedure ChangeContrast(SrcBmp: TDLBitmap; ValueChange: integer);
procedure SprayPoints(DLBmp: TDLBitmap; X, Y: integer; Radians: integer; PColor: TColor);
function GetRColor(const Color: TColor): Byte;
function GetGColor(const Color: TColor): Byte;
function GetBColor(const Color: TColor): Byte;
implementation implementation
@ -364,10 +369,15 @@ begin
tmp.Free; tmp.Free;
end; end;
procedure TDLBitmap.FloodFill (x, y:integer); procedure TDLBitmap.FloodFill(x, y: integer);
begin begin
Canvas.Brush.Color := FFillColor; Canvas.Brush.Color := FFillColor;
Canvas.FloodFill(x, y, Canvas.Pixels[x,y], fsSurface); Canvas.FloodFill(x, y, Canvas.Pixels[x, y], fsSurface);
end;
procedure TDLBitmap.Spray(x, y, radian: integer; PColor: TColor);
begin
SprayPoints(Self, x, y, radian, PColor);
end; end;
procedure TDLBitmap.FillEllipse(X1, Y1, X2, Y2: integer); procedure TDLBitmap.FillEllipse(X1, Y1, X2, Y2: integer);

View File

@ -487,4 +487,76 @@ begin
DestBmp.Free; DestBmp.Free;
end; end;
procedure SetCanvasPixel(DLBmp: TDLBitmap; x, y: integer; aColor: TColor);
var SrcRow: pRGBATriple;
begin
if (x > 0) and (x < DLBmp.Width) and (y > 0) and (y < DLBmp.Height) then
//aCanvas.Pixels[x, y] := aColor;
begin
SrcRow := DLBmp.ScanLine[y];
SrcRow[x].rgbtRed:=GetRColor(aColor);
SrcRow[x].rgbtGreen:=GetGColor(aColor);
SrcRow[x].rgbtBlue:=GetBColor(aColor);
end;
end;
procedure SprayPoints(DLBmp: TDLBitmap; X, Y: integer; Radians: Integer; PColor: TColor);
var
i, a, b, temp, ci, center: Integer;
begin
if DLBmp = nil then
Exit;
Randomize;
for i := 0 to Radians do
begin
temp := Random(100);
a := Random(Round(Radians * 0.65));
if (temp < 50) then a := 0 - a;
temp := Random(100);
b := Random(Round(Radians * 0.65));
if (temp < 50) then b := 0 - b;
if (a * a + b * b < Sqr(Round(Radians * 0.65))) then
SetCanvasPixel(DLBmp, X + a, Y + b, PColor);
end;
for i := 0 to Radians div 3 do
begin
temp := Random(100);
a := Random(Round(Radians * 0.65));
if (temp < 50) then a := 0 - a;
temp := Random(100);
b := Random(Round(Radians * 0.65));
if (temp < 50) then b := 0 - b;
if (a * a + b * b < Sqr(Round(Radians * 0.65))) then
SetCanvasPixel(DLBmp, X + a, Y + b, PColor);
end;
for i := 0 to Radians * 2 div 3 do
begin
temp := Random(100);
a := Random(Round(Radians * 0.65));
if (temp < 50) then a := 0 - a;
temp := Random(100);
b := Random(Round(Radians * 0.65));
if (temp < 50) then b := 0 - b;
if (a * a + b * b < Sqr(Round(Radians * 0.65))) then
SetCanvasPixel(DLBmp, X + a, Y + b, PColor);
end;
DLBmp.InvalidateScanLine;
end;
function GetRColor(const Color: TColor): Byte;
begin
Result := Color and $FF;
end;
function GetGColor(const Color: TColor): Byte;
begin
Result := (Color and $FF00) shr 8;
end;
function GetBColor(const Color: TColor): Byte;
begin
Result := (Color and $FF0000) shr 16;
end;

View File

@ -41,7 +41,7 @@
<PackageName Value="LCL"/> <PackageName Value="LCL"/>
</Item3> </Item3>
</RequiredPackages> </RequiredPackages>
<Units Count="39"> <Units Count="41">
<Unit0> <Unit0>
<Filename Value="lazimageeditor.pas"/> <Filename Value="lazimageeditor.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
@ -50,7 +50,7 @@
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<CursorPos X="14" Y="4"/> <CursorPos X="14" Y="4"/>
<UsageCount Value="65"/> <UsageCount Value="68"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
@ -62,20 +62,21 @@
<UnitName Value="Main"/> <UnitName Value="Main"/>
<EditorIndex Value="0"/> <EditorIndex Value="0"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="534"/> <TopLine Value="224"/>
<CursorPos X="49" Y="551"/> <CursorPos X="29" Y="251"/>
<UsageCount Value="65"/> <UsageCount Value="68"/>
<Loaded Value="True"/> <Loaded Value="True"/>
<LoadedDesigner Value="True"/> <LoadedDesigner Value="True"/>
</Unit1> </Unit1>
<Unit2> <Unit2>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<UnitName Value="PictureCtrls"/> <UnitName Value="PictureCtrls"/>
<EditorIndex Value="4"/> <IsVisibleTab Value="True"/>
<EditorIndex Value="5"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="755"/> <TopLine Value="1031"/>
<CursorPos X="23" Y="758"/> <CursorPos X="39" Y="1047"/>
<UsageCount Value="29"/> <UsageCount Value="30"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit2> </Unit2>
<Unit3> <Unit3>
@ -182,7 +183,7 @@
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<CursorPos X="100" Y="4"/> <CursorPos X="100" Y="4"/>
<UsageCount Value="30"/> <UsageCount Value="31"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit13> </Unit13>
<Unit14> <Unit14>
@ -244,12 +245,10 @@
<Unit21> <Unit21>
<Filename Value="bmprgbtypes.pas"/> <Filename Value="bmprgbtypes.pas"/>
<UnitName Value="BmpRGBTypes"/> <UnitName Value="BmpRGBTypes"/>
<EditorIndex Value="5"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<CursorPos X="98" Y="4"/> <CursorPos X="98" Y="4"/>
<UsageCount Value="27"/> <UsageCount Value="27"/>
<Loaded Value="True"/>
</Unit21> </Unit21>
<Unit22> <Unit22>
<Filename Value="T:\fpclaz\laz\lcl\include\winapih.inc"/> <Filename Value="T:\fpclaz\laz\lcl\include\winapih.inc"/>
@ -359,12 +358,11 @@
<Unit35> <Unit35>
<Filename Value="DLBitmap.pas"/> <Filename Value="DLBitmap.pas"/>
<UnitName Value="DLBitmap"/> <UnitName Value="DLBitmap"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="3"/> <EditorIndex Value="3"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="346"/> <TopLine Value="351"/>
<CursorPos X="1" Y="371"/> <CursorPos X="19" Y="380"/>
<UsageCount Value="12"/> <UsageCount Value="13"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit35> </Unit35>
<Unit36> <Unit36>
@ -391,127 +389,144 @@
<CursorPos X="29" Y="64"/> <CursorPos X="29" Y="64"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
</Unit38> </Unit38>
<Unit39>
<Filename Value="DLBmpUtils.inc"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="509"/>
<CursorPos X="28" Y="543"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit39>
<Unit40>
<Filename Value="T:\fpclaz\laz\ide\main.pp"/>
<UnitName Value="Main"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="91" Y="1811"/>
<UsageCount Value="10"/>
</Unit40>
</Units> </Units>
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="597" Column="55" TopLine="575"/> <Caret Line="683" Column="54" TopLine="667"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="596" Column="21" TopLine="586"/> <Caret Line="1015" Column="36" TopLine="994"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="166" Column="24" TopLine="150"/> <Caret Line="1038" Column="20" TopLine="1022"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="167" Column="28" TopLine="150"/> <Caret Line="375" Column="24" TopLine="354"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="213" Column="82" TopLine="186"/> <Caret Line="490" Column="41" TopLine="480"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="596" Column="25" TopLine="569"/> <Caret Line="507" Column="29" TopLine="497"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="597" Column="55" TopLine="570"/> <Caret Line="87" Column="54" TopLine="65"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="641" Column="37" TopLine="614"/> <Caret Line="375" Column="24" TopLine="347"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="658" Column="18" TopLine="631"/> <Caret Line="497" Column="22" TopLine="487"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="703" Column="12" TopLine="676"/> <Caret Line="499" Column="41" TopLine="478"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="picturectrls.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="766" Column="13" TopLine="748"/> <Caret Line="91" Column="1" TopLine="65"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="771" Column="54" TopLine="756"/> <Caret Line="8" Column="97" TopLine="3"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="774" Column="43" TopLine="756"/> <Caret Line="111" Column="32" TopLine="79"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="784" Column="26" TopLine="757"/> <Caret Line="114" Column="54" TopLine="85"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="5" Column="95" TopLine="1"/> <Caret Line="178" Column="22" TopLine="146"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="111" Column="62" TopLine="84"/> <Caret Line="668" Column="55" TopLine="822"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="117" Column="51" TopLine="90"/> <Caret Line="680" Column="14" TopLine="661"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="127" Column="15" TopLine="100"/> <Caret Line="684" Column="21" TopLine="661"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="166" Column="24" TopLine="139"/> <Caret Line="699" Column="35" TopLine="682"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="167" Column="28" TopLine="140"/> <Caret Line="737" Column="27" TopLine="708"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="213" Column="82" TopLine="186"/> <Caret Line="738" Column="12" TopLine="708"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="596" Column="20" TopLine="581"/> <Caret Line="3" Column="103" TopLine="1"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="166" Column="24" TopLine="150"/> <Caret Line="111" Column="32" TopLine="79"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="167" Column="28" TopLine="150"/> <Caret Line="114" Column="54" TopLine="82"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="213" Column="82" TopLine="186"/> <Caret Line="178" Column="22" TopLine="146"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="596" Column="20" TopLine="570"/> <Caret Line="690" Column="12" TopLine="657"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="166" Column="22" TopLine="150"/> <Caret Line="689" Column="30" TopLine="665"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="162" Column="49" TopLine="147"/> <Caret Line="684" Column="40" TopLine="665"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="517" Column="36" TopLine="511"/> <Caret Line="686" Column="20" TopLine="667"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="173" Column="59" TopLine="151"/> <Caret Line="1049" Column="31" TopLine="1029"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
</ProjectOptions> </ProjectOptions>

View File

@ -1,7 +1,7 @@
object MainForm: TMainForm object MainForm: TMainForm
Left = 260 Left = 135
Height = 681 Height = 681
Top = 147 Top = 90
Width = 935 Width = 935
Caption = 'Lazarus Image Editor' Caption = 'Lazarus Image Editor'
ClientHeight = 659 ClientHeight = 659
@ -151,6 +151,13 @@
ShowHint = True ShowHint = True
Style = tbsCheck Style = tbsCheck
end end
object ToolBrush: TToolButton
Left = 0
Top = 402
Caption = 'ToolBrush'
ImageIndex = 5
OnClick = ToolBrushClick
end
end end
end end
object StatusBar: TStatusBar object StatusBar: TStatusBar
@ -1262,8 +1269,8 @@
object spinFillAlpha: TSpinEdit object spinFillAlpha: TSpinEdit
Left = 10 Left = 10
Height = 27 Height = 27
Top = 5 Top = 3
Width = 51 Width = 53
OnChange = spinFillAlphaChange OnChange = spinFillAlphaChange
TabOrder = 0 TabOrder = 0
Value = 100 Value = 100
@ -1292,9 +1299,9 @@
TabOrder = 5 TabOrder = 5
object checkFuzzy: TCheckBox object checkFuzzy: TCheckBox
Left = 4 Left = 4
Height = 19 Height = 23
Top = 9 Top = 9
Width = 20 Width = 24
OnChange = checkFuzzyChange OnChange = checkFuzzyChange
TabOrder = 0 TabOrder = 0
end end

File diff suppressed because it is too large Load Diff

View File

@ -163,6 +163,7 @@ type
PanelTools: TPanel; PanelTools: TPanel;
ExportResourceDialog: TSaveDialog; ExportResourceDialog: TSaveDialog;
SavePictureDialog: TSavePictureDialog; SavePictureDialog: TSavePictureDialog;
ToolBrush: TToolButton;
ZoomInBtn: TToolButton; ZoomInBtn: TToolButton;
ZoomOutBtn: TToolButton; ZoomOutBtn: TToolButton;
ToolCircleShape: TSpeedButton; ToolCircleShape: TSpeedButton;
@ -257,6 +258,7 @@ type
procedure Rotate270Execute(Sender: TObject); procedure Rotate270Execute(Sender: TObject);
procedure Rotate90Execute(Sender: TObject); procedure Rotate90Execute(Sender: TObject);
procedure spinFillAlphaChange(Sender: TObject); procedure spinFillAlphaChange(Sender: TObject);
procedure ToolBrushClick(Sender: TObject);
procedure ZoomInBtnClick(Sender: TObject); procedure ZoomInBtnClick(Sender: TObject);
procedure ZoomOutBtnClick(Sender: TObject); procedure ZoomOutBtnClick(Sender: TObject);
procedure ToolCircleShapeClick(Sender: TObject); procedure ToolCircleShapeClick(Sender: TObject);
@ -461,6 +463,13 @@ begin
ActivePictureEdit.FillAlpha := spinFillAlpha.Value; ActivePictureEdit.FillAlpha := spinFillAlpha.Value;
end; end;
procedure TMainForm.ToolBrushClick(Sender: TObject);
begin
if not Pictures.CanEdit then
Exit;
ChangeTool(ptBrush);
end;
procedure TMainForm.ZoomInBtnClick(Sender: TObject); procedure TMainForm.ZoomInBtnClick(Sender: TObject);
var var
V, E: integer; V, E: integer;

File diff suppressed because it is too large Load Diff