unit utest22;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, BGRABitmap, BGRABitmapTypes, Graphics, utest;

type
  { TTest22 }

  TTest22 = class(TTest)
  protected
    virtualScreen,pac: TBGRABitmap;
  public
    constructor Create;
    destructor Destroy; override;
    procedure OnPaint(Canvas: TCanvas; Left,Top,Width,Height: Integer); override;
    procedure OnTimer(Width, Height: Integer; ElapsedSec: Double); override;
  end;

implementation

{ TTest22 }

constructor TTest22.Create;
begin
  inherited Create;
  randomize;
  Name := 'Fast clipping (rectangle)';
  pac := TBGRABitmap.Create(ResourceDir+'pac_d2.bmp');
  pac.ReplaceColor(pac.GetPixel(0,0),BGRAPixelTransparent);
end;

destructor TTest22.Destroy;
begin
  pac.free;
  virtualscreen.free;
end;

procedure TTest22.OnPaint(Canvas: TCanvas; Left,Top,Width, Height: Integer);
var c: TBGRAPixel; x1,y1,x2,y2,x3,y3: integer; w: single;
begin
  if (virtualscreen <> nil) and ((virtualscreen.width <> width) or (virtualscreen.Height <> height)) then
    FreeAndNil(virtualScreen);

  if virtualscreen = nil then
    virtualscreen := TBGRABitmap.Create(Width,Height,BGRABlack);

  virtualscreen.ClipRect := rect(Width div 4,Height div 4, Width*3 div 4, Height*3 div 4);
  c := BGRA(random(256),random(256),random(256),random(128)+128);
  x1 := random(width);
  y1 := random(height);
  x2 := random(width);
  y2 := random(height);
  x3 := random(width);
  y3 := random(height);
  w := random(width+height)/500;

  case random(12) of
  0: virtualscreen.DrawHorizLine(x1,y1,x2,c);
  1: virtualscreen.SetHorizLine(x1,y1,x2,c);
  2: virtualscreen.DrawLine(x1,y1,x2,y2,c,True);
  3: virtualscreen.DrawLineAntialias(x1,y1,x2,y2,c,w);
  4: virtualscreen.EraseLineAntialias(x1,y1,x2,y2,c.alpha,w);
  5: if random(2)= 0 then
       virtualscreen.FillPoly([PointF(x1,y1),PointF(x2,y2),PointF(x3,y3)],c,dmDrawWithTransparency)
    else virtualscreen.FillPolyAntialias([PointF(x1,y1),PointF(x2,y2),PointF(x3,y3)],c);
  6: virtualscreen.FillEllipseAntialias(x1,y1,x2-x1,y2-y1,c);
  7: virtualscreen.Rectangle(x1,y1,x2-x1,y2-y1,c,dmDrawWithTransparency);
  8: virtualscreen.RoundRectAntialias(x1,y1,x2,y2,abs((x2-x1)/6),abs((y2-y1)/6),c,w);
  9: virtualscreen.FillRect(x1,y1,x2-x1,y2-y1,c,dmDrawWithTransparency);
  10: virtualscreen.TextOutAngle(x1,y1,random(3600),'Some text',c,taCenter);
  11: virtualScreen.PutImage(x1,y1,pac,dmDrawWithTransparency);
  end;

  virtualscreen.NoClip;
  virtualscreen.SetPixel(random(width),random(height),c);

  //draw virtualscreen opaque on canvas
  virtualscreen.Draw(Canvas,Left,Top,True);
end;

procedure TTest22.OnTimer(Width, Height: Integer;
  ElapsedSec: Double);
begin
  //nothing
end;

end.

