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+}
@ -65,7 +65,8 @@ type
procedure CopyToClipboard; virtual;
procedure PasteFromClipboard; 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 OutlineColor: TColor read GetOutlineColor write SetOutlineColor;
property PaperColor: TColor read GetPaperColor write SetPaperColor;
@ -83,6 +84,10 @@ procedure InvertBitmap(aBitmap: TDLBitmap);
procedure ChangeRGB(SrcBmp: TDLBitmap; RedChange, GreenChange, BlueChange: integer);
procedure ChangeBrightness(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
@ -364,10 +369,15 @@ begin
tmp.Free;
end;
procedure TDLBitmap.FloodFill (x, y:integer);
procedure TDLBitmap.FloodFill(x, y: integer);
begin
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;
procedure TDLBitmap.FillEllipse(X1, Y1, X2, Y2: integer);

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff