Browse Source

add blend operation

Johann ELSASS 5 years ago
parent
commit
00aad86985
2 changed files with 71 additions and 32 deletions
  1. 71 25
      bgrasvgtheme.pas
  2. 0 7
      bgratheme.pas

+ 71 - 25
bgrasvgtheme.pas

@@ -15,6 +15,10 @@ type
 
   TBGRASVGTheme = class(TBGRATheme)
   private
+    FColorizeActiveOp: TBlendOperation;
+    FColorizeDisabledOp: TBlendOperation;
+    FColorizeHoverOp: TBlendOperation;
+    FColorizeNormalOp: TBlendOperation;
     FOwner: TComponent;
     FButtonActive: TStringList;
     FButtonHover: TStringList;
@@ -41,9 +45,13 @@ type
     procedure SetCheckBoxChecked(AValue: TStringList);
     procedure SetCheckBoxUnchecked(AValue: TStringList);
     procedure SetColorizeActive(AValue: string);
+    procedure SetColorizeActiveOp(AValue: TBlendOperation);
     procedure SetColorizeDisabled(AValue: string);
+    procedure SetColorizeDisabledOp(AValue: TBlendOperation);
     procedure SetColorizeHover(AValue: string);
+    procedure SetColorizeHoverOp(AValue: TBlendOperation);
     procedure SetColorizeNormal(AValue: string);
+    procedure SetColorizeNormalOp(AValue: TBlendOperation);
     procedure SetRadioButtonChecked(AValue: TStringList);
     procedure SetRadioButtonUnchecked(AValue: TStringList);
   protected
@@ -54,6 +62,7 @@ type
     procedure SliceScalingDraw(const Source: TBGRASVG;
       const marginLeft, marginTop, marginRight, marginBottom: integer;
       const Dest: TBGRABitmap; DestDPI: integer);
+    procedure ColorizeSurface(ASurface: TBGRAThemeSurface; AState: TBGRAThemeButtonState);
   public
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
@@ -111,12 +120,16 @@ type
       read FButtonSliceScalingBottom write SetButtonSliceScalingBottom;
     // CSS Color to tint the normal states, use rgba(0,0,0,0) to disable
     property ColorizeNormal: string read FColorizeNormal write SetColorizeNormal;
+    property ColorizeNormalOp: TBlendOperation read FColorizeNormalOp write SetColorizeNormalOp default boTransparent;
     // CSS Color to tint the hover states, use rgba(0,0,0,0) to disable
     property ColorizeHover: string read FColorizeHover write SetColorizeHover;
+    property ColorizeHoverOp: TBlendOperation read FColorizeHoverOp write SetColorizeHoverOp default boTransparent;
     // CSS Color to tint the active states, use rgba(0,0,0,0) to disable
     property ColorizeActive: string read FColorizeActive write SetColorizeActive;
+    property ColorizeActiveOp: TBlendOperation read FColorizeActiveOp write SetColorizeActiveOp default boTransparent;
     // CSS Color to tint the disabled states, use rgba(0,0,0,0) to disable
     property ColorizeDisabled: string read FColorizeDisabled write SetColorizeDisabled;
+    property ColorizeDisabledOp: TBlendOperation read FColorizeDisabledOp write SetColorizeDisabledOp default boTransparent;
   end;
 
   { TBGRASVGThemeComponentEditor }
@@ -293,6 +306,13 @@ begin
   Refresh;
 end;
 
+procedure TBGRASVGTheme.SetColorizeActiveOp(AValue: TBlendOperation);
+begin
+  if FColorizeActiveOp=AValue then Exit;
+  FColorizeActiveOp:=AValue;
+  Refresh;
+end;
+
 procedure TBGRASVGTheme.SetColorizeDisabled(AValue: string);
 begin
   if FColorizeDisabled = AValue then
@@ -301,6 +321,13 @@ begin
   Refresh;
 end;
 
+procedure TBGRASVGTheme.SetColorizeDisabledOp(AValue: TBlendOperation);
+begin
+  if FColorizeDisabledOp=AValue then Exit;
+  FColorizeDisabledOp:=AValue;
+  Refresh;
+end;
+
 procedure TBGRASVGTheme.SetColorizeHover(AValue: string);
 begin
   if FColorizeHover = AValue then
@@ -309,6 +336,13 @@ begin
   Refresh;
 end;
 
+procedure TBGRASVGTheme.SetColorizeHoverOp(AValue: TBlendOperation);
+begin
+  if FColorizeHoverOp=AValue then Exit;
+  FColorizeHoverOp:=AValue;
+  Refresh;
+end;
+
 procedure TBGRASVGTheme.SetColorizeNormal(AValue: string);
 begin
   if FColorizeNormal = AValue then
@@ -317,6 +351,13 @@ begin
   Refresh;
 end;
 
+procedure TBGRASVGTheme.SetColorizeNormalOp(AValue: TBlendOperation);
+begin
+  if FColorizeNormalOp=AValue then Exit;
+  FColorizeNormalOp:=AValue;
+  Refresh;
+end;
+
 procedure TBGRASVGTheme.SetRadioButtonChecked(AValue: TStringList);
 begin
   CheckEmptyResourceException(AValue.Text);
@@ -360,6 +401,10 @@ begin
   FColorizeHover := RES_COLORIZEHOVER;
   FColorizeActive := RES_COLORIZEACTIVE;
   FColorizeDisabled := RES_COLORIZEDISABLED;
+  FColorizeNormalOp := boTransparent;
+  FColorizeHoverOp := boTransparent;
+  FColorizeActiveOp := boTransparent;
+  FColorizeDisabledOp := boTransparent;
 end;
 
 procedure TBGRASVGTheme.LoadTheme(const XMLConf: TXMLConfig);
@@ -383,6 +428,10 @@ begin
   FColorizeDisabled := XMLConf{%H-}.GetValue('Colorize/Disabled', RES_COLORIZEDISABLED);
   FColorizeHover := XMLConf{%H-}.GetValue('Colorize/Hover', RES_COLORIZEHOVER);
   FColorizeNormal := XMLConf{%H-}.GetValue('Colorize/Normal', RES_COLORIZENORMAL);
+  FColorizeActiveOp := StrToBlendOperation(XMLConf{%H-}.GetValue('Colorize/ActiveOp', BlendOperationStr[boTransparent]));
+  FColorizeDisabledOp := StrToBlendOperation(XMLConf{%H-}.GetValue('Colorize/DisabledOp', BlendOperationStr[boTransparent]));
+  FColorizeHoverOp := StrToBlendOperation(XMLConf{%H-}.GetValue('Colorize/HoverOp', BlendOperationStr[boTransparent]));
+  FColorizeNormalOp := StrToBlendOperation(XMLConf{%H-}.GetValue('Colorize/NormalOp', BlendOperationStr[boTransparent]));
   // RadioButton
   FRadioButtonChecked.Text :=
     XMLConf.GetValue('RadioButton/Checked/SVG', RES_RADIOBUTTONCHECKED{%H-}){%H-};
@@ -409,7 +458,10 @@ begin
   XMLConf.SetValue('Colorize/Disabled', FColorizeDisabled{%H-});
   XMLConf.SetValue('Colorize/Hover', FColorizeHover{%H-});
   XMLConf.SetValue('Colorize/Normal', FColorizeNormal{%H-});
-  // RadioButton
+  XMLConf.SetValue('Colorize/ActiveOp', BlendOperationStr[FColorizeActiveOp{%H-}]);
+  XMLConf.SetValue('Colorize/DisabledOp', BlendOperationStr[FColorizeDisabledOp{%H-}]);
+  XMLConf.SetValue('Colorize/HoverOp', BlendOperationStr[FColorizeHoverOp{%H-}]);
+  XMLConf.SetValue('Colorize/NormalOp', BlendOperationStr[FColorizeNormalOp{%H-}]);   // RadioButton
   XMLConf.SetValue('RadioButton/Checked/SVG', FRadioButtonChecked.Text{%H-});
   XMLConf.SetValue('RadioButton/Unchecked/SVG', FRadioButtonUnchecked.Text{%H-});
 end;
@@ -493,6 +545,21 @@ begin
   Dest.NoClip;
 end;
 
+procedure TBGRASVGTheme.ColorizeSurface(ASurface: TBGRAThemeSurface;
+  AState: TBGRAThemeButtonState);
+var
+  color: String;
+  op: TBlendOperation;
+begin
+  case AState of
+    btbsNormal: begin color := FColorizeNormal; op := FColorizeNormalOp; end;
+    btbsHover: begin color := FColorizeHover; op := FColorizeHoverOp; end;
+    btbsActive: begin color := FColorizeActive; op := FColorizeActiveOp; end;
+    else {btbsDisabled} begin color := FColorizeDisabled; op := FColorizeDisabledOp; end;
+  end;
+  ASurface.BitmapColorOverlay(StrToBGRA(color), op);
+end;
+
 constructor TBGRASVGTheme.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);
@@ -524,7 +591,6 @@ procedure TBGRASVGTheme.DrawButton(Caption: string; State: TBGRAThemeButtonState
 var
   Style: TTextStyle;
   svg: TBGRASVG;
-  color: string;
   r: TRect;
 begin
   with ASurface do
@@ -539,13 +605,7 @@ begin
       FButtonSliceScalingRight, FButtonSliceScalingBottom, ASurface.Bitmap,
       Screen.PixelsPerInch);
     svg.Free;
-    case State of
-      btbsNormal: color := FColorizeNormal;
-      btbsHover: color := FColorizeHover;
-      btbsActive: color := FColorizeActive;
-      btbsDisabled: color := FColorizeDisabled;
-    end;
-    BitmapColorOverlay(color{%H-});
+    ColorizeSurface(ASurface, State);
     DrawBitmap;
 
     if Focused then
@@ -581,7 +641,6 @@ procedure TBGRASVGTheme.DrawRadioButton(Caption: string;
 var
   Style: TTextStyle;
   svg: TBGRASVG;
-  color: string;
 begin
   with ASurface do
   begin
@@ -592,13 +651,7 @@ begin
       svg := TBGRASVG.CreateFromString(FRadioButtonUnchecked.Text);
     svg.StretchDraw(Bitmap.Canvas2D, 0, 0, Bitmap.Width, Bitmap.Height);
     svg.Free;
-    case State of
-      btbsNormal: color := FColorizeNormal;
-      btbsHover: color := FColorizeHover;
-      btbsActive: color := FColorizeActive;
-      btbsDisabled: color := FColorizeDisabled;
-    end;
-    BitmapColorOverlay(color{%H-});
+    ColorizeSurface(ASurface, State);
     DrawBitmap;
 
     if Caption <> '' then
@@ -692,7 +745,6 @@ procedure TBGRASVGTheme.DrawCheckBox(Caption: string; State: TBGRAThemeButtonSta
 var
   Style: TTextStyle;
   svg: TBGRASVG;
-  color: string;
 begin
   with ASurface do
   begin
@@ -703,13 +755,7 @@ begin
       svg := TBGRASVG.CreateFromString(FCheckBoxUnchecked.Text);
     svg.StretchDraw(Bitmap.Canvas2D, 0, 0, Bitmap.Width, Bitmap.Height);
     svg.Free;
-    case State of
-      btbsNormal: color := FColorizeNormal;
-      btbsHover: color := FColorizeHover;
-      btbsActive: color := FColorizeActive;
-      btbsDisabled: color := FColorizeDisabled;
-    end;
-    BitmapColorOverlay(color{%H-});
+    ColorizeSurface(ASurface, State);
     DrawBitmap;
 
     if Caption <> '' then

+ 0 - 7
bgratheme.pas

@@ -30,7 +30,6 @@ type
     destructor Destroy; override;
     procedure DrawBitmap;
     procedure DiscardBitmap;
-    procedure BitmapColorOverlay(AColor: string; AOperation: TBlendOperation = boTransparent); overload;
     procedure BitmapColorOverlay(AColor: TBGRAPixel; AOperation: TBlendOperation = boTransparent); overload;
     function ScaleForCanvas(AValue: integer; AFromDPI: integer = 96): integer;
     property DestCanvas: TCanvas read FDestCanvas;
@@ -165,12 +164,6 @@ begin
   FreeAndNil(FBitmap);
 end;
 
-procedure TBGRAThemeSurface.BitmapColorOverlay(AColor: string;
-  AOperation: TBlendOperation);
-begin
-  BitmapColorOverlay(StrToBGRA(AColor), AOperation);
-end;
-
 procedure TBGRAThemeSurface.BitmapColorOverlay(AColor: TBGRAPixel;
   AOperation: TBlendOperation);
 begin