188 lines
4.6 KiB
ObjectPascal
188 lines
4.6 KiB
ObjectPascal
unit aa_demo_main;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
|
|
ExtCtrls, StdCtrls, BGRABitmapTypes, BGRABitmap, lmessages, Spin;
|
|
|
|
type
|
|
|
|
{ TForm1 }
|
|
|
|
TForm1 = class(TForm)
|
|
SpinEdit_Gamma: TFloatSpinEdit;
|
|
Label1: TLabel;
|
|
Label2: TLabel;
|
|
Label_PixelSizeValue: TLabel;
|
|
Panel1: TPanel;
|
|
TrackBar_PixelSize: TTrackBar;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
|
|
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure FormPaint(Sender: TObject);
|
|
procedure SpinEdit_GammaChange(Sender: TObject);
|
|
procedure TrackBar_PixelSizeChange(Sender: TObject);
|
|
procedure WMEraseBkgnd(var Message: TLMEraseBkgnd); message LM_ERASEBKGND;
|
|
private
|
|
{ private declarations }
|
|
public
|
|
{ public declarations }
|
|
pts: array[0..2] of TPointF;
|
|
formLoaded: boolean;
|
|
MovingPointIndex: integer;
|
|
MovingOrigin: TPointF;
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
procedure NicePoint(bmp: TBGRABitmap; x, y: single);
|
|
begin
|
|
bmp.EllipseAntialias(x,y,4,4,BGRA(0,0,0,192),1);
|
|
bmp.EllipseAntialias(x,y,3,3,BGRA(255,255,255,192),1);
|
|
bmp.EllipseAntialias(x,y,2,2,BGRA(0,0,0,192),1);
|
|
end;
|
|
|
|
{ TForm1 }
|
|
|
|
procedure TForm1.FormPaint(Sender: TObject);
|
|
var zoomTx,zoomTy,tx,ty,pixSize: integer;
|
|
bmp,bmpPreview: TBGRABitmap;
|
|
i: Integer;
|
|
x,y: integer;
|
|
|
|
function coordToBmp(pt: TPointF): TPointF;
|
|
begin
|
|
result := (pt+PointF(0.5,0.5))*(1/pixSize)-PointF(0.5,0.5);
|
|
end;
|
|
|
|
begin
|
|
zoomTx := ClientWidth;
|
|
zoomTy := Panel1.Top;
|
|
pixSize := TrackBar_PixelSize.Position;
|
|
tx := (zoomTx+pixSize-1) div pixSize;
|
|
ty := (zoomTy+pixSize-1) div pixSize;
|
|
|
|
//draw triangle
|
|
bmp := TBGRABitmap.Create(tx,ty,BGRAWhite);
|
|
bmp.FillPolyAntialias([coordToBmp(pts[0]),coordToBmp(pts[1]),coordToBmp(pts[2])],BGRABlack);
|
|
|
|
//draw lower-left preview
|
|
bmpPreview := TBGRABitmap.Create(panel1.left,panel1.height,BGRAWhite);
|
|
x := (bmpPreview.Width-bmp.width) div 2;
|
|
y := (bmpPreview.Height-bmp.Height) div 2;
|
|
if x < 1 then x := 1;
|
|
if y < 1 then y := 1;
|
|
bmpPreview.Rectangle(x-1,y-1,x+bmp.width+1,y+bmp.height+1,BGRA(255,0,0),dmSet);
|
|
bmpPreview.PutImage(x,y,bmp,dmSet);
|
|
bmpPreview.Draw(Canvas,0,panel1.top);
|
|
bmpPreview.Free;
|
|
|
|
//zoom
|
|
BGRAReplace(bmp,bmp.Resample(tx*pixSize,ty*pixSize,rmSimpleStretch));
|
|
|
|
bmp.DrawPolygonAntialias(pts,BGRA(0,128,128,192),1);
|
|
for i := 0 to 2 do
|
|
NicePoint(bmp,pts[i].x,pts[i].y);
|
|
BGRAReplace(bmp,bmp.GetPart(rect(0,0,zoomTx,zoomTy)));
|
|
bmp.Draw(Canvas,0,0);
|
|
|
|
bmp.free;
|
|
end;
|
|
|
|
procedure TForm1.SpinEdit_GammaChange(Sender: TObject);
|
|
begin
|
|
if formLoaded then
|
|
begin
|
|
BGRASetGamma(SpinEdit_Gamma.Value);
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.TrackBar_PixelSizeChange(Sender: TObject);
|
|
begin
|
|
Label_PixelSizeValue.Caption := '= ' + IntToStr(TrackBar_PixelSize.Position);
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TForm1.WMEraseBkgnd(var Message: TLMEraseBkgnd);
|
|
begin
|
|
//
|
|
end;
|
|
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
begin
|
|
pts[0] := PointF(57,100);
|
|
pts[1] := PointF(369,170);
|
|
pts[2] := PointF(143,310);
|
|
Label_PixelSizeValue.Caption := '= ' + IntToStr(TrackBar_PixelSize.Position);
|
|
MovingPointIndex := -1;
|
|
SpinEdit_Gamma.Value := BGRAGetGamma;
|
|
formLoaded := true;
|
|
end;
|
|
|
|
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
var maxDist,dist: single;
|
|
mousePos,vect: TPointF;
|
|
i: Integer;
|
|
begin
|
|
if Button <> mbLeft then exit;
|
|
|
|
//select point to move
|
|
MovingPointIndex := -1;
|
|
maxDist := 10;
|
|
mousePos := PointF(X,Y);
|
|
MovingOrigin := mousePos;
|
|
|
|
for i := 0 to high(pts) do
|
|
begin
|
|
vect := pts[i] - mousePos;
|
|
dist := sqrt(vect*vect);
|
|
if dist < maxDist then
|
|
begin
|
|
maxDist := dist;
|
|
MovingPointIndex := i;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
|
|
Y: Integer);
|
|
var
|
|
mousePos: TPointF;
|
|
i: Integer;
|
|
begin
|
|
if ssLeft in Shift then
|
|
begin
|
|
mousePos := PointF(X,Y);
|
|
if MovingPointIndex <> -1 then
|
|
pts[MovingPointIndex].Offset(mousePos-MovingOrigin) else
|
|
begin
|
|
for i := 0 to high(pts) do
|
|
pts[i].Offset(mousePos-MovingOrigin);
|
|
end;
|
|
Invalidate;
|
|
MovingOrigin := mousePos;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
if Button = mbLeft then MovingPointIndex := -1;
|
|
end;
|
|
|
|
end.
|
|
|