96 lines
2.9 KiB
ObjectPascal

unit main;
{$IFDEF FPC}{$MODE objfpc}{$H+}{$ENDIF}
interface
uses
mseglob, mseguiglob, mseguiintf, mseapplication, msestat, msemenus, msegui,
msegraphics, msegraphutils, mseevent, mseclasses, mseforms, msesimplewidgets,
msewidgets, math;
type
tmainfo = class(tmainform)
tpaintbox1: tpaintbox;
procedure tpaintbox1_onpaint(const sender: twidget; const acanvas: tcanvas);
end;
const
deg_to_rad = pi / 180;
var
mainfo: tmainfo;
implementation
uses
BGRABitmap, BGRABitmapTypes, BGRAGraphics, BGRAClasses, BGRAUTF8,
BGRAGradientScanner, main_mfm;
procedure drawTree(x1, y1, angle, depth, multiplier: single; bgra : tbgrabitmap);
var
x2, y2: single;
begin
if (depth > 0) then
begin
x2 := x1 + (cos(angle * deg_to_rad) * depth * multiplier);
y2 := y1 + (sin(angle * deg_to_rad) * depth * multiplier);
bgra.DrawLineAntialias(x1, y1, x2, y2, BGRABlack, depth, False);
// Use even values without randomness to get a 'real' fractal image
drawTree(x2, y2, angle - randomrange(15,50), depth - 1.44, multiplier, bgra);
drawTree(x2, y2, angle + randomrange(10,25), depth - 0.72, multiplier, bgra);
drawTree(x2, y2, angle - randomrange(10,25), depth - 3, multiplier, bgra);
drawTree(x2, y2, angle + randomrange(15,50), depth - 4, multiplier, bgra);
end;
end;
procedure tmainfo.tpaintbox1_onpaint(const sender: twidget; const acanvas: tcanvas);
const
SampleText = 'HellÔ green tree';
MarginX = 20;
MarginY = 20;
var
bmp : tbgrabitmap;
multiplier : single;
grad: TBGRACustomGradient;
scan: TBGRACustomScanner;
textWidth: integer;
begin
bmp := tbgrabitmap.create(sender.bounds_cx, sender.bounds_cy);
multiplier := sender.bounds_cy / 50;
bmp.GradientFill(0, 0, bmp.Width, bmp.Height, cl_dkgreen, BGRA(0,125,0),
gtLinear, PointF(0,0), PointF(0, bmp.Height), dmSet);
drawTree(bmp.Width div 2, bmp.Height, -91, 9, multiplier, bmp);
bmp.FontFullHeight := 30;
textWidth := bmp.TextSize(SampleText).cx;
bmp.TextOut(MarginX, MarginY, SampleText, BGRAWhite);
bmp.HorizLine(MarginX, MarginY, MarginX + bmp.TextSize(SampleText).cx-1, BGRAWhite);
bmp.HorizLine(MarginX, MarginY + bmp.FontFullHeight, MarginX + textWidth-1, BGRAWhite);
bmp.FontFullHeight := 40;
bmp.FontStyle := [fsBold];
textWidth := bmp.TextSize(SampleText).cx;
grad := TBGRAHueGradient.Create(0,0,65535,40000,[hgoRepeat,hgoPositiveDirection,hgoLightnessCorrection]);
scan := TBGRAGradientScanner.Create(grad, gtLinear, PointF(0, bmp.Height - MarginY), PointF(0, bmp.Height - MarginY - textWidth));
bmp.TextOutAngle(bmp.Width - MarginX - bmp.FontFullHeight, bmp.Height - MarginY, 900, SampleText, scan);
scan.Free;
grad.Free;
bmp.Rectangle(0, 0, bmp.Width, bmp.Height, BGRABlack);
bmp.Rectangle(5, 5, bmp.Width - 5, bmp.Height - 5, BGRABlack);
bmp.draw(acanvas, 0, 0, false);
bmp.free;
end;
end.