251 lines
6.8 KiB
ObjectPascal
251 lines
6.8 KiB
ObjectPascal
unit utest;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
|
|
BCImageButton, BGRAVirtualScreen, BGRABitmap, BGRABitmapTypes, BCTypes,
|
|
BCFilters, BGRATextFX, Types;
|
|
|
|
type
|
|
|
|
{ TForm1 }
|
|
|
|
TForm1 = class(TForm)
|
|
BCXButton1: TBCXButton;
|
|
BCXButton2: TBCXButton;
|
|
BCXButton3: TBCXButton;
|
|
BCXButton4: TBCXButton;
|
|
BCXButton5: TBCXButton;
|
|
BCXButton6: TBCXButton;
|
|
BCXButton7: TBCXButton;
|
|
vs1: TBGRAVirtualScreen;
|
|
procedure BCXButton1RenderControl(Sender: TObject; Bitmap: TBGRABitmap;
|
|
State: TBCGraphicButtonState);
|
|
procedure BCXButton3RenderControl(Sender: TObject; Bitmap: TBGRABitmap;
|
|
State: TBCGraphicButtonState);
|
|
procedure vs1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
private
|
|
{ private declarations }
|
|
public
|
|
{ public declarations }
|
|
Image: TBGRABitmap;
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Themes, LCLType;
|
|
|
|
{$R *.lfm}
|
|
|
|
{ Button }
|
|
|
|
procedure DrawBasicXButton(Sender: TObject; Bitmap: TBGRABitmap;
|
|
State: TBCGraphicButtonState);
|
|
begin
|
|
case State of
|
|
gbsNormal: Bitmap.Fill(BGRA(255, 0, 0, 100));
|
|
gbsHover: Bitmap.Fill(BGRA(0, 255, 0, 100));
|
|
gbsActive: Bitmap.Fill(BGRA(0, 0, 255, 100));
|
|
gbsDisabled: Bitmap.Fill(BGRA(0, 0, 0, 100));
|
|
end;
|
|
end;
|
|
|
|
procedure DrawGlassXButton(Sender: TObject; Bitmap, Background: TBGRABitmap;
|
|
State: TBCGraphicButtonState);
|
|
var
|
|
tmp: TBGRABitmap;
|
|
r: TRect;
|
|
begin
|
|
{ Rect to copy backround }
|
|
with TBCXButton(Sender) do
|
|
r := Rect(Left, Top, Left + Width, Top + Height);
|
|
{ Copy background }
|
|
tmp := Background.GetPart(r) as TBGRABitmap;
|
|
{ Apply blur }
|
|
BGRAReplace(tmp, tmp.FilterBlurRadial(25, rbFast));
|
|
{ Blend }
|
|
Bitmap.BlendImageOver(0, 0, tmp, boLinearBlend);
|
|
tmp.Free;
|
|
{ Rect to draw borders }
|
|
r := Rect(0, 0, Bitmap.Width, Bitmap.Height);
|
|
{ Draw borders }
|
|
case State of
|
|
gbsNormal:
|
|
begin
|
|
Bitmap.Rectangle(r, BGRA(0, 0, 0, 100), BGRA(255, 255, 255, 10),
|
|
dmDrawWithTransparency);
|
|
r := Rect(r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1);
|
|
Bitmap.Rectangle(r, BGRA(255, 255, 255, 100), BGRAPixelTransparent,
|
|
dmDrawWithTransparency);
|
|
end;
|
|
gbsHover:
|
|
begin
|
|
Bitmap.Rectangle(r, BGRA(0, 0, 0, 100), BGRA(255, 255, 255, 50),
|
|
dmDrawWithTransparency);
|
|
r := Rect(r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1);
|
|
Bitmap.Rectangle(r, BGRA(255, 255, 255, 100), BGRAPixelTransparent,
|
|
dmDrawWithTransparency);
|
|
end;
|
|
gbsActive:
|
|
begin
|
|
Bitmap.Rectangle(r, BGRA(0, 0, 0, 100), BGRA(100, 100, 100, 50),
|
|
dmDrawWithTransparency);
|
|
r := Rect(r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1);
|
|
Bitmap.Rectangle(r, BGRA(255, 255, 255, 50), BGRAPixelTransparent,
|
|
dmDrawWithTransparency);
|
|
end;
|
|
gbsDisabled:
|
|
begin
|
|
Bitmap.Rectangle(r, BGRA(0, 0, 0, 100), BGRA(100, 100, 100, 50),
|
|
dmDrawWithTransparency);
|
|
r := Rect(r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1);
|
|
Bitmap.Rectangle(r, BGRA(100, 100, 100, 100), BGRAPixelTransparent,
|
|
dmDrawWithTransparency);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure DrawXButtonText(Sender: TObject; Bitmap: TBGRABitmap; State: TBCGraphicButtonState; Text: String);
|
|
var
|
|
tmp: TBGRABitmap;
|
|
op: byte;
|
|
begin
|
|
if State = gbsDisabled then
|
|
op := 100
|
|
else
|
|
op := 255;
|
|
|
|
tmp := TextShadow(Bitmap.Width, Bitmap.Height, Text, 18, BGRA(255, 255, 255, op),
|
|
BGRABlack, 1, 1, 2) as TBGRABitmap;
|
|
|
|
Bitmap.BlendImageOver(0, 0, tmp, boLinearBlend);
|
|
tmp.Free;
|
|
end;
|
|
|
|
{ TForm1 }
|
|
|
|
procedure TForm1.BCXButton1RenderControl(Sender: TObject; Bitmap: TBGRABitmap;
|
|
State: TBCGraphicButtonState);
|
|
var
|
|
str: string;
|
|
begin
|
|
{ Style }
|
|
DrawGlassXButton(Sender, Bitmap, Image, State);
|
|
//DrawBasicXButton(Sender, Bitmap, State);
|
|
|
|
{ Strings }
|
|
str := TControl(Sender).Caption;
|
|
|
|
{ Text }
|
|
DrawXButtonText(Sender, Bitmap, State, str);
|
|
end;
|
|
|
|
function SaveAlphaRect(ABitmap: TBGRABitmap; ARect: TRect): Pointer;
|
|
var width,height,count,y: Integer;
|
|
pAlphaData: PByte;
|
|
pSrc: PBGRAPixel;
|
|
begin
|
|
IntersectRect(ARect,ARect,Classes.Rect(0,0,ABitmap.Width,ABitmap.Height));
|
|
width := ARect.Right-ARect.Left;
|
|
height := ARect.Bottom-ARect.Top;
|
|
if (width <= 0) or (height <= 0) then result := nil;
|
|
getmem(result, sizeof(longint)*2 + sizeof(byte)*width*height);
|
|
PLongint(result)^ := width;
|
|
(PLongint(result)+1)^ := height;
|
|
pAlphaData := pbyte(plongint(result)+2);
|
|
for y := ARect.Top to ARect.Bottom-1 do
|
|
begin
|
|
pSrc := ABitmap.ScanLine[y]+ARect.Left;
|
|
count := width;
|
|
while count > 0 do
|
|
begin
|
|
pAlphaData^ := pSrc^.alpha;
|
|
inc(pAlphaData);
|
|
inc(pSrc);
|
|
dec(count);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure RestoreAlphaRectAndFree(ABitmap: TBGRABitmap; AX,AY: integer; ASavedAlphaRect: Pointer);
|
|
var width,height,count,y: Integer;
|
|
pAlphaData: PByte;
|
|
pSrc: PBGRAPixel;
|
|
begin
|
|
if ASavedAlphaRect = nil then exit;
|
|
if AX < 0 then AX := 0;
|
|
if AY < 0 then AY := 0;
|
|
width := PLongint(ASavedAlphaRect)^;
|
|
height := (PLongint(ASavedAlphaRect)+1)^;
|
|
pAlphaData := pbyte(plongint(ASavedAlphaRect)+2);
|
|
for y := AY to AY+height-1 do
|
|
begin
|
|
pSrc := ABitmap.ScanLine[y]+AX;
|
|
count := width;
|
|
while count > 0 do
|
|
begin
|
|
pSrc^.alpha := pAlphaData^;
|
|
inc(pAlphaData);
|
|
inc(pSrc);
|
|
dec(count);
|
|
end;
|
|
end;
|
|
freemem(ASavedAlphaRect);
|
|
end;
|
|
|
|
procedure TForm1.BCXButton3RenderControl(Sender: TObject; Bitmap: TBGRABitmap;
|
|
State: TBCGraphicButtonState);
|
|
var
|
|
Details: TThemedElementDetails;
|
|
PaintRect: TRect;
|
|
AlphaRect: Pointer;
|
|
begin
|
|
PaintRect := Rect(0, 0, Bitmap.Width, Bitmap.Height);
|
|
|
|
case State of
|
|
gbsNormal: Details := ThemeServices.GetElementDetails(tbPushButtonNormal);
|
|
gbsHover: Details := ThemeServices.GetElementDetails(tbPushButtonHot);
|
|
gbsActive: Details := ThemeServices.GetElementDetails(tbPushButtonPressed);
|
|
gbsDisabled: Details := ThemeServices.GetElementDetails(tbPushButtonDisabled);
|
|
end;
|
|
|
|
ThemeServices.DrawElement(Bitmap.Canvas.Handle, Details, PaintRect, nil);
|
|
Bitmap.Canvas.Changed;
|
|
|
|
PaintRect := ThemeServices.ContentRect(Bitmap.Canvas.Handle, Details, PaintRect);
|
|
AlphaRect := SaveAlphaRect(Bitmap, PaintRect);
|
|
ThemeServices.DrawText(Bitmap.Canvas, Details, TControl(Sender).Caption, PaintRect,
|
|
DT_CENTER or DT_VCENTER or DT_SINGLELINE, 0);
|
|
RestoreAlphaRectAndFree(Bitmap, PaintRect.Left,PaintRect.Top, AlphaRect);
|
|
end;
|
|
|
|
{ Image }
|
|
|
|
procedure TForm1.vs1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
|
|
begin
|
|
Bitmap.BlendImageOver(0, 0, Image, boLinearBlend);
|
|
end;
|
|
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
begin
|
|
BCXButton2.Enabled := False;
|
|
BCXButton4.Enabled := False;
|
|
Image := TBGRABitmap.Create(Application.Location + 'Desert.jpg');
|
|
end;
|
|
|
|
procedure TForm1.FormDestroy(Sender: TObject);
|
|
begin
|
|
Image.Free;
|
|
end;
|
|
|
|
end.
|