78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
unit utest14;
 | 
						|
 | 
						|
{$mode objfpc}{$H+}
 | 
						|
 | 
						|
interface
 | 
						|
 | 
						|
uses
 | 
						|
  Classes, SysUtils, Graphics, BGRABitmap, BGRABitmapTypes, utest;
 | 
						|
 | 
						|
type
 | 
						|
  { TTest14 }
 | 
						|
 | 
						|
  TTest14 = class(TTest)
 | 
						|
  protected
 | 
						|
    virtualScreen: TBGRABitmap;
 | 
						|
    time: single;
 | 
						|
    lightPos1,lightPos2: TPointF;
 | 
						|
  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
 | 
						|
 | 
						|
{ TTest14 }
 | 
						|
 | 
						|
constructor TTest14.Create;
 | 
						|
begin
 | 
						|
  inherited Create;
 | 
						|
  Name := 'Layer blending: adding red and green gives yellow';
 | 
						|
  virtualScreen := nil;
 | 
						|
  time := 0;
 | 
						|
end;
 | 
						|
 | 
						|
destructor TTest14.Destroy;
 | 
						|
begin
 | 
						|
  virtualScreen.Free;
 | 
						|
  inherited Destroy;
 | 
						|
end;
 | 
						|
 | 
						|
procedure TTest14.OnPaint(Canvas: TCanvas; Left,Top,Width, Height: Integer);
 | 
						|
var layer: TBGRABitmap; x,y: single; radius: integer;
 | 
						|
begin
 | 
						|
  if (virtualscreen <> nil) and ((virtualscreen.width <> width) or (virtualscreen.Height <> height)) then
 | 
						|
    FreeAndNil(virtualScreen);
 | 
						|
 | 
						|
  if virtualscreen = nil then
 | 
						|
    virtualscreen := TBGRABitmap.Create(Width,Height);
 | 
						|
 | 
						|
  if time = 0 then exit;
 | 
						|
 | 
						|
  radius := (width+height) div 8;
 | 
						|
  virtualScreen.Fill(BGRABlack);
 | 
						|
  x := lightPos1.X*Width;
 | 
						|
  y := lightPos1.Y*Height;
 | 
						|
  virtualScreen.FillEllipseAntialias(x,y,radius,radius,BGRA(255,0,0,255));
 | 
						|
  layer := TBGRABitmap.Create(Width,Height,BGRABlack);
 | 
						|
  x := lightPos2.X*Width;
 | 
						|
  y := lightPos2.Y*Height;
 | 
						|
  layer.FillEllipseAntialias(x,y,radius,radius,BGRA(0,255,0,255));
 | 
						|
  virtualScreen.BlendImage(0,0,layer,boAdditive);
 | 
						|
  layer.Free;
 | 
						|
 | 
						|
  virtualscreen.Draw(Canvas,Left,Top,True);
 | 
						|
end;
 | 
						|
 | 
						|
procedure TTest14.OnTimer(Width, Height: Integer; ElapsedSec: Double);
 | 
						|
begin
 | 
						|
  time := time+ElapsedSec*0.5;
 | 
						|
  lightPos1 := pointF((sin(time)+1)/4+0.2,(cos(time*0.3)+1)/4+0.3);
 | 
						|
  lightPos2 := pointF((sin(time*0.7+1)+1)/4+0.4,(cos(time*0.5+2)+1)/4+0.3);
 | 
						|
end;
 | 
						|
 | 
						|
end.
 | 
						|
 |