// SPDX-License-Identifier: LGPL-3.0-linking-exception
{******************************* CONTRIBUTOR(S) ******************************
- Edivando S. Santos Brasil | mailedivando@gmail.com
  (Compatibility with delphi VCL 11/2018)

***************************** END CONTRIBUTOR(S) *****************************}
unit BCSamples;

{$I bgracontrols.inc}

interface

uses
  Classes, Controls, Graphics,
  {$IFDEF FPC}LCLProc, LCLType, LazUTF8,{$ENDIF}
  StdCtrls, BCButton, BCButtonFocus, BCTypes,
  {$IFNDEF FPC}Types, Windows, Sysutils, BGRAGraphics, GraphType, FPImage, {$ENDIF}
  BGRABitmap, BGRABitmapTypes, BGRAGradients, MaterialColors, BCBrightAndContrast;

{$IFNDEF FPC}
type
  TWinControlHack = class(TWinControl);
{$ENDIF}

const
  {Accent Colors}
  acMagenta = TColor($009700FF);
  acPurple = TColor($00FF00A2);
  acTeal = TColor($00A9AB00);
  acLime = TColor($0026BF8C);
  acBrown = TColor($000050A0);
  acPink = TColor($00B871E6);
  acOrange = TColor($000996F0);
  acBlue = TColor($00E2A11B);
  acRed = TColor($000014E5);
  acGreen = TColor($00339933);
  {Facebook Colors}
  fbBlue = TColor($00AA785F);
  fbGreen = TColor($004BA567);
  fbGray = TColor($00F8F8F8);
  {Windows 8 Color Scheme - Background}
  clScheme1_Background = TColor($00252525);
  clScheme2_Background = TColor($00252525);
  clScheme3_Background = TColor($00252525);
  clScheme4_Background = TColor($00252525);
  clScheme5_Background = TColor($0000172E);
  clScheme6_Background = TColor($0000004E);
  clScheme7_Background = TColor($0038004E);
  clScheme8_Background = TColor($004E002D);
  clScheme9_Background = TColor($0068001F);
  clScheme10_Background = TColor($004E1E00);
  clScheme11_Background = TColor($00604D00);
  clScheme12_Background = TColor($00004A00);
  clScheme13_Background = TColor($002A9915);
  clScheme14_Background = TColor($00196CE5);
  clScheme15_Background = TColor($001B1BB8);
  clScheme16_Background = TColor($006C1BB8);
  clScheme17_Background = TColor($00B81B69);
  clScheme18_Background = TColor($00B8581B);
  clScheme19_Background = TColor($00E39C56);
  clScheme20_Background = TColor($00AAAA00);
  clScheme21_Background = TColor($001FBA83);
  clScheme22_Background = TColor($00099DD3);
  clScheme23_Background = TColor($00B764E0);
  clScheme24_Background = TColor($00696969);
  clScheme25_Background = TColor($00696969);
  {Windows 8 Color Scheme - Selection}
  clScheme1_Selection = TColor($0000B3F4);
  clScheme2_Selection = TColor($0000BA78);
  clScheme3_Selection = TColor($00EC7326);
  clScheme4_Selection = TColor($003D11AE);
  clScheme5_Selection = TColor($00002F63);
  clScheme6_Selection = TColor($00001EB0);
  clScheme7_Selection = TColor($004F00C1);
  clScheme8_Selection = TColor($00AC0072);
  clScheme9_Selection = TColor($00B41746);
  clScheme10_Selection = TColor($00C16A00);
  clScheme11_Selection = TColor($00878200);
  clScheme12_Selection = TColor($00009919);
  clScheme13_Selection = TColor($003FC100);
  clScheme14_Selection = TColor($001D98FF);
  clScheme15_Selection = TColor($00122EFF);
  clScheme16_Selection = TColor($00771DFF);
  clScheme17_Selection = TColor($00FF40AA);
  clScheme18_Selection = TColor($00FFAE1F);
  clScheme19_Selection = TColor($00FFC556);
  clScheme20_Selection = TColor($00CCD800);
  clScheme21_Selection = TColor($0000D191);
  clScheme22_Selection = TColor($0000B7E1);
  clScheme23_Selection = TColor($00BC76FF);
  clScheme24_Selection = TColor($00A4A400);
  clScheme25_Selection = TColor($00237DFF);

type
  TBCSampleStyle = (ssDefault, ssWindows7, ssWindows7ToolBar, ssOffice2010,
    ssFlashPlayer, ssMacOSXLion, ssWindows8_1, ssWindows8_2, ssWindows8_3,
    ssWindows8_4, ssWindows8_5, ssWindows8_6, ssWindows8_7, ssWindows8_8,
    ssWindows8_9, ssWindows8_10, ssWindows8_11, ssWindows8_12, ssWindows8_13,
    ssWindows8_14, ssWindows8_15, ssWindows8_16, ssWindows8_17, ssWindows8_18,
    ssWindows8_19, ssWindows8_20, ssWindows8_21, ssWindows8_22, ssWindows8_23,
    ssWindows8_24, ssWindows8_25, ssMaterialRed, ssMaterialPink, ssMaterialPurple,
    ssMaterialDeepPurple, ssMaterialIndigo, ssMaterialBlue, ssMaterialLightBlue,
    ssMaterialCyan, ssMaterialTeal, ssMaterialGreen, ssMaterialLightGreen,
    ssMaterialLime, ssMaterialYellow, ssMaterialAmber, ssMaterialOrange,
    ssMaterialDeepOrange, ssMaterialBrown, ssMaterialGrey, ssMaterialBlueGrey);

  TBCSampleDrawing = (sdDefault, sdFlashPlayerBody, sdFlashPlayerButtonPanel,
    sdWindows7Toolbar, sdiOSBar, sdiOSToolBar, sdiOSBackground,
    sdWindows8_1, sdWindows8_2, sdWindows8_3,
    sdWindows8_4, sdWindows8_5, sdWindows8_6, sdWindows8_7, sdWindows8_8,
    sdWindows8_9, sdWindows8_10, sdWindows8_11, sdWindows8_12, sdWindows8_13,
    sdWindows8_14, sdWindows8_15, sdWindows8_16, sdWindows8_17, sdWindows8_18,
    sdWindows8_19, sdWindows8_20, sdWindows8_21, sdWindows8_22, sdWindows8_23,
    sdWindows8_24, sdWindows8_25);

const
  BCSampleStyleStr: array[TBCSampleStyle] of string =
    ('Default', 'Windows 7', 'Windows 7 ToolBar', 'Office 2010',
    'Flash Player', 'Mac OSX Lion', 'Windows 8 Scheme 1', 'Windows 8 Scheme 2',
    'Windows 8 Scheme 3', 'Windows 8 Scheme 4', 'Windows 8 Scheme 5'
    , 'Windows 8 Scheme 6', 'Windows 8 Scheme 7', 'Windows 8 Scheme 8'
    , 'Windows 8 Scheme 9', 'Windows 8 Scheme 10', 'Windows 8 Scheme 11'
    , 'Windows 8 Scheme 12', 'Windows 8 Scheme 13', 'Windows 8 Scheme 14'
    , 'Windows 8 Scheme 15', 'Windows 8 Scheme 16', 'Windows 8 Scheme 17'
    , 'Windows 8 Scheme 18', 'Windows 8 Scheme 19', 'Windows 8 Scheme 20'
    , 'Windows 8 Scheme 21', 'Windows 8 Scheme 22', 'Windows 8 Scheme 23'
    , 'Windows 8 Scheme 24', 'Windows 8 Scheme 25', 'Material Red', 'Material Pink',
    'Material Purple', 'Material Deep Purple', 'Material Indigo', 'Material Blue',
    'Material Light Blue', 'Material Cyan', 'Material Teal', 'Material Green',
    'Material Light Green', 'Material Lime', 'Material Yellow', 'Material Amber',
    'Material Orange', 'Material Deep Orange', 'Material Brown', 'Material Grey',
    'Material Blue Grey');

  BCSampleDrawingStr: array[TBCSampleDrawing] of string =
    ('Default', 'Flash Player Body', 'Flash Player Button Panel',
    'Windows 7 ToolBar', 'iOS Bar', 'iOS ToolBar', 'iOS Background',
    'Windows 8 Scheme 1', 'Windows 8 Scheme 2',
    'Windows 8 Scheme 3', 'Windows 8 Scheme 4', 'Windows 8 Scheme 5'
    , 'Windows 8 Scheme 6', 'Windows 8 Scheme 7', 'Windows 8 Scheme 8'
    , 'Windows 8 Scheme 9', 'Windows 8 Scheme 10', 'Windows 8 Scheme 11'
    , 'Windows 8 Scheme 12', 'Windows 8 Scheme 13', 'Windows 8 Scheme 14'
    , 'Windows 8 Scheme 15', 'Windows 8 Scheme 16', 'Windows 8 Scheme 17'
    , 'Windows 8 Scheme 18', 'Windows 8 Scheme 19', 'Windows 8 Scheme 20'
    , 'Windows 8 Scheme 21', 'Windows 8 Scheme 22', 'Windows 8 Scheme 23'
    , 'Windows 8 Scheme 24', 'Windows 8 Scheme 25');

function StrToTBCSampleStyle(const s: ansistring): TBCSampleStyle;
procedure BCSampleStyleStrList(s: TStrings);

function StrToTBCSampleDrawing(const s: ansistring): TBCSampleDrawing;
procedure BCSampleDrawingStrList(s: TStrings);

procedure StyleButtons(AControl: TControl; AButton: TBCButton); overload;
procedure StyleButtons(AControl: TControl; AButton: TBCButtonFocus); overload;
procedure StyleButtonsSample(AControl: TControl; AStyle: TBCSampleStyle);
procedure StyleButtonsFocusSample(AControl: TControl; AStyle: TBCSampleStyle);

procedure DrawSample(ABitmap: TBGRABitmap; Element: TBCSampleDrawing;
  Align: TAlign = alNone); overload;
function DrawSample(AWidth, AHeight: integer; Element: TBCSampleDrawing;
  Align: TAlign = alNone): TBGRABitmap; overload;
procedure DrawItem(Control: TWinControl; Index: integer; ARect: TRect;
  State: TOwnerDrawState; Style: TBCSampleDrawing);

{ Buttons }
procedure BCButtonWindows7(AButton: TBCButton); overload;
procedure BCButtonWindows7ToolBar(AButton: TBCButton); overload;
procedure BCButtonOffice2010(AButton: TBCButton); overload;
procedure BCButtonFlashPlayer(AButton: TBCButton); overload;
procedure BCButtonMacOSXLion(AButton: TBCButton); overload;
procedure BCButtonWindows8(AButton: TBCButton; cl1, cl2: TColor; rounding: integer = 1); overload;

procedure BCButtonWindows7(AButton: TBCButtonFocus); overload;
procedure BCButtonWindows7ToolBar(AButton: TBCButtonFocus);overload;
procedure BCButtonOffice2010(AButton: TBCButtonFocus);overload;
procedure BCButtonFlashPlayer(AButton: TBCButtonFocus);overload;
procedure BCButtonMacOSXLion(AButton: TBCButtonFocus);overload;
procedure BCButtonWindows8(AButton: TBCButtonFocus; cl1, cl2: TColor;
  rounding: integer = 1); overload;

{ Drawings }
procedure DrawFlashPlayerBody(ABitmap: TBGRABitmap);
procedure DrawFlashPlayerButtonPanel(ABitmap: TBGRABitmap);
procedure DrawWindows7ToolBar(ABitmap: TBGRABitmap; ADir: TAlign;
  Smooth: boolean = False);
procedure DrawiOSBar(ABitmap: TBGRABitmap);
procedure DrawiOSToolBar(ABitmap: TBGRABitmap; Shadow: boolean = True);
procedure DrawiOSBackground(ABitmap: TBGRABitmap);
procedure DrawWindows8Background(ABitmap: TBGRABitmap; {%H-}cl1, cl2: TColor);

implementation

function StrToTBCSampleStyle(const s: ansistring): TBCSampleStyle;
var
  ss: TBCSampleStyle;
  ls: ansistring;
begin
  Result := ssDefault;
  ls := {$IFDEF FPC}UTF8LowerCase{$ELSE}LowerCase{$ENDIF}(s);
  for ss := low(TBCSampleStyle) to high(TBCSampleStyle) do
    if ls = {$IFDEF FPC}UTF8LowerCase{$ELSE}LowerCase{$ENDIF}(BCSampleStyleStr[ss]) then
    begin
      Result := ss;
      break;
    end;
end;

procedure BCSampleStyleStrList(s: TStrings);
var
  ss: TBCSampleStyle;
begin
  for ss := low(TBCSampleStyle) to high(TBCSampleStyle) do
    s.Add(BCSampleStyleStr[ss]);
end;

procedure StyleButtons(AControl: TControl; AButton: TBCButton);
var
  i: integer;
  WinControl: TWinControl;
begin
  if AControl is TBCButton then
    with AControl as TBCButton do
    begin
      // Those are recomended properties to keep unchanged
      AButton.Glyph := Glyph;
      AButton.GlyphMargin := GlyphMargin;
      AButton.StaticButton := StaticButton;
      AButton.Down := Down;
      AButton.Style := Style;
      Assign(AButton);
    end;
  if AControl is TWinControl then
  begin
    WinControl := TWinControl(AControl);
    if WinControl.ControlCount = 0 then
      exit;
    for i := 0 to WinControl.ControlCount - 1 do
      StyleButtons(WinControl.Controls[i], AButton);
  end;
end;

procedure StyleButtons(AControl: TControl; AButton: TBCButtonFocus);
var
  i: integer;
  WinControl: TWinControl;
begin
  if AControl is TBCButtonFocus then
    with AControl as TBCButtonFocus do
    begin
      // Those are recomended properties to keep unchanged
      AButton.Glyph := Glyph;
      AButton.GlyphMargin := GlyphMargin;
      AButton.StaticButton := StaticButton;
      AButton.Down := Down;
      AButton.Style := Style;
      Assign(AButton);
    end;
  if AControl is TWinControl then
  begin
    WinControl := TWinControl(AControl);
    if WinControl.ControlCount = 0 then
      exit;
    for i := 0 to WinControl.ControlCount - 1 do
      StyleButtons(WinControl.Controls[i], AButton);
  end;
end;

procedure StyleButtonsSample(AControl: TControl; AStyle: TBCSampleStyle);
var
  temp: TBCButton;
begin
  temp := TBCButton.Create(nil);
  case AStyle of
    ssWindows7: BCButtonWindows7(temp);
    ssWindows7ToolBar: BCButtonWindows7ToolBar(temp);
    ssOffice2010: BCButtonOffice2010(temp);
    ssFlashPlayer: BCButtonFlashPlayer(temp);
    ssMacOSXLion: BCButtonMacOSXLion(temp);
    ssWindows8_1: BCButtonWindows8(temp, clScheme1_Background, clScheme1_Selection);
    ssWindows8_2: BCButtonWindows8(temp, clScheme2_Background, clScheme2_Selection);
    ssWindows8_3: BCButtonWindows8(temp, clScheme3_Background, clScheme3_Selection);
    ssWindows8_4: BCButtonWindows8(temp, clScheme4_Background, clScheme4_Selection);
    ssWindows8_5: BCButtonWindows8(temp, clScheme5_Background, clScheme5_Selection);
    ssWindows8_6: BCButtonWindows8(temp, clScheme6_Background, clScheme6_Selection);
    ssWindows8_7: BCButtonWindows8(temp, clScheme7_Background, clScheme7_Selection);
    ssWindows8_8: BCButtonWindows8(temp, clScheme8_Background, clScheme8_Selection);
    ssWindows8_9: BCButtonWindows8(temp, clScheme9_Background, clScheme9_Selection);
    ssWindows8_10: BCButtonWindows8(temp, clScheme10_Background, clScheme10_Selection);
    ssWindows8_11: BCButtonWindows8(temp, clScheme11_Background, clScheme11_Selection);
    ssWindows8_12: BCButtonWindows8(temp, clScheme12_Background, clScheme12_Selection);
    ssWindows8_13: BCButtonWindows8(temp, clScheme13_Background, clScheme13_Selection);
    ssWindows8_14: BCButtonWindows8(temp, clScheme14_Background, clScheme14_Selection);
    ssWindows8_15: BCButtonWindows8(temp, clScheme15_Background, clScheme15_Selection);
    ssWindows8_16: BCButtonWindows8(temp, clScheme16_Background, clScheme16_Selection);
    ssWindows8_17: BCButtonWindows8(temp, clScheme17_Background, clScheme17_Selection);
    ssWindows8_18: BCButtonWindows8(temp, clScheme18_Background, clScheme18_Selection);
    ssWindows8_19: BCButtonWindows8(temp, clScheme19_Background, clScheme19_Selection);
    ssWindows8_20: BCButtonWindows8(temp, clScheme20_Background, clScheme20_Selection);
    ssWindows8_21: BCButtonWindows8(temp, clScheme21_Background, clScheme21_Selection);
    ssWindows8_22: BCButtonWindows8(temp, clScheme22_Background, clScheme22_Selection);
    ssWindows8_23: BCButtonWindows8(temp, clScheme23_Background, clScheme23_Selection);
    ssWindows8_24: BCButtonWindows8(temp, clScheme24_Background, clScheme24_Selection);
    ssWindows8_25: BCButtonWindows8(temp, clScheme25_Background, clScheme25_Selection);
    ssMaterialRed: BCButtonWindows8(temp, MaterialRed.M500, MaterialRed.M300, 5);
    ssMaterialPink: BCButtonWindows8(temp, MaterialPink.M500, MaterialPink.M300, 5);
    ssMaterialPurple: BCButtonWindows8(temp, MaterialPurple.M500,
        MaterialPurple.M300, 5);
    ssMaterialDeepPurple: BCButtonWindows8(temp, MaterialDeepPurple.M500,
        MaterialDeepPurple.M300, 5);
    ssMaterialIndigo: BCButtonWindows8(temp, MaterialIndigo.M500,
        MaterialIndigo.M300, 5);
    ssMaterialBlue: BCButtonWindows8(temp, MaterialBlue.M500, MaterialBlue.M300, 5);
    ssMaterialLightBlue: BCButtonWindows8(temp, MaterialLightBlue.M500,
        MaterialLightBlue.M300, 5);
    ssMaterialCyan: BCButtonWindows8(temp, MaterialCyan.M500, MaterialCyan.M300, 5);
    ssMaterialTeal: BCButtonWindows8(temp, MaterialTeal.M500, MaterialTeal.M300, 5);
    ssMaterialGreen: BCButtonWindows8(temp, MaterialGreen.M500, MaterialGreen.M300, 5);
    ssMaterialLightGreen: BCButtonWindows8(temp, MaterialLightGreen.M500,
        MaterialLightGreen.M300, 5);
    ssMaterialLime: BCButtonWindows8(temp, MaterialLime.M500, MaterialLime.M300, 5);
    ssMaterialYellow: BCButtonWindows8(temp, MaterialYellow.M500,
        MaterialYellow.M300, 5);
    ssMaterialAmber: BCButtonWindows8(temp, MaterialAmber.M500, MaterialAmber.M300, 5);
    ssMaterialOrange: BCButtonWindows8(temp, MaterialOrange.M500,
        MaterialOrange.M300, 5);
    ssMaterialDeepOrange: BCButtonWindows8(temp, MaterialDeepOrange.M500,
        MaterialDeepOrange.M300, 5);
    ssMaterialBrown: BCButtonWindows8(temp, MaterialBrown.M500, MaterialBrown.M300, 5);
    ssMaterialGrey: BCButtonWindows8(temp, MaterialGrey.M500, MaterialGrey.M300, 5);
    ssMaterialBlueGrey: BCButtonWindows8(temp, MaterialBlueGrey.M500,
        MaterialBlueGrey.M300, 5);
  end;
  StyleButtons(AControl, temp);
  temp.Free;
end;

procedure StyleButtonsFocusSample(AControl: TControl; AStyle: TBCSampleStyle);
var
  temp: TBCButtonFocus;
begin
  temp := TBCButtonFocus.Create(nil);
  case AStyle of
    ssWindows7: BCButtonWindows7(temp);
    ssWindows7ToolBar: BCButtonWindows7ToolBar(temp);
    ssOffice2010: BCButtonOffice2010(temp);
    ssFlashPlayer: BCButtonFlashPlayer(temp);
    ssMacOSXLion: BCButtonMacOSXLion(temp);
    ssWindows8_1: BCButtonWindows8(temp, clScheme1_Background, clScheme1_Selection);
    ssWindows8_2: BCButtonWindows8(temp, clScheme2_Background, clScheme2_Selection);
    ssWindows8_3: BCButtonWindows8(temp, clScheme3_Background, clScheme3_Selection);
    ssWindows8_4: BCButtonWindows8(temp, clScheme4_Background, clScheme4_Selection);
    ssWindows8_5: BCButtonWindows8(temp, clScheme5_Background, clScheme5_Selection);
    ssWindows8_6: BCButtonWindows8(temp, clScheme6_Background, clScheme6_Selection);
    ssWindows8_7: BCButtonWindows8(temp, clScheme7_Background, clScheme7_Selection);
    ssWindows8_8: BCButtonWindows8(temp, clScheme8_Background, clScheme8_Selection);
    ssWindows8_9: BCButtonWindows8(temp, clScheme9_Background, clScheme9_Selection);
    ssWindows8_10: BCButtonWindows8(temp, clScheme10_Background, clScheme10_Selection);
    ssWindows8_11: BCButtonWindows8(temp, clScheme11_Background, clScheme11_Selection);
    ssWindows8_12: BCButtonWindows8(temp, clScheme12_Background, clScheme12_Selection);
    ssWindows8_13: BCButtonWindows8(temp, clScheme13_Background, clScheme13_Selection);
    ssWindows8_14: BCButtonWindows8(temp, clScheme14_Background, clScheme14_Selection);
    ssWindows8_15: BCButtonWindows8(temp, clScheme15_Background, clScheme15_Selection);
    ssWindows8_16: BCButtonWindows8(temp, clScheme16_Background, clScheme16_Selection);
    ssWindows8_17: BCButtonWindows8(temp, clScheme17_Background, clScheme17_Selection);
    ssWindows8_18: BCButtonWindows8(temp, clScheme18_Background, clScheme18_Selection);
    ssWindows8_19: BCButtonWindows8(temp, clScheme19_Background, clScheme19_Selection);
    ssWindows8_20: BCButtonWindows8(temp, clScheme20_Background, clScheme20_Selection);
    ssWindows8_21: BCButtonWindows8(temp, clScheme21_Background, clScheme21_Selection);
    ssWindows8_22: BCButtonWindows8(temp, clScheme22_Background, clScheme22_Selection);
    ssWindows8_23: BCButtonWindows8(temp, clScheme23_Background, clScheme23_Selection);
    ssWindows8_24: BCButtonWindows8(temp, clScheme24_Background, clScheme24_Selection);
    ssWindows8_25: BCButtonWindows8(temp, clScheme25_Background, clScheme25_Selection);
    ssMaterialRed: BCButtonWindows8(temp, MaterialRed.M500, MaterialRed.M300, 5);
    ssMaterialPink: BCButtonWindows8(temp, MaterialPink.M500, MaterialPink.M300, 5);
    ssMaterialPurple: BCButtonWindows8(temp, MaterialPurple.M500,
        MaterialPurple.M300, 5);
    ssMaterialDeepPurple: BCButtonWindows8(temp, MaterialDeepPurple.M500,
        MaterialDeepPurple.M300, 5);
    ssMaterialIndigo: BCButtonWindows8(temp, MaterialIndigo.M500,
        MaterialIndigo.M300, 5);
    ssMaterialBlue: BCButtonWindows8(temp, MaterialBlue.M500, MaterialBlue.M300, 5);
    ssMaterialLightBlue: BCButtonWindows8(temp, MaterialLightBlue.M500,
        MaterialLightBlue.M300, 5);
    ssMaterialCyan: BCButtonWindows8(temp, MaterialCyan.M500, MaterialCyan.M300, 5);
    ssMaterialTeal: BCButtonWindows8(temp, MaterialTeal.M500, MaterialTeal.M300, 5);
    ssMaterialGreen: BCButtonWindows8(temp, MaterialGreen.M500, MaterialGreen.M300, 5);
    ssMaterialLightGreen: BCButtonWindows8(temp, MaterialLightGreen.M500,
        MaterialLightGreen.M300, 5);
    ssMaterialLime: BCButtonWindows8(temp, MaterialLime.M500, MaterialLime.M300, 5);
    ssMaterialYellow: BCButtonWindows8(temp, MaterialYellow.M500,
        MaterialYellow.M300, 5);
    ssMaterialAmber: BCButtonWindows8(temp, MaterialAmber.M500, MaterialAmber.M300, 5);
    ssMaterialOrange: BCButtonWindows8(temp, MaterialOrange.M500,
        MaterialOrange.M300, 5);
    ssMaterialDeepOrange: BCButtonWindows8(temp, MaterialDeepOrange.M500,
        MaterialDeepOrange.M300, 5);
    ssMaterialBrown: BCButtonWindows8(temp, MaterialBrown.M500, MaterialBrown.M300, 5);
    ssMaterialGrey: BCButtonWindows8(temp, MaterialGrey.M500, MaterialGrey.M300, 5);
    ssMaterialBlueGrey: BCButtonWindows8(temp, MaterialBlueGrey.M500,
        MaterialBlueGrey.M300, 5);
  end;
  StyleButtons(AControl, temp);
  temp.Free;
end;

procedure DrawItem(Control: TWinControl; Index: integer; ARect: TRect;
  State: TOwnerDrawState; Style: TBCSampleDrawing);
var
  temp: TBGRABitmap;
  str: string;
begin
  if Control is TListBox then
    str := TListBox(Control).Items[Index]
  else if Control is TComboBox then
    str := TComboBox(Control).Items[Index];

  temp := TBGRABitmap.Create(ARect.Right - ARect.Left, ARect.Bottom -
    ARect.Top, {$IFNDEF FPC}TWinControlHack(Control).{$ELSE}Control.{$ENDIF}Color);

  temp.FontAntialias := True;
  temp.FontHeight := 0;
  temp.FontQuality := fqSystemClearType;

  if odSelected in State then
    DrawSample(temp, Style, alNone);

  temp.TextOut(2, 0, {%H-}str, BGRABlack);

  if Control is TListBox then
    temp.Draw(TListBox(Control).Canvas, ARect, False)
  else if Control is TComboBox then
    temp.Draw(TComboBox(Control).Canvas, ARect, False);

  temp.Free;
end;

procedure BCButtonWindows7(AButton: TBCButton);
begin
  AButton.Rounding.RoundX := 3;
  AButton.Rounding.RoundY := 3;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(112, 112, 112);
    Border.LightWidth := 1;
    Border.LightOpacity := 175;
    Border.Style := bboSolid;
    FontEx.Color := clBlack;
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(242, 242, 242);
    Background.Gradient1.EndColor := RGBToColor(235, 235, 235);
    Background.Gradient2.StartColor := RGBToColor(221, 221, 221);
    Background.Gradient2.EndColor := RGBToColor(207, 207, 207);
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(234, 246, 253);
    Background.Gradient1.EndColor := RGBToColor(217, 240, 252);
    Background.Gradient2.StartColor := RGBToColor(190, 230, 253);
    Background.Gradient2.EndColor := RGBToColor(167, 217, 245);
    Border.Color := RGBToColor(60, 127, 177);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(229, 244, 252);
    Background.Gradient1.EndColor := RGBToColor(196, 229, 246);
    Background.Gradient2.StartColor := RGBToColor(152, 209, 239);
    Background.Gradient2.EndColor := RGBToColor(104, 179, 219);
    Background.Gradient1EndPercent := 55;
    Border.Color := RGBToColor(44, 98, 139);
    Border.LightOpacity := 100;
    Border.LightColor := clBlack;
  end;
end;

procedure BCButtonWindows7ToolBar(AButton: TBCButton);
begin
  AButton.Rounding.RoundX := 2;
  AButton.Rounding.RoundY := 2;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(187, 202, 219);
    Border.LightWidth := 1;
    Border.LightOpacity := 200;
    Border.Style := bboSolid;
    FontEx.Color := RGBToColor(30, 57, 91);
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(245, 250, 255);
    Background.Gradient1.EndColor := RGBToColor(230, 240, 250);
    Background.Gradient2.StartColor := RGBToColor(220, 230, 244);
    Background.Gradient2.EndColor := RGBToColor(221, 233, 247);
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(248, 251, 254);
    Background.Gradient1.EndColor := RGBToColor(237, 242, 250);
    Background.Gradient2.StartColor := RGBToColor(215, 228, 244);
    Background.Gradient2.EndColor := RGBToColor(193, 210, 232);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(226, 236, 245);
    Background.Gradient1.EndColor := RGBToColor(216, 228, 241);
    Background.Gradient2.StartColor := RGBToColor(207, 219, 236);
    Background.Gradient2.EndColor := RGBToColor(207, 220, 237);
  end;
end;

procedure BCButtonOffice2010(AButton: TBCButton);
begin
  AButton.Rounding.RoundX := 3;
  AButton.Rounding.RoundY := 3;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(207, 208, 210);
    Border.LightWidth := 1;
    Border.LightOpacity := 175;
    Border.Style := bboSolid;
    FontEx.Color := clBlack;
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(255, 255, 255);
    Background.Gradient1.EndColor := RGBToColor(237, 239, 241);
    Background.Gradient1EndPercent := 100;
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(254, 241, 189);
    Background.Gradient1.EndColor := RGBToColor(254, 228, 134);
    Background.Gradient2.StartColor := RGBToColor(254, 228, 134);
    Background.Gradient2.EndColor := RGBToColor(254, 248, 196);
    Border.Color := RGBToColor(244, 210, 81);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(255, 229, 117);
    Background.Gradient1.EndColor := RGBToColor(255, 216, 107);
    Background.Gradient2.StartColor := RGBToColor(255, 216, 107);
    Background.Gradient2.EndColor := RGBToColor(255, 239, 129);
    Border.Color := RGBToColor(194, 161, 63);
    Border.LightWidth := 0;
  end;
end;

procedure BCButtonFlashPlayer(AButton: TBCButton);
begin
  AButton.Rounding.RoundX := 1;
  AButton.Rounding.RoundY := 1;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(24, 24, 24);
    Border.LightWidth := 1;
    Border.LightOpacity := 20;
    Border.Style := bboSolid;
    FontEx.Color := clWhite;
    FontEx.Shadow := True;
    FontEx.ShadowRadius := 1;
    FontEx.ShadowOffsetX := 1;
    FontEx.ShadowOffsetY := 1;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(104, 104, 104);
    Background.Gradient1.EndColor := RGBToColor(104, 104, 104);
    Background.Gradient2.StartColor := RGBToColor(103, 103, 103);
    Background.Gradient2.EndColor := RGBToColor(71, 71, 71);
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(118, 118, 118);
    Background.Gradient1.EndColor := RGBToColor(118, 118, 118);
    Background.Gradient2.StartColor := RGBToColor(117, 117, 117);
    Background.Gradient2.EndColor := RGBToColor(81, 81, 81);
    Border.Color := RGBToColor(24, 24, 24);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(92, 92, 92);
    Background.Gradient1.EndColor := RGBToColor(92, 92, 92);
    Background.Gradient2.StartColor := RGBToColor(91, 91, 91);
    Background.Gradient2.EndColor := RGBToColor(62, 62, 62);
    Background.Gradient1EndPercent := 55;
    Border.Color := RGBToColor(24, 24, 24);
  end;
end;

procedure BCButtonMacOSXLion(AButton: TBCButton);
begin
  AButton.Rounding.RoundX := 3;
  AButton.Rounding.RoundY := 3;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(154, 154, 154);
    Border.LightWidth := 1;
    Border.LightOpacity := 175;
    Border.Style := bboSolid;
    FontEx.Color := clBlack;
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(255, 255, 255);
    Background.Gradient1.EndColor := RGBToColor(243, 243, 243);
    Background.Gradient2.StartColor := RGBToColor(236, 236, 236);
    Background.Gradient2.EndColor := RGBToColor(235, 235, 235);
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(204, 229, 252);
    Background.Gradient1.EndColor := RGBToColor(161, 209, 249);
    Background.Gradient2.StartColor := RGBToColor(143, 202, 251);
    Background.Gradient2.EndColor := RGBToColor(207, 245, 253);
    Border.Color := RGBToColor(86, 87, 143);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(144, 195, 241);
    Background.Gradient1.EndColor := RGBToColor(113, 180, 239);
    Background.Gradient2.StartColor := RGBToColor(97, 173, 240);
    Background.Gradient2.EndColor := RGBToColor(147, 206, 241);
    Background.Gradient1EndPercent := 55;
    Border.Color := RGBToColor(86, 87, 143);
    Border.LightWidth := 0;
  end;
end;

procedure BCButtonWindows8(AButton: TBCButton; cl1, cl2: TColor; rounding: integer = 1);
begin
  AButton.Rounding.RoundX := rounding;
  AButton.Rounding.RoundY := rounding;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Style := bbsColor;
    Background.Color := cl1;
    Border.Style := bboSolid;
    Border.Width := 1;
    Border.Color := cl1;
    Border.LightWidth := 0;
    Border.LightOpacity := 255;
    Border.Style := bboSolid;
    FontEx.Color := GetContrastColor(cl1);
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateHover do
  begin
    Background.Color := cl2;
    Border.Color := cl2;
  end;

  with AButton.StateClicked do
  begin
    Background.Color := cl2;
    Border.Color := cl2;
  end;
end;

procedure BCButtonWindows7(AButton: TBCButtonFocus);
begin
  AButton.Rounding.RoundX := 3;
  AButton.Rounding.RoundY := 3;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(112, 112, 112);
    Border.LightWidth := 1;
    Border.LightOpacity := 175;
    Border.Style := bboSolid;
    FontEx.Color := clBlack;
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(242, 242, 242);
    Background.Gradient1.EndColor := RGBToColor(235, 235, 235);
    Background.Gradient2.StartColor := RGBToColor(221, 221, 221);
    Background.Gradient2.EndColor := RGBToColor(207, 207, 207);
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(234, 246, 253);
    Background.Gradient1.EndColor := RGBToColor(217, 240, 252);
    Background.Gradient2.StartColor := RGBToColor(190, 230, 253);
    Background.Gradient2.EndColor := RGBToColor(167, 217, 245);
    Border.Color := RGBToColor(60, 127, 177);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(229, 244, 252);
    Background.Gradient1.EndColor := RGBToColor(196, 229, 246);
    Background.Gradient2.StartColor := RGBToColor(152, 209, 239);
    Background.Gradient2.EndColor := RGBToColor(104, 179, 219);
    Background.Gradient1EndPercent := 55;
    Border.Color := RGBToColor(44, 98, 139);
    Border.LightOpacity := 100;
    Border.LightColor := clBlack;
  end;
end;

procedure BCButtonWindows7ToolBar(AButton: TBCButtonFocus);
begin
  AButton.Rounding.RoundX := 2;
  AButton.Rounding.RoundY := 2;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(187, 202, 219);
    Border.LightWidth := 1;
    Border.LightOpacity := 200;
    Border.Style := bboSolid;
    FontEx.Color := RGBToColor(30, 57, 91);
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(245, 250, 255);
    Background.Gradient1.EndColor := RGBToColor(230, 240, 250);
    Background.Gradient2.StartColor := RGBToColor(220, 230, 244);
    Background.Gradient2.EndColor := RGBToColor(221, 233, 247);
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(248, 251, 254);
    Background.Gradient1.EndColor := RGBToColor(237, 242, 250);
    Background.Gradient2.StartColor := RGBToColor(215, 228, 244);
    Background.Gradient2.EndColor := RGBToColor(193, 210, 232);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(226, 236, 245);
    Background.Gradient1.EndColor := RGBToColor(216, 228, 241);
    Background.Gradient2.StartColor := RGBToColor(207, 219, 236);
    Background.Gradient2.EndColor := RGBToColor(207, 220, 237);
  end;
end;

procedure BCButtonOffice2010(AButton: TBCButtonFocus);
begin
  AButton.Rounding.RoundX := 3;
  AButton.Rounding.RoundY := 3;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(207, 208, 210);
    Border.LightWidth := 1;
    Border.LightOpacity := 175;
    Border.Style := bboSolid;
    FontEx.Color := clBlack;
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(255, 255, 255);
    Background.Gradient1.EndColor := RGBToColor(237, 239, 241);
    Background.Gradient1EndPercent := 100;
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(254, 241, 189);
    Background.Gradient1.EndColor := RGBToColor(254, 228, 134);
    Background.Gradient2.StartColor := RGBToColor(254, 228, 134);
    Background.Gradient2.EndColor := RGBToColor(254, 248, 196);
    Border.Color := RGBToColor(244, 210, 81);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(255, 229, 117);
    Background.Gradient1.EndColor := RGBToColor(255, 216, 107);
    Background.Gradient2.StartColor := RGBToColor(255, 216, 107);
    Background.Gradient2.EndColor := RGBToColor(255, 239, 129);
    Border.Color := RGBToColor(194, 161, 63);
    Border.LightWidth := 0;
  end;
end;

procedure BCButtonFlashPlayer(AButton: TBCButtonFocus);
begin
  AButton.Rounding.RoundX := 1;
  AButton.Rounding.RoundY := 1;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(24, 24, 24);
    Border.LightWidth := 1;
    Border.LightOpacity := 20;
    Border.Style := bboSolid;
    FontEx.Color := clWhite;
    FontEx.Shadow := True;
    FontEx.ShadowRadius := 1;
    FontEx.ShadowOffsetX := 1;
    FontEx.ShadowOffsetY := 1;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(104, 104, 104);
    Background.Gradient1.EndColor := RGBToColor(104, 104, 104);
    Background.Gradient2.StartColor := RGBToColor(103, 103, 103);
    Background.Gradient2.EndColor := RGBToColor(71, 71, 71);
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(118, 118, 118);
    Background.Gradient1.EndColor := RGBToColor(118, 118, 118);
    Background.Gradient2.StartColor := RGBToColor(117, 117, 117);
    Background.Gradient2.EndColor := RGBToColor(81, 81, 81);
    Border.Color := RGBToColor(24, 24, 24);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(92, 92, 92);
    Background.Gradient1.EndColor := RGBToColor(92, 92, 92);
    Background.Gradient2.StartColor := RGBToColor(91, 91, 91);
    Background.Gradient2.EndColor := RGBToColor(62, 62, 62);
    Background.Gradient1EndPercent := 55;
    Border.Color := RGBToColor(24, 24, 24);
  end;
end;

procedure BCButtonMacOSXLion(AButton: TBCButtonFocus);
begin
  AButton.Rounding.RoundX := 3;
  AButton.Rounding.RoundY := 3;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Gradient1EndPercent := 50;
    Background.Gradient2.Point1XPercent := 0;
    Background.Gradient2.Point1YPercent := 0;
    Background.Gradient2.Point2YPercent := 100;
    Background.Gradient2.GradientType := gtLinear;
    Border.Color := RGBToColor(154, 154, 154);
    Border.LightWidth := 1;
    Border.LightOpacity := 175;
    Border.Style := bboSolid;
    FontEx.Color := clBlack;
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateNormal do
  begin
    Background.Gradient1.StartColor := RGBToColor(255, 255, 255);
    Background.Gradient1.EndColor := RGBToColor(243, 243, 243);
    Background.Gradient2.StartColor := RGBToColor(236, 236, 236);
    Background.Gradient2.EndColor := RGBToColor(235, 235, 235);
  end;

  with AButton.StateHover do
  begin
    Background.Gradient1.StartColor := RGBToColor(204, 229, 252);
    Background.Gradient1.EndColor := RGBToColor(161, 209, 249);
    Background.Gradient2.StartColor := RGBToColor(143, 202, 251);
    Background.Gradient2.EndColor := RGBToColor(207, 245, 253);
    Border.Color := RGBToColor(86, 87, 143);
  end;

  with AButton.StateClicked do
  begin
    Background.Gradient1.StartColor := RGBToColor(144, 195, 241);
    Background.Gradient1.EndColor := RGBToColor(113, 180, 239);
    Background.Gradient2.StartColor := RGBToColor(97, 173, 240);
    Background.Gradient2.EndColor := RGBToColor(147, 206, 241);
    Background.Gradient1EndPercent := 55;
    Border.Color := RGBToColor(86, 87, 143);
    Border.LightWidth := 0;
  end;
end;

procedure BCButtonWindows8(AButton: TBCButtonFocus; cl1, cl2: TColor;
  rounding: integer = 1);
begin
  AButton.Rounding.RoundX := rounding;
  AButton.Rounding.RoundY := rounding;
  AButton.RoundingDropDown.Assign(AButton.Rounding);

  with AButton.StateNormal do
  begin
    Background.Style := bbsColor;
    Background.Color := cl1;
    Border.Style := bboSolid;
    Border.Width := 1;
    Border.Color := cl1;
    Border.LightWidth := 0;
    Border.LightOpacity := 255;
    Border.Style := bboSolid;
    FontEx.Color := GetContrastColor(cl1);
    FontEx.Shadow := False;
    FontEx.Style := [];
  end;

  AButton.StateHover.Assign(AButton.StateNormal);
  AButton.StateClicked.Assign(AButton.StateNormal);

  with AButton.StateHover do
  begin
    Background.Color := cl2;
    Border.Color := cl2;
  end;

  with AButton.StateClicked do
  begin
    Background.Color := cl2;
    Border.Color := cl2;
  end;
end;

procedure DrawFlashPlayerBody(ABitmap: TBGRABitmap);
begin
  with ABitmap do
  begin
    GradientFill(0, 0, Width, Height, BGRA(203, 19, 23, 255), BGRA(110, 3, 20, 255),
      gtLinear, PointF(0, 0), PointF(0, Height), dmSet);
    Rectangle(0, 0, Width, Height + 1, BGRA(0, 0, 0, 215), dmDrawWithTransparency);
  end;
end;

procedure DrawFlashPlayerButtonPanel(ABitmap: TBGRABitmap);
begin
  with ABitmap do
  begin
    DrawHorizLine(0, 0, Width, BGRA(30, 30, 30, 255));
    DrawHorizLine(0, Height - 1, Width, BGRA(62, 62, 62, 255));
    Rectangle(0, 1, Width, Height - 1, BGRA(91, 91, 91, 255),
      BGRA(76, 76, 76, 255), dmSet);
  end;
end;

procedure DrawWindows7ToolBar(ABitmap: TBGRABitmap; ADir: TAlign;
  Smooth: boolean = False);
var
  tempBmp: TBGRABitmap;
begin
  if Smooth then
    tempBmp := DoubleGradientAlphaFill(Rect(0, 0, ABitmap.Width, ABitmap.Height),
      BGRA(245, 249, 255, 255), BGRA(222, 232, 245, 255), BGRA(220, 230, 245, 255),
      BGRA(222, 230, 245, 255), gdVertical, gdVertical, gdVertical, 0.50)
  else
    tempBmp := DoubleGradientAlphaFill(Rect(0, 0, ABitmap.Width, ABitmap.Height),
      BGRA(245, 250, 255, 255), BGRA(230, 240, 250, 255), BGRA(220, 230, 244, 255),
      BGRA(221, 233, 247, 255), gdVertical, gdVertical, gdVertical, 0.50);

  ABitmap.BlendImage(0, 0, tempBmp, boLinearBlend);
  tempBmp.Free;

  case ADir of
    alLeft: with ABitmap do
      begin
        if not Smooth then
          Rectangle(0, 0, Width - 2, Height, BGRA(255, 255, 255, 100),
            dmDrawWithTransparency);
        SetVertLine(Width - 1, 0, Height - 1, BGRA(160, 175, 195, 255));
        SetVertLine(Width - 2, 0, Height - 1, BGRA(205, 218, 234, 255));
      end;
    alTop: with ABitmap do
      begin
        if not Smooth then
          Rectangle(0, 0, Width, Height - 2, BGRA(255, 255, 255, 100),
            dmDrawWithTransparency);
        SetHorizLine(0, Height - 1, Width - 1, BGRA(160, 175, 195, 255));
        SetHorizLine(0, Height - 2, Width - 1, BGRA(205, 218, 234, 255));
      end;
    alRight: with ABitmap do
      begin
        if not Smooth then
          Rectangle(2, 0, Width, Height, BGRA(255, 255, 255, 100),
            dmDrawWithTransparency);
        SetVertLine(0, 0, Height, BGRA(160, 175, 195, 255));
        SetVertLine(1, 0, Height, BGRA(205, 218, 234, 255));
      end;
    alBottom: with ABitmap do
      begin
        if not Smooth then
          Rectangle(0, 2, Width, Height, BGRA(255, 255, 255, 100),
            dmDrawWithTransparency);
        SetHorizLine(0, 0, Width - 1, BGRA(160, 175, 195, 255));
        SetHorizLine(0, 1, Width - 1, BGRA(205, 218, 234, 255));
      end;
    alClient, alCustom, alNone: with ABitmap do
      begin
        if not Smooth then
          Rectangle(0, 0, Width, Height, BGRA(255, 255, 255, 100),
            dmDrawWithTransparency);
      end;
  end;
end;

function StrToTBCSampleDrawing(const s: ansistring): TBCSampleDrawing;
var
  ss: TBCSampleDrawing;
  ls: ansistring;
begin
  Result := sdDefault;
  ls := {$IFDEF FPC}UTF8LowerCase{$ELSE}LowerCase{$ENDIF}(s);
  for ss := low(TBCSampleDrawing) to high(TBCSampleDrawing) do
    if ls = {$IFDEF FPC}UTF8LowerCase{$ELSE}LowerCase{$ENDIF}(BCSampleDrawingStr[ss]) then
    begin
      Result := ss;
      break;
    end;
end;

procedure BCSampleDrawingStrList(s: TStrings);
var
  ss: TBCSampleDrawing;
begin
  for ss := low(TBCSampleDrawing) to high(TBCSampleDrawing) do
    s.Add(BCSampleDrawingStr[ss]);
end;

procedure DrawSample(ABitmap: TBGRABitmap; Element: TBCSampleDrawing;
  Align: TAlign = alNone);
begin
  case Element of
    sdFlashPlayerBody: DrawFlashPlayerBody(ABitmap);
    sdFlashPlayerButtonPanel: DrawFlashPlayerButtonPanel(ABitmap);
    sdWindows7Toolbar: DrawWindows7ToolBar(ABitmap, Align);
    sdiOSBar: DrawiOSBar(ABitmap);
    sdiOSToolBar: DrawiOSToolBar(ABitmap, False);
    sdiOSBackground: DrawiOSBackground(ABitmap);
    sdWindows8_1: DrawWindows8Background(ABitmap, clScheme1_Background,
        clScheme1_Selection);
    sdWindows8_2: DrawWindows8Background(ABitmap, clScheme2_Background,
        clScheme2_Selection);
    sdWindows8_3: DrawWindows8Background(ABitmap, clScheme3_Background,
        clScheme3_Selection);
    sdWindows8_4: DrawWindows8Background(ABitmap, clScheme4_Background,
        clScheme4_Selection);
    sdWindows8_5: DrawWindows8Background(ABitmap, clScheme5_Background,
        clScheme5_Selection);
    sdWindows8_6: DrawWindows8Background(ABitmap, clScheme6_Background,
        clScheme6_Selection);
    sdWindows8_7: DrawWindows8Background(ABitmap, clScheme7_Background,
        clScheme7_Selection);
    sdWindows8_8: DrawWindows8Background(ABitmap, clScheme8_Background,
        clScheme8_Selection);
    sdWindows8_9: DrawWindows8Background(ABitmap, clScheme9_Background,
        clScheme9_Selection);
    sdWindows8_10: DrawWindows8Background(ABitmap, clScheme10_Background,
        clScheme10_Selection);
    sdWindows8_11: DrawWindows8Background(ABitmap, clScheme11_Background,
        clScheme11_Selection);
    sdWindows8_12: DrawWindows8Background(ABitmap, clScheme12_Background,
        clScheme12_Selection);
    sdWindows8_13: DrawWindows8Background(ABitmap, clScheme13_Background,
        clScheme13_Selection);
    sdWindows8_14: DrawWindows8Background(ABitmap, clScheme14_Background,
        clScheme14_Selection);
    sdWindows8_15: DrawWindows8Background(ABitmap, clScheme15_Background,
        clScheme15_Selection);
    sdWindows8_16: DrawWindows8Background(ABitmap, clScheme16_Background,
        clScheme16_Selection);
    sdWindows8_17: DrawWindows8Background(ABitmap, clScheme17_Background,
        clScheme17_Selection);
    sdWindows8_18: DrawWindows8Background(ABitmap, clScheme18_Background,
        clScheme18_Selection);
    sdWindows8_19: DrawWindows8Background(ABitmap, clScheme19_Background,
        clScheme19_Selection);
    sdWindows8_20: DrawWindows8Background(ABitmap, clScheme20_Background,
        clScheme20_Selection);
    sdWindows8_21: DrawWindows8Background(ABitmap, clScheme21_Background,
        clScheme21_Selection);
    sdWindows8_22: DrawWindows8Background(ABitmap, clScheme22_Background,
        clScheme22_Selection);
    sdWindows8_23: DrawWindows8Background(ABitmap, clScheme23_Background,
        clScheme23_Selection);
    sdWindows8_24: DrawWindows8Background(ABitmap, clScheme24_Background,
        clScheme24_Selection);
    sdWindows8_25: DrawWindows8Background(ABitmap, clScheme25_Background,
        clScheme25_Selection);
  end;
end;

function DrawSample(AWidth, AHeight: integer; Element: TBCSampleDrawing;
  Align: TAlign = alNone): TBGRABitmap;
var
  ABitmap: TBGRABitmap;
begin
  ABitmap := TBGRABitmap.Create(AWidth, AHeight);
  DrawSample(ABitmap, Element, Align);
  Result := ABitmap;
end;

procedure DrawiOSBar(ABitmap: TBGRABitmap);
begin
  ABitmap.GradientFill(0, 0, ABitmap.Width, ABitmap.Height - 4,
    BGRA(238, 245, 248, 255), BGRA(196, 204, 208, 255), gtLinear,
    PointF(0, 0), PointF(0, ABitmap.Height - 4), dmSet);
  with ABitmap do
  begin
    // Bottom Bevel
    SetHorizLine(0, Height - 4, Width - 1, BGRA(190, 198, 202, 255));
    SetHorizLine(0, Height - 3, Width - 1, BGRA(201, 209, 213, 255));
    SetHorizLine(0, Height - 2, Width - 1, BGRA(134, 142, 147, 255));
    SetHorizLine(0, Height - 1, Width - 1, BGRA(177, 180, 182, 255));
  end;
end;

procedure DrawiOSToolBar(ABitmap: TBGRABitmap; Shadow: boolean = True);
begin
  if Shadow then
  begin
    DoubleGradientAlphaFill(ABitmap, Rect(0, 3, ABitmap.Width, ABitmap.Height - 6),
      BGRA(172, 185, 201), BGRA(134, 153, 178, 255),
      BGRA(125, 147, 175, 255), BGRA(110, 132, 162, 255),
      gdVertical, gdVertical, gdVertical, 0.5);
    with ABitmap do
    begin
      // Top Bevel
      SetHorizLine(0, 0, Width - 1, BGRA(201, 210, 221, 255));
      SetHorizLine(0, 1, Width - 1, BGRA(173, 184, 200, 255));
      SetHorizLine(0, 2, Width - 1, BGRA(179, 190, 205, 255));
      // Bottom Bevel
      SetHorizLine(0, Height - 6, Width - 1, BGRA(107, 129, 158, 255));
      SetHorizLine(0, Height - 5, Width - 1, BGRA(116, 139, 170, 255));
      SetHorizLine(0, Height - 4, Width - 1, BGRA(48, 54, 62, 255));
      // Bottom Shadow
      SetHorizLine(0, Height - 3, Width - 1, BGRA(0, 0, 0, 75));
      SetHorizLine(0, Height - 2, Width - 1, BGRA(255, 255, 255, 50));
      SetHorizLine(0, Height - 1, Width - 1, BGRA(0, 0, 0, 10));
    end;
  end
  else
  begin
    DoubleGradientAlphaFill(ABitmap, Rect(0, 3, ABitmap.Width, ABitmap.Height - 3),
      BGRA(172, 185, 201), BGRA(134, 153, 178, 255),
      BGRA(125, 147, 175, 255), BGRA(110, 132, 162, 255),
      gdVertical, gdVertical, gdVertical, 0.5);
    with ABitmap do
    begin
      // Top Bevel
      SetHorizLine(0, 0, Width - 1, BGRA(201, 210, 221, 255));
      SetHorizLine(0, 1, Width - 1, BGRA(173, 184, 200, 255));
      SetHorizLine(0, 2, Width - 1, BGRA(179, 190, 205, 255));
      // Bottom Bevel
      SetHorizLine(0, Height - 3, Width - 1, BGRA(107, 129, 158, 255));
      SetHorizLine(0, Height - 2, Width - 1, BGRA(116, 139, 170, 255));
      SetHorizLine(0, Height - 1, Width - 1, BGRA(48, 54, 62, 255));
    end;
  end;
end;

procedure DrawiOSBackground(ABitmap: TBGRABitmap);
var
  temp: TBGRABitmap;
begin
  temp := TBGRABitmap.Create(16, 1, BGRA(197, 204, 211));
  with temp do
  begin
    SetPixel(7, 0, BGRA(203, 210, 217));
    SetPixel(14, 0, BGRA(204, 211, 218));
    BGRAReplace(temp, temp.FilterBlurRadial(1, rbFast));
    BGRAReplace(temp, temp.FilterSharpen);
  end;
  ABitmap.Fill(temp);
  temp.Free;
end;

procedure DrawWindows8Background(ABitmap: TBGRABitmap; cl1, cl2: TColor);
begin
  ABitmap.Fill(cl2);
end;

end.
