git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.jvcl@19 7f62d464-2af8-f54e-996c-e91b33f51cbe
5034 lines
132 KiB
ObjectPascal
5034 lines
132 KiB
ObjectPascal
{-----------------------------------------------------------------------------
|
||
The contents of this file are subject to the Mozilla Public License
|
||
Version 1.1 (the "License"); you may not use this file except in compliance
|
||
with the License. You may obtain a copy of the License at
|
||
http://www.mozilla.org/MPL/MPL-1.1.html
|
||
|
||
Software distributed under the License is distributed on an "AS IS" basis,
|
||
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
||
the specific language governing rights and limitations under the License.
|
||
|
||
The Original Code is: JvDrawImage.PAS, released on 2002-06-15.
|
||
|
||
The Initial Developer of the Original Code is Jan Verhoeven [jan1 dott verhoeven att wxs dott nl]
|
||
Portions created by Jan Verhoeven are Copyright (C) 2002 Jan Verhoeven.
|
||
All Rights Reserved.
|
||
|
||
Contributor(s): Robert Love [rlove att slcdug dott org].
|
||
|
||
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
||
located at http://jvcl.delphi-jedi.org
|
||
|
||
Known Issues:
|
||
-----------------------------------------------------------------------------}
|
||
// $Id: JvDrawImage.pas 12461 2009-08-14 17:21:33Z obones $
|
||
|
||
unit JvDrawImage;
|
||
|
||
{$I jvcl.inc}
|
||
|
||
interface
|
||
|
||
uses
|
||
{$IFDEF UNITVERSIONING}
|
||
JclUnitVersioning,
|
||
{$ENDIF UNITVERSIONING}
|
||
Windows,
|
||
Messages,
|
||
Classes, Graphics, Controls, ExtCtrls,
|
||
JvAirBrush, JvPaintFX;
|
||
|
||
type
|
||
TSmartResizeMode = (rmWidth, rmHeight, rmSquare);
|
||
TMorphBrush = (mbVerBox, mbHorBox, mbVerOval, mbHorOval);
|
||
TDigitalFilter = array [0..4, 0..4] of Smallint;
|
||
TColorPicked = procedure(Sender: TObject; AColor: TColor) of object;
|
||
TGonio = array [0..180, 0..1] of Extended;
|
||
TSinPix = array [0..255] of Byte;
|
||
|
||
TJvDrawImage = class(TImage)
|
||
private
|
||
FGonio: TGonio;
|
||
FSinPixs: TSinPix;
|
||
FShape: string;
|
||
FShapes: TStringList;
|
||
FZoomClip: TBitmap;
|
||
FAirBrush: TJvAirBrush;
|
||
FPolygonChecked: Boolean;
|
||
FOnColorPicked: TColorPicked;
|
||
FBlocks: Integer;
|
||
FStars: Integer;
|
||
FStarPoints: Integer;
|
||
FSpirals: Integer;
|
||
function GetShapes: TStrings;
|
||
procedure EscapePaint(X, Y: Integer; Shift: TShiftState);
|
||
procedure CopyClip;
|
||
procedure SetClip(AColor: TColor);
|
||
procedure InitPlasma;
|
||
function MixColors(Color1, Color2: TColor): TColor;
|
||
function GetBlue(AColor: TColor): Byte;
|
||
function GetGreen(AColor: TColor): Byte;
|
||
function GetRed(AColor: TColor): Byte;
|
||
procedure SetSyms(X, Y: Integer);
|
||
function Rotate(Origin, Endpoint: TPoint; Angle: Real): TPoint;
|
||
procedure DrawPlasma(X, Y: Integer; Amount: Extended);
|
||
procedure DrawEffectBrush(X, Y, Radius: Integer; Amount: Extended;
|
||
Style: TLightBrush);
|
||
procedure Rimple(Src, Dst: TBitmap; Amount: Extended);
|
||
procedure DrawStretchBrush(X, Y, Radius: Integer; Amount: Extended;
|
||
Style: TMorphBrush);
|
||
procedure SampleStretch(Src, Dst: TBitmap);
|
||
procedure DrawLightBrush(X, Y, Radius, Amount: Integer;
|
||
Style: TLightBrush);
|
||
procedure DrawColorCircle(X, Y, Mode: Integer);
|
||
procedure ColorCircle(var bm: TBitmap; center: TPoint; Radius,
|
||
Mode: Integer);
|
||
procedure DrawDarkerCircle(X, Y, Mode: Integer);
|
||
procedure DrawLighterCircle(X, Y, Mode: Integer);
|
||
procedure DrawGradientBrush(Color1, Color2: TColor; X1, X2,
|
||
Y: Integer);
|
||
procedure HorGradientLine(Bitmap: TBitmap; XOrigin, XFinal, Y: Integer;
|
||
R1, G1, B1, R2, G2, B2: Byte; Smooth: Boolean);
|
||
procedure SmoothPnt(Bitmap: TBitmap; xk, yk: Integer);
|
||
procedure DrawVGradientBrush(Color1, Color2: TColor; Y1, Y2,
|
||
X: Integer);
|
||
procedure VerGradientLine(Bitmap: TBitmap; YOrigin, YFinal, X: Integer;
|
||
R1, G1, B1, R2, G2, B2: Byte; Smooth: Boolean);
|
||
procedure DrawCube;
|
||
function PointToBlock(X, Y: Integer): TRect;
|
||
procedure DrawSkew;
|
||
procedure DrawTriangle;
|
||
procedure PutClip(M: TRect);
|
||
procedure DrawSyms(X, Y: Integer);
|
||
procedure DrawTexLines(X0, Y0, X, Y: Integer);
|
||
function BlendColors(const Color1, Color2: Integer;
|
||
Opacity: Integer): Longint;
|
||
function TexHighlight(Colr: Integer): Longint;
|
||
function TexShadow(Colr: Integer): Longint;
|
||
procedure DrawTexOvals(X0, Y0, X, Y: Integer);
|
||
procedure DrawBlurOvals(X0, Y0, X, Y: Integer);
|
||
procedure DrawTexCurves(X0, Y0, X, Y: Integer);
|
||
procedure DrawBlurCurves(X0, Y0, X, Y: Integer);
|
||
procedure DrawTexPoly(X0, Y0, X, Y: Integer);
|
||
procedure DrawBlurPoly(X0, Y0, X, Y: Integer);
|
||
procedure DrawTexRects(X0, Y0, X, Y: Integer);
|
||
procedure DrawBlurRects(X0, Y0, X, Y: Integer);
|
||
procedure DrawBlurLines(X0, Y0, X, Y: Integer);
|
||
procedure InterpRect(X1, Y1, X2, Y2: Integer);
|
||
procedure InterpolateRect(Bmp: TBitmap; X1, Y1, X2, Y2: Integer);
|
||
procedure DrawColumn(X1, Y1, X2, Y2: Integer);
|
||
procedure Column(Bitmap: TBitmap; XOrigin, XFinal, YOrigin,
|
||
YFinal: Integer; R1, G1, B1, R2, G2, B2: Byte; Smooth: Boolean);
|
||
procedure DrawSphere(Color1, Color2: TColor; X1, Y1, X2, Y2: Integer);
|
||
procedure Sphere(Bitmap: TBitmap; xcenter, a, ycenter, b: Integer; R1,
|
||
G1, B1, R2, G2, B2: Byte; Smooth: Boolean);
|
||
procedure DrawMultiSphere(Color1, Color2: TColor; X1, Y1, X2,
|
||
Y2: Integer);
|
||
procedure DrawDropletSphere(Color1, Color2: TColor; X1, Y1, X2,
|
||
Y2: Integer);
|
||
procedure DrawWaveSphere(Color1, Color2: TColor; X1, Y1, X2,
|
||
Y2: Integer);
|
||
procedure DrawRisingWaveSphere(Color1, Color2: TColor; X1, Y1, X2,
|
||
Y2: Integer);
|
||
// function GetAngle(Origin, Endpoint: TPoint): Integer;
|
||
// procedure TextRotate(X, Y, Angle: Integer; AText: string; AFont: TFont);
|
||
function ReduceVector(Origin, Endpoint: TPoint; Factor: Real): TPoint;
|
||
procedure Star(X, Y: Integer);
|
||
procedure SetPolygonChecked(const Value: Boolean);
|
||
procedure DrawSpiro(center, Radius: TPoint);
|
||
procedure DrawBars(X1, Y1, X2, Y2: Integer);
|
||
procedure Drawborders(X1, Y1, X2, Y2: Integer);
|
||
procedure SetonColorPicked(const Value: TColorPicked);
|
||
procedure SetShape(const Value: string);
|
||
procedure SetAirBrush(const Value: TJvAirBrush);
|
||
procedure SetTransformer(const Value: TJvPaintFX);
|
||
procedure BuildShapeList;
|
||
procedure SetBlocks(const Value: Integer);
|
||
procedure SetSpirals(const Value: Integer);
|
||
procedure SetStarPoints(const Value: Integer);
|
||
procedure SetStars(const Value: Integer);
|
||
procedure FillGonio;
|
||
procedure FillSinPixs;
|
||
procedure Shear(ABitmap: TBitmap; Amount: Integer);
|
||
procedure XFormA(Amount: Integer);
|
||
protected
|
||
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
||
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
||
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
||
procedure ColorPicked(AColor: TColor);
|
||
procedure Loaded; override;
|
||
public
|
||
Clip: TBitmap;
|
||
TraceB: Byte;
|
||
FX: TJvPaintFX;
|
||
constructor Create(AOwner: TComponent); override;
|
||
destructor Destroy; override;
|
||
procedure ClipAll;
|
||
procedure Effects;
|
||
procedure Backgrounds;
|
||
procedure Preview(ABitmap: TBitmap);
|
||
procedure ApplyFilter(var Dst: TBitmap; DF: TDigitalFilter);
|
||
procedure BlurBarChange(Sender: TObject);
|
||
procedure ColorNoiseBarChange(Sender: TObject);
|
||
procedure ContrastBarChange(Sender: TObject);
|
||
procedure DrawBlend;
|
||
procedure DrawMandelJulia(Mandel: Boolean);
|
||
procedure DrawMap;
|
||
procedure DrawSolarize;
|
||
procedure DrawTriangles;
|
||
procedure EmbossBarChange;
|
||
procedure FilterBlueBarChange;
|
||
procedure FilterGreenBarChange;
|
||
procedure FilterRedBarChange;
|
||
procedure FilterXBlueBarChange;
|
||
procedure FilterXGreenBarChange;
|
||
procedure FilterXRedBarChange;
|
||
procedure FisheyeBarChange;
|
||
procedure LightnessBarChange(Sender: TObject);
|
||
procedure Marble2BarChange;
|
||
procedure Marble3BarChange;
|
||
procedure Marble4BarChange;
|
||
procedure Marble5BarChange;
|
||
procedure Marble6BarChange;
|
||
procedure Marble7BarChange;
|
||
procedure Marble8BarChange;
|
||
procedure MarbleBarChange;
|
||
procedure MonoNoiseBarChange(Sender: TObject);
|
||
procedure MosaicBarChange;
|
||
procedure PlasmaBarChange;
|
||
procedure Posterize;
|
||
procedure RippleRandom;
|
||
procedure RippleTooth;
|
||
procedure RippleTriangle;
|
||
procedure RotateBar;
|
||
procedure SaturationBarChange(Sender: TObject);
|
||
procedure SeamBarChange;
|
||
procedure ShearBarChange;
|
||
procedure SmoothBarChange(Sender: TObject);
|
||
procedure SplitBlurBarChange(Sender: TObject);
|
||
procedure SplitRoundBarChange;
|
||
procedure SplitWasteBarChange;
|
||
procedure SqueezeBotBarChange;
|
||
procedure SqueezeDiamondBarChange;
|
||
procedure SqueezeHorBarChange;
|
||
procedure SqueezeRound2BarChange;
|
||
procedure SqueezeRoundBarChange;
|
||
procedure SqueezeTopBarChange;
|
||
procedure SqueezeWasteBarChange;
|
||
procedure TexturizeOverlap;
|
||
procedure TexturizeTile;
|
||
procedure TwistBarChange;
|
||
procedure WaveBarChange;
|
||
procedure WaveExtraChange;
|
||
procedure WaveInfChange;
|
||
procedure XFormABarChange;
|
||
procedure Trace;
|
||
property AirBrush: TJvAirBrush read FAirBrush write SetAirBrush;
|
||
property Transformer: TJvPaintFX read FX write SetTransformer;
|
||
property Shapes: TStrings read GetShapes;
|
||
published
|
||
property Shape: string read FShape write SetShape;
|
||
property PolygonChecked: Boolean read FPolygonChecked write SetPolygonChecked;
|
||
property Stars: Integer read FStars write SetStars;
|
||
property StarPoints: Integer read FStarPoints write SetStarPoints;
|
||
property Blocks: Integer read FBlocks write SetBlocks;
|
||
property Spirals: Integer read FSpirals write SetSpirals;
|
||
property OnColorPicked: TColorPicked read FOnColorPicked write SetOnColorPicked;
|
||
end;
|
||
|
||
{$IFDEF UNITVERSIONING}
|
||
const
|
||
UnitVersioning: TUnitVersionInfo = (
|
||
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_39/run/JvDrawImage.pas $';
|
||
Revision: '$Revision: 12461 $';
|
||
Date: '$Date: 2009-08-14 19:21:33 +0200 (ven., 14 août 2009) $';
|
||
LogPath: 'JVCL\run'
|
||
);
|
||
{$ENDIF UNITVERSIONING}
|
||
|
||
implementation
|
||
|
||
uses
|
||
SysUtils, Math, Dialogs, Clipbrd,
|
||
JvResample, JvPainterEffectsForm, JvQuickPreviewForm, JvPainterQBForm,
|
||
JvTypes, JvResources;
|
||
|
||
const
|
||
// Texture constants
|
||
DarkStrength = 0.82;
|
||
StrongBlend = 52;
|
||
WeakBlend = 36;
|
||
|
||
BlurFilter: TDigitalFilter =
|
||
((1, 1, 1, 1, 1),
|
||
(1, 0, 0, 0, 1),
|
||
(1, 0, 0, 0, 1),
|
||
(1, 0, 0, 0, 1),
|
||
(1, 1, 1, 1, 1));
|
||
|
||
type
|
||
TFColor = record
|
||
B: Byte;
|
||
G: Byte;
|
||
R: Byte;
|
||
end;
|
||
|
||
Tmybezier = array [0..3] of TPoint;
|
||
Tmyskew = array [0..4] of TPoint;
|
||
Tmychord = array [1..8] of Integer;
|
||
Tpointarray = array [0..12] of TPoint;
|
||
Tfreepoly = array [0..100] of TPoint;
|
||
|
||
var
|
||
PainterEffectsF: TPainterEffectsForm;
|
||
QuickPreviewF: TQuickPreviewForm;
|
||
PainterQBF: TPainterQBForm;
|
||
|
||
mycliprect: TRect;
|
||
UserFilter: TDigitalFilter;
|
||
|
||
RangeTransColor: TColor;
|
||
|
||
NSpiro: Integer;
|
||
Wavepen, Wavebrush: TColor;
|
||
decoX, decoY: Integer;
|
||
|
||
mybezier: Tmybezier;
|
||
myskew: Tmyskew;
|
||
mychord: Tmychord;
|
||
myorigin, myprevpoint: TPoint;
|
||
myslinedir: string;
|
||
myslinetol: Integer;
|
||
myDraw: Boolean;
|
||
mypen: TPenMode;
|
||
mypenstyle: TPenStyle;
|
||
myoldbrushstyle: TBrushStyle;
|
||
myoldpenwidth: Integer;
|
||
myround: Integer;
|
||
|
||
clipcm: TCopyMode;
|
||
|
||
pointarray: Tpointarray;
|
||
spiralfactor: Real;
|
||
spiraldir: Integer;
|
||
TargetPoint: TPoint;
|
||
zoomrect: TRect;
|
||
freepoly: Tfreepoly;
|
||
freepolycount: Integer;
|
||
bezierfix1, bezierfix2: Boolean;
|
||
|
||
function TrimInt(N, Min, Max: Integer): Integer;
|
||
begin
|
||
if N > Max then
|
||
Result := Max
|
||
else
|
||
if N < Min then
|
||
Result := Min
|
||
else
|
||
Result := N;
|
||
end;
|
||
|
||
function IntToByte(N: Integer): Byte;
|
||
begin
|
||
if N > 255 then
|
||
Result := 255
|
||
else
|
||
if N < 0 then
|
||
Result := 0
|
||
else
|
||
Result := N;
|
||
end;
|
||
|
||
constructor TJvDrawImage.Create(AOwner: TComponent);
|
||
begin
|
||
inherited Create(AOwner);
|
||
Width := 256;
|
||
Height := 256;
|
||
Clip := TBitmap.Create;
|
||
FZoomClip := TBitmap.Create;
|
||
FAirBrush := TJvAirBrush.Create(Self);
|
||
FX := TJvPaintFX.Create(Self);
|
||
TargetPoint := Point(0, 0);
|
||
NSpiro := 40;
|
||
RangeTransColor := clWhite;
|
||
zoomrect := Rect(0, 0, 50, 50);
|
||
mycliprect := Rect(0, 0, 256, 256);
|
||
//spiral number, direction and Factor
|
||
Spirals := 3;
|
||
spiralfactor := 0.99;
|
||
spiraldir := 1;
|
||
// number of points for Star shape
|
||
StarPoints := 5;
|
||
Stars := 1;
|
||
// tolerance for straight line Drawing
|
||
myslinetol := 5;
|
||
|
||
mypenstyle := psSolid;
|
||
// number of Blocks wide and heigh
|
||
Blocks := 32;
|
||
// rounding of roundrect
|
||
myround := 10;
|
||
// default Drawing Mode
|
||
Shape := 'line';
|
||
FillSinPixs;
|
||
FillGonio;
|
||
TraceB := $00;
|
||
FShapes := TStringList.Create;
|
||
BuildShapeList;
|
||
PainterEffectsF := TPainterEffectsForm.Create(Self);
|
||
PainterEffectsF.setDrawImage(Self);
|
||
QuickPreviewF := TQuickPreviewForm.Create(Self);
|
||
QuickPreviewF.SetDrawImage(Self);
|
||
PainterQBF := TPainterQBForm.Create(Self);
|
||
PainterQBF.setDrawImage(Self);
|
||
end;
|
||
|
||
destructor TJvDrawImage.Destroy;
|
||
begin
|
||
FShapes.Free;
|
||
Clip.Free;
|
||
FZoomClip.Free;
|
||
FAirBrush.Free;
|
||
FX.Free;
|
||
PainterEffectsF.Free;
|
||
QuickPreviewF.Free;
|
||
PainterQBF.Free;
|
||
inherited Destroy;
|
||
end;
|
||
|
||
function TJvDrawImage.GetShapes: TStrings;
|
||
begin
|
||
Result := FShapes;
|
||
end;
|
||
|
||
// Start of filter procedures
|
||
|
||
procedure TJvDrawImage.FillGonio;
|
||
var
|
||
A0: Extended;
|
||
I: Integer;
|
||
begin
|
||
A0 := Pi / 180;
|
||
for I := 0 to 180 do
|
||
SinCos(A0 * (I - 90), FGonio[I, 0], FGonio[I, 1]);
|
||
end;
|
||
|
||
procedure TJvDrawImage.FillSinPixs;
|
||
var
|
||
I: Integer;
|
||
begin
|
||
for I := 0 to 255 do
|
||
FSinPixs[I] := Variant(Sin(I / 255 * Pi / 2) * 255);
|
||
end;
|
||
|
||
procedure TJvDrawImage.Shear(ABitmap: TBitmap; Amount: Integer);
|
||
var
|
||
bm: TBitmap;
|
||
p1, p2: PByteArray;
|
||
X, dx, Y, h, w, c1, c2: Integer;
|
||
f: Extended;
|
||
begin
|
||
bm := TBitmap.Create;
|
||
h := ABitmap.Height;
|
||
w := ABitmap.Width;
|
||
bm.Width := w;
|
||
bm.Height := h;
|
||
f := w / (w + (Amount / 100) * h);
|
||
bm.PixelFormat := pf24bit;
|
||
ABitmap.PixelFormat := pf24bit;
|
||
for Y := 0 to h - 1 do
|
||
begin
|
||
p1 := ABitmap.ScanLine[Y];
|
||
p2 := bm.ScanLine[Y];
|
||
dx := Round(Amount / 100 * Y);
|
||
for X := 0 to w - 1 do
|
||
begin
|
||
c1 := X * 3;
|
||
c2 := Round(f * (X + dx)) * 3;
|
||
p2[c2] := p1[c1];
|
||
p2[c2 + 1] := p1[c1 + 1];
|
||
p2[c2 + 2] := p1[c1 + 2];
|
||
end;
|
||
end;
|
||
ABitmap.Assign(bm);
|
||
bm.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.XFormA(Amount: Integer);
|
||
var
|
||
X, Y, i: Integer;
|
||
p1: pbytearray;
|
||
begin
|
||
for i := 1 to Amount do
|
||
for Y := 0 to Clip.Height - 1 do
|
||
begin
|
||
p1 := Clip.ScanLine[Y];
|
||
for X := 0 to Clip.Width - 1 do
|
||
begin
|
||
p1[X * 3] := FSinPixs[p1[X * 3]];
|
||
p1[X * 3 + 1] := FSinPixs[p1[X * 3 + 1]];
|
||
p1[X * 3 + 2] := FSinPixs[p1[X * 3 + 2]];
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Drawborders(X1, Y1, X2, Y2: Integer);
|
||
var
|
||
h, w: Integer;
|
||
begin
|
||
h := clientheight;
|
||
w := clientwidth;
|
||
Canvas.FillRect(Rect(0, 0, w, Y2 - Y1));
|
||
Canvas.FillRect(Rect(0, h - (Y2 - Y1), w, h));
|
||
Canvas.FillRect(Rect(0, 0, X2 - X1, h));
|
||
Canvas.FillRect(Rect(w - (X2 - X1), 0, w, h));
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawBars(X1, Y1, X2, Y2: Integer);
|
||
var
|
||
h, w: Integer;
|
||
begin
|
||
h := clientheight;
|
||
w := clientwidth;
|
||
if Y1 < 10 then
|
||
Y1 := 0;
|
||
if Y2 > (h - 10) then
|
||
Y2 := h;
|
||
X1 := 0;
|
||
X2 := w;
|
||
Canvas.FillRect(Rect(X1, Y1, X2, Y2));
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawSpiro(center, Radius: TPoint);
|
||
var
|
||
X0, X1, Y0, Y1, a0, a1, da0, da1: Real;
|
||
xs, ys, X, Y, r0, R1: Integer;
|
||
i: Integer;
|
||
begin
|
||
xs := Picture.Bitmap.Width div 2;
|
||
ys := Picture.Bitmap.Height div 2;
|
||
if xs <> ys then
|
||
begin
|
||
ShowMessage(RsImageMustBeSquare);
|
||
Exit;
|
||
end;
|
||
r0 := Variant(Sqrt(Sqr(center.X - xs) + Sqr(center.Y - ys)));
|
||
R1 := Variant(Sqrt(Sqr(Radius.X - center.X) + Sqr(Radius.Y - center.Y)));
|
||
if (r0 + R1) > xs then
|
||
begin
|
||
ShowMessage(RsSumOfRadiTolarge);
|
||
Exit;
|
||
end;
|
||
if (r0 < 5) or (R1 < 5) then
|
||
begin
|
||
ShowMessage(Format(RsBothRadiMustBeGr, [5]));
|
||
Exit;
|
||
end;
|
||
da1 := 2 * pi / 36;
|
||
da0 := R1 / r0 * da1;
|
||
a0 := 0;
|
||
a1 := 0;
|
||
Canvas.MoveTo(xs + r0 + R1, ys);
|
||
for i := 1 to 36 * NSpiro do
|
||
begin
|
||
X1 := R1 * Cos(a1);
|
||
Y1 := R1 * Sin(a1);
|
||
a1 := a1 + da1;
|
||
X0 := r0 * Cos(a0);
|
||
Y0 := r0 * Sin(a0);
|
||
a0 := a0 + da0;
|
||
X := Variant(xs + X0 + X1);
|
||
Y := Variant(ys + Y0 + Y1);
|
||
Canvas.LineTo(X, Y)
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Star(X, Y: Integer);
|
||
var
|
||
i, X0, Y0, damult: Integer;
|
||
apoint: TPoint;
|
||
da: Real;
|
||
begin
|
||
X0 := myorigin.X;
|
||
Y0 := myorigin.Y;
|
||
//777 d := Abs(Y - Y0);
|
||
damult := 1;
|
||
if not PolygonChecked then
|
||
begin
|
||
case StarPoints of
|
||
5: damult := 2;
|
||
7: damult := 3;
|
||
9: damult := 4;
|
||
11: damult := 5;
|
||
end;
|
||
end;
|
||
da := damult * 2 * pi / StarPoints;
|
||
with Canvas do
|
||
begin
|
||
pointarray[0] := Point(X, Y);
|
||
// MoveTo(X,Y);
|
||
apoint := Point(X, Y);
|
||
for i := 1 to StarPoints - 1 do
|
||
begin
|
||
// apoint:=Rotate(Point(X0,Y0),apoint,da);
|
||
// LineTo(apoint.X,apoint.Y);
|
||
apoint := Rotate(Point(X0, Y0), apoint, da);
|
||
pointarray[i] := apoint;
|
||
end;
|
||
// LineTo(X,Y);
|
||
Polygon(Slice(PointArray, StarPoints))
|
||
end;
|
||
end;
|
||
|
||
function TJvDrawImage.ReduceVector(Origin, Endpoint: TPoint;
|
||
Factor: Real): TPoint;
|
||
var
|
||
a, d, r: Real;
|
||
begin
|
||
r := Sqrt(Sqr(Endpoint.X - Origin.X) + Sqr(Endpoint.Y - Origin.Y));
|
||
d := Endpoint.X - Origin.X;
|
||
if (d >= 0) and (d < 0.001) then
|
||
d := 0.001;
|
||
if (d < 0) and (d > -0.001) then
|
||
d := -0.001;
|
||
a := ArcTan2((Endpoint.Y - Origin.Y), d);
|
||
r := r * Factor;
|
||
Result.X := Origin.X + Variant(r * Cos(a));
|
||
Result.Y := Origin.Y + Variant(r * Sin(a));
|
||
end;
|
||
(*)
|
||
procedure TJvDrawImage.TextRotate(X, Y, Angle: Integer; aText: string;
|
||
afont: tfont);
|
||
var
|
||
dc: hdc;
|
||
fnt: LogFont;
|
||
hfnt, hfntPrev: hfont;
|
||
i: Integer;
|
||
fname, s: string;
|
||
begin
|
||
s := aText;
|
||
fnt.lfEscapement := Angle * 10;
|
||
fnt.lfOrientation := Angle * 10;
|
||
if fsbold in afont.Style then
|
||
fnt.lfWeight := FW_Bold
|
||
else
|
||
fnt.lfWeight := FW_NORMAL;
|
||
if fsitalic in afont.Style then
|
||
fnt.lfItalic := 1
|
||
else
|
||
fnt.lfItalic := 0;
|
||
if fsunderline in afont.Style then
|
||
fnt.lfUnderline := 1
|
||
else
|
||
fnt.lfUnderline := 0;
|
||
fnt.lfStrikeOut := 0;
|
||
fnt.lfHeight := Abs(afont.Height);
|
||
fname := afont.Name;
|
||
for i := 1 to length(fname) do
|
||
fnt.lffacename[i - 1] := fname[i];
|
||
fnt.lfFaceName[length(fname)] := #0;
|
||
hfnt := CreateFontIndirect(fnt);
|
||
dc := Canvas.handle;
|
||
SetBkMode(dc, windows.TRANSPARENT);
|
||
SetTextColor(dc, afont.Color);
|
||
hfntPrev := SelectObject(dc, hfnt);
|
||
//Textout(dc,X,Y,@aText[1],length(aText));
|
||
Textout(dc, X, Y, @s[1], length(s));
|
||
SelectObject(dc, hfntPrev);
|
||
DeleteObject(hfnt);
|
||
Repaint;
|
||
end;
|
||
(*)
|
||
(*)
|
||
function TJvDrawImage.GetAngle(Origin, Endpoint: TPoint): Integer;
|
||
var
|
||
a, d: Real;
|
||
begin
|
||
// r := Sqrt(Sqr(Endpoint.X - Origin.X) + Sqr(Endpoint.Y - Origin.Y));
|
||
d := Endpoint.X - Origin.X;
|
||
if (d >= 0) and (d < 0.001) then
|
||
d := 0.001;
|
||
if (d < 0) and (d > -0.001) then
|
||
d := -0.001;
|
||
a := ArcTan2((Endpoint.Y - Origin.Y), d);
|
||
a := a * 360 / (2 * pi);
|
||
Result := Variant(-a);
|
||
end;
|
||
(*)
|
||
procedure TJvDrawImage.DrawRisingWaveSphere(Color1, Color2: TColor; X1, Y1, X2, Y2: Integer);
|
||
var
|
||
t, xcenter, a, ycenter, b: Integer;
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
i, dx, dy, xo, yo, r, bl: Integer;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
if X1 > X2 then
|
||
begin
|
||
t := X1;
|
||
X1 := X2;
|
||
X2 := t;
|
||
end;
|
||
if Y1 > Y2 then
|
||
begin
|
||
t := Y1;
|
||
Y1 := Y2;
|
||
Y2 := t;
|
||
end;
|
||
a := (X2 - X1) div 2;
|
||
b := (Y2 - Y1) div 2;
|
||
if a > b then
|
||
bl := a div (b + 1)
|
||
else
|
||
bl := b div (a + 1);
|
||
|
||
xcenter := X1 + a;
|
||
ycenter := Y1 + b;
|
||
|
||
dx := (X2 - X1) div bl;
|
||
dy := (Y2 - Y1) div bl;
|
||
if dx > dy then
|
||
begin
|
||
a := (dx div 2) * 4 div 5;
|
||
ycenter := Y1 + b;
|
||
b := a;
|
||
end
|
||
else
|
||
begin
|
||
b := (dy div 2) * 4 div 5;
|
||
xcenter := X1 + a;
|
||
a := b;
|
||
end;
|
||
Color1 := ColorToRGB(Color1);
|
||
R1 := GetRValue(Color1);
|
||
G1 := GetGValue(Color1);
|
||
B1 := GetBValue(Color1);
|
||
Color2 := ColorToRGB(Color2);
|
||
R2 := GetRValue(Color2);
|
||
G2 := GetGValue(Color2);
|
||
B2 := GetBValue(Color2);
|
||
for i := 0 to bl - 1 do
|
||
begin
|
||
if dx > dy then
|
||
begin
|
||
xo := i * dx + a;
|
||
r := Abs(Round(a * Sin(pi * xo / (X2 - X1))));
|
||
Sphere(Clip, X1 + xo, r, ycenter, r, R1, G1, B1, R2, G2, B2, True);
|
||
end
|
||
else
|
||
begin
|
||
yo := i * dy + b;
|
||
r := Abs(Round(b * Sin(pi * yo / (Y2 - Y1) - pi / 2)));
|
||
Sphere(Clip, xcenter, r, Y1 + yo, r, R1, G1, B1, R2, G2, B2, True);
|
||
end;
|
||
end;
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawWaveSphere(Color1, Color2: TColor; X1, Y1, X2, Y2: Integer);
|
||
var
|
||
t, xcenter, a, ycenter, b: Integer;
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
i, dx, dy, xo, yo, r, bl: Integer;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
if X1 > X2 then
|
||
begin
|
||
t := X1;
|
||
X1 := X2;
|
||
X2 := t;
|
||
end;
|
||
if Y1 > Y2 then
|
||
begin
|
||
t := Y1;
|
||
Y1 := Y2;
|
||
Y2 := t;
|
||
end;
|
||
a := (X2 - X1) div 2;
|
||
b := (Y2 - Y1) div 2;
|
||
if a > b then
|
||
bl := a div (b + 1)
|
||
else
|
||
bl := b div (a + 1);
|
||
|
||
xcenter := X1 + a;
|
||
ycenter := Y1 + b;
|
||
|
||
dx := (X2 - X1) div bl;
|
||
dy := (Y2 - Y1) div bl;
|
||
if dx > dy then
|
||
begin
|
||
a := (dx div 2) * 4 div 5;
|
||
ycenter := Y1 + b;
|
||
b := a;
|
||
end
|
||
else
|
||
begin
|
||
b := (dy div 2) * 4 div 5;
|
||
xcenter := X1 + a;
|
||
a := b;
|
||
end;
|
||
Color1 := ColorToRGB(Color1);
|
||
R1 := GetRValue(Color1);
|
||
G1 := GetGValue(Color1);
|
||
B1 := GetBValue(Color1);
|
||
Color2 := ColorToRGB(Color2);
|
||
R2 := GetRValue(Color2);
|
||
G2 := GetGValue(Color2);
|
||
B2 := GetBValue(Color2);
|
||
for i := 0 to bl - 1 do
|
||
begin
|
||
if dx > dy then
|
||
begin
|
||
xo := i * dx + a;
|
||
r := Abs(Round(a * Sin(pi * xo / (X2 - X1) - pi / 2)));
|
||
Sphere(Clip, X1 + xo, r, ycenter, r, R1, G1, B1, R2, G2, B2, True);
|
||
end
|
||
else
|
||
begin
|
||
yo := i * dy + b;
|
||
r := Abs(Round(b * Sin(pi * yo / (Y2 - Y1) - pi / 2)));
|
||
Sphere(Clip, xcenter, r, Y1 + yo, r, R1, G1, B1, R2, G2, B2, True);
|
||
end;
|
||
end;
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawDropletSphere(Color1, Color2: TColor; X1, Y1, X2, Y2: Integer);
|
||
var
|
||
t, xcenter, a, ycenter, b: Integer;
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
i, dx, dy, bl: Integer;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
if X1 > X2 then
|
||
begin
|
||
t := X1;
|
||
X1 := X2;
|
||
X2 := t;
|
||
end;
|
||
if Y1 > Y2 then
|
||
begin
|
||
t := Y1;
|
||
Y1 := Y2;
|
||
Y2 := t;
|
||
end;
|
||
a := (X2 - X1) div 2;
|
||
b := (Y2 - Y1) div 2;
|
||
if a > b then
|
||
bl := a div (b + 1)
|
||
else
|
||
bl := b div (a + 1);
|
||
|
||
xcenter := X1 + a;
|
||
ycenter := Y1 + b;
|
||
|
||
dx := (X2 - X1) div bl;
|
||
dy := (Y2 - Y1) div bl;
|
||
if dx > dy then
|
||
begin
|
||
a := (dx div 2) * 4 div 5;
|
||
ycenter := Y1 + b;
|
||
end
|
||
else
|
||
begin
|
||
b := (dy div 2) * 4 div 5;
|
||
xcenter := X1 + a;
|
||
end;
|
||
Color1 := ColorToRGB(Color1);
|
||
R1 := GetRValue(Color1);
|
||
G1 := GetGValue(Color1);
|
||
B1 := GetBValue(Color1);
|
||
Color2 := ColorToRGB(Color2);
|
||
R2 := GetRValue(Color2);
|
||
G2 := GetGValue(Color2);
|
||
B2 := GetBValue(Color2);
|
||
for i := 0 to bl - 1 do
|
||
begin
|
||
if dx > dy then
|
||
Sphere(Clip, X1 + i * dx + a, a, ycenter, a, R1, G1, B1, R2, G2, B2, True)
|
||
else
|
||
Sphere(Clip, xcenter, b, Y1 + i * dy + b, b, R1, G1, B1, R2, G2, B2, True);
|
||
end;
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawMultiSphere(Color1, Color2: TColor; X1, Y1, X2, Y2: Integer);
|
||
var
|
||
t, xcenter, a, ycenter, b: Integer;
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
i, dx, dy, bl: Integer;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
if X1 > X2 then
|
||
begin
|
||
t := X1;
|
||
X1 := X2;
|
||
X2 := t;
|
||
end;
|
||
if Y1 > Y2 then
|
||
begin
|
||
t := Y1;
|
||
Y1 := Y2;
|
||
Y2 := t;
|
||
end;
|
||
a := (X2 - X1) div 2;
|
||
b := (Y2 - Y1) div 2;
|
||
xcenter := X1 + a;
|
||
ycenter := Y1 + b;
|
||
if a > b then
|
||
bl := a div (b + 1)
|
||
else
|
||
bl := b div (a + 1);
|
||
dx := (X2 - X1) div bl;
|
||
dy := (Y2 - Y1) div bl;
|
||
if dx > dy then
|
||
begin
|
||
a := dx div 2;
|
||
ycenter := Y1 + b;
|
||
end
|
||
else
|
||
begin
|
||
b := dy div 2;
|
||
xcenter := X1 + a;
|
||
end;
|
||
Color1 := ColorToRGB(Color1);
|
||
R1 := GetRValue(Color1);
|
||
G1 := GetGValue(Color1);
|
||
B1 := GetBValue(Color1);
|
||
Color2 := ColorToRGB(Color2);
|
||
R2 := GetRValue(Color2);
|
||
G2 := GetGValue(Color2);
|
||
B2 := GetBValue(Color2);
|
||
for i := 0 to bl - 1 do
|
||
begin
|
||
if dx > dy then
|
||
Sphere(Clip, X1 + i * dx + a, a, ycenter, a, R1, G1, B1, R2, G2, B2, True)
|
||
else
|
||
Sphere(Clip, xcenter, b, Y1 + i * dy + b, b, R1, G1, B1, R2, G2, B2, True);
|
||
end;
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.Sphere(Bitmap: TBitmap;
|
||
xcenter, a, ycenter, b: Integer; R1, G1, B1, R2, G2, B2: Byte; Smooth: Boolean);
|
||
var (* Dessine un disque Color *)
|
||
xx, yy: Integer; (* par remplissage avec Couleur1-2 *)
|
||
compt, x_ll, y_ll, x_ray, y_ray: Longint;
|
||
begin
|
||
xx := 0;
|
||
yy := b;
|
||
x_ray := 2 * a * a;
|
||
y_ray := 2 * b * b;
|
||
x_ll := 1;
|
||
y_ll := x_ray * b - 1;
|
||
compt := y_ll div 2;
|
||
while yy >= 0 do
|
||
begin
|
||
HorGradientLine(Bitmap, xcenter - xx, xcenter + xx, ycenter + yy, R1, G1, B1, R2, G2, B2, Smooth);
|
||
HorGradientLine(Bitmap, xcenter - xx, xcenter + xx, ycenter - yy, R1, G1, B1, R2, G2, B2, Smooth);
|
||
if compt >= 0 then
|
||
begin
|
||
x_ll := x_ll + y_ray;
|
||
compt := compt - x_ll - 1;
|
||
xx := xx + 1;
|
||
end;
|
||
if compt < 0 then
|
||
begin
|
||
y_ll := y_ll - x_ray;
|
||
compt := compt + y_ll - 1;
|
||
yy := yy - 1;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawSphere(Color1, Color2: TColor; X1, Y1, X2, Y2: Integer);
|
||
var
|
||
t, xcenter, a, ycenter, b: Integer;
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
if X1 > X2 then
|
||
begin
|
||
t := X1;
|
||
X1 := X2;
|
||
X2 := t;
|
||
end;
|
||
if Y1 > Y2 then
|
||
begin
|
||
t := Y1;
|
||
Y1 := Y2;
|
||
Y2 := t;
|
||
end;
|
||
a := ((X2 - X1) div 2);
|
||
xcenter := X1 + a;
|
||
b := ((Y2 - Y1) div 2);
|
||
ycenter := Y1 + b;
|
||
Color1 := ColorToRGB(Color1);
|
||
R1 := GetRValue(Color1);
|
||
G1 := GetGValue(Color1);
|
||
B1 := GetBValue(Color1);
|
||
Color2 := ColorToRGB(Color2);
|
||
R2 := GetRValue(Color2);
|
||
G2 := GetGValue(Color2);
|
||
B2 := GetBValue(Color2);
|
||
Sphere(Clip, xcenter, a, ycenter, b, R1, G1, B1, R2, G2, B2, True);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.Column(Bitmap: TBitmap; XOrigin, XFinal, YOrigin, YFinal: Integer; R1, G1, B1, R2, G2, B2: Byte; Smooth: Boolean);
|
||
var
|
||
j: Integer;
|
||
begin
|
||
for j := YOrigin to YFinal do
|
||
HorGradientLine(Bitmap, XOrigin, XFinal, j, R1, G1, B1, R2, G2, B2, Smooth);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawColumn(X1, Y1, X2, Y2: Integer);
|
||
var
|
||
t: Integer;
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
line: pbytearray;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
if X1 > X2 then
|
||
begin
|
||
t := X1;
|
||
X1 := X2;
|
||
X2 := t;
|
||
end;
|
||
if Y1 > Y2 then
|
||
begin
|
||
t := Y1;
|
||
Y1 := Y2;
|
||
Y2 := t;
|
||
end;
|
||
line := Clip.ScanLine[Y1];
|
||
R1 := line[0];
|
||
G1 := line[1];
|
||
B1 := line[2];
|
||
line := Clip.ScanLine[Y2];
|
||
R2 := line[X2 * 3];
|
||
G2 := line[X2 * 3 + 1];
|
||
B2 := line[X2 * 3 + 2];
|
||
Column(Clip, X1, X2, Y1, Y2, R1, G1, B1, R2, G2, B2, True);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.InterpolateRect(Bmp: TBitmap; X1, Y1, X2, Y2: Integer);
|
||
// Draws rectangle, which will have different Color in each corner and
|
||
// will blend from one Color to another
|
||
// ( c[0,0] c[1,0]
|
||
// c[0,1] c[1,1] )
|
||
type
|
||
TFColor = record b, g, r: Byte
|
||
end;
|
||
var
|
||
xCount, yCount,
|
||
t, t2, z, iz,
|
||
rp, rp2, gp,
|
||
gp2, bp, bp2,
|
||
xx: Integer;
|
||
pb: PByteArray;
|
||
c00, c10, c01, c11: TFColor;
|
||
begin
|
||
t := 0;
|
||
t2 := 0;
|
||
if X2 < X1 then
|
||
begin
|
||
t := X2;
|
||
X2 := X1;
|
||
X1 := t;
|
||
end;
|
||
if Y2 < Y1 then
|
||
begin
|
||
t := Y2;
|
||
Y2 := Y1;
|
||
Y1 := t;
|
||
end;
|
||
if (X1 < 0) or (Y1 < 0) or (X2 > Bmp.Width - 1) or (Y2 > Bmp.Height - 1) then
|
||
Exit;
|
||
z := 0;
|
||
iz := $100000;
|
||
if X2 <> X1 then
|
||
t := $100000 div (X2 - X1);
|
||
if Y2 <> Y1 then
|
||
t2 := $100000 div (Y2 - Y1);
|
||
///// dx := X2 - X1;
|
||
pb := bmp.ScanLine[Y1];
|
||
c00.r := pb[X1 * 3];
|
||
c00.g := pb[X1 * 3 + 1];
|
||
c00.b := pb[X1 * 3 + 2];
|
||
c01.r := pb[X2 * 3];
|
||
c01.g := pb[X2 * 3 + 1];
|
||
c01.b := pb[X2 * 3 + 2];
|
||
pb := bmp.ScanLine[Y2];
|
||
c10.r := pb[X1 * 3];
|
||
c10.g := pb[X1 * 3 + 1];
|
||
c10.b := pb[X1 * 3 + 2];
|
||
c11.r := pb[X2 * 3];
|
||
c11.g := pb[X2 * 3 + 1];
|
||
c11.b := pb[X2 * 3 + 2];
|
||
for yCount := Y1 to Y2 do
|
||
begin
|
||
xx := ((c00.r * iz + c01.r * z) shr 20);
|
||
rp := xx shl 20;
|
||
rp2 := (((c10.r * iz + c11.r * z) shr 20) - xx) * t;
|
||
xx := ((c00.g * iz + c01.g * z) shr 20);
|
||
gp := xx shl 20;
|
||
gp2 := (((c10.g * iz + c11.g * z) shr 20) - xx) * t;
|
||
xx := ((c00.b * iz + c01.b * z) shr 20);
|
||
bp := xx shl 20;
|
||
bp2 := (((c10.b * iz + c11.b * z) shr 20) - xx) * t;
|
||
pb := bmp.ScanLine[ycount];
|
||
// pb:=@Bmp.Pixels[yCount,X1];
|
||
for xCount := X1 to X2 do
|
||
begin
|
||
pb[xcount * 3 + 2] := bp shr 20;
|
||
Inc(bp, bp2);
|
||
pb[xcount * 3 + 1] := gp shr 20;
|
||
Inc(gp, gp2);
|
||
pb[xcount * 3] := rp shr 20;
|
||
Inc(rp, rp2);
|
||
end;
|
||
Inc(z, t2);
|
||
Dec(iz, t2);
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.InterpRect(X1, Y1, X2, Y2: Integer);
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
Interpolaterect(Clip, X1, Y1, X2, Y2);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawBlurLines(X0, Y0, X, Y: Integer);
|
||
begin
|
||
DrawTexLines(X0, Y0, X, Y);
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
//GaussianBlur(4);
|
||
UserFilter := Blurfilter;
|
||
applyfilter(Clip, UserFilter);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawBlurRects(X0, Y0, X, Y: Integer);
|
||
begin
|
||
DrawTexRects(X0, Y0, X, Y);
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.GaussianBlur(Clip, 4);
|
||
UserFilter := Blurfilter;
|
||
applyfilter(Clip, UserFilter);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawTexRects(X0, Y0, X, Y: Integer);
|
||
var
|
||
dx, dy, xr, yr, X1, Y1, X2, Y2, i, w, h, xi, yi: Integer;
|
||
bcolor, pcolor, hcolor, scolor: TColor;
|
||
begin
|
||
w := Width;
|
||
h := Height;
|
||
pcolor := Canvas.Pen.Color;
|
||
bcolor := Canvas.Brush.Color;
|
||
Canvas.Brush.Color := pcolor;
|
||
Canvas.Brush.Style := bssolid;
|
||
hcolor := Texhighlight(pcolor);
|
||
scolor := TexShadow(pcolor);
|
||
xr := Abs(Round(Sqrt(Sqr(X - X0) + Sqr(Y - Y0))));
|
||
dx := Abs(X - X0);
|
||
dy := Abs(Y - Y0);
|
||
if dy < 3 then
|
||
dy := 3;
|
||
if dx < 3 then
|
||
dx := 3;
|
||
// tx := w div dx;
|
||
// ty := h div dy;
|
||
yr := Round(dy / dx * xr);
|
||
yi := 0;
|
||
repeat
|
||
xi := 0;
|
||
repeat
|
||
for i := 1 to 3 do
|
||
with Canvas do
|
||
begin
|
||
X1 := xi + random(xr);
|
||
Y1 := yi + random(yr);
|
||
X2 := xi + random(xr);
|
||
Y2 := yi + random(yr);
|
||
Pen.Color := scolor;
|
||
Brush.Color := scolor;
|
||
Rectangle(X1, Y1, X2 + 2, Y2 + 2);
|
||
Pen.Color := hcolor;
|
||
Brush.Color := hcolor;
|
||
Rectangle(X1 - 2, Y1 - 2, X2, Y2);
|
||
Pen.Color := pcolor;
|
||
Brush.Color := pcolor;
|
||
Rectangle(X1, Y1, X2, Y2);
|
||
end;
|
||
inc(xi, dx);
|
||
until xi > w - 1;
|
||
inc(yi, dy);
|
||
until yi > h - 1;
|
||
Canvas.Pen.Color := pcolor;
|
||
Canvas.Brush.Color := bcolor;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawBlurPoly(X0, Y0, X, Y: Integer);
|
||
begin
|
||
DrawTexPoly(X0, Y0, X, Y);
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
//GaussianBlur(4);
|
||
UserFilter := Blurfilter;
|
||
applyfilter(Clip, UserFilter);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawTexPoly(X0, Y0, X, Y: Integer);
|
||
var
|
||
dx, dy, xr, yr, X1, Y1, X2, Y2, i, w, h, xi, yi: Integer;
|
||
pcolor: TColor;
|
||
points: array[0..3] of TPoint;
|
||
begin
|
||
w := Width;
|
||
h := Height;
|
||
pcolor := Canvas.Pen.Color;
|
||
// hcolor := Texhighlight(pcolor);
|
||
// scolor := TexShadow(pcolor);
|
||
xr := Abs(Round(Sqrt(Sqr(X - X0) + Sqr(Y - Y0))));
|
||
dx := Abs(X - X0);
|
||
dy := Abs(Y - Y0);
|
||
if dy < 3 then
|
||
dy := 3;
|
||
if dx < 3 then
|
||
dx := 3;
|
||
// tx := w div dx;
|
||
// ty := h div dy;
|
||
yr := Round(dy / dx * xr);
|
||
yi := 0;
|
||
repeat
|
||
xi := 0;
|
||
repeat
|
||
for i := 1 to 10 do
|
||
with Canvas do
|
||
begin
|
||
X1 := xi + random(xr);
|
||
Y1 := yi + random(yr);
|
||
X2 := xi + random(xr);
|
||
Y2 := yi + random(yr);
|
||
points[0] := Point(X1, Y1);
|
||
points[3] := Point(X2, Y2);
|
||
X1 := xi + random(xr);
|
||
Y1 := yi + random(yr);
|
||
X2 := xi + random(xr);
|
||
Y2 := yi + random(yr);
|
||
points[1] := Point(X1, Y1);
|
||
points[2] := Point(X2, Y2);
|
||
Pen.Color := pcolor;
|
||
polyline(points);
|
||
end;
|
||
inc(xi, dx);
|
||
until xi > w - 1;
|
||
inc(yi, dy);
|
||
until yi > h - 1;
|
||
Canvas.Pen.Color := pcolor;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawBlurCurves(X0, Y0, X, Y: Integer);
|
||
begin
|
||
DrawTexCurves(X0, Y0, X, Y);
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
//GaussianBlur(4);
|
||
UserFilter := Blurfilter;
|
||
applyfilter(Clip, UserFilter);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawTexCurves(X0, Y0, X, Y: Integer);
|
||
var
|
||
dx, dy, xr, yr, X1, Y1, X2, Y2, i, w, h, xi, yi: Integer;
|
||
pcolor: TColor;
|
||
points: array[0..3] of TPoint;
|
||
begin
|
||
w := Width;
|
||
h := Height;
|
||
pcolor := Canvas.Pen.Color;
|
||
// hcolor := Texhighlight(pcolor);
|
||
// scolor := TexShadow(pcolor);
|
||
xr := Abs(Round(Sqrt(Sqr(X - X0) + Sqr(Y - Y0))));
|
||
dx := Abs(X - X0);
|
||
dy := Abs(Y - Y0);
|
||
if dy < 3 then
|
||
dy := 3;
|
||
if dx < 3 then
|
||
dx := 3;
|
||
// tx := w div dx;
|
||
// ty := h div dy;
|
||
yr := Round(dy / dx * xr);
|
||
yi := 0;
|
||
repeat
|
||
xi := 0;
|
||
repeat
|
||
for i := 1 to 10 do
|
||
with Canvas do
|
||
begin
|
||
X1 := xi + random(xr);
|
||
Y1 := yi + random(yr);
|
||
X2 := xi + random(xr);
|
||
Y2 := yi + random(yr);
|
||
points[0] := Point(X1, Y1);
|
||
points[3] := Point(X2, Y2);
|
||
X1 := xi + random(xr);
|
||
Y1 := yi + random(yr);
|
||
X2 := xi + random(xr);
|
||
Y2 := yi + random(yr);
|
||
points[1] := Point(X1, Y1);
|
||
points[2] := Point(X2, Y2);
|
||
Pen.Color := pcolor;
|
||
PolyBezier(points);
|
||
end;
|
||
inc(xi, dx);
|
||
until xi > w - 1;
|
||
inc(yi, dy);
|
||
until yi > h - 1;
|
||
Canvas.Pen.Color := pcolor;
|
||
end;
|
||
|
||
procedure TJvDrawImage.ApplyFilter(var Dst: TBitmap; DF: TDigitalFilter);
|
||
var
|
||
i, j, X, Y, tmpx, tmpy: Integer;
|
||
Sum,
|
||
Red,
|
||
Green,
|
||
Blue: Integer; //total value
|
||
Tmp,
|
||
Color: TFColor;
|
||
Ptmp, Pcolor: pbytearray;
|
||
bm: TBitmap;
|
||
R: TRect;
|
||
begin
|
||
bm := TBitmap.Create;
|
||
bm.pixelformat := pf24bit;
|
||
bm.Width := Dst.Width;
|
||
bm.Height := Dst.Height;
|
||
R := Rect(0, 0, bm.Width, bm.Height);
|
||
bm.Canvas.CopyRect(R, Dst.Canvas, R);
|
||
sum := 0;
|
||
for Y := 0 to 4 do
|
||
for X := 0 to 4 do
|
||
sum := sum + DF[X, Y];
|
||
if Sum = 0 then
|
||
Sum := 1;
|
||
for Y := 0 to Dst.Height - 1 do
|
||
begin
|
||
Pcolor := Dst.ScanLine[Y];
|
||
for X := 0 to bm.Width - 1 do
|
||
begin
|
||
Red := 0;
|
||
Green := 0;
|
||
Blue := 0;
|
||
for i := 0 to 4 do
|
||
for j := 0 to 4 do
|
||
begin
|
||
Tmpy := TrimInt(Y + j - 2, 0, bm.Height - 1);
|
||
Tmpx := TrimInt(X + i - 2, 0, bm.Width - 1);
|
||
ptmp := bm.ScanLine[Tmpy];
|
||
Tmp.r := ptmp[tmpx * 3];
|
||
Tmp.g := ptmp[tmpx * 3 + 1];
|
||
Tmp.b := ptmp[tmpx * 3 + 2];
|
||
// Tmp:=@Dst.Pixels[TrimInt(Y+j-1,0,Dst.Height-1),
|
||
// TrimInt(X+i-1,0,Dst.Width-1)];
|
||
Inc(Blue, DF[i, j] * Tmp.b);
|
||
Inc(Green, DF[i, j] * Tmp.g);
|
||
Inc(Red, DF[i, j] * Tmp.r);
|
||
end;
|
||
Color.b := IntToByte(Blue div Sum);
|
||
Color.g := IntToByte(Green div Sum);
|
||
Color.r := IntToByte(Red div Sum);
|
||
PColor[X * 3] := Color.r;
|
||
Pcolor[X * 3 + 1] := Color.g;
|
||
Pcolor[X * 3 + 2] := Color.b;
|
||
end;
|
||
end;
|
||
bm.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawBlurOvals(X0, Y0, X, Y: Integer);
|
||
begin
|
||
DrawTexOvals(X0, Y0, X, Y);
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.GaussianBlur(Clip, 4);
|
||
UserFilter := Blurfilter;
|
||
applyfilter(Clip, UserFilter);
|
||
Picture.Bitmap.Assign(Clip);
|
||
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawTexOvals(X0, Y0, X, Y: Integer);
|
||
var
|
||
dx, dy, xr, yr, X1, Y1, X2, Y2, i, w, h, xi, yi: Integer;
|
||
bcolor, pcolor, hcolor, scolor: TColor;
|
||
begin
|
||
w := Width;
|
||
h := Height;
|
||
pcolor := Canvas.Pen.Color;
|
||
bcolor := Canvas.Brush.Color;
|
||
Canvas.Brush.Color := pcolor;
|
||
Canvas.Brush.Style := bssolid;
|
||
hcolor := Texhighlight(pcolor);
|
||
scolor := TexShadow(pcolor);
|
||
xr := Abs(Round(Sqrt(Sqr(X - X0) + Sqr(Y - Y0))));
|
||
dx := Abs(X - X0);
|
||
dy := Abs(Y - Y0);
|
||
if dy < 3 then
|
||
dy := 3;
|
||
if dx < 3 then
|
||
dx := 3;
|
||
// tx := w div dx;
|
||
// ty := h div dy;
|
||
yr := Round(dy / dx * xr);
|
||
yi := 0;
|
||
repeat
|
||
xi := 0;
|
||
repeat
|
||
for i := 1 to 3 do
|
||
with Canvas do
|
||
begin
|
||
X1 := xi + random(xr);
|
||
Y1 := yi + random(yr);
|
||
X2 := xi + random(xr);
|
||
Y2 := yi + random(yr);
|
||
Pen.Color := scolor;
|
||
Brush.Color := scolor;
|
||
Ellipse(X1, Y1, X2 + 2, Y2 + 2);
|
||
Pen.Color := hcolor;
|
||
Brush.Color := hcolor;
|
||
Ellipse(X1 - 2, Y1 - 2, X2, Y2);
|
||
Pen.Color := pcolor;
|
||
Brush.Color := pcolor;
|
||
Ellipse(X1, Y1, X2, Y2);
|
||
end;
|
||
inc(xi, dx);
|
||
until xi > w - 1;
|
||
inc(yi, dy);
|
||
until yi > h - 1;
|
||
Canvas.Pen.Color := pcolor;
|
||
Canvas.Brush.Color := bcolor;
|
||
end;
|
||
|
||
function TJvDrawImage.BlendColors(const Color1, Color2: Longint; Opacity: Integer): Longint;
|
||
var
|
||
R, R1, R2, G, G1, G2, B, B1, B2: Integer;
|
||
begin
|
||
Opacity := Abs(Opacity);
|
||
if Opacity > 100 then
|
||
Opacity := 100;
|
||
R1 := GetRValue(ColorToRGB(Color1));
|
||
G1 := GetGValue(ColorToRGB(Color1));
|
||
B1 := GetBValue(ColorToRGB(Color1));
|
||
R2 := GetRValue(ColorToRGB(Color2));
|
||
G2 := GetGValue(ColorToRGB(Color2));
|
||
B2 := GetBValue(ColorToRGB(Color2));
|
||
R := trunc(R1 * Opacity / 100) + trunc(R2 * (100 - Opacity) / 100);
|
||
G := trunc(G1 * Opacity / 100) + trunc(G2 * (100 - Opacity) / 100);
|
||
B := trunc(B1 * Opacity / 100) + trunc(B2 * (100 - Opacity) / 100);
|
||
Result := RGB(R, G, B);
|
||
end; { BlendColors }
|
||
|
||
function TJvDrawImage.TexHighlight(Colr: Longint): Longint;
|
||
var
|
||
avg, r, g, b: Integer;
|
||
tmp: Longint;
|
||
begin
|
||
r := GetRValue(Colr);
|
||
g := GetGValue(Colr);
|
||
b := GetBValue(Colr);
|
||
avg := (r + g + b) div 3;
|
||
r := (255 + 255 + avg + r) div 4;
|
||
g := (255 + 255 + avg + g) div 4;
|
||
b := (255 + 255 + avg + b) div 4;
|
||
tmp := RGB(r, g, b);
|
||
Result := BlendColors(Colr, tmp, WeakBlend);
|
||
end; { Highlight }
|
||
|
||
function TJvDrawImage.TexShadow(Colr: Longint): Longint;
|
||
var
|
||
r, g, b: Integer;
|
||
tmp: Longint;
|
||
begin
|
||
r := GetRValue(Colr);
|
||
g := GetGValue(Colr);
|
||
b := GetBValue(Colr);
|
||
tmp := RGB(trunc(DarkStrength * r), trunc(DarkStrength * g),
|
||
trunc(DarkStrength * b));
|
||
Result := BlendColors(Colr, tmp, StrongBlend);
|
||
end; { Shadow }
|
||
|
||
procedure TJvDrawImage.DrawTexLines(X0, Y0, X, Y: Integer);
|
||
var
|
||
dx, dy, xr, yr, X1, Y1, X2, Y2, i, w, h, xi, yi: Integer;
|
||
pcolor, hcolor, scolor: TColor;
|
||
begin
|
||
w := Width;
|
||
h := Height;
|
||
pcolor := Canvas.Pen.Color;
|
||
hcolor := Texhighlight(pcolor);
|
||
scolor := TexShadow(pcolor);
|
||
xr := Abs(Round(Sqrt(Sqr(X - X0) + Sqr(Y - Y0))));
|
||
dx := Abs(X - X0);
|
||
dy := Abs(Y - Y0);
|
||
if dy = 0 then
|
||
dy := 1;
|
||
if dx = 0 then
|
||
dx := 1;
|
||
// tx := w div dx;
|
||
// ty := h div dy;
|
||
yr := Round(dy / dx * xr);
|
||
yi := 0;
|
||
repeat
|
||
xi := 0;
|
||
repeat
|
||
for i := 1 to 10 do
|
||
with Canvas do
|
||
begin
|
||
X1 := xi + random(xr);
|
||
Y1 := yi + random(yr);
|
||
X2 := xi + random(xr);
|
||
Y2 := yi + random(yr);
|
||
Pen.Color := pcolor;
|
||
MoveTo(X1, Y1);
|
||
LineTo(X2, Y2);
|
||
Pen.Color := hcolor;
|
||
MoveTo(X1 - 1, Y1 - 1);
|
||
LineTo(X2 - 1, Y2 - 1);
|
||
Pen.Color := scolor;
|
||
MoveTo(X1 + 1, Y1 + 1);
|
||
LineTo(X2 + 1, Y2 + 1);
|
||
end;
|
||
inc(xi, dx);
|
||
until xi > w - 1;
|
||
inc(yi, dy);
|
||
until yi > h - 1;
|
||
Canvas.Pen.Color := pcolor;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawSyms(X, Y: Integer);
|
||
var
|
||
X0, Y0, i: Integer;
|
||
da: Real;
|
||
apoint: TPoint;
|
||
begin
|
||
X0 := Picture.Bitmap.Width div 2;
|
||
Y0 := Picture.Bitmap.Height div 2;
|
||
da := 2 * pi / StarPoints;
|
||
apoint := Point(X, Y);
|
||
for i := 0 to StarPoints - 1 do
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
MoveTo(pointarray[i].X, pointarray[i].Y);
|
||
LineTo(apoint.X, apoint.Y);
|
||
pointarray[i] := apoint;
|
||
apoint := Rotate(Point(X0, Y0), apoint, da);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.PutClip(M: TRect);
|
||
var
|
||
dest: TRect;
|
||
begin
|
||
Clip.Width := (m.Right - m.Left + 1);
|
||
Clip.Height := (m.Bottom - m.Top + 1);
|
||
dest := Rect(0, 0, Clip.Width, Clip.Height);
|
||
Clip.Canvas.CopyMode := cmsrccopy;
|
||
Clip.pixelformat := Picture.Bitmap.pixelformat;
|
||
Clip.Canvas.CopyRect(dest, Canvas, m);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawTriangle;
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
MoveTo(myskew[0].X, myskew[0].Y);
|
||
LineTo(myskew[1].X, myskew[1].Y);
|
||
LineTo(myskew[2].X, myskew[2].Y);
|
||
LineTo(myskew[0].X, myskew[0].Y);
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawSkew;
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
MoveTo(myskew[0].X, myskew[0].Y);
|
||
LineTo(myskew[1].X, myskew[1].Y);
|
||
LineTo(myskew[2].X, myskew[2].Y);
|
||
LineTo(myskew[3].X, myskew[3].Y);
|
||
LineTo(myskew[0].X, myskew[0].Y);
|
||
end;
|
||
end;
|
||
|
||
function TJvDrawImage.PointToBlock(X, Y: Integer): TRect;
|
||
var
|
||
xb, yb, w, h: Integer;
|
||
begin
|
||
w := Picture.Bitmap.Width;
|
||
h := Picture.Bitmap.Height;
|
||
xb := w div Blocks;
|
||
yb := h div Blocks;
|
||
Result.Left := (X div xb) * xb;
|
||
Result.Top := (Y div yb) * yb;
|
||
Result.Right := Result.Left + xb;
|
||
Result.Bottom := Result.Top + yb;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawCube;
|
||
var
|
||
dx, dy: Integer;
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
dx := myskew[4].X - myskew[2].X;
|
||
dy := myskew[4].Y - myskew[2].Y;
|
||
MoveTo(myskew[0].X, myskew[0].Y);
|
||
LineTo(myskew[1].X, myskew[1].Y);
|
||
LineTo(myskew[2].X, myskew[2].Y);
|
||
LineTo(myskew[3].X, myskew[3].Y);
|
||
LineTo(myskew[0].X, myskew[0].Y);
|
||
if (dx >= 0) and (dy <= 0) then
|
||
begin
|
||
MoveTo(myskew[0].X, myskew[0].Y);
|
||
LineTo(myskew[0].X + dx, myskew[0].Y + dy);
|
||
LineTo(myskew[1].X + dx, myskew[1].Y + dy);
|
||
LineTo(myskew[2].X + dx, myskew[2].Y + dy);
|
||
LineTo(myskew[2].X, myskew[2].Y);
|
||
MoveTo(myskew[1].X, myskew[1].Y);
|
||
LineTo(myskew[1].X + dx, myskew[1].Y + dy);
|
||
end
|
||
else
|
||
if (dx >= 0) and (dy > 0) then
|
||
begin
|
||
MoveTo(myskew[1].X, myskew[1].Y);
|
||
LineTo(myskew[1].X + dx, myskew[1].Y + dy);
|
||
LineTo(myskew[2].X + dx, myskew[2].Y + dy);
|
||
LineTo(myskew[3].X + dx, myskew[3].Y + dy);
|
||
LineTo(myskew[3].X, myskew[3].Y);
|
||
MoveTo(myskew[2].X, myskew[2].Y);
|
||
LineTo(myskew[2].X + dx, myskew[2].Y + dy);
|
||
end
|
||
else
|
||
if (dx < 0) and (dy > 0) then
|
||
begin
|
||
MoveTo(myskew[0].X, myskew[0].Y);
|
||
LineTo(myskew[0].X + dx, myskew[0].Y + dy);
|
||
LineTo(myskew[3].X + dx, myskew[3].Y + dy);
|
||
LineTo(myskew[2].X + dx, myskew[2].Y + dy);
|
||
LineTo(myskew[2].X, myskew[2].Y);
|
||
MoveTo(myskew[3].X, myskew[3].Y);
|
||
LineTo(myskew[3].X + dx, myskew[3].Y + dy);
|
||
end
|
||
else
|
||
if (dx < 0) and (dy < 0) then
|
||
begin
|
||
MoveTo(myskew[1].X, myskew[1].Y);
|
||
LineTo(myskew[1].X + dx, myskew[1].Y + dy);
|
||
LineTo(myskew[0].X + dx, myskew[0].Y + dy);
|
||
LineTo(myskew[3].X + dx, myskew[3].Y + dy);
|
||
LineTo(myskew[3].X, myskew[3].Y);
|
||
MoveTo(myskew[0].X, myskew[0].Y);
|
||
LineTo(myskew[0].X + dx, myskew[0].Y + dy);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.VerGradientLine(Bitmap: TBitmap;
|
||
YOrigin, YFinal, X: Integer; R1, G1, B1, R2, G2, B2: Byte; Smooth: Boolean);
|
||
var
|
||
r, g, b, i: Integer;
|
||
valueR, ValueG, ValueB, advalR, advalB, advalG: single;
|
||
Line: PByteArray;
|
||
begin
|
||
if (X >= 0) and (X < Bitmap.Width) then
|
||
begin
|
||
if YOrigin > YFinal then
|
||
begin
|
||
i := YOrigin;
|
||
YOrigin := YFinal;
|
||
YFinal := i;
|
||
end;
|
||
if YFinal <> YOrigin then
|
||
begin
|
||
advalR := (R2 - R1) / (YFinal - YOrigin);
|
||
advalG := (G2 - G1) / (YFinal - YOrigin);
|
||
advalB := (B2 - B1) / (YFinal - YOrigin);
|
||
end
|
||
else
|
||
begin
|
||
advalR := 0;
|
||
advalG := 0;
|
||
advalB := 0;
|
||
end;
|
||
|
||
valueR := R1;
|
||
valueG := G1;
|
||
valueB := B1;
|
||
|
||
for i := YOrigin to YFinal do
|
||
begin
|
||
Line := Bitmap.ScanLine[i];
|
||
valueR := valueR + advalR;
|
||
r := Round(ValueR);
|
||
if r > 255 then
|
||
r := 255;
|
||
if r < 0 then
|
||
r := 0;
|
||
valueG := valueG + advalG;
|
||
g := Round(ValueG);
|
||
if g > 255 then
|
||
g := 255;
|
||
if g < 0 then
|
||
g := 0;
|
||
valueB := valueB + advalB;
|
||
b := Round(ValueB);
|
||
if b > 255 then
|
||
b := 255;
|
||
if b < 0 then
|
||
b := 0;
|
||
if (X >= 0) and (X < Bitmap.Width) then
|
||
begin
|
||
Line[X * 3] := b;
|
||
Line[X * 3 + 1] := g;
|
||
Line[X * 3 + 2] := r;
|
||
end;
|
||
end;
|
||
if Smooth then
|
||
begin
|
||
SmoothPnt(Bitmap, X, YOrigin - 1);
|
||
SmoothPnt(Bitmap, X, YFinal + 1);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawVGradientBrush(Color1, Color2: TColor; Y1, Y2, X: Integer);
|
||
var
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
Color1 := ColorToRGB(Color1);
|
||
R1 := GetRValue(Color1);
|
||
G1 := GetGValue(Color1);
|
||
B1 := GetBValue(Color1);
|
||
Color2 := ColorToRGB(Color2);
|
||
R2 := GetRValue(Color2);
|
||
G2 := GetGValue(Color2);
|
||
B2 := GetBValue(Color2);
|
||
vergradientline(Clip, Y1, Y2, X, R1, G1, B1, R2, G2, B2, True);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.SmoothPnt(Bitmap: TBitmap; xk, yk: Integer);
|
||
type
|
||
TFColor = record b, g, r: Byte
|
||
end;
|
||
var
|
||
Bleu, Vert, Rouge: Integer;
|
||
Color: TFColor;
|
||
BB, GG, RR: array[1..5] of Integer;
|
||
Line: pbytearray;
|
||
begin
|
||
if (xk > 0) and (yk > 0) and (xk < Bitmap.Width - 1) and (yk < Bitmap.Height - 1) then
|
||
begin
|
||
line := Bitmap.ScanLine[yk - 1];
|
||
Color.r := line[xk * 3];
|
||
Color.g := line[xk * 3 + 1];
|
||
Color.b := line[xk * 3 + 2];
|
||
RR[1] := Color.r;
|
||
GG[1] := Color.g;
|
||
BB[1] := Color.b;
|
||
line := Bitmap.ScanLine[yk];
|
||
Color.r := line[(xk + 1) * 3];
|
||
Color.g := line[(xk + 1) * 3 + 1];
|
||
Color.b := line[(xk + 1) * 3 + 2];
|
||
RR[2] := Color.r;
|
||
GG[2] := Color.g;
|
||
BB[2] := Color.b;
|
||
line := Bitmap.ScanLine[yk + 1];
|
||
Color.r := line[xk * 3];
|
||
Color.g := line[xk * 3 + 1];
|
||
Color.b := line[xk * 3 + 2];
|
||
RR[3] := Color.r;
|
||
GG[3] := Color.g;
|
||
BB[3] := Color.b;
|
||
line := Bitmap.ScanLine[yk];
|
||
Color.r := line[(xk - 1) * 3];
|
||
Color.g := line[(xk - 1) * 3 + 1];
|
||
Color.b := line[(xk - 1) * 3 + 2];
|
||
RR[4] := Color.r;
|
||
GG[4] := Color.g;
|
||
BB[4] := Color.b;
|
||
Bleu := (BB[1] + (BB[2] + BB[3] + BB[4])) div 4; (* Valeur moyenne *)
|
||
Vert := (GG[1] + (GG[2] + GG[3] + GG[4])) div 4; (* en cours d'<27>valuation *)
|
||
Rouge := (RR[1] + (RR[2] + RR[3] + RR[4])) div 4;
|
||
Color.r := rouge;
|
||
Color.g := vert;
|
||
Color.b := bleu;
|
||
line := Bitmap.ScanLine[yk];
|
||
line[xk * 3] := Color.r;
|
||
line[xk * 3 + 1] := Color.g;
|
||
line[xk * 3 + 2] := Color.b;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.HorGradientLine(Bitmap: TBitmap;
|
||
XOrigin, XFinal, Y: Integer; R1, G1, B1, R2, G2, B2: Byte; Smooth: Boolean);
|
||
var
|
||
r, g, b, i: Integer;
|
||
valueR, ValueG, ValueB, advalR, advalB, advalG: single;
|
||
Line: PByteArray;
|
||
begin
|
||
if (Y >= 0) and (Y < Bitmap.Height) then
|
||
begin
|
||
if XOrigin > XFinal then
|
||
begin
|
||
i := XOrigin;
|
||
XOrigin := XFinal;
|
||
XFinal := i;
|
||
end;
|
||
if XFinal <> XOrigin then
|
||
begin
|
||
advalR := (R2 - R1) / (XFinal - XOrigin);
|
||
advalG := (G2 - G1) / (XFinal - XOrigin);
|
||
advalB := (B2 - B1) / (XFinal - XOrigin);
|
||
end
|
||
else
|
||
begin
|
||
advalR := 0;
|
||
advalG := 0;
|
||
advalB := 0;
|
||
end;
|
||
|
||
valueR := R1;
|
||
valueG := G1;
|
||
valueB := B1;
|
||
Line := Bitmap.ScanLine[Y];
|
||
for i := XOrigin to XFinal do
|
||
begin
|
||
valueR := valueR + advalR;
|
||
r := Round(ValueR);
|
||
if r > 255 then
|
||
r := 255;
|
||
if r < 0 then
|
||
r := 0;
|
||
valueG := valueG + advalG;
|
||
g := Round(ValueG);
|
||
if g > 255 then
|
||
g := 255;
|
||
if g < 0 then
|
||
g := 0;
|
||
valueB := valueB + advalB;
|
||
b := Round(ValueB);
|
||
if b > 255 then
|
||
b := 255;
|
||
if b < 0 then
|
||
b := 0;
|
||
if (i >= 0) and (i < Bitmap.Width) then
|
||
begin
|
||
Line[i * 3] := b;
|
||
Line[i * 3 + 1] := g;
|
||
Line[i * 3 + 2] := r;
|
||
end;
|
||
end;
|
||
if Smooth then
|
||
begin
|
||
SmoothPnt(Bitmap, XOrigin - 1, Y);
|
||
SmoothPnt(Bitmap, XFinal + 1, Y);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawGradientBrush(Color1, Color2: TColor; X1, X2, Y: Integer);
|
||
var
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
Color1 := ColorToRGB(Color1);
|
||
R1 := GetRValue(Color1);
|
||
G1 := GetGValue(Color1);
|
||
B1 := GetBValue(Color1);
|
||
Color2 := ColorToRGB(Color2);
|
||
R2 := GetRValue(Color2);
|
||
G2 := GetGValue(Color2);
|
||
B2 := GetBValue(Color2);
|
||
horgradientline(Clip, X1, X2, Y, R1, G1, B1, R2, G2, B2, True);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawLighterCircle(X, Y, Mode: Integer);
|
||
var
|
||
r: Integer;
|
||
begin
|
||
r := Canvas.Pen.Width;
|
||
if r < 5 then
|
||
r := 5;
|
||
ColorCircle(Clip, Point(X, Y), r, Mode);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawDarkerCircle(X, Y, Mode: Integer);
|
||
var
|
||
r: Integer;
|
||
begin
|
||
r := Canvas.Pen.Width;
|
||
if r < 5 then
|
||
r := 5;
|
||
ColorCircle(Clip, Point(X, Y), r, Mode);
|
||
Picture.Bitmap.Assign(Clip);
|
||
|
||
end;
|
||
|
||
procedure TJvDrawImage.ColorCircle(var bm: TBitmap; center: TPoint; Radius, Mode: Integer);
|
||
var
|
||
p, p0, p1: pbytearray;
|
||
dx, X, Y, w, h, i, j, sum, c: Integer;
|
||
cm, tm: TBitmap;
|
||
Rs, Rd: TRect;
|
||
begin
|
||
X := center.X;
|
||
Y := center.Y;
|
||
w := bm.Width;
|
||
h := bm.Height;
|
||
cm := TBitmap.Create;
|
||
cm.Width := 2 * Radius;
|
||
cm.Height := 2 * Radius;
|
||
cm.PixelFormat := pf24bit;
|
||
tm := TBitmap.Create;
|
||
tm.Width := 2 * Radius;
|
||
tm.Height := 2 * Radius;
|
||
tm.PixelFormat := pf24bit;
|
||
tm.Canvas.Brush.Color := clBlack;
|
||
tm.Canvas.Ellipse(0, 0, tm.Width - 1, tm.Height - 1);
|
||
tm.Transparent := True;
|
||
tm.TransparentColor := clBlack;
|
||
Rd := Rect(0, 0, cm.Width, cm.Height);
|
||
Rs := Rect(X - Radius, Y - Radius, X + Radius, Y + Radius);
|
||
cm.Canvas.CopyRect(Rd, bm.Canvas, RS);
|
||
p0 := nil;
|
||
p1 := nil;
|
||
for j := 0 to cm.Height - 1 do
|
||
begin
|
||
p := cm.ScanLine[j];
|
||
if j > 0 then
|
||
p0 := cm.ScanLine[j - 1];
|
||
if j < (h - 1) then
|
||
p1 := cm.ScanLine[j + 1];
|
||
for i := 0 to cm.Width - 1 do
|
||
begin
|
||
case Mode of
|
||
0: //Blue
|
||
begin
|
||
p[i * 3 + 1] := 0;
|
||
p[i * 3 + 2] := 0;
|
||
end;
|
||
1: //Green
|
||
begin
|
||
p[i * 3] := 0;
|
||
p[i * 3 + 2] := 0;
|
||
end;
|
||
2: //Red
|
||
begin
|
||
p[i * 3] := 0;
|
||
p[i * 3 + 1] := 0;
|
||
end;
|
||
3: //not Blue
|
||
begin
|
||
p[i * 3] := 0;
|
||
end;
|
||
4: //not Green
|
||
begin
|
||
p[i * 3 + 1] := 0;
|
||
end;
|
||
5: //not Red
|
||
begin
|
||
p[i * 3 + 2] := 0;
|
||
end;
|
||
6: //half Blue
|
||
begin
|
||
p[i * 3] := p[i * 3] * 9 div 10;
|
||
end;
|
||
7: //half Green
|
||
begin
|
||
p[i * 3 + 1] := p[i * 3 + 1] * 9 div 10;
|
||
end;
|
||
8: //half Red
|
||
begin
|
||
p[i * 3 + 2] := p[i * 3 + 2] * 9 div 10;
|
||
end;
|
||
9: // darker
|
||
begin
|
||
p[i * 3] := Round(p[i * 3] * 10 / 11);
|
||
p[i * 3 + 1] := Round(p[i * 3 + 1] * 10 / 11);
|
||
p[i * 3 + 2] := Round(p[i * 3 + 2] * 10 / 11);
|
||
end;
|
||
10: // lighter
|
||
begin
|
||
p[i * 3] := Round(p[i * 3] * 11 / 10);
|
||
p[i * 3 + 1] := Round(p[i * 3 + 1] * 11 / 10);
|
||
p[i * 3 + 2] := Round(p[i * 3 + 2] * 11 / 10);
|
||
end;
|
||
11: // gray
|
||
begin
|
||
sum := Round((p[i * 3] + p[i * 3 + 1] + p[i * 3 + 2]) / 3);
|
||
p[i * 3] := sum;
|
||
p[i * 3 + 1] := sum;
|
||
p[i * 3 + 2] := sum;
|
||
end;
|
||
12: // mix
|
||
begin
|
||
c := p[i * 3];
|
||
p[i * 3] := p[i * 3 + 1];
|
||
p[i * 3 + 1] := p[i * 3 + 2];
|
||
p[i * 3 + 2] := c;
|
||
end;
|
||
13: //Smooth
|
||
begin
|
||
if ((j > 0) and (j < (h - 1)) and (i > 0) and (i < (w - 1))) then
|
||
begin
|
||
p[i * 3] := Round((p[(i - 1) * 3] + p[(i + 1) * 3] + p0[i * 3] + p1[i * 3]) / 4);
|
||
p[i * 3 + 1] := Round((p[(i - 1) * 3 + 1] + p[(i + 1) * 3 + 1] + p0[i * 3 + 1] + p1[i * 3 + 1]) / 4);
|
||
p[i * 3 + 2] := Round((p[(i - 1) * 3 + 2] + p[(i + 1) * 3 + 2] + p0[i * 3 + 2] + p1[i * 3 + 2]) / 4);
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
cm.Canvas.Draw(0, 0, tm);
|
||
cm.Transparent := True;
|
||
cm.transparentcolor := clWhite;
|
||
bm.Canvas.Draw(X - Radius, Y - Radius, cm);
|
||
cm.Free;
|
||
tm.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawColorCircle(X, Y, Mode: Integer);
|
||
var
|
||
r: Integer;
|
||
begin
|
||
Picture.Bitmap.pixelformat := pf24bit;
|
||
Clip.Assign(Picture.Bitmap);
|
||
Clip.PixelFormat := pf24bit;
|
||
r := Canvas.Pen.Width;
|
||
if r < 5 then
|
||
r := 5;
|
||
ColorCircle(Clip, Point(X, Y), r, Mode);
|
||
Picture.Bitmap.Assign(Clip);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawLightBrush(X, Y, Radius, Amount: Integer; Style: TLightBrush);
|
||
var
|
||
Src, Dst: TBitmap;
|
||
Rclip, Rsrc: TRect;
|
||
begin
|
||
if X < Radius then
|
||
X := Radius;
|
||
if Y < Radius then
|
||
Y := Radius;
|
||
if (X + Radius) > Clip.Width - 1 then
|
||
X := Clip.Width - 1 - Radius;
|
||
if (Y + Radius) > Clip.Height - 1 then
|
||
Y := Clip.Height - 1 - Radius;
|
||
Src := TBitmap.Create;
|
||
Src.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Rclip := Rect(X - Radius, Y - Radius, X + Radius, Y + Radius);
|
||
Src.Width := Rclip.Right - Rclip.Left;
|
||
Src.Height := RClip.Bottom - Rclip.Top;
|
||
Dst.Width := Src.Width;
|
||
Dst.Height := Src.Height;
|
||
Rsrc := Rect(0, 0, Src.Width, Src.Height);
|
||
Dst.Canvas.CopyRect(Rsrc, Clip.Canvas, Rclip);
|
||
case Style of
|
||
lbBrightness: FX.lightness(Dst, Amount);
|
||
lbSaturation: FX.saturation(Dst, Amount);
|
||
lbContrast: FX.contrast(Dst, Amount);
|
||
end;
|
||
// mask code
|
||
Src.Canvas.Brush.Color := clWhite;
|
||
Src.Canvas.FillRect(Rsrc);
|
||
Src.Canvas.Brush.Style := bssolid;
|
||
Src.Canvas.Brush.Color := clBlack;
|
||
Src.Canvas.Ellipse(0, 0, Src.Width - 1, Src.Height - 1);
|
||
Src.Transparent := True;
|
||
Src.TransparentColor := clBlack;
|
||
Dst.Canvas.Draw(0, 0, Src);
|
||
Dst.Transparent := True;
|
||
Dst.TransparentColor := clWhite;
|
||
Canvas.Draw(0, 0, Clip);
|
||
Canvas.Draw(X - Radius, Y - Radius, Dst);
|
||
Src.Free;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SampleStretch(Src, Dst: TBitmap);
|
||
begin
|
||
// use mitchelfilter from resample unit
|
||
ImgStretch(Src, Dst,
|
||
ResampleFilters[6].Filter, ResampleFilters[6].Width);
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawStretchBrush(X, Y, Radius: Integer; Amount: Extended; Style: TMorphBrush);
|
||
var
|
||
Src, Dst: TBitmap;
|
||
Rclip, Rsrc: TRect;
|
||
dr: Integer;
|
||
begin
|
||
if X < Radius then
|
||
X := Radius;
|
||
if Y < Radius then
|
||
Y := Radius;
|
||
if (X + Radius) > Clip.Width - 1 then
|
||
X := Clip.Width - 1 - Radius;
|
||
if (Y + Radius) > Clip.Height - 1 then
|
||
Y := Clip.Height - 1 - Radius;
|
||
Src := TBitmap.Create;
|
||
Src.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Rclip := Rect(X - Radius, Y - Radius, X + Radius, Y + Radius);
|
||
Dst.Width := Rclip.Right - Rclip.Left;
|
||
Dst.Height := RClip.Bottom - Rclip.Top;
|
||
// now Change to Reduce
|
||
Amount := Abs(Amount);
|
||
if Amount < 1 then
|
||
Amount := 1;
|
||
dr := Round(Radius * Amount / 180);
|
||
if dr < 5 then
|
||
dr := 5;
|
||
if dr > Radius then
|
||
dr := Radius;
|
||
//(mbVerBox,mbHorBox,mbVerOval,mbHorOval);
|
||
case Style of
|
||
mbVerOval, mbVerbox: Rclip := Rect(X - Radius, Y - dr, X + Radius, Y + dr);
|
||
mbHorOval, mbHorBox: Rclip := Rect(X - dr, Y - Radius, X + dr, Y + Radius);
|
||
end;
|
||
Src.Width := Rclip.Right - Rclip.Left;
|
||
Src.Height := RClip.Bottom - Rclip.Top;
|
||
Rsrc := Rect(0, 0, Src.Width, Src.Height);
|
||
Src.Canvas.CopyRect(Rsrc, Clip.Canvas, Rclip);
|
||
SampleStretch(Src, Dst);
|
||
// mask code
|
||
// reset Src dimensions for masking
|
||
if Style in [mbHorOval, mbVerOval] then
|
||
begin
|
||
Src.Width := Dst.Width;
|
||
Src.Height := Dst.Height;
|
||
Src.Canvas.Brush.Color := clWhite;
|
||
Src.Canvas.FillRect(Rsrc);
|
||
Src.Canvas.Brush.Style := bssolid;
|
||
Src.Canvas.Brush.Color := clBlack;
|
||
Src.Canvas.Ellipse(0, 0, Src.Width - 1, Src.Height - 1);
|
||
Src.Transparent := True;
|
||
Src.TransparentColor := clBlack;
|
||
Dst.Canvas.Draw(0, 0, Src);
|
||
Dst.Transparent := True;
|
||
Dst.TransparentColor := clWhite;
|
||
Canvas.Draw(0, 0, Clip);
|
||
end;
|
||
Canvas.Draw(X - Radius, Y - Radius, Dst);
|
||
Src.Free;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Rimple(Src, Dst: TBitmap; Amount: Extended);
|
||
var
|
||
ca, sa, a, dx, dy, r, sr, fr: Extended;
|
||
w, h, X, Y, cx, cy, i, j, c, ci: Integer;
|
||
p1, p2: pbytearray;
|
||
begin
|
||
w := Src.Width;
|
||
h := Src.Height;
|
||
cx := w div 2;
|
||
cy := h div 2;
|
||
if Amount < 1 then
|
||
Amount := 1;
|
||
fr := cx / Amount;
|
||
for Y := 0 to h - 1 do
|
||
begin
|
||
p1 := Src.ScanLine[Y];
|
||
for X := 0 to w - 1 do
|
||
begin
|
||
dx := X - cx;
|
||
dy := -(Y - cx);
|
||
r := Sqrt(Sqr(dx) + Sqr(dy));
|
||
sr := fr * Sin(r / cx * Amount * 2 * pi);
|
||
if (r + sr < cx) and (r + sr > 0) then
|
||
begin
|
||
a := ArcTan2(dy, dx);
|
||
sincos(a, sa, ca);
|
||
i := cx + Round((r + sr) * ca);
|
||
j := cy + Round((r + sr) * sa);
|
||
p2 := Dst.ScanLine[j];
|
||
c := X * 3;
|
||
ci := i * 3;
|
||
p2[ci] := p1[c];
|
||
p2[ci + 1] := p1[c + 1];
|
||
p2[ci + 2] := p1[c + 2];
|
||
end;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawEffectBrush(X, Y, Radius: Integer; Amount: Extended; Style: TLightBrush);
|
||
var
|
||
Src, Dst: TBitmap;
|
||
Rclip, Rsrc: TRect;
|
||
begin
|
||
if X < Radius then
|
||
X := Radius;
|
||
if Y < Radius then
|
||
Y := Radius;
|
||
if (X + Radius) > Clip.Width - 1 then
|
||
X := Clip.Width - 1 - Radius;
|
||
if (Y + Radius) > Clip.Height - 1 then
|
||
Y := Clip.Height - 1 - Radius;
|
||
Src := TBitmap.Create;
|
||
Src.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Rclip := Rect(X - Radius, Y - Radius, X + Radius, Y + Radius);
|
||
Src.Width := Rclip.Right - Rclip.Left;
|
||
Src.Height := RClip.Bottom - Rclip.Top;
|
||
Dst.Width := Src.Width;
|
||
Dst.Height := Src.Height;
|
||
Rsrc := Rect(0, 0, Src.Width, Src.Height);
|
||
Src.Canvas.CopyRect(Rsrc, Clip.Canvas, Rclip);
|
||
case Style of
|
||
lbfisheye: FX.fisheye(Src, Dst, Amount);
|
||
lbrotate: FX.smoothrotate(Src, Dst, Src.Width div 2, Src.Height div 2, Amount);
|
||
lbtwist: FX.twist(Src, Dst, Round(Amount));
|
||
lbrimple: Rimple(Src, Dst, Amount);
|
||
mbHor, mbTop, mbBottom, mbDiamond, mbWaste, mbRound, mbRound2:
|
||
FX.SqueezeHor(Src, Dst, Round(Amount), Style);
|
||
mbSplitRound, mbSplitWaste:
|
||
FX.SplitRound(Src, Dst, Round(Amount), Style);
|
||
end;
|
||
// mask code
|
||
Src.Canvas.Brush.Color := clWhite;
|
||
Src.Canvas.FillRect(Rsrc);
|
||
Src.Canvas.Brush.Style := bssolid;
|
||
Src.Canvas.Brush.Color := clBlack;
|
||
Src.Canvas.Ellipse(0, 0, Src.Width - 1, Src.Height - 1);
|
||
Src.Transparent := True;
|
||
Src.TransparentColor := clBlack;
|
||
Dst.Canvas.Draw(0, 0, Src);
|
||
Dst.Transparent := True;
|
||
Dst.TransparentColor := clWhite;
|
||
Canvas.Draw(0, 0, Clip);
|
||
Canvas.Draw(X - Radius, Y - Radius, Dst);
|
||
Src.Free;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawPlasma(X, Y: Integer; Amount: Extended);
|
||
var
|
||
Src: TBitmap;
|
||
Rs: TRect;
|
||
h, w, ra: Integer;
|
||
begin
|
||
Src := TBitmap.Create;
|
||
ra := Round(Amount);
|
||
zoomrect := Rect(X - ra, Y - ra, X + ra, Y + ra);
|
||
if zoomrect.Left < 0 then
|
||
zoomrect.Left := 0;
|
||
if zoomrect.Top < 0 then
|
||
zoomrect.Top := 0;
|
||
if zoomrect.Right > (FZoomClip.Width - 1) then
|
||
zoomrect.Right := FZoomClip.Width - 1;
|
||
if zoomrect.Bottom > (FZoomClip.Height - 1) then
|
||
zoomrect.Bottom := FZoomClip.Height - 1;
|
||
w := zoomrect.Right - zoomrect.Left + 1;
|
||
h := zoomrect.Bottom - zoomrect.Top + 1;
|
||
Src.Width := w;
|
||
Src.Height := h;
|
||
Src.PixelFormat := pf24bit;
|
||
Rs := Rect(0, 0, w, h);
|
||
Src.Canvas.CopyRect(Rs, FZoomClip.Canvas, zoomrect);
|
||
Canvas.stretchDraw(Rect(0, 0, FZoomClip.Width, FZoomClip.Height), Src);
|
||
Src.Free;
|
||
end;
|
||
|
||
function TJvDrawImage.Rotate(Origin, Endpoint: TPoint; Angle: Real): TPoint;
|
||
var
|
||
a, d, r: Real;
|
||
begin
|
||
r := Sqrt(Sqr(Endpoint.X - Origin.X) + Sqr(Endpoint.Y - Origin.Y));
|
||
d := Endpoint.X - Origin.X;
|
||
if (d >= 0) and (d < 0.001) then
|
||
d := 0.001;
|
||
if (d < 0) and (d > -0.001) then
|
||
d := -0.001;
|
||
a := ArcTan2((Endpoint.Y - Origin.Y), d);
|
||
a := a + Angle;
|
||
Result.X := Origin.X + Variant(r * Cos(a));
|
||
Result.Y := Origin.Y + Variant(r * Sin(a));
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetSyms(X, Y: Integer);
|
||
var
|
||
X0, Y0, i: Integer;
|
||
da: Real;
|
||
apoint: TPoint;
|
||
begin
|
||
X0 := Picture.Bitmap.Width div 2;
|
||
Y0 := Picture.Bitmap.Height div 2;
|
||
da := 2 * pi / StarPoints;
|
||
apoint := Point(X, Y);
|
||
pointarray[0] := apoint;
|
||
for i := 1 to StarPoints - 1 do
|
||
begin
|
||
apoint := Rotate(Point(X0, Y0), apoint, da);
|
||
pointarray[i] := apoint;
|
||
end;
|
||
end;
|
||
|
||
function TJvDrawImage.GetBlue(AColor: TColor): Byte;
|
||
begin
|
||
Result := GetBValue(ColorToRGB(AColor));
|
||
end;
|
||
|
||
function TJvDrawImage.GetGreen(AColor: TColor): Byte;
|
||
begin
|
||
Result := GetGValue(ColorToRGB(AColor));
|
||
end;
|
||
|
||
function TJvDrawImage.GetRed(AColor: TColor): Byte;
|
||
begin
|
||
Result := GetRValue(ColorToRGB(AColor));
|
||
end;
|
||
|
||
function TJvDrawImage.MixColors(Color1, Color2: TColor): TColor;
|
||
var
|
||
R1, G1, B1: Byte;
|
||
begin
|
||
Color1 := ColorToRGB(Color1);
|
||
Color2 := ColorToRGB(Color2);
|
||
R1 := (GetRed(Color1) + GetRed(Color2)) div 2;
|
||
G1 := (GetGreen(Color1) + GetGreen(Color2)) div 2;
|
||
B1 := (GetBlue(Color1) + GetBlue(Color2)) div 2;
|
||
Result := rgb(R1, G1, B1);
|
||
end;
|
||
|
||
procedure TJvDrawImage.InitPlasma;
|
||
var
|
||
w, h: Integer;
|
||
begin
|
||
with Picture.Bitmap do
|
||
begin
|
||
w := Width;
|
||
h := Height;
|
||
FZoomClip.Width := w;
|
||
FZoomClip.Height := h;
|
||
end;
|
||
FZoomClip.PixelFormat := pf24bit;
|
||
FZoomClip.Canvas.Draw(0, 0, Picture.Bitmap);
|
||
end;
|
||
|
||
procedure TJvDrawImage.CopyClip;
|
||
var
|
||
m, dest: TRect;
|
||
begin
|
||
m := mycliprect;
|
||
Clip.Width := m.Right - m.Left + 1;
|
||
Clip.Height := m.Bottom - m.Top + 1;
|
||
dest := Rect(0, 0, Clip.Width, Clip.Height);
|
||
Clip.Canvas.CopyMode := clipcm;
|
||
Clip.Canvas.CopyRect(dest, Canvas, m);
|
||
Clip.pixelformat := pf24bit;
|
||
end;
|
||
|
||
procedure TJvDrawImage.ClipAll;
|
||
begin
|
||
mycliprect := Rect(0, 0, Picture.Bitmap.Width - 1, Picture.Bitmap.Height - 1);
|
||
clipcm := cmsrccopy;
|
||
SetClip(clWhite);
|
||
CopyClip;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetClip(AColor: TColor);
|
||
var
|
||
m, dest: TRect;
|
||
begin
|
||
m := mycliprect;
|
||
Clip.Width := (m.Right - m.Left) + 1;
|
||
Clip.Height := (m.Bottom - m.Top) + 1;
|
||
dest := Rect(0, 0, Clip.Width, Clip.Height);
|
||
Clip.Canvas.Brush.Color := AColor;
|
||
Clip.Canvas.FillRect(dest);
|
||
end;
|
||
|
||
procedure TJvDrawImage.EscapePaint(X, Y: Integer; Shift: TShiftState);
|
||
begin
|
||
if Shape = 'Polygon' then
|
||
begin
|
||
if freepolycount > 2 then
|
||
Canvas.Polygon(slice(freepoly, freepolycount));
|
||
freepolycount := 0;
|
||
myDraw := False;
|
||
end;
|
||
if Shape = 'polyline' then
|
||
begin
|
||
freepolycount := 0;
|
||
myDraw := False;
|
||
end;
|
||
if Shape = 'polybezier' then
|
||
begin
|
||
bezierfix1 := False;
|
||
bezierfix2 := False;
|
||
myorigin := Point(X, Y);
|
||
myprevpoint := myorigin;
|
||
if ssAlt in Shift then
|
||
myDraw := False;
|
||
end;
|
||
|
||
Canvas.Pen.Mode := mypen;
|
||
TargetPoint := Point(X, Y);
|
||
end;
|
||
|
||
procedure TJvDrawImage.MouseDown(Button: TMouseButton;
|
||
Shift: TShiftState; X, Y: Integer);
|
||
begin
|
||
Wavepen := Canvas.Pen.Color;
|
||
Wavebrush := Canvas.Brush.Color;
|
||
if button = mbright then
|
||
begin
|
||
EscapePaint(X, Y, Shift);
|
||
Exit;
|
||
end;
|
||
if ((ssCtrl in Shift) and (ssShift in Shift)) then
|
||
begin
|
||
X := targetpoint.X;
|
||
Y := targetpoint.Y;
|
||
mouse.CursorPos := clienttoscreen(Point(X, Y));
|
||
end;
|
||
Canvas.MoveTo(X, Y);
|
||
myorigin := Point(X, Y);
|
||
myprevpoint := myorigin;
|
||
myslinedir := 'none';
|
||
myDraw := True;
|
||
mypen := Canvas.Pen.Mode;
|
||
if (Shape = 'rangemove') or (Shape = 'rangesmear') then
|
||
begin
|
||
clipcm := cmSrcInvert;
|
||
SetClip(clWhite);
|
||
CopyClip;
|
||
with Canvas do
|
||
begin
|
||
copymode := cmSrcInvert;
|
||
Draw(X, Y, Clip);
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'darkerbrush' then
|
||
ClipAll;
|
||
if Shape = 'mbHorOval' then
|
||
ClipAll;
|
||
if Shape = 'mbVerOval' then
|
||
ClipAll;
|
||
if Shape = 'mbVerBox' then
|
||
ClipAll;
|
||
if Shape = 'mbHorBox' then
|
||
ClipAll;
|
||
if Shape = 'mbHor' then
|
||
ClipAll;
|
||
if Shape = 'mbTop' then
|
||
ClipAll;
|
||
if Shape = 'mbBottom' then
|
||
ClipAll;
|
||
if Shape = 'mbDiamond' then
|
||
ClipAll;
|
||
if Shape = 'mbWaste' then
|
||
ClipAll;
|
||
if Shape = 'mbRound' then
|
||
ClipAll;
|
||
if Shape = 'mbRound2' then
|
||
ClipAll;
|
||
if Shape = 'mbSplitRound' then
|
||
ClipAll;
|
||
if Shape = 'mbSplitWaste' then
|
||
ClipAll;
|
||
if Shape = 'zoombrush' then
|
||
InitPlasma;
|
||
if Shape = 'zoomkeepbrush' then
|
||
InitPlasma;
|
||
if Shape = 'brightnessbrush' then
|
||
ClipAll;
|
||
if Shape = 'contrastbrush' then
|
||
ClipAll;
|
||
if Shape = 'saturationbrush' then
|
||
ClipAll;
|
||
if Shape = 'fisheyebrush' then
|
||
ClipAll;
|
||
if Shape = 'fisheyefixbrush' then
|
||
ClipAll;
|
||
if Shape = 'rotatebrush' then
|
||
ClipAll;
|
||
if Shape = 'twistbrush' then
|
||
ClipAll;
|
||
if Shape = 'rimplebrush' then
|
||
ClipAll;
|
||
if Shape = 'lighterbrush' then
|
||
ClipAll;
|
||
if Shape = 'graybrush' then
|
||
ClipAll;
|
||
if Shape = 'rollmixbrush' then
|
||
ClipAll;
|
||
if Shape = 'smoothbrush' then
|
||
ClipAll;
|
||
|
||
if Shape = 'gradientbrush' then
|
||
begin
|
||
Picture.Bitmap.PixelFormat := pf24bit;
|
||
end;
|
||
if Shape = 'mixbrush' then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
if ssAlt in Shift then
|
||
Pen.Color := MixColors(Pixels[X, Y - Pen.Width], Pixels[X, Y + Pen.Width])
|
||
else
|
||
Pen.Color := MixColors(Pixels[X - Pen.Width, Y], Pixels[X + Pen.Width, Y]);
|
||
end;
|
||
end;
|
||
if Shape = 'sym' then
|
||
SetSyms(X, Y);
|
||
if Shape = 'chord3' then
|
||
Shape := 'chord';
|
||
if Shape = 'pie3' then
|
||
Shape := 'pie';
|
||
if Shape = 'arc3' then
|
||
Shape := 'arc';
|
||
if Shape = 'bezier3' then
|
||
Shape := 'bezier';
|
||
if Shape = 'skewrect2' then
|
||
Shape := 'skewrect';
|
||
if Shape = 'triangle2' then
|
||
Shape := 'triangle';
|
||
if Shape = 'cube2' then
|
||
Shape := 'cube';
|
||
if (Shape = 'snapshot') then
|
||
begin
|
||
myoldbrushstyle := Canvas.Brush.Style;
|
||
Canvas.Brush.Style := bsClear;
|
||
myoldpenwidth := Canvas.Pen.Width;
|
||
Canvas.Pen.Width := 1;
|
||
end;
|
||
if (Shape = 'bezier1') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
PolyBezier(mybezier);
|
||
mybezier[1] := Point(X, Y);
|
||
PolyBezier(mybezier);
|
||
end;
|
||
if (Shape = 'bezier2') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
PolyBezier(mybezier);
|
||
mybezier[2] := Point(X, Y);
|
||
PolyBezier(mybezier);
|
||
end;
|
||
Canvas.Pen.Mode := mypen;
|
||
end;
|
||
|
||
procedure TJvDrawImage.MouseMove(Shift: TShiftState;
|
||
X, Y: Integer);
|
||
var
|
||
xp, yp, i, j, X1, Y1, X2, Y2, h, w, pw, movex, movey: Integer;
|
||
myrect: TRect;
|
||
Color1, Color2: TColor;
|
||
R1, G1, B1, R2, B2, G2: Byte;
|
||
dx, dy, Angle: Extended;
|
||
|
||
function rr: Integer;
|
||
begin
|
||
Result := Round(Sqrt(Sqr(X - myorigin.X) + Sqr(Y - myorigin.Y)));
|
||
if Result < 10 then
|
||
Result := 10;
|
||
end;
|
||
|
||
procedure MoveOrigin;
|
||
begin
|
||
myorigin.X := myorigin.X + movex;
|
||
myorigin.Y := myorigin.Y + movey;
|
||
end;
|
||
|
||
begin
|
||
decoX := X;
|
||
decoY := Y;
|
||
movex := X - myprevpoint.X;
|
||
movey := Y - myprevpoint.Y;
|
||
// test for scripting
|
||
if ((ssCtrl in Shift) and (ssAlt in Shift)) then
|
||
Exit;
|
||
mypen := Canvas.Pen.Mode;
|
||
h := Abs(Y - myorigin.Y);
|
||
// w := Abs(X - myorigin.X);
|
||
if myDraw then
|
||
begin
|
||
if (Shape = 'rangemove') or (Shape = 'rangesmear') then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
copymode := cmSrcInvert;
|
||
if Shape = 'rangemove' then
|
||
Draw(myprevpoint.X, myprevpoint.Y, Clip);
|
||
Draw(X, Y, Clip);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
end;
|
||
if Shape = 'airbrush' then
|
||
if AirBrush.Air then
|
||
AirBrush.Draw(Canvas, X, Y);
|
||
if (Shape = 'zoombrush') or (Shape = 'zoomkeepbrush') then
|
||
begin
|
||
w := Canvas.Pen.Width;
|
||
if w < 5 then
|
||
w := 50;
|
||
DrawPlasma(X, Y, w);
|
||
end;
|
||
if Shape = 'fisheyebrush' then
|
||
begin
|
||
w := Canvas.Pen.Width;
|
||
if w < 5 then
|
||
w := 50;
|
||
DrawEffectBrush(X, Y, w, 0.9, lbfisheye);
|
||
end;
|
||
if Shape = 'fisheyefixbrush' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) / pi * 0.5 + 0.5;
|
||
if Angle < 0.55 then
|
||
Angle := 0.55;
|
||
if Angle > 0.99 then
|
||
Angle := 0.99;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, lbfisheye);
|
||
end;
|
||
if Shape = 'twistbrush' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := Abs(ArcTan2(dy, dx) * 25 / pi) + 1;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Round(Angle), lbtwist);
|
||
end;
|
||
if Shape = 'mbHorOval' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawStretchBrush(myorigin.X, myorigin.Y, rr, Angle, mbHorOval);
|
||
end;
|
||
if Shape = 'mbHorBox' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawStretchBrush(myorigin.X, myorigin.Y, rr, Angle, mbHorBox);
|
||
end;
|
||
|
||
if Shape = 'mbVerOval' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawStretchBrush(myorigin.X, myorigin.Y, rr, Angle, mbVerOval);
|
||
end;
|
||
|
||
if Shape = 'mbVerBox' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawStretchBrush(myorigin.X, myorigin.Y, rr, Angle, mbVerBox);
|
||
end;
|
||
|
||
if Shape = 'mbHor' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbHor);
|
||
end;
|
||
|
||
if Shape = 'mbTop' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbTop);
|
||
end;
|
||
|
||
if Shape = 'mbBottom' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbBottom);
|
||
end;
|
||
if Shape = 'mbWaste' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbWaste);
|
||
end;
|
||
if Shape = 'mbRound' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbRound);
|
||
end;
|
||
if Shape = 'mbRound2' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbRound2);
|
||
end;
|
||
|
||
if Shape = 'mbDiamond' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbDiamond);
|
||
end;
|
||
if Shape = 'mbSplitRound' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbSplitRound);
|
||
end;
|
||
if Shape = 'mbSplitWaste' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, mbSplitWaste);
|
||
end;
|
||
|
||
if Shape = 'rimplebrush' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 10 / pi + 1;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, lbrimple);
|
||
end;
|
||
|
||
if Shape = 'rotatebrush' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 180 / pi;
|
||
DrawEffectBrush(myorigin.X, myorigin.Y, rr, Angle, lbrotate);
|
||
end;
|
||
if Shape = 'brightnessbrush' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 100 / pi;
|
||
DrawLightBrush(myorigin.X, myorigin.Y,
|
||
rr, Round(Angle), lbBrightness);
|
||
end;
|
||
if Shape = 'contrastbrush' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 100 / pi;
|
||
DrawLightBrush(myorigin.X, myorigin.Y,
|
||
rr, Round(Angle), lbContrast);
|
||
end;
|
||
if Shape = 'saturationbrush' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
MoveOrigin;
|
||
dx := X - myorigin.X;
|
||
if dx = 0 then
|
||
dx := 0.01;
|
||
dy := Y - myorigin.Y;
|
||
Angle := ArcTan2(dy, dx) * 100 / pi;
|
||
DrawLightBrush(myorigin.X, myorigin.Y,
|
||
rr, Round(Angle), lbContrast);
|
||
end;
|
||
|
||
if Shape = 'Bluebrush' then
|
||
DrawColorCircle(X, Y, 0);
|
||
if Shape = 'Greenbrush' then
|
||
DrawColorCircle(X, Y, 1);
|
||
if Shape = 'redbrush' then
|
||
DrawColorCircle(X, Y, 2);
|
||
if Shape = 'notBluebrush' then
|
||
DrawColorCircle(X, Y, 3);
|
||
if Shape = 'notGreenbrush' then
|
||
DrawColorCircle(X, Y, 4);
|
||
if Shape = 'notredbrush' then
|
||
DrawColorCircle(X, Y, 5);
|
||
if Shape = 'halfBluebrush' then
|
||
DrawColorCircle(X, Y, 6);
|
||
if Shape = 'halfGreenbrush' then
|
||
DrawColorCircle(X, Y, 7);
|
||
if Shape = 'halfredbrush' then
|
||
DrawColorCircle(X, Y, 8);
|
||
if Shape = 'darkerbrush' then
|
||
DrawDarkerCircle(X, Y, 9);
|
||
if Shape = 'lighterbrush' then
|
||
DrawLighterCircle(X, Y, 10);
|
||
if Shape = 'graybrush' then
|
||
DrawLighterCircle(X, Y, 11);
|
||
if Shape = 'rollmixbrush' then
|
||
DrawLighterCircle(X, Y, 12);
|
||
if Shape = 'smoothbrush' then
|
||
DrawLighterCircle(X, Y, 13);
|
||
|
||
if Shape = 'gradientbrush' then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
if ssAlt in Shift then
|
||
begin
|
||
Color1 := Pixels[X, Y - Pen.Width];
|
||
Color2 := Pixels[X, Y + Pen.Width];
|
||
DrawVGradientBrush(Color1, Color2, Y - Pen.Width, Y + Pen.Width, X);
|
||
DrawVGradientBrush(Color1, Color2, Y - Pen.Width, Y + Pen.Width, X - 1);
|
||
DrawVGradientBrush(Color1, Color2, Y - Pen.Width, Y + Pen.Width, X - 2);
|
||
end
|
||
else
|
||
begin
|
||
Color1 := Pixels[X - Pen.Width, Y];
|
||
Color2 := Pixels[X + Pen.Width, Y];
|
||
DrawGradientBrush(Color1, Color2, X - Pen.Width, X + Pen.Width, Y);
|
||
DrawGradientBrush(Color1, Color2, X - Pen.Width, X + Pen.Width, Y + 1);
|
||
DrawGradientBrush(Color1, Color2, X - Pen.Width, X + Pen.Width, Y + 2);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'cube1' then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
DrawCube;
|
||
myskew[4] := Point(X, Y);
|
||
DrawCube;
|
||
end;
|
||
if (Shape = 'rectangle') or (Shape = 'cube') or (Shape = 'maze') or
|
||
(Shape = 'Interprect') or (Shape = 'interColumn') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
Rectangle(myorigin.X, myorigin.Y, myprevpoint.X, myprevpoint.Y);
|
||
Rectangle(myorigin.X, myorigin.Y, X, Y);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
|
||
if Shape = 'roundrect' then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
RoundRect(myorigin.X, myorigin.Y, myprevpoint.X, myprevpoint.Y, myround, myround);
|
||
RoundRect(myorigin.X, myorigin.Y, X, Y, myround, myround);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
if Shape = 'Blocks' then
|
||
Canvas.FillRect(PointToBlock(X, Y));
|
||
|
||
if (Shape = 'ellipse') or (Shape = 'globe') or (Shape = 'interSphere') or
|
||
(Shape = 'MultiSphere') or (Shape = 'DropletSphere') or
|
||
(Shape = 'WaveSphere') or (Shape = 'RisingWaveSphere') or
|
||
(Shape = 'decooval') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
Ellipse(myorigin.X, myorigin.Y, myprevpoint.X, myprevpoint.Y);
|
||
Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
if (Shape = 'chord') or (Shape = 'pie') or (Shape = 'arc') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
Ellipse(myorigin.X, myorigin.Y, myprevpoint.X, myprevpoint.Y);
|
||
Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
if Shape = 'skewrect1' then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
DrawSkew;
|
||
myskew[2] := Point(X, Y);
|
||
myskew[3].X := myskew[0].X + (myskew[2].X - myskew[1].X);
|
||
myskew[3].Y := myskew[0].Y + (myskew[2].Y - myskew[1].Y);
|
||
DrawSkew;
|
||
end;
|
||
|
||
if Shape = 'triangle1' then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
DrawTriangle;
|
||
myskew[2] := Point(X, Y);
|
||
DrawTriangle;
|
||
end;
|
||
if (Shape = 'polyline') or (Shape = 'Polygon') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
PenPos := Point(myorigin.X, myorigin.Y);
|
||
LineTo(myprevpoint.X, myprevpoint.Y);
|
||
PenPos := Point(myorigin.X, myorigin.Y);
|
||
LineTo(X, Y);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
|
||
if Shape = 'polybezier' then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
mybezier[0] := Point(myorigin.X, myorigin.Y);
|
||
mybezier[3] := Point(myprevpoint.X, myprevpoint.Y);
|
||
if not bezierfix1 then
|
||
begin
|
||
mybezier[1].X := mybezier[0].X;
|
||
mybezier[1].Y := mybezier[3].Y;
|
||
end;
|
||
if not bezierfix2 then
|
||
begin
|
||
mybezier[2].X := mybezier[3].X;
|
||
mybezier[2].Y := mybezier[0].Y;
|
||
end;
|
||
PolyBezier(mybezier);
|
||
mybezier[3] := Point(X, Y);
|
||
if (ssCtrl in Shift) then
|
||
begin
|
||
bezierfix1 := True;
|
||
mybezier[1] := mybezier[3];
|
||
end;
|
||
if not bezierfix1 then
|
||
begin
|
||
mybezier[1].X := mybezier[0].X;
|
||
mybezier[1].Y := mybezier[3].Y;
|
||
end;
|
||
if (ssShift in Shift) then
|
||
begin
|
||
bezierfix2 := True;
|
||
mybezier[2] := mybezier[3];
|
||
end;
|
||
if not bezierfix2 then
|
||
begin
|
||
mybezier[2].X := mybezier[3].X;
|
||
mybezier[2].Y := mybezier[0].Y;
|
||
end;
|
||
|
||
PolyBezier(mybezier);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
if (Shape = 'line') or (Shape = 'rotateText') or (Shape = 'Star') or
|
||
(Shape = 'spiral') or (Shape = 'skewrect') or (Shape = 'triangle') or
|
||
(Shape = 'cone') or (Shape = 'Spiro') or (Shape = 'decobar') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
PenPos := Point(myorigin.X, myorigin.Y);
|
||
LineTo(myprevpoint.X, myprevpoint.Y);
|
||
PenPos := Point(myorigin.X, myorigin.Y);
|
||
LineTo(X, Y);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
if (Shape = 'bezier') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
mybezier[0] := Point(myorigin.X, myorigin.Y);
|
||
mybezier[1] := mybezier[0];
|
||
mybezier[3] := Point(myprevpoint.X, myprevpoint.Y);
|
||
mybezier[2] := mybezier[3];
|
||
PolyBezier(mybezier);
|
||
mybezier[3] := Point(X, Y);
|
||
mybezier[2] := mybezier[3];
|
||
PolyBezier(mybezier);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
if (Shape = 'bezier1') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
PolyBezier(mybezier);
|
||
mybezier[1] := Point(X, Y);
|
||
PolyBezier(mybezier);
|
||
end;
|
||
if (Shape = 'bezier2') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
PolyBezier(mybezier);
|
||
mybezier[2] := Point(X, Y);
|
||
PolyBezier(mybezier);
|
||
end;
|
||
if Shape = 'spray' then
|
||
for i := 1 to 10 do
|
||
begin
|
||
xp := random(30) - 15;
|
||
yp := random(30) - 15;
|
||
Canvas.Pixels[X + xp, Y + yp] := Canvas.Brush.Color;
|
||
end;
|
||
|
||
if (Shape = 'Waveline') or (Shape = 'fastWaveline') or
|
||
(Shape = 'colorWaveline') then
|
||
with Canvas do
|
||
begin
|
||
Canvas.LineTo(X, Y);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
|
||
if Shape = 'borderWaveline' then
|
||
begin
|
||
Canvas.MoveTo(myprevpoint.X, myprevpoint.Y);
|
||
Canvas.LineTo(X, Y);
|
||
Canvas.MoveTo(Width - myprevpoint.X, Height - myprevpoint.Y);
|
||
Canvas.LineTo(Width - X, Height - Y);
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
|
||
if Shape = 'decoline' then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
pw := Pen.Width;
|
||
Pen.Color := Wavepen;
|
||
Pen.Mode := pmCopy;
|
||
MoveTo(myprevpoint.X, myprevpoint.Y);
|
||
LineTo(X, Y);
|
||
Pen.Width := pw * 2;
|
||
Pen.Mode := pmmasknotpen;
|
||
MoveTo(myprevpoint.X, myprevpoint.Y);
|
||
LineTo(X, Y);
|
||
myprevpoint := Point(X, Y);
|
||
Pen.Width := pw;
|
||
Pen.Mode := pmCopy;
|
||
Pen.Mode := mypen;
|
||
end;
|
||
end;
|
||
|
||
if (Shape = 'freehand') or (Shape = 'mixbrush') then
|
||
with Canvas do
|
||
begin
|
||
Canvas.LineTo(X, Y);
|
||
myprevpoint := Point(X, Y)
|
||
end;
|
||
if Shape = 'cloneall' then
|
||
with Canvas do
|
||
begin
|
||
X1 := myorigin.X - TargetPoint.X;
|
||
Y1 := myorigin.Y - Targetpoint.Y;
|
||
X2 := X - X1;
|
||
Y2 := Y - Y1;
|
||
copymode := cmsrccopy;
|
||
i := Pen.Width;
|
||
copyrect(Rect(X, Y, X + i, Y + i), Canvas,
|
||
Rect(X2, Y2, X2 + i, Y2 + i));
|
||
end;
|
||
|
||
if Shape = 'clonenottarget' then
|
||
with Canvas do
|
||
begin
|
||
X1 := myorigin.X - TargetPoint.X;
|
||
Y1 := myorigin.Y - Targetpoint.Y;
|
||
X2 := X - X1;
|
||
Y2 := Y - Y1;
|
||
i := Pen.Width;
|
||
PutClip(Rect(X2, Y2, X2 + i, Y2 + i));
|
||
Clip.Transparent := True;
|
||
Clip.TransparentColor := Pixels[Targetpoint.X, Targetpoint.Y];
|
||
Draw(X, Y, Clip);
|
||
Clip.Transparent := False;
|
||
end;
|
||
|
||
if (Shape = 'paste') and (ssShift in Shift) then
|
||
begin
|
||
myrect := Rect(0, 0, 0, 0);
|
||
myrect.Left := X;
|
||
myrect.Top := Y;
|
||
myrect.Right := X + mycliprect.Right - mycliprect.Left;
|
||
myrect.Bottom := Y + mycliprect.Bottom - mycliprect.Top;
|
||
Canvas.CopyRect(myrect, Canvas, mycliprect);
|
||
end;
|
||
if Shape = 'sym' then
|
||
DrawSyms(X, Y);
|
||
if Shape = 'sline' then
|
||
begin
|
||
if myslinedir = 'none' then
|
||
if Abs(X - myorigin.X) >= Abs(Y - myorigin.Y) then
|
||
myslinedir := 'h'
|
||
else
|
||
myslinedir := 'v';
|
||
if (myslinedir = 'h') and (Abs(Y - myprevpoint.Y) > myslinetol) then
|
||
myslinedir := 'v';
|
||
if (myslinedir = 'v') and (Abs(X - myprevpoint.X) > myslinetol) then
|
||
myslinedir := 'h';
|
||
if myslinedir = 'h' then
|
||
begin
|
||
Canvas.LineTo(X, myprevpoint.Y);
|
||
myprevpoint.X := X;
|
||
end;
|
||
if myslinedir = 'v' then
|
||
begin
|
||
Canvas.LineTo(myprevpoint.X, Y);
|
||
myprevpoint.Y := Y;
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'vmirror' then
|
||
begin
|
||
X1 := myprevpoint.X;
|
||
Y1 := myprevpoint.Y;
|
||
X2 := Width;
|
||
// Y2 := Height;
|
||
Canvas.PenPos := Point(X2 - X1, Y1);
|
||
Canvas.LineTo(X2 - X, Y);
|
||
Canvas.PenPos := Point(X1, Y1);
|
||
Canvas.LineTo(X, Y);
|
||
myprevpoint := Point(X, Y)
|
||
end;
|
||
if Shape = 'cmirror' then
|
||
begin
|
||
X1 := myprevpoint.X;
|
||
Y1 := myprevpoint.Y;
|
||
X2 := Width;
|
||
Y2 := Height;
|
||
Canvas.PenPos := Point(X2 - X1, Y2 - Y1);
|
||
Canvas.LineTo(X2 - X, Y2 - Y);
|
||
Canvas.PenPos := Point(X1, Y1);
|
||
Canvas.LineTo(X, Y);
|
||
myprevpoint := Point(X, Y)
|
||
end;
|
||
if Shape = 'mirror4' then
|
||
begin
|
||
X1 := myprevpoint.X;
|
||
Y1 := myprevpoint.Y;
|
||
X2 := Width;
|
||
Y2 := Height;
|
||
Canvas.PenPos := Point(X2 - X1, Y2 - Y1);
|
||
Canvas.LineTo(X2 - X, Y2 - Y);
|
||
Canvas.PenPos := Point(X2 - X1, Y1);
|
||
Canvas.LineTo(X2 - X, Y);
|
||
Canvas.PenPos := Point(X1, Y2 - Y1);
|
||
Canvas.LineTo(X, Y2 - Y);
|
||
Canvas.PenPos := Point(X1, Y1);
|
||
Canvas.LineTo(X, Y);
|
||
myprevpoint := Point(X, Y)
|
||
end;
|
||
if Shape = 'hmirror' then
|
||
begin
|
||
X1 := myprevpoint.X;
|
||
Y1 := myprevpoint.Y;
|
||
// X2 := Width;
|
||
Y2 := Height;
|
||
Canvas.PenPos := Point(X1, Y2 - Y1);
|
||
Canvas.LineTo(X, Y2 - Y);
|
||
Canvas.PenPos := Point(X1, Y1);
|
||
Canvas.LineTo(X, Y);
|
||
myprevpoint := Point(X, Y)
|
||
end;
|
||
if (Shape = 'snapshot') or (Shape = 'bars') or (Shape = 'border') then
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
Pen.Style := psDot;
|
||
Rectangle(myorigin.X, myorigin.Y, myprevpoint.X, myprevpoint.Y);
|
||
Rectangle(myorigin.X, myorigin.Y, X, Y);
|
||
myprevpoint := Point(X, Y);
|
||
Pen.Style := psSolid;
|
||
end;
|
||
end;
|
||
Canvas.Pen.Mode := mypen;
|
||
myprevpoint := Point(X, Y);
|
||
end;
|
||
|
||
procedure TJvDrawImage.MouseUp(Button: TMouseButton;
|
||
Shift: TShiftState; X, Y: Integer);
|
||
var
|
||
myrect: TRect;
|
||
xs, ys, xt, yt, i, tangle: Integer;
|
||
c: TColor;
|
||
drw: string;
|
||
apoint: TPoint;
|
||
Bitmap: TBitmap;
|
||
X1, Y1, X2, Y2: Integer;
|
||
dcurve: array [0..3] of TPoint;
|
||
rgn: HRGN;
|
||
R1, G1, B1, R2, G2, B2: Byte;
|
||
r, g, b, dr, dg, db: Extended;
|
||
AColor, pcolor: TColor;
|
||
pw: Integer;
|
||
begin
|
||
//Canvas.Pen.Color:=Wavepen;
|
||
//Canvas.Brush.Color:=Wavebrush;
|
||
|
||
if ((ssCtrl in Shift) and (ssAlt in Shift)) then
|
||
Exit;
|
||
if button = mbright then
|
||
Exit;
|
||
mypen := Canvas.Pen.Mode;
|
||
|
||
if Shape = 'zoombrush' then
|
||
Canvas.Draw(0, 0, FZoomClip);
|
||
if Shape = 'transcopy' then
|
||
begin
|
||
clipcm := cmSrcCopy;
|
||
SetClip(clWhite);
|
||
CopyClip;
|
||
myrect := Rect(X, Y, X + Clip.Width - 1, Y + Clip.Height - 1);
|
||
With Canvas do
|
||
BrushCopy( myrect, Clip,
|
||
Rect(0, 0, Clip.Width, Clip.Height), RangeTransColor);
|
||
myDraw := False;
|
||
end;
|
||
if Shape = 'cube1' then
|
||
begin
|
||
if mypen <> pmNotXor then
|
||
DrawCube;
|
||
Shape := 'cube2';
|
||
end;
|
||
|
||
if Shape = 'TexLines' then
|
||
begin
|
||
DrawTexLines(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'Texovals' then
|
||
begin
|
||
DrawTexOvals(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'Blurovals' then
|
||
begin
|
||
DrawBlurOvals(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'Texcurves' then
|
||
begin
|
||
DrawTexCurves(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'Blurcurves' then
|
||
begin
|
||
DrawBlurCurves(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'Texpoly' then
|
||
begin
|
||
DrawTexPoly(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'Blurpoly' then
|
||
begin
|
||
DrawBlurPoly(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'TexRects' then
|
||
begin
|
||
DrawTexRects(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'BlurRects' then
|
||
begin
|
||
DrawBlurRects(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
if Shape = 'BlurLines' then
|
||
begin
|
||
DrawBlurLines(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
|
||
if Shape = 'cube' then
|
||
begin
|
||
myskew[0] := myorigin;
|
||
myskew[2] := Point(X, Y);
|
||
myskew[4] := myskew[2];
|
||
myskew[1].X := myskew[2].X;
|
||
myskew[1].Y := myskew[0].Y;
|
||
myskew[3].X := myskew[0].X;
|
||
myskew[3].Y := myskew[2].Y;
|
||
DrawCube;
|
||
Shape := 'cube1';
|
||
end;
|
||
|
||
if Shape = 'Interprect' then
|
||
InterpRect(myorigin.X, myorigin.Y, X, Y);
|
||
|
||
if Shape = 'interColumn' then
|
||
DrawColumn(myorigin.X, myorigin.Y, X, Y);
|
||
|
||
if Shape = 'interSphere' then
|
||
if ((myorigin.X <> X) and (myorigin.Y <> Y)) then
|
||
begin
|
||
if ssAlt in Shift then
|
||
DrawSphere(Canvas.Pixels[myorigin.X, myorigin.Y],
|
||
Canvas.Pixels[X, Y], myorigin.X, myorigin.Y, X, Y)
|
||
else
|
||
DrawSphere(Wavepen, Wavebrush, myorigin.X, myorigin.Y, X, Y)
|
||
end;
|
||
|
||
if Shape = 'MultiSphere' then
|
||
begin
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
Canvas.Pen.Mode := pmCopy;
|
||
if ((myorigin.X <> X) and (myorigin.Y <> Y)) then
|
||
begin
|
||
if ssAlt in Shift then
|
||
DrawMultiSphere(Canvas.Pixels[myorigin.X, myorigin.Y],
|
||
Canvas.Pixels[X, Y], myorigin.X, myorigin.Y, X, Y)
|
||
else
|
||
DrawMultiSphere(Wavepen, Wavebrush, myorigin.X, myorigin.Y, X, Y)
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'DropletSphere' then
|
||
begin
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
Canvas.Pen.Mode := pmCopy;
|
||
if ((myorigin.X <> X) and (myorigin.Y <> Y)) then
|
||
begin
|
||
if ssAlt in Shift then
|
||
DrawDropletSphere(Canvas.Pixels[myorigin.X, myorigin.Y],
|
||
Canvas.Pixels[X, Y], myorigin.X, myorigin.Y, X, Y)
|
||
else
|
||
DrawDropletSphere(Wavepen, Wavebrush, myorigin.X, myorigin.Y, X, Y)
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'WaveSphere' then
|
||
begin
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
Canvas.Pen.Mode := pmCopy;
|
||
if ((myorigin.X <> X) and (myorigin.Y <> Y)) then
|
||
begin
|
||
if ssAlt in Shift then
|
||
DrawWaveSphere(Canvas.Pixels[myorigin.X, myorigin.Y],
|
||
Canvas.Pixels[X, Y], myorigin.X, myorigin.Y, X, Y)
|
||
else
|
||
DrawWaveSphere(Wavepen, Wavebrush, myorigin.X, myorigin.Y, X, Y)
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'RisingWaveSphere' then
|
||
begin
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
Canvas.Pen.Mode := pmCopy;
|
||
if ((myorigin.X <> X) and (myorigin.Y <> Y)) then
|
||
begin
|
||
if ssAlt in Shift then
|
||
DrawRisingWaveSphere(Canvas.Pixels[myorigin.X, myorigin.Y],
|
||
Canvas.Pixels[X, Y], myorigin.X, myorigin.Y, X, Y)
|
||
else
|
||
DrawRisingWaveSphere(Wavepen, Wavebrush, myorigin.X, myorigin.Y, X, Y)
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'rectangle' then
|
||
begin
|
||
if mypen <> pmNotXor then
|
||
Canvas.Rectangle(myorigin.X, myorigin.Y, X, Y);
|
||
if Stars > 1 then
|
||
begin
|
||
xs := (X - myorigin.X) div 2 div Stars;
|
||
ys := (Y - myorigin.Y) div 2 div Stars;
|
||
for i := 1 to Stars - 1 do
|
||
begin
|
||
Canvas.Rectangle(myorigin.X + i * xs, myorigin.Y + i * ys, X - i * xs, Y - i * ys);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'maze' then
|
||
begin
|
||
if mypen <> pmNotXor then
|
||
Canvas.Rectangle(myorigin.X, myorigin.Y, X, Y);
|
||
xs := (X - myorigin.X) div 10;
|
||
ys := (Y - myorigin.Y) div 10;
|
||
xt := myorigin.X;
|
||
yt := myorigin.Y;
|
||
for i := 1 to 10 do
|
||
begin
|
||
Canvas.MoveTo(xt + i * xs, Y);
|
||
Canvas.LineTo(X, Y - i * ys);
|
||
Canvas.MoveTo(X, Y - i * ys);
|
||
Canvas.LineTo(X - i * xs, yt);
|
||
Canvas.MoveTo(X - i * xs, yt);
|
||
Canvas.LineTo(xt, yt + i * ys);
|
||
Canvas.MoveTo(xt, yt + i * ys);
|
||
Canvas.LineTo(xt + i * xs, Y);
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'roundrect' then
|
||
begin
|
||
if mypen <> pmNotXor then
|
||
Canvas.RoundRect(myorigin.X, myorigin.Y, X, Y, myround, myround);
|
||
if Stars > 1 then
|
||
begin
|
||
xs := (X - myorigin.X) div 2 div Stars;
|
||
ys := (Y - myorigin.Y) div 2 div Stars;
|
||
for i := 1 to Stars - 1 do
|
||
begin
|
||
Canvas.RoundRect(myorigin.X + i * xs, myorigin.Y + i * ys, X - i * xs, Y - i * ys, myround, myround);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'Blocks' then
|
||
Canvas.FillRect(PointToBlock(X, Y));
|
||
|
||
if Shape = 'Star' then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
PenPos := Point(myorigin.X, myorigin.Y);
|
||
LineTo(myprevpoint.X, myprevpoint.Y);
|
||
end;
|
||
Canvas.Pen.Mode := mypen;
|
||
for i := 1 to Stars do
|
||
begin
|
||
apoint := ReduceVector(myorigin, Point(X, Y), i / Stars);
|
||
Star(apoint.X, apoint.Y);
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'spiral' then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
PenPos := Point(myorigin.X, myorigin.Y);
|
||
LineTo(myprevpoint.X, myprevpoint.Y);
|
||
end;
|
||
Canvas.Pen.Mode := mypen;
|
||
apoint := Point(100 * X, 100 * Y);
|
||
myorigin.X := 100 * myorigin.X;
|
||
myorigin.Y := 100 * myorigin.Y;
|
||
for i := 1 to Variant(Spirals * 36) do
|
||
begin
|
||
apoint := Rotate(myorigin, apoint, spiraldir * pi / 18);
|
||
apoint := ReduceVector(myorigin, apoint, spiralfactor);
|
||
Canvas.LineTo(apoint.X div 100, apoint.Y div 100);
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'ellipse' then
|
||
begin
|
||
if mypen <> pmNotXor then
|
||
Canvas.Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
if Stars > 1 then
|
||
begin
|
||
xs := (X - myorigin.X) div 2 div Stars;
|
||
ys := (Y - myorigin.Y) div 2 div Stars;
|
||
for i := 1 to Stars - 1 do
|
||
begin
|
||
Canvas.Ellipse(myorigin.X + i * xs, myorigin.Y + i * ys, X - i * xs, Y - i * ys);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'globe' then
|
||
begin
|
||
if mypen <> pmNotXor then
|
||
Canvas.Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
xs := (X - myorigin.X) div 20;
|
||
ys := (Y - myorigin.Y) div 20;
|
||
for i := 1 to 10 do
|
||
begin
|
||
Canvas.Ellipse(myorigin.X + i * xs, myorigin.Y, X - i * xs, Y);
|
||
Canvas.Ellipse(myorigin.X, myorigin.Y + i * ys, X, Y - i * ys);
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'chord2' then
|
||
begin
|
||
mychord[7] := X;
|
||
mychord[8] := Y;
|
||
Shape := 'chord3';
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.Ellipse(mychord[1], mychord[2], mychord[3], mychord[4]);
|
||
Canvas.Pen.Mode := mypen;
|
||
Canvas.Chord(mychord[1], mychord[2], mychord[3], mychord[4], mychord[5], mychord[6], mychord[7], mychord[8]);
|
||
end;
|
||
|
||
if Shape = 'chord1' then
|
||
begin
|
||
mychord[5] := X;
|
||
mychord[6] := Y;
|
||
Shape := 'chord2';
|
||
end;
|
||
|
||
if Shape = 'chord' then
|
||
begin
|
||
mychord[1] := myorigin.X;
|
||
mychord[2] := myorigin.Y;
|
||
mychord[3] := X;
|
||
mychord[4] := Y;
|
||
Shape := 'chord1';
|
||
end;
|
||
|
||
if Shape = 'arc2' then
|
||
begin
|
||
mychord[7] := X;
|
||
mychord[8] := Y;
|
||
Shape := 'arc3';
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.Ellipse(mychord[1], mychord[2], mychord[3], mychord[4]);
|
||
Canvas.Pen.Mode := mypen;
|
||
Canvas.Arc(mychord[1], mychord[2], mychord[3], mychord[4], mychord[5], mychord[6], mychord[7], mychord[8]);
|
||
end;
|
||
|
||
if Shape = 'arc1' then
|
||
begin
|
||
mychord[5] := X;
|
||
mychord[6] := Y;
|
||
Shape := 'arc2';
|
||
end;
|
||
|
||
if Shape = 'arc' then
|
||
begin
|
||
mychord[1] := myorigin.X;
|
||
mychord[2] := myorigin.Y;
|
||
mychord[3] := X;
|
||
mychord[4] := Y;
|
||
Shape := 'arc1';
|
||
end;
|
||
|
||
if Shape = 'pie2' then
|
||
begin
|
||
mychord[7] := X;
|
||
mychord[8] := Y;
|
||
Shape := 'pie3';
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.Ellipse(mychord[1], mychord[2], mychord[3], mychord[4]);
|
||
Canvas.Pen.Mode := mypen;
|
||
Canvas.Pie(mychord[1], mychord[2], mychord[3], mychord[4], mychord[5], mychord[6], mychord[7], mychord[8]);
|
||
end;
|
||
|
||
if Shape = 'pie1' then
|
||
begin
|
||
mychord[5] := X;
|
||
mychord[6] := Y;
|
||
Shape := 'pie2';
|
||
end;
|
||
|
||
if Shape = 'pie' then
|
||
begin
|
||
mychord[1] := myorigin.X;
|
||
mychord[2] := myorigin.Y;
|
||
mychord[3] := X;
|
||
mychord[4] := Y;
|
||
Shape := 'pie1';
|
||
end;
|
||
|
||
if Shape = 'skewrect1' then
|
||
begin
|
||
if mypen <> pmNotXor then
|
||
DrawSkew;
|
||
Shape := 'skewrect2';
|
||
end;
|
||
|
||
if Shape = 'skewrect' then
|
||
begin
|
||
Canvas.PenPos := Point(myorigin.X, myorigin.Y);
|
||
if mypen <> pmNotXor then
|
||
Canvas.LineTo(X, Y);
|
||
myskew[0] := myorigin;
|
||
myskew[1] := Point(X, Y);
|
||
myskew[2] := myskew[1];
|
||
myskew[3] := myskew[0];
|
||
Shape := 'skewrect1';
|
||
end;
|
||
|
||
if Shape = 'triangle1' then
|
||
begin
|
||
if mypen <> pmNotXor then
|
||
DrawTriangle;
|
||
Shape := 'triangle2';
|
||
end;
|
||
|
||
if Shape = 'triangle' then
|
||
begin
|
||
Canvas.PenPos := Point(myorigin.X, myorigin.Y);
|
||
if mypen <> pmNotXor then
|
||
Canvas.LineTo(X, Y);
|
||
myskew[0] := myorigin;
|
||
myskew[1] := Point(X, Y);
|
||
myskew[2] := myskew[1];
|
||
Shape := 'triangle1';
|
||
end;
|
||
|
||
if Shape = 'decobar' then
|
||
begin
|
||
Picture.Bitmap.PixelFormat := pf24bit;
|
||
with Canvas do
|
||
begin
|
||
pw := Pen.Width;
|
||
pcolor := Pen.Color;
|
||
AColor := ColorToRGB(Wavebrush);
|
||
R1 := GetRed(AColor);
|
||
r := R1;
|
||
G1 := GetGreen(AColor);
|
||
g := G1;
|
||
B1 := GetBlue(AColor);
|
||
b := B1;
|
||
AColor := ColorToRGB(Pen.Color);
|
||
R2 := GetRed(AColor);
|
||
G2 := GetGreen(AColor);
|
||
B2 := GetBlue(AColor);
|
||
dr := (R1 - R2) / (pw / 3);
|
||
dg := (G1 - G2) / (pw / 3);
|
||
db := (B1 - B2) / (pw / 3);
|
||
if pw < 30 then
|
||
Pen.Width := 30;
|
||
for i := 1 to Pen.Width div 3 do
|
||
begin
|
||
r := r - dr;
|
||
g := g - dg;
|
||
b := b - db;
|
||
Pen.Color := rgb(Round(r), Round(g), Round(b));
|
||
MoveTo(myorigin.X, myorigin.Y);
|
||
LineTo(X, Y);
|
||
Pen.Width := Pen.Width - 2;
|
||
end;
|
||
Pen.Width := pw;
|
||
Pen.Color := pcolor;
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'decooval' then
|
||
begin
|
||
Picture.Bitmap.PixelFormat := pf24bit;
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
Ellipse(myorigin.X, myorigin.Y, myprevpoint.X, myprevpoint.Y);
|
||
Pen.Mode := pmCopy;
|
||
pw := Pen.Width;
|
||
Brush.Style := bsClear;
|
||
AColor := ColorToRGB(Wavebrush);
|
||
R1 := GetRed(AColor);
|
||
r := R1;
|
||
G1 := GetGreen(AColor);
|
||
g := G1;
|
||
B1 := GetBlue(AColor);
|
||
b := B1;
|
||
AColor := ColorToRGB(Wavepen);
|
||
R2 := GetRed(AColor);
|
||
G2 := GetGreen(AColor);
|
||
B2 := GetBlue(AColor);
|
||
dr := (R1 - R2) / (pw / 3);
|
||
dg := (G1 - G2) / (pw / 3);
|
||
db := (B1 - B2) / (pw / 3);
|
||
if pw < 30 then
|
||
Pen.Width := 30;
|
||
for i := 1 to Pen.Width div 3 do
|
||
begin
|
||
Pen.Width := Pen.Width - 2;
|
||
r := r - dr;
|
||
g := g - dg;
|
||
b := b - db;
|
||
Pen.Color := rgb(Round(r), Round(g), Round(b));
|
||
Ellipse(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
Pen.Width := pw;
|
||
end;
|
||
end;
|
||
|
||
if (Shape = 'polyline') or (Shape = 'Polygon') then
|
||
begin
|
||
Canvas.PenPos := Point(myorigin.X, myorigin.Y);
|
||
if mypen <> pmNotXor then
|
||
Canvas.LineTo(X, Y);
|
||
if freepolycount = 0 then
|
||
begin
|
||
freepoly[0] := myorigin;
|
||
inc(freepolycount);
|
||
end
|
||
else
|
||
begin
|
||
freepoly[freepolycount] := Point(X, Y);
|
||
if freepolycount < 100 then
|
||
inc(freepolycount);
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'line' then
|
||
begin
|
||
Canvas.PenPos := Point(myorigin.X, myorigin.Y);
|
||
if mypen <> pmNotXor then
|
||
begin
|
||
Canvas.LineTo(X, Y);
|
||
end;
|
||
end;
|
||
|
||
if Shape = 'Spiro' then
|
||
begin
|
||
Canvas.PenPos := Point(myorigin.X, myorigin.Y);
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.LineTo(X, Y);
|
||
Canvas.Pen.Mode := mypen;
|
||
DrawSpiro(myorigin, Point(X, Y));
|
||
end;
|
||
|
||
if Shape = 'cone' then
|
||
begin
|
||
Canvas.PenPos := Point(myorigin.X, myorigin.Y);
|
||
Canvas.Pen.Mode := pmNotXor;
|
||
Canvas.LineTo(X, Y);
|
||
Canvas.Pen.Mode := mypen;
|
||
xt := (Picture.Bitmap.Width - 2 * myorigin.X) div 20;
|
||
xs := (Picture.Bitmap.Width - 2 * X) div 20;
|
||
X := Picture.Bitmap.Width div 2;
|
||
with Canvas do
|
||
begin
|
||
for i := 0 to 10 do
|
||
begin
|
||
MoveTo(X + i * xt, myorigin.Y);
|
||
LineTo(X + i * xs, Y);
|
||
MoveTo(X - i * xt, myorigin.Y);
|
||
LineTo(X - i * xs, Y);
|
||
end;
|
||
MoveTo(X + 10 * xt, myorigin.Y);
|
||
LineTo(X - 10 * xt, myorigin.Y);
|
||
MoveTo(X + 10 * xs, Y);
|
||
LineTo(X - 10 * xs, Y);
|
||
end;
|
||
end;
|
||
|
||
{if Shape='polybezier' then
|
||
begin
|
||
Canvas.PenPos:=Point(myorigin.X,myorigin.Y);
|
||
if mypen<>pmNotXor then
|
||
begin
|
||
mybezier[0]:=myorigin;
|
||
mybezier[3]:=Point(X,Y);
|
||
if not bezierfix1 then
|
||
begin
|
||
mybezier[1].X:=mybezier[0].X;
|
||
mybezier[1].Y:=mybezier[3].Y;
|
||
end;
|
||
if not bezierfix2 then
|
||
begin
|
||
mybezier[2].X:=mybezier[3].X;
|
||
mybezier[2].Y:=mybezier[0].Y;
|
||
end;
|
||
Canvas.PolyBezier(mybezier);
|
||
bezierfix1:=False;
|
||
bezierfix2:=False;
|
||
end;
|
||
end;}
|
||
|
||
if Shape = 'bezier2' then
|
||
begin
|
||
Canvas.PenPos := Point(myorigin.X, myorigin.Y);
|
||
if mypen <> pmNotXor then
|
||
begin
|
||
mybezier[2] := Point(X, Y);
|
||
Canvas.PolyBezier(mybezier);
|
||
end;
|
||
Shape := 'bezier3';
|
||
end;
|
||
|
||
if Shape = 'bezier1' then
|
||
Shape := 'bezier2';
|
||
if Shape = 'bezier' then
|
||
Shape := 'bezier1';
|
||
if Shape = 'bezier3' then
|
||
Shape := 'bezier';
|
||
if Shape = 'floodfill' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
Canvas.FloodFill(X, Y, Canvas.Pen.Color, fsborder)
|
||
else
|
||
Canvas.FloodFill(X, Y, Canvas.Pixels[X, Y], fssurface);
|
||
end;
|
||
if Shape = 'snapshot' then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
Pen.Style := psDot;
|
||
Rectangle(myorigin.X, myorigin.Y, X, Y);
|
||
Pen.Style := psSolid;
|
||
end;
|
||
mycliprect := Rect(myorigin.X, myorigin.Y, X, Y);
|
||
Canvas.Brush.Style := myoldbrushstyle;
|
||
Canvas.Pen.Width := myoldpenwidth;
|
||
Shape := '';
|
||
end;
|
||
|
||
if Shape = 'bars' then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
Pen.Style := psDot;
|
||
Rectangle(myorigin.X, myorigin.Y, X, Y);
|
||
Pen.Style := psSolid;
|
||
end;
|
||
DrawBars(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
|
||
if Shape = 'border' then
|
||
begin
|
||
with Canvas do
|
||
begin
|
||
Pen.Mode := pmNotXor;
|
||
Pen.Style := psDot;
|
||
Rectangle(myorigin.X, myorigin.Y, X, Y);
|
||
Pen.Style := psSolid;
|
||
end;
|
||
Drawborders(myorigin.X, myorigin.Y, X, Y);
|
||
end;
|
||
|
||
if Shape = 'paste' then
|
||
begin
|
||
myrect := Rect(0, 0, 0, 0);
|
||
myrect.Left := X;
|
||
myrect.Top := Y;
|
||
myrect.Right := X + mycliprect.Right - mycliprect.Left;
|
||
myrect.Bottom := Y + mycliprect.Bottom - mycliprect.Top;
|
||
Canvas.CopyRect(myrect, Canvas, mycliprect);
|
||
end;
|
||
|
||
if Shape = 'pastecolor' then
|
||
begin
|
||
clipcm := cmsrccopy;
|
||
SetClip(clWhite);
|
||
CopyClip;
|
||
FX.ExtractColor(Clip, Canvas.Brush.Color);
|
||
Canvas.Draw(X, Y, Clip);
|
||
Clip.Transparent := False;
|
||
end;
|
||
|
||
if Shape = 'pastecolorx' then
|
||
begin
|
||
clipcm := cmsrccopy;
|
||
SetClip(clWhite);
|
||
CopyClip;
|
||
FX.ExcludeColor(Clip, Canvas.Brush.Color);
|
||
Canvas.Draw(X, Y, Clip);
|
||
Clip.Transparent := False;
|
||
end;
|
||
|
||
if Shape = 'zoomkeepbrush' then
|
||
begin
|
||
Shape := 'freehand';
|
||
Canvas.Pen.Width := 2;
|
||
end;
|
||
|
||
if Shape = 'paintpick' then
|
||
begin
|
||
if ssAlt in Shift then
|
||
Canvas.Brush.Color := MixColors(
|
||
Canvas.Pixels[X - 5, Y],
|
||
Canvas.Pixels[X + 5, Y])
|
||
else
|
||
Canvas.Brush.Color := Canvas.Pixels[X, Y];
|
||
ColorPicked(Canvas.Brush.Color);
|
||
Shape := '';
|
||
end;
|
||
Canvas.Pen.Mode := mypen;
|
||
if not ((Shape = 'Polygon') or
|
||
(Shape = 'polyline') or
|
||
(Shape = 'polybezier')) then
|
||
begin
|
||
myDraw := False;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.BuildShapeList;
|
||
const
|
||
Names: array [0..99] of PChar =
|
||
(
|
||
'airbrush',
|
||
'arc',
|
||
'bars',
|
||
'bezier',
|
||
'Blocks',
|
||
'Bluebrush',
|
||
'Blurcurves',
|
||
'BlurLines',
|
||
'Blurovals',
|
||
'Blurpoly',
|
||
'BlurRects',
|
||
'border',
|
||
'brightnessbrush',
|
||
'chord',
|
||
'cloneall',
|
||
'clonenottarget',
|
||
'cmirror',
|
||
'cone',
|
||
'contrastbrush',
|
||
'cube',
|
||
'darkerbrush',
|
||
'decobar',
|
||
'decoval',
|
||
'DropletSphere',
|
||
'ellipse',
|
||
'fisheyebrush',
|
||
'fisheyefixbrush',
|
||
'floodfill',
|
||
'freehand',
|
||
'globe',
|
||
'gradientbrush',
|
||
'graybrush',
|
||
'Greenbrush',
|
||
'halfBluebrush',
|
||
'halfGreenbrush',
|
||
'halfredbrush',
|
||
'hmirror',
|
||
'interColumn',
|
||
'Interprect',
|
||
'interSphere',
|
||
'lighterbrush',
|
||
'line',
|
||
'maze',
|
||
'mbBottom',
|
||
'mbDiamond',
|
||
'mbHor',
|
||
'mbHorBox',
|
||
'mbHorOval',
|
||
'mbRound',
|
||
'mbRound2',
|
||
'mbSplitRound',
|
||
'mbSplitWaste',
|
||
'mbTop',
|
||
'mbVerBox',
|
||
'mbVerOval',
|
||
'mbWaste',
|
||
'mirror4',
|
||
'mixbrush',
|
||
'MultiSphere',
|
||
'notBluebrush',
|
||
'notGreenbrush',
|
||
'notredbrush',
|
||
'paintpick',
|
||
'paste',
|
||
'pastecolor',
|
||
'pastecolorx',
|
||
'pie',
|
||
'polybezier',
|
||
'Polygon',
|
||
'polyline',
|
||
'rangemove',
|
||
'rangesmear',
|
||
'rectangle',
|
||
'redbrush',
|
||
'rimplebrush',
|
||
'RisingWaveSphere',
|
||
'rollmixbrush',
|
||
'rotatebrush',
|
||
'roundrect',
|
||
'saturationbrush',
|
||
'skewrect',
|
||
'sline',
|
||
'smoothbrush',
|
||
'snapshot',
|
||
'spiral',
|
||
'Spiro',
|
||
'Star',
|
||
'sym',
|
||
'Texcurves',
|
||
'TexLines',
|
||
'Texovals',
|
||
'Texpoly',
|
||
'TexRects',
|
||
'transcopy',
|
||
'triangle',
|
||
'twistbrush',
|
||
'vmirror',
|
||
'WaveSphere',
|
||
'zoombrush',
|
||
'zoomkeepbrush'
|
||
);
|
||
var
|
||
I: Integer;
|
||
begin
|
||
for I := Low(Names) to High(Names) do
|
||
Shapes.Append(Names[I]);
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetPolygonChecked(const Value: Boolean);
|
||
begin
|
||
FPolygonChecked := Value;
|
||
end;
|
||
|
||
procedure TJvDrawImage.ColorPicked(AColor: TColor);
|
||
begin
|
||
if Assigned(FOnColorPicked) then
|
||
FOnColorPicked(Self, AColor);
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetOnColorPicked(const Value: TColorPicked);
|
||
begin
|
||
FOnColorPicked := Value;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetShape(const Value: string);
|
||
begin
|
||
FShape := Value;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Loaded;
|
||
begin
|
||
inherited Loaded;
|
||
autosize := True;
|
||
Picture.Bitmap.Height := 256;
|
||
Picture.Bitmap.Width := 256;
|
||
Canvas.Brush.Color := clWhite;
|
||
Picture.Bitmap.Canvas.FillRect(Rect(0, 0, Picture.Bitmap.Width, Picture.Bitmap.Height));
|
||
Canvas.Brush.Style := bsClear;
|
||
Canvas.Pen.Color := clWhite;
|
||
Canvas.MoveTo(100, 100);
|
||
Canvas.LineTo(128, 128);
|
||
Canvas.Pen.Color := clBlack;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetAirBrush(const Value: TJvAirBrush);
|
||
begin
|
||
FAirBrush.Assign(Value);
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetTransformer(const Value: TJvPaintFX);
|
||
begin
|
||
FX.Assign(Value);
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetBlocks(const Value: Integer);
|
||
begin
|
||
FBlocks := Value;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetSpirals(const Value: Integer);
|
||
begin
|
||
FSpirals := Value;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetStarPoints(const Value: Integer);
|
||
begin
|
||
FStarPoints := Value;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SetStars(const Value: Integer);
|
||
begin
|
||
FStars := Value;
|
||
end;
|
||
|
||
procedure TJvDrawImage.contrastBarChange(Sender: TObject);
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.contrast(Clip, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.saturationBarChange(Sender: TObject);
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.saturation(Clip, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.lightnessBarChange(Sender: TObject);
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.lightness(Clip, painterEffectsF.Ebar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.BlurBarChange(Sender: TObject);
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.GaussianBlur(Clip, painterEffectsF.Ebar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.splitBlurBarChange(Sender: TObject);
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.SplitBlur(Clip, painterEffectsF.Ebar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.colornoiseBarChange(Sender: TObject);
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.AddColorNoise(Clip, painterEffectsF.Ebar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.mononoiseBarChange(Sender: TObject);
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.AddmonoNoise(Clip, painterEffectsF.Ebar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.smoothBarChange(Sender: TObject);
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.Smooth(Clip, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Effects;
|
||
begin
|
||
with PainterEffectsF do
|
||
begin
|
||
cxbar.Max := Width;
|
||
cybar.Max := Height;
|
||
cxbar.Position := cxbar.Max div 2;
|
||
cybar.Position := cybar.Max div 2;
|
||
Show;
|
||
end;
|
||
end;
|
||
|
||
procedure TJvDrawImage.seamBarChange;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.MakeSeamlessClip(Clip, painterEffectsF.Ebar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.mosaicBarChange;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.mosaic(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.twistBarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.twist(Clip, bm2, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.FisheyeBarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: single;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position / 100;
|
||
FX.Fisheye(Clip, bm2, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.WaveBarChange;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.Wave(Clip, am, 0, 0);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.WaveExtraChange;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.EBar.Position;
|
||
FX.Wave(Clip, am, 0, 1);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.WaveInfChange;
|
||
var
|
||
wa, inf: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
inf := painterEffectsF.Ebar.Position;
|
||
wa := paintereffectsF.ExtraBar.Position;
|
||
FX.Wave(Clip, wa, inf, 2);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.RotateBar;
|
||
var
|
||
am: Extended;
|
||
Dst: TBitmap;
|
||
dx, dy: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
Dst.pixelformat := pf24bit;
|
||
with PainterEffectsF do
|
||
begin
|
||
am := Ebar.Position;
|
||
dx := cxBar.Position;
|
||
dy := cyBar.Position;
|
||
end;
|
||
FX.SmoothRotate(Clip, Dst, dx, dy, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.XFormABarChange;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
XFormA(am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.MarbleBarChange;
|
||
var
|
||
turbulence: Integer;
|
||
Dst: TBitmap;
|
||
scale: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
scale := painterEffectsF.ExtraBar.Position;
|
||
turbulence := painterEffectsF.Ebar.Position;
|
||
FX.Marble(Clip, Dst, scale, turbulence);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Marble2BarChange;
|
||
var
|
||
turbulence: Integer;
|
||
Dst: TBitmap;
|
||
scale: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
scale := painterEffectsF.ExtraBar.Position;
|
||
turbulence := painterEffectsF.Ebar.Position;
|
||
FX.Marble2(Clip, Dst, scale, turbulence);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Marble3BarChange;
|
||
var
|
||
turbulence: Integer;
|
||
Dst: TBitmap;
|
||
scale: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
scale := painterEffectsF.ExtraBar.Position;
|
||
turbulence := painterEffectsF.Ebar.Position;
|
||
FX.Marble3(Clip, Dst, scale, turbulence);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Marble4BarChange;
|
||
var
|
||
turbulence: Integer;
|
||
Dst: TBitmap;
|
||
scale: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
scale := painterEffectsF.ExtraBar.Position;
|
||
turbulence := painterEffectsF.Ebar.Position;
|
||
FX.Marble4(Clip, Dst, scale, turbulence);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Marble5BarChange;
|
||
var
|
||
turbulence: Integer;
|
||
Dst: TBitmap;
|
||
scale: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
scale := painterEffectsF.ExtraBar.Position;
|
||
turbulence := painterEffectsF.EBar.Position;
|
||
FX.Marble5(Clip, Dst, scale, turbulence);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Marble6barChange;
|
||
var
|
||
turbulence: Integer;
|
||
Dst: TBitmap;
|
||
scale: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
scale := painterEffectsF.ExtraBar.Position;
|
||
turbulence := painterEffectsF.Ebar.Position;
|
||
FX.Marble6(Clip, Dst, scale, turbulence);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Marble7barChange;
|
||
var
|
||
turbulence: Integer;
|
||
Dst: TBitmap;
|
||
scale: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
scale := painterEffectsF.ExtraBar.Position;
|
||
turbulence := painterEffectsF.Ebar.Position;
|
||
FX.Marble7(Clip, Dst, scale, turbulence);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Marble8barChange;
|
||
var
|
||
turbulence: Integer;
|
||
Dst: TBitmap;
|
||
scale: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
Dst := TBitmap.Create;
|
||
Dst.PixelFormat := pf24bit;
|
||
Dst.Width := Clip.Width;
|
||
Dst.Height := Clip.Height;
|
||
scale := painterEffectsF.ExtraBar.Position;
|
||
turbulence := painterEffectsF.Ebar.Position;
|
||
FX.Marble8(Clip, Dst, scale, turbulence);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.embossbarChange;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.Emboss(Clip);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.filterRedbarChange;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.filterRed(Clip, paintereffectsF.ExtraBar.Position, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.filterGreenbarChange;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.filterGreen(Clip, paintereffectsF.ExtraBar.Position, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.filterBluebarChange;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.filterBlue(Clip, paintereffectsF.ExtraBar.Position, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.FilterXRedbarChange;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.FilterXRed(Clip, paintereffectsF.ExtraBar.Position, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.FilterXGreenbarChange;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.FilterXGreen(Clip, paintereffectsF.ExtraBar.Position, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.FilterXBluebarChange;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
FX.FilterXBlue(Clip, paintereffectsF.ExtraBar.Position, painterEffectsF.EBar.Position);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SqueezeHorbarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SqueezeHor(Clip, bm2, am, mbHor);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SqueezeTopbarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SqueezeHor(Clip, bm2, am, mbTop);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SqueezeBotbarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SqueezeHor(Clip, bm2, am, mbBottom);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SqueezeDiamondbarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SqueezeHor(Clip, bm2, am, mbDiamond);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SqueezeWastebarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SqueezeHor(Clip, bm2, am, mbwaste);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SqueezeRoundbarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SqueezeHor(Clip, bm2, am, mbRound);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SqueezeRound2barChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SqueezeHor(Clip, bm2, am, mbround2);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SplitRoundbarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SplitRound(Clip, bm2, am, mbSplitRound);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.SplitWastebarChange;
|
||
var
|
||
bm2: TBitmap;
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
bm2 := TBitmap.Create;
|
||
bm2.Width := Clip.Width;
|
||
bm2.Height := Clip.Height;
|
||
bm2.pixelformat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.SplitRound(Clip, bm2, am, mbSplitWaste);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(bm2);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
bm2.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.ShearbarChange;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
Shear(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.plasmabarChange;
|
||
var
|
||
am, turb, w, h: Integer;
|
||
src1, src2: TBitmap;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
w := Clip.Width;
|
||
h := Clip.Height;
|
||
src1 := TBitmap.Create;
|
||
src1.Width := w;
|
||
src1.Height := h;
|
||
src1.PixelFormat := pf24bit;
|
||
src1.Canvas.Draw(0, 0, Clip);
|
||
src2 := TBitmap.Create;
|
||
src2.Width := w;
|
||
src2.Height := h;
|
||
src2.PixelFormat := pf24bit;
|
||
src2.Canvas.Draw(0, 0, Clip);
|
||
am := painterEffectsF.Ebar.Position;
|
||
turb := painterEffectsF.ExtraBar.Position;
|
||
if turb < 10 then
|
||
begin
|
||
painterEffectsF.ExtraBar.Position := 10;
|
||
turb := 10;
|
||
end;
|
||
FX.Plasma(src1, src2, Clip, am, turb);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
src2.Free;
|
||
src1.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawMandelJulia(Mandel: Boolean);
|
||
var
|
||
xr, yr: Extended;
|
||
X0, Y0, X1, Y1: Extended;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
xr := painterEffectsF.Ebar.Position * 0.028;
|
||
yr := painterEffectsF.ExtraBar.Position * 0.009;
|
||
X0 := -2.25 + xr;
|
||
X1 := 0.75;
|
||
Y0 := -1.5 + yr;
|
||
Y1 := 1.5;
|
||
FX.DrawMandelJulia(Clip, X0, Y0, X1, Y1, 16, Mandel);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawTriangles;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.Triangles(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.RippleTooth;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.RippleTooth(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.RippleTriangle;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.RippleTooth(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.RippleRandom;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.RippleRandom(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.TexturizeTile;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.TexturizeTile(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.TexturizeOverlap;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.TexturizeOverlap(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawMap;
|
||
var
|
||
am: Integer;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
FX.HeightMap(Clip, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Clip);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawBlend;
|
||
var
|
||
am, w, h: Integer;
|
||
src2, Dst: TBitmap;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
w := Clip.Width;
|
||
h := Clip.Height;
|
||
if not Clipboard.HasFormat(CF_BITMAP) then
|
||
Exit;
|
||
src2 := TBitmap.Create;
|
||
src2.Assign(Clipboard);
|
||
src2.PixelFormat := pf24bit;
|
||
if ((src2.Width <> w) or (src2.Height <> h)) then
|
||
begin
|
||
src2.Free;
|
||
Exit;
|
||
end;
|
||
Dst := TBitmap.Create;
|
||
Dst.Width := w;
|
||
Dst.Height := h;
|
||
Dst.PixelFormat := pf24bit;
|
||
FX.Blend(Clip, src2, Dst, am / 100);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
src2.Free;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.DrawSolarize;
|
||
var
|
||
am, w, h: Integer;
|
||
Dst: TBitmap;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
w := Clip.Width;
|
||
h := Clip.Height;
|
||
Dst := TBitmap.Create;
|
||
Dst.Width := w;
|
||
Dst.Height := h;
|
||
Dst.PixelFormat := pf24bit;
|
||
FX.Solarize(Clip, Dst, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Posterize;
|
||
var
|
||
am, w, h: Integer;
|
||
Dst: TBitmap;
|
||
begin
|
||
ClipAll;
|
||
Clip.PixelFormat := pf24bit;
|
||
am := painterEffectsF.Ebar.Position;
|
||
w := Clip.Width;
|
||
h := Clip.Height;
|
||
Dst := TBitmap.Create;
|
||
Dst.Width := w;
|
||
Dst.Height := h;
|
||
Dst.PixelFormat := pf24bit;
|
||
FX.Posterize(Clip, Dst, am);
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(Dst);
|
||
QuickPreviewF.PreviewImage.Update;
|
||
Dst.Free;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Backgrounds;
|
||
begin
|
||
PainterQBF.Show;
|
||
PainterQBF.BringToFront;
|
||
end;
|
||
|
||
procedure TJvDrawImage.Preview(ABitmap: TBitmap);
|
||
begin
|
||
QuickPreviewF.Show;
|
||
QuickPreviewF.PreviewImage.Picture.Bitmap.Assign(abitmap);
|
||
end;
|
||
|
||
procedure TJvDrawImage.Trace;
|
||
var
|
||
BitMap: TBitmap;
|
||
begin
|
||
BitMap := TBitmap.Create;
|
||
Bitmap.Assign(Picture.Bitmap);
|
||
FX.Trace(BitMap, 1);
|
||
Picture.Bitmap.Assign(Bitmap);
|
||
BitMap.Free;
|
||
Update;
|
||
end;
|
||
|
||
{$IFDEF UNITVERSIONING}
|
||
initialization
|
||
RegisterUnitVersion(HInstance, UnitVersioning);
|
||
|
||
finalization
|
||
UnregisterUnitVersion(HInstance);
|
||
{$ENDIF UNITVERSIONING}
|
||
|
||
end. |