267 lines
7.7 KiB
ObjectPascal

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, BCButton, BGRAVirtualScreen, BGRALayers, BGRAStreamLayers,
BGRABitmap, BGRABitmapTypes, BGRALayerOriginal;
type
{ TForm1 }
TForm1 = class(TForm)
BCFlipX: TBCButton;
BCRotUD: TBCButton;
BCSave: TBCButton;
BCFlipY: TBCButton;
BCRotCW: TBCButton;
BCRotCCW: TBCButton;
BCColor1: TBCButton;
BCColor2: TBCButton;
BGRAVirtualScreen1: TBGRAVirtualScreen;
ColorDialog1: TColorDialog;
cbInterp: TComboBox;
cbRepeat: TComboBox;
cbGradientType: TComboBox;
SaveDialog1: TSaveDialog;
procedure BCRotUDClick(Sender: TObject);
procedure BCSaveClick(Sender: TObject);
procedure BCFlipXClick(Sender: TObject);
procedure BCFlipYClick(Sender: TObject);
procedure BCRotCWClick(Sender: TObject);
procedure BCRotCCWClick(Sender: TObject);
procedure BCColor1Click(Sender: TObject);
procedure BCColor2Click(Sender: TObject);
procedure BGRAVirtualScreen1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure BGRAVirtualScreen1MouseMove(Sender: TObject; {%H-}Shift: TShiftState;
{%H-}X, {%H-}Y: Integer);
procedure BGRAVirtualScreen1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
procedure cbGradientTypeChange(Sender: TObject);
procedure cbInterpChange(Sender: TObject);
procedure cbRepeatChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure OriginalChange(Sender: TObject; {%H-}AOriginal: TBGRALayerCustomOriginal;
var {%H-}ADiff: TBGRAOriginalDiff);
procedure SetVSCursor(ACursor: TOriginalEditorCursor);
public
FLayers: TBGRALayeredBitmap;
end;
var
Form1: TForm1;
implementation
uses BGRATransform, BGRASVGOriginal, BGRAGradientOriginal, BGRALazPaint;
{$R *.lfm}
{ TForm1 }
procedure TForm1.BCFlipXClick(Sender: TObject);
begin
FLayers.HorizontalFlip;
BGRAVirtualScreen1.DiscardBitmap;
end;
procedure TForm1.BCSaveClick(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
RegisterLazPaintFormat;
try
FLayers.SaveToFile(SaveDialog1.FileName);
except
on ex:exception do
ShowMessage(ex.Message);
end;
end;
end;
procedure TForm1.BCRotUDClick(Sender: TObject);
begin
FLayers.RotateUD;
BGRAVirtualScreen1.DiscardBitmap;
end;
procedure TForm1.BCFlipYClick(Sender: TObject);
begin
FLayers.VerticalFlip;
BGRAVirtualScreen1.DiscardBitmap;
end;
procedure TForm1.BCRotCWClick(Sender: TObject);
begin
FLayers.RotateCW;
BGRAVirtualScreen1.DiscardBitmap;
end;
procedure TForm1.BCRotCCWClick(Sender: TObject);
begin
FLayers.RotateCCW;
BGRAVirtualScreen1.DiscardBitmap;
end;
procedure TForm1.BCColor1Click(Sender: TObject);
var
orig: TBGRALayerGradientOriginal;
begin
orig := FLayers.Original[0] as TBGRALayerGradientOriginal;
ColorDialog1.Color:= orig.StartColor;
if ColorDialog1.Execute then orig.StartColor := ColorToBGRA(ColorDialog1.Color);
end;
procedure TForm1.BCColor2Click(Sender: TObject);
var
orig: TBGRALayerGradientOriginal;
begin
orig := FLayers.Original[0] as TBGRALayerGradientOriginal;
ColorDialog1.Color:= orig.EndColor;
if ColorDialog1.Execute then orig.EndColor := ColorToBGRA(ColorDialog1.Color);
end;
procedure TForm1.BGRAVirtualScreen1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
newCursor: TOriginalEditorCursor;
begin
FLayers.MouseDown(Button=mbRight,Shift,X,Y,newCursor);
SetVSCursor(newCursor);
end;
procedure TForm1.BGRAVirtualScreen1MouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
newCursor: TOriginalEditorCursor;
begin
FLayers.MouseMove(Shift,X,Y,newCursor);
SetVSCursor(newCursor);
end;
procedure TForm1.BGRAVirtualScreen1MouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
newCursor: TOriginalEditorCursor;
begin
FLayers.MouseUp(Button=mbRight,Shift,X,Y,newCursor);
SetVSCursor(newCursor);
end;
procedure TForm1.BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
begin
FLayers.Draw(Bitmap, 0,0);
FLayers.DrawEditor(Bitmap, 0, 0,0, 8);
end;
procedure TForm1.cbGradientTypeChange(Sender: TObject);
var
orig: TBGRALayerGradientOriginal;
begin
orig := FLayers.Original[0] as TBGRALayerGradientOriginal;
orig.GradientType := TGradientType(cbGradientType.ItemIndex);
end;
procedure TForm1.cbInterpChange(Sender: TObject);
var
orig: TBGRALayerGradientOriginal;
begin
orig := FLayers.Original[0] as TBGRALayerGradientOriginal;
orig.ColorInterpolation := TBGRAColorInterpolation(cbInterp.ItemIndex);
end;
procedure TForm1.cbRepeatChange(Sender: TObject);
var
orig: TBGRALayerGradientOriginal;
begin
orig := FLayers.Original[0] as TBGRALayerGradientOriginal;
orig.Repetition := TBGRAGradientRepetition(cbRepeat.ItemIndex);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
grad: TBGRALayerGradientOriginal;
svg: TBGRALayerSVGOriginal;
img: TBGRALayerImageOriginal;
gradStream: TMemoryStream;
idxBike, idxImg: Integer;
begin
FLayers := TBGRALayeredBitmap.Create(640,480);
flayers.OnOriginalChange := @OriginalChange;
cbGradientType.ItemIndex:= 0;
cbInterp.ItemIndex := 0;
cbRepeat.ItemIndex := 0;
gradStream := TMemoryStream.Create;
grad := TBGRALayerGradientOriginal.Create;
grad.SetColors([CSSWhite, CSSSkyBlue, CSSOrange, CSSRed],
[0, 0.2, 0.8, 1]);
grad.GradientType:= gtLinear;
grad.Origin := PointF(FLayers.Width/2,40);
grad.XAxis := grad.origin+PointF(0,400);
grad.SaveToStream(gradStream); //save original definition
grad.Free;
grad := TBGRALayerGradientOriginal.Create;
gradStream.Position:= 0;
grad.LoadFromStream(gradStream); // load original definition
FLayers.AddLayerFromOwnedOriginal(grad);
gradStream.free;
svg := TBGRALayerSVGOriginal.Create;
svg.LoadFromFile(Application.Location + 'bicycling.svg');
idxBike := FLayers.AddLayerFromOwnedOriginal(svg);
FLayers.LayerOpacity[idxBike] := 192;
FLayers.LayerOriginalMatrix[idxBike] := AffineMatrixTranslation((FLayers.Width-svg.Width*0.5)/2,(FLayers.Height-svg.Height*0.5)/2)*
AffineMatrixScale(0.5,0.5)*
AffineMatrixTranslation(svg.Width/2,svg.Height/2)*
AffineMatrixRotationDeg(30)*
AffineMatrixTranslation(-svg.Width/2,-svg.Height/2);
FLayers.RenderLayerFromOriginal(idxBike);
img := TBGRALayerImageOriginal.Create;
img.LoadFromFile(Application.Location + 'lazarus.jpg');
idxImg := FLayers.AddLayerFromOwnedOriginal(img);
FLayers.LayerOriginalMatrix[idxImg] := AffineMatrixTranslation(0, FLayers.Height - img.Height);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FLayers.Free;
end;
procedure TForm1.OriginalChange(Sender: TObject;
AOriginal: TBGRALayerCustomOriginal;
var ADiff: TBGRAOriginalDiff);
begin
BGRAVirtualScreen1.DiscardBitmap;
end;
procedure TForm1.SetVSCursor(ACursor: TOriginalEditorCursor);
begin
case ACursor of
oecDefault: BGRAVirtualScreen1.Cursor := crDefault;
oecMove: BGRAVirtualScreen1.Cursor := crSize;
oecMoveE: BGRAVirtualScreen1.Cursor := crSizeE;
oecMoveW: BGRAVirtualScreen1.Cursor := crSizeW;
oecMoveN: BGRAVirtualScreen1.Cursor := crSizeN;
oecMoveS: BGRAVirtualScreen1.Cursor := crSizeS;
oecMoveNE: BGRAVirtualScreen1.Cursor := crSizeNE;
oecMoveNW: BGRAVirtualScreen1.Cursor := crSizeNW;
oecMoveSW: BGRAVirtualScreen1.Cursor := crSizeSW;
oecMoveSE: BGRAVirtualScreen1.Cursor := crSizeSE;
end;
end;
end.