procedure TForm1.ClearTransformations;
var
I: Integer;
begin
FillChar(Operation[0], SizeOf(TOpRecs), 0);
for I := 0
to 7
do
begin
Operation[I].Sx := 1;
Operation[I].Sy := 1;
Operation[I].Cx := Src.Bitmap.Width / 2;
Operation[I].Cy := Src.Bitmap.Height / 2;
end;
end;
procedure TForm1.PrepareSource;
begin
// make the border pixels transparent while keeping their RGB components
SetBorderTransparent(Src.Bitmap, Src.Bitmap.BoundsRect);
end;
procedure TForm1.DoTransform;
var
i, j: Integer;
begin
GenTransform;
Dst.BeginUpdate;
Dst.Bitmap.Clear($00000000);
Transform(Dst.Bitmap, Src.Bitmap, TT);
Dst.EndUpdate;
Dst.Invalidate;
if Mode = tmAffine
then
begin
// fill the string grid
for j := 0
to 2
do
for i := 0
to 2
do
StringGrid.Cells[i, j] := Format('
%.3g', [AT.Matrix[i, j]]);
StringGrid.Col := 3;
// hide grid cursor
end;
end;
procedure TForm1.GenTransform;
var
I: Integer;
Rec: TOpRec;
S:
string;
begin
if Mode = tmProjective
then
begin
PT.X0 := Vertices[0].X;
PT.Y0 := Vertices[0].Y;
PT.X1 := Vertices[1].X;
PT.Y1 := Vertices[1].Y;
PT.X2 := Vertices[2].X;
PT.Y2 := Vertices[2].Y;
PT.X3 := Vertices[3].X;
PT.Y3 := Vertices[3].Y;
end
else
begin
// affine mode
AT.Clear;
for I := 0
to 7
do
begin
Rec := Operation[I];
case Rec.OpType
of
opTranslate: AT.Translate(Rec.Dx, Rec.Dy);
opScale: AT.Scale(Rec.Sx, Rec.Sy);
opRotate: AT.Rotate(Rec.Cx, Rec.Cy, Rec.Alpha);
opSkew: AT.Skew(Rec.Fx, Rec.Fy);
end;
case Rec.OpType
of
opTranslate: s := s + Format('
Translate(%.3g, %.3g); ', [Rec.Dx, Rec.Dy]);
opScale: s := s + Format('
Scale(%.3g, %.3g); ', [Rec.Sx, Rec.Sy]);
opRotate: s := s + Format('
Rotate(%.3g, %.3g, %3g); ', [Rec.Cx, Rec.Cy, Rec.Alpha]);
opSkew: s := s + Format('
Skew(%.3g, %.3g); ', [Rec.Fx, Rec.Fy]);
end;
end;
if Length(s) = 0
then s := '
Clear;';
CodeString.Text := s;
end;
TT.SrcRect := SrcRubberBandLayer.Location;
end;