Przeglądaj źródła

Colorize each state of the controls.

lainz 5 lat temu
rodzic
commit
b036004edb
2 zmienionych plików z 110 dodań i 20 usunięć
  1. 84 20
      bgrasvgtheme.pas
  2. 26 0
      bgratheme.pas

+ 84 - 20
bgrasvgtheme.pas

@@ -14,14 +14,22 @@ type
 
   TBGRASVGTheme = class(TBGRATheme)
   private
-    FCheckBoxChecked: String;
-    FCheckBoxUnchecked: String;
-    FRadioButtonChecked: String;
-    FRadioButtonUnchecked: String;
-    procedure SetCheckBoxChecked(AValue: String);
-    procedure SetCheckBoxUnchecked(AValue: String);
-    procedure SetRadioButtonChecked(AValue: String);
-    procedure SetRadioButtonUnchecked(AValue: String);
+    FCheckBoxChecked: string;
+    FCheckBoxUnchecked: string;
+    FColorizeActive: TBGRAPixel;
+    FColorizeDisabled: TBGRAPixel;
+    FColorizeHover: TBGRAPixel;
+    FColorizeNormal: TBGRAPixel;
+    FRadioButtonChecked: string;
+    FRadioButtonUnchecked: string;
+    procedure SetCheckBoxChecked(AValue: string);
+    procedure SetCheckBoxUnchecked(AValue: string);
+    procedure SetColorizeActive(AValue: TBGRAPixel);
+    procedure SetColorizeDisabled(AValue: TBGRAPixel);
+    procedure SetColorizeHover(AValue: TBGRAPixel);
+    procedure SetColorizeNormal(AValue: TBGRAPixel);
+    procedure SetRadioButtonChecked(AValue: string);
+    procedure SetRadioButtonUnchecked(AValue: string);
 
   protected
 
@@ -34,15 +42,20 @@ type
     procedure DrawCheckBox(Caption: string; State: TBGRAThemeButtonState;
     {%H-}Focused: boolean; Checked: boolean; ARect: TRect;
       DestCanvas: TCanvas); override;
+  public
+    property ColorizeNormal: TBGRAPixel read FColorizeNormal write SetColorizeNormal;
+    property ColorizeHover: TBGRAPixel read FColorizeHover write SetColorizeHover;
+    property ColorizeActive: TBGRAPixel read FColorizeActive write SetColorizeActive;
+    property ColorizeDisabled: TBGRAPixel read FColorizeDisabled
+      write SetColorizeDisabled;
   published
-    property CheckBoxUnchecked: String
-      read FCheckBoxUnchecked write SetCheckBoxUnchecked;
-    property CheckBoxChecked: String read FCheckBoxChecked
-      write SetCheckBoxChecked;
-    property RadioButtonUnchecked: String
-      read FRadioButtonUnchecked write SetRadioButtonUnchecked;
-    property RadioButtonChecked: String
-      read FRadioButtonChecked write SetRadioButtonChecked;
+    property CheckBoxUnchecked: string read FCheckBoxUnchecked
+      write SetCheckBoxUnchecked;
+    property CheckBoxChecked: string read FCheckBoxChecked write SetCheckBoxChecked;
+    property RadioButtonUnchecked: string read FRadioButtonUnchecked
+      write SetRadioButtonUnchecked;
+    property RadioButtonChecked: string read FRadioButtonChecked
+      write SetRadioButtonChecked;
   end;
 
 procedure Register;
@@ -56,21 +69,49 @@ end;
 
 { TBGRASVGTheme }
 
-procedure TBGRASVGTheme.SetCheckBoxUnchecked(AValue: String);
+procedure TBGRASVGTheme.SetCheckBoxUnchecked(AValue: string);
 begin
   if FCheckBoxUnchecked = AValue then
     Exit;
   FCheckBoxUnchecked := AValue;
 end;
 
-procedure TBGRASVGTheme.SetRadioButtonChecked(AValue: String);
+procedure TBGRASVGTheme.SetColorizeActive(AValue: TBGRAPixel);
+begin
+  if FColorizeActive = AValue then
+    Exit;
+  FColorizeActive := AValue;
+end;
+
+procedure TBGRASVGTheme.SetColorizeDisabled(AValue: TBGRAPixel);
+begin
+  if FColorizeDisabled = AValue then
+    Exit;
+  FColorizeDisabled := AValue;
+end;
+
+procedure TBGRASVGTheme.SetColorizeHover(AValue: TBGRAPixel);
+begin
+  if FColorizeHover = AValue then
+    Exit;
+  FColorizeHover := AValue;
+end;
+
+procedure TBGRASVGTheme.SetColorizeNormal(AValue: TBGRAPixel);
+begin
+  if FColorizeNormal = AValue then
+    Exit;
+  FColorizeNormal := AValue;
+end;
+
+procedure TBGRASVGTheme.SetRadioButtonChecked(AValue: string);
 begin
   if FRadioButtonChecked = AValue then
     Exit;
   FRadioButtonChecked := AValue;
 end;
 
-procedure TBGRASVGTheme.SetRadioButtonUnchecked(AValue: String);
+procedure TBGRASVGTheme.SetRadioButtonUnchecked(AValue: string);
 begin
   if FRadioButtonUnchecked = AValue then
     Exit;
@@ -89,6 +130,11 @@ begin
     '<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></svg>';
   FRadioButtonChecked :=
     '<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/></svg>';
+  // Colorize
+  FColorizeNormal := BGRAPixelTransparent;
+  FColorizeHover := BGRA(255, 255, 255, 175);
+  FColorizeActive := BGRAPixelTransparent;
+  FColorizeDisabled := BGRAPixelTransparent;
 end;
 
 destructor TBGRASVGTheme.Destroy;
@@ -104,6 +150,7 @@ var
   Bitmap: TBGRABitmap;
   svg: TBGRASVG;
   aleft, atop, aright, abottom: integer;
+  color: TBGRAPixel;
 begin
   if Checked then
     svg := TBGRASVG.CreateFromString(FRadioButtonChecked)
@@ -115,6 +162,14 @@ begin
   atop := 0;
   abottom := Bitmap.Height;
   svg.StretchDraw(Bitmap.Canvas2D, aleft, atop, aright, abottom);
+  case State of
+    btbsNormal: color := FColorizeNormal;
+    btbsHover: color := FColorizeHover;
+    btbsActive: color := FColorizeActive;
+    btbsDisabled: color := FColorizeDisabled;
+  end;
+  if color{%H-} <> BGRAPixelTransparent then
+    Colorize(Bitmap, Bitmap, color);
   Bitmap.Draw(DestCanvas, Arect.Left, Arect.Top, False);
   Bitmap.Free;
   svg.Free;
@@ -132,7 +187,7 @@ begin
   end;
 end;
 
-procedure TBGRASVGTheme.SetCheckBoxChecked(AValue: String);
+procedure TBGRASVGTheme.SetCheckBoxChecked(AValue: string);
 begin
   if FCheckBoxChecked = AValue then
     Exit;
@@ -146,6 +201,7 @@ var
   Bitmap: TBGRABitmap;
   svg: TBGRASVG;
   aleft, atop, aright, abottom: integer;
+  color: TBGRAPixel;
 begin
   if Checked then
     svg := TBGRASVG.CreateFromString(FCheckBoxChecked)
@@ -157,6 +213,14 @@ begin
   atop := 0;
   abottom := Bitmap.Height;
   svg.StretchDraw(Bitmap.Canvas2D, aleft, atop, aright, abottom);
+  case State of
+    btbsNormal: color := FColorizeNormal;
+    btbsHover: color := FColorizeHover;
+    btbsActive: color := FColorizeActive;
+    btbsDisabled: color := FColorizeDisabled;
+  end;
+  if color{%H-} <> BGRAPixelTransparent then
+    Colorize(Bitmap, Bitmap, color);
   Bitmap.Draw(DestCanvas, Arect.Left, Arect.Top, False);
   Bitmap.Free;
   svg.Free;

+ 26 - 0
bgratheme.pas

@@ -28,6 +28,8 @@ type
     procedure DrawCheckBox(Caption: string; State: TBGRAThemeButtonState;
     {%H-}Focused: boolean; Checked: boolean; ARect: TRect;
       DestCanvas: TCanvas); virtual;
+  public
+    procedure Colorize(Source, Dest: TBGRABitmap; c: TBGRAPixel);
   published
 
   end;
@@ -46,6 +48,30 @@ end;
 
 { TBGRATheme }
 
+procedure TBGRATheme.Colorize(Source, Dest: TBGRABitmap; c: TBGRAPixel);
+var
+  psource: PBGRAPixel;
+  pdest: PBGRAPixel;
+  ec: TExpandedPixel;
+  n: integer;
+begin
+  psource := Source.Data;
+  pdest := Dest.Data;
+  ec := GammaExpansion(c);
+  for n := Source.NbPixels - 1 downto 0 do
+  begin
+    pdest^.red := GammaCompressionTab[
+      ((GammaExpansionTab[psource^.red] * ec.red + 65535) shr 16)];
+    pdest^.green := GammaCompressionTab[
+      ((GammaExpansionTab[psource^.green] * ec.green + 65535) shr 16)];
+    pdest^.blue := GammaCompressionTab[
+      ((GammaExpansionTab[psource^.blue] * ec.blue + 65535) shr 16)];
+    pdest^.alpha := (psource^.alpha * ec.alpha + 255) shr 16;
+    Inc(pdest);
+    Inc(psource);
+  end;
+end;
+
 procedure TBGRATheme.DrawButton(Caption: string; State: TBGRAThemeButtonState;
   Focused: boolean; ARect: TRect; DestCanvas: TCanvas);
 var