168 lines
4.3 KiB
ObjectPascal
168 lines
4.3 KiB
ObjectPascal
unit utest25;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Graphics, BGRABitmap, BGRABitmapTypes, BGRACanvas, utest;
|
|
|
|
type
|
|
{ TTest25 }
|
|
|
|
TTest25 = class(TTest)
|
|
private
|
|
pacman,virtualScreen: TBGRABitmap;
|
|
alphaFactor: byte;
|
|
time: single;
|
|
pts: array of TPoint;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure OnPaint(Canvas: TCanvas; Left,Top,Width,Height: Integer); override;
|
|
procedure OnTimer(Width,Height: Integer; ElapsedSec: Double); override;
|
|
procedure DrawOnCanvas(Canvas: TBGRACanvas);
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses BGRAGradientScanner;
|
|
|
|
{ TTest25 }
|
|
|
|
constructor TTest25.Create;
|
|
begin
|
|
inherited Create;
|
|
Name := 'BGRACanvas test (with aliasing on the left, with anti-aliasing on the right)';
|
|
virtualScreen := nil;
|
|
pacman := TBGRABitmap.Create(ResourceDir+'pac_d1.bmp');
|
|
pacman.ReplaceColor(pacman.GetPixel(0,0),BGRAPixelTransparent);
|
|
time := 0;
|
|
end;
|
|
|
|
destructor TTest25.Destroy;
|
|
begin
|
|
virtualScreen.Free;
|
|
pacman.free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TTest25.OnPaint(Canvas: TCanvas; Left,Top,Width, Height: Integer);
|
|
var
|
|
i: Integer;
|
|
tx: integer;
|
|
begin
|
|
if time=0 then exit;
|
|
|
|
tx := (Width+1) div 2;
|
|
if (virtualscreen <> nil) and ((virtualscreen.width <> tx) or (virtualscreen.Height <> height)) then
|
|
FreeAndNil(virtualScreen);
|
|
|
|
if virtualscreen = nil then
|
|
begin
|
|
virtualscreen := TBGRABitmap.Create(tx,Height);
|
|
//randseed := 1;
|
|
setlength(pts, 20);
|
|
for i := 0 to high(pts) do
|
|
pts[i] := Point(Random(virtualScreen.Width),random(virtualScreen.Height));
|
|
end;
|
|
|
|
virtualScreen.CanvasBGRA.AntialiasingMode := amOff;
|
|
virtualScreen.CanvasBGRA.Font.Quality := fqSystem;
|
|
DrawOnCanvas(virtualScreen.CanvasBGRA);
|
|
virtualscreen.Draw(Canvas,Left,Top,True);
|
|
|
|
virtualScreen.CanvasBGRA.AntialiasingMode := amOn;
|
|
virtualScreen.CanvasBGRA.Font.Quality := fqFineClearTypeRGB;
|
|
DrawOnCanvas(virtualScreen.CanvasBGRA);
|
|
virtualscreen.Draw(Canvas,Left+Width div 2,Top,True);
|
|
end;
|
|
|
|
procedure TTest25.OnTimer(Width, Height: Integer; ElapsedSec: Double);
|
|
begin
|
|
time := time+ElapsedSec;
|
|
alphaFactor := round((sin(time)+1)/2*255);
|
|
end;
|
|
|
|
procedure TTest25.DrawOnCanvas(Canvas: TBGRACanvas);
|
|
var i,k: integer;
|
|
grad: TBGRAGradientScanner;
|
|
begin
|
|
for k := 1 to 1 do
|
|
begin
|
|
grad := TBGRAGradientScanner.Create(BGRA(0,150,255),BGRA(0,0,0),gtLinear,PointF(0,0),PointF(0,Canvas.Height/40),True,True);
|
|
With Canvas do
|
|
begin
|
|
Brush.style := bsSolid;
|
|
Brush.Color := clWhite;
|
|
Brush.Opacity := 255;
|
|
FillRect(0,0,Width,Height);
|
|
|
|
Font.Orientation := 0;
|
|
Font.Color := clBlack;
|
|
Font.Height := Height div 20;
|
|
Font.Texture := grad;
|
|
TextOut(Font.Height div 2,0,'Font rendering');
|
|
|
|
Font.Orientation := -450;
|
|
TextOut(Font.Height,Font.Height,'Text angle');
|
|
|
|
pen.width := 2;
|
|
pen.opacity := 255;
|
|
Brush.Color := clGreen;
|
|
brush.Style := bsSolid;
|
|
pen.Style := psDash;
|
|
Ellipse(pts[6].x,pts[6].y,pts[7].x,pts[7].y);
|
|
|
|
pen.Style := psSolid;
|
|
pen.width := 1;
|
|
pen.opacity := 255;
|
|
Brush.BGRAColor := BGRA(255,128,0);
|
|
brush.style := bsFDiagonal;
|
|
Ellipse(pts[14].x,pts[14].y,pts[15].x,pts[15].y);
|
|
|
|
pen.style := psClear;
|
|
pen.opacity := 64;
|
|
Brush.Color := clBlue;
|
|
Brush.Opacity := 128;
|
|
brush.style := bsCross;
|
|
Rectangle(pts[8].x,pts[8].y,pts[9].x,pts[9].y);
|
|
|
|
pen.Style := psSolid;
|
|
pen.width := 1;
|
|
pen.opacity := 128;
|
|
Brush.Color := clRed;
|
|
Brush.Opacity := 64;
|
|
brush.Style := bsSolid;
|
|
RoundRect(pts[10].x,pts[10].y,pts[11].x,pts[11].y,abs(pts[11].x-pts[10].x) div 2,abs(pts[11].y-pts[10].y) div 2);
|
|
|
|
brush.style := bsClear;
|
|
pen.width := 2;
|
|
RoundRect(pts[16].x,pts[16].y,pts[17].x,pts[17].y,abs(pts[17].x-pts[16].x) div 2,abs(pts[17].y-pts[16].y) div 2);
|
|
|
|
pen.style := psClear;
|
|
Brush.Color := clBlue;
|
|
Brush.Opacity := 192;
|
|
brush.style := bsSolid;
|
|
//Polygon(pts);
|
|
Pie(pts[12].x,pts[12].y,pts[13].x,pts[13].y,pts[6].x,pts[6].y,pts[7].x,pts[7].y);
|
|
|
|
Pen.Color := clBlack;
|
|
pen.style := psSolid;
|
|
pen.opacity := 128;
|
|
MoveTo(pts[0]);
|
|
for i := 0 to 5 do
|
|
begin
|
|
Pen.Width := i+1;
|
|
LineTo(pts[i+1]);
|
|
end;
|
|
|
|
Font.Texture := nil;
|
|
end;
|
|
Grad.Free;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|