126 lines
3.4 KiB
ObjectPascal

unit utest7;
{$mode objfpc}{$H+}
interface
uses
BGRAClasses, SysUtils, utest, Graphics, BGRABitmap, BGRABitmapTypes, BGRAGradientScanner;
type
{ TTest7 }
TTest7 = class(TTest)
protected
pacman,virtualScreen,background: TBGRABitmap;
time: single;
multigrad: TBGRACustomGradient;
pixels: array of record
x,y,dx,dy: single;
end;
procedure DrawPacman(x,y: integer; angle: single);
public
constructor Create;
destructor Destroy; override;
procedure OnPaint(Canvas: TCanvas; Left,Top,Width,Height: Integer); override;
procedure OnTimer({%H-}Width,{%H-}Height: Integer; ElapsedSec: Double); override;
end;
implementation
{ TTest7 }
procedure TTest7.DrawPacman(x, y: integer; angle: single);
var temp: TBGRABitmap;
begin
temp := pacman.FilterRotate(pointF((pacman.width-1)/2,(pacman.height-1)/2),angle);
virtualScreen.PutImage(x-temp.width div 2,y-temp.height div 2,temp,dmDrawWithTransparency);
temp.Free;
end;
constructor TTest7.Create;
var temp: TBGRABitmap;
begin
inherited Create;
Name := 'Smart zoom x3 and rotate';
virtualScreen := nil;
background := nil;
pacman := TBGRABitmap.Create(ResourceDir+'pac_d1.bmp');
pacman.ReplaceColor(pacman.GetPixel(0,0),BGRAPixelTransparent);
temp := pacman.FilterSmartZoom3(moMediumSmooth);
pacman.Free;
pacman := temp;
time := 0;
multigrad := TBGRAHueGradient.Create(0,0,65535,40000,[hgoRepeat,hgoPositiveDirection,hgoLightnessCorrection]);
end;
destructor TTest7.Destroy;
begin
virtualScreen.Free;
pacman.free;
multigrad.Free;
background.Free;
inherited Destroy;
end;
procedure TTest7.OnPaint(Canvas: TCanvas; Left,Top,Width, Height: Integer);
var
i: Integer;
smallW,smallH: integer;
pixBmp: TBGRABitmap;
begin
if (virtualscreen <> nil) and ((virtualscreen.width <> width) or (virtualscreen.Height <> height)) then
begin
FreeAndNil(virtualScreen);
FreeAndNil(background);
end;
smallW := (Width+4) div 8;
smallH := (Height+4) div 8;
if virtualscreen = nil then
begin
virtualscreen := TBGRABitmap.Create(Width,Height);
background := TBGRABitmap.Create(Width,Height);
background.GradientFill(0,0,Width,Height,multigrad,gtRadial,PointF(0,0),PointF(Width/2,Height/2),dmSet,False);
setlength(pixels, round(sqrt(smallW*smallH)) );
for i := 0 to high(pixels) do
begin
pixels[i].x := random(smallW);
pixels[i].y := random(smallH);
pixels[i].dx := (random(1001)-500)/500;
pixels[i].dy := (random(1001)-500)/500;
end;
end;
virtualscreen.PutImage(0,0,background,dmSet);
pixBmp := TBGRABitmap.Create(smallW, smallH);
for i := 0 to high(pixels) do
begin
pixBmp.DrawPixelF(pixels[i].x, pixels[i].y, BGRABlack, dmDrawWithTransparency);
IncF(pixels[i].x, pixels[i].dx);
IncF(pixels[i].y, pixels[i].dy);
if pixels[i].x <= -1 then pixels[i].x := smallW else
if pixels[i].x >= smallW then pixels[i].x := -1;
if pixels[i].y <= -1 then pixels[i].y := smallH else
if pixels[i].y >= smallH then pixels[i].y := -1;
end;
virtualScreen.StretchPutImage(rect(0,0,Width,Height), pixBmp, dmDrawWithTransparency);
pixBmp.Free;
DrawPacman(virtualScreen.Width div 4,virtualScreen.Height div 2, ln(time+1)*100);
DrawPacman(3*virtualScreen.Width div 4,virtualScreen.Height div 2, -time*4);
virtualscreen.Draw(Canvas,Left,Top,True);
end;
procedure TTest7.OnTimer(Width, Height: Integer; ElapsedSec: Double);
begin
time := time+ElapsedSec*5;
end;
end.