Pārlūkot izejas kodu

Added bgracontrolsfx to get hardware drawing of bgracontrols

lainz 9 gadi atpakaļ
vecāks
revīzija
a79a612fbd
3 mainītis faili ar 238 papildinājumiem un 25 dzēšanām
  1. 15 2
      bcbasectrls.pas
  2. 217 20
      bcbutton.pas
  3. 6 3
      bgracontrols.lpk

+ 15 - 2
bcbasectrls.pas

@@ -35,7 +35,7 @@ unit BCBaseCtrls;
 interface
 
 uses
-  Classes, SysUtils, Controls, BGRABitmap, BGRABitmapTypes;
+  Classes, SysUtils, Controls, Graphics, BGRABitmap, BGRABitmapTypes, FXContainer;
 
 type
 
@@ -79,7 +79,7 @@ type
     debug functions
   }
 
-  TBCGraphicControl = class(TGraphicControl)
+  TBCGraphicControl = class(TGraphicControl, IFXDrawable)
   private
     {$IFDEF DEBUG}
     FPaintCount: Integer;
@@ -98,6 +98,9 @@ type
     // This method is called when control should be rendered (when some
     // general action occur which change "body" e.g. resize)
     procedure RenderControl; virtual;
+    // BGRA Controls FX
+    procedure FXDraw; virtual;
+    procedure FXPreview(aCanvas: TCanvas); virtual;
   public
     constructor Create(AOwner: TComponent); override;
     // This disable DrawControl method
@@ -361,6 +364,16 @@ begin
 
 end;
 
+procedure TBCGraphicControl.FXDraw;
+begin
+
+end;
+
+procedure TBCGraphicControl.FXPreview(aCanvas: TCanvas);
+begin
+
+end;
+
 constructor TBCGraphicControl.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);

+ 217 - 20
bcbutton.pas

@@ -49,7 +49,7 @@ uses
   Classes, LResources, Controls, Dialogs, BGRABitmap, BGRABitmapTypes,
   ActnList, ImgList, Menus, // MORA
   Buttons, Graphics, LCLType, types, BCTypes, Forms, BCBasectrls,
-  BCThemeManager;
+  BCThemeManager, FXContainer, BGRAOpenGL;
 
 {off $DEFINE DEBUG}
 
@@ -177,7 +177,7 @@ type
     { Protected declarations }
     procedure LimitMemoryUsage;
     procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
-      {%H-}WithThemeSpace: boolean); override;
+    {%H-}WithThemeSpace: boolean); override;
     class function GetControlClassDefaultSize: TSize; override;
     procedure Click; override;
     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
@@ -215,6 +215,8 @@ type
     function GetStyleExtension: string; override;
     procedure DrawControl; override;
     procedure RenderControl; override;
+    procedure FXDraw; override;
+    procedure FXPreview(aCanvas: TCanvas); override;
   protected
     property AutoSizeExtraVertical: integer read AutoSizeExtraY;
     property AutoSizeExtraHorizontal: integer read AutoSizeExtraX;
@@ -383,8 +385,9 @@ type
 
 procedure TBCButton.SetFBCThemeManager(AValue: TBCThemeManager);
 begin
-  if FBCThemeManager=AValue then Exit;
-  FBCThemeManager:=AValue;
+  if FBCThemeManager = AValue then
+    Exit;
+  FBCThemeManager := AValue;
 end;
 
 function TBCButtonImageIndexPropertyEditor.GetImageList: TCustomImageList;
@@ -857,11 +860,14 @@ end;
 
 procedure TCustomBCButton.LimitMemoryUsage;
 begin
-  if (FMemoryUsage = bmuLow) and Assigned(FBGRANormal) then FBGRANormal.Discard;
+  if (FMemoryUsage = bmuLow) and Assigned(FBGRANormal) then
+    FBGRANormal.Discard;
   if (FMemoryUsage <> bmuHigh) then
   begin
-    if Assigned(FBGRAHover) then FBGRAHover.Discard;
-    if Assigned(FBGRAClick) then FBGRAClick.Discard;
+    if Assigned(FBGRAHover) then
+      FBGRAHover.Discard;
+    if Assigned(FBGRAClick) then
+      FBGRAClick.Discard;
   end;
 end;
 
@@ -1013,16 +1019,18 @@ end;
 
 procedure TCustomBCButton.SetInnerMargin(AValue: single);
 begin
-  if FInnerMargin=AValue then Exit;
-  FInnerMargin:=AValue;
+  if FInnerMargin = AValue then
+    Exit;
+  FInnerMargin := AValue;
   RenderControl;
   Invalidate;
 end;
 
 procedure TCustomBCButton.SetMemoryUsage(AValue: TBCButtonMemoryUsage);
 begin
-  if FMemoryUsage=AValue then Exit;
-  FMemoryUsage:=AValue;
+  if FMemoryUsage = AValue then
+    Exit;
+  FMemoryUsage := AValue;
   LimitMemoryUsage;
 end;
 
@@ -1087,7 +1095,7 @@ end;
 procedure TCustomBCButton.CalculatePreferredSize(
   var PreferredWidth, PreferredHeight: integer; WithThemeSpace: boolean);
 var
-//  AWidth: integer;
+  //  AWidth: integer;
   gh: integer = 0;
   gw: integer = 0;
 begin
@@ -1504,11 +1512,115 @@ end;
 
 {$ENDIF}
 
+// Is like Paint event
 procedure TCustomBCButton.DrawControl;
 var
   bgra: TBGRABitmapEx;
 begin
+  if csLoading in ComponentState then
+    exit;
 
+  if Parent is TFXContainer then
+    Parent.Invalidate
+  else
+  begin
+
+    // If style is without dropdown button or state of each button
+    // is the same (possible only for msNone) or static button then
+    // we can draw whole BGRABitmap
+    if (FStyle = bbtButton) or (FButtonState = FDownButtonState) or FStaticButton then
+    begin
+      // Main button
+      if FStaticButton then
+        bgra := FBGRANormal
+      else
+      if FDown then
+        bgra := FBGRAClick
+      else
+        case FButtonState of
+          msNone: bgra := FBGRANormal;
+          msHover: bgra := FBGRAHover;
+          msClicked: bgra := FBGRAClick;
+        end;
+      if {%H-}bgra.NeedRender then
+        Render(bgra, TBCButtonState(bgra.CustomData));
+      bgra.Draw(Self.Canvas, 0, 0, False);
+    end
+    // Otherwise we must draw part of state for each button
+    else
+    begin
+      // The active button must be draw as last because right edge of button and
+      // left edge of dropdown are overlapping each other, so we must draw edge
+      // for current state of active button
+      case FActiveButt of
+        bbtButton:
+        begin
+          // Drop down button
+          case FDownButtonState of
+            msNone: bgra := FBGRANormal;
+            msHover: bgra := FBGRAHover;
+            msClicked: bgra := FBGRAClick;
+          end;
+          if bgra.NeedRender then
+            Render(bgra, TBCButtonState(bgra.CustomData));
+          bgra.DrawPart(GetDropDownRect, Self.Canvas, GetDropDownRect.Left,
+            GetDropDownRect.Top, False);
+          // Main button
+          if FDown then
+            bgra := FBGRAClick
+          else
+            case FButtonState of
+              msNone: bgra := FBGRANormal;
+              msHover: bgra := FBGRAHover;
+              msClicked: bgra := FBGRAClick;
+            end;
+          if bgra.NeedRender then
+            Render(bgra, TBCButtonState(bgra.CustomData));
+          bgra.DrawPart(GetButtonRect, Self.Canvas, 0, 0, False);
+        end;
+        bbtDropDown:
+        begin
+          // Main button
+          if FDown then
+            bgra := FBGRAClick
+          else
+            case FButtonState of
+              msNone: bgra := FBGRANormal;
+              msHover: bgra := FBGRAHover;
+              msClicked: bgra := FBGRAClick;
+            end;
+          if bgra.NeedRender then
+            Render(bgra, TBCButtonState(bgra.CustomData));
+          bgra.DrawPart(GetButtonRect, Self.Canvas, 0, 0, False);
+          // Drop down button
+          case FDownButtonState of
+            msNone: bgra := FBGRANormal;
+            msHover: bgra := FBGRAHover;
+            msClicked: bgra := FBGRAClick;
+          end;
+          if bgra.NeedRender then
+            Render(bgra, TBCButtonState(bgra.CustomData));
+          bgra.DrawPart(GetDropDownRect, Self.Canvas, GetDropDownRect.Left,
+            GetDropDownRect.Top, False);
+        end;
+      end;
+    end;
+
+    LimitMemoryUsage;
+  end;
+end;
+
+procedure TCustomBCButton.RenderControl;
+begin
+  inherited RenderControl;
+end;
+
+procedure TCustomBCButton.FXDraw;
+var
+  bgra: TBGRABitmapEx;
+  temp: TBGRABitmap;
+begin
+  temp := TBGRABitmap.Create(Width, Height);
   // If style is without dropdown button or state of each button
   // is the same (possible only for msNone) or static button then
   // we can draw whole BGRABitmap
@@ -1528,7 +1640,7 @@ begin
       end;
     if {%H-}bgra.NeedRender then
       Render(bgra, TBCButtonState(bgra.CustomData));
-    bgra.Draw(Self.Canvas, 0, 0, False);
+    bgra.Draw(temp.Canvas, 0, 0, False);
   end
   // Otherwise we must draw part of state for each button
   else
@@ -1547,7 +1659,7 @@ begin
         end;
         if bgra.NeedRender then
           Render(bgra, TBCButtonState(bgra.CustomData));
-        bgra.DrawPart(GetDropDownRect, Self.Canvas, GetDropDownRect.Left,
+        bgra.DrawPart(GetDropDownRect, temp.Canvas, GetDropDownRect.Left,
           GetDropDownRect.Top, False);
         // Main button
         if FDown then
@@ -1560,7 +1672,7 @@ begin
           end;
         if bgra.NeedRender then
           Render(bgra, TBCButtonState(bgra.CustomData));
-        bgra.DrawPart(GetButtonRect, Self.Canvas, 0, 0, False);
+        bgra.DrawPart(GetButtonRect, temp.Canvas, 0, 0, False);
       end;
       bbtDropDown:
       begin
@@ -1575,7 +1687,7 @@ begin
           end;
         if bgra.NeedRender then
           Render(bgra, TBCButtonState(bgra.CustomData));
-        bgra.DrawPart(GetButtonRect, Self.Canvas, 0, 0, False);
+        bgra.DrawPart(GetButtonRect, temp.Canvas, 0, 0, False);
         // Drop down button
         case FDownButtonState of
           msNone: bgra := FBGRANormal;
@@ -1584,19 +1696,104 @@ begin
         end;
         if bgra.NeedRender then
           Render(bgra, TBCButtonState(bgra.CustomData));
-        bgra.DrawPart(GetDropDownRect, Self.Canvas, GetDropDownRect.Left,
+        bgra.DrawPart(GetDropDownRect, temp.Canvas, GetDropDownRect.Left,
           GetDropDownRect.Top, False);
       end;
     end;
   end;
 
+  BGLCanvas.PutImage(Left, Top, BGLTexture(temp));
+  temp.Free;
+
   LimitMemoryUsage;
 end;
 
-procedure TCustomBCButton.RenderControl;
+procedure TCustomBCButton.FXPreview(aCanvas: TCanvas);
+var
+  bgra: TBGRABitmapEx;
 begin
-  inherited RenderControl;
-  RenderAll;
+  // If style is without dropdown button or state of each button
+  // is the same (possible only for msNone) or static button then
+  // we can draw whole BGRABitmap
+  if (FStyle = bbtButton) or (FButtonState = FDownButtonState) or FStaticButton then
+  begin
+    // Main button
+    if FStaticButton then
+      bgra := FBGRANormal
+    else
+    if FDown then
+      bgra := FBGRAClick
+    else
+      case FButtonState of
+        msNone: bgra := FBGRANormal;
+        msHover: bgra := FBGRAHover;
+        msClicked: bgra := FBGRAClick;
+      end;
+    if {%H-}bgra.NeedRender then
+      Render(bgra, TBCButtonState(bgra.CustomData));
+    bgra.Draw(aCanvas, Left, Top, False);
+  end
+  // Otherwise we must draw part of state for each button
+  else
+  begin
+    // The active button must be draw as last because right edge of button and
+    // left edge of dropdown are overlapping each other, so we must draw edge
+    // for current state of active button
+    case FActiveButt of
+      bbtButton:
+      begin
+        // Drop down button
+        case FDownButtonState of
+          msNone: bgra := FBGRANormal;
+          msHover: bgra := FBGRAHover;
+          msClicked: bgra := FBGRAClick;
+        end;
+        if bgra.NeedRender then
+          Render(bgra, TBCButtonState(bgra.CustomData));
+        bgra.DrawPart(GetDropDownRect, aCanvas, Left + GetDropDownRect.Left,
+          Top + GetDropDownRect.Top, False);
+        // Main button
+        if FDown then
+          bgra := FBGRAClick
+        else
+          case FButtonState of
+            msNone: bgra := FBGRANormal;
+            msHover: bgra := FBGRAHover;
+            msClicked: bgra := FBGRAClick;
+          end;
+        if bgra.NeedRender then
+          Render(bgra, TBCButtonState(bgra.CustomData));
+        bgra.DrawPart(GetButtonRect, aCanvas, Left, Top, False);
+      end;
+      bbtDropDown:
+      begin
+        // Main button
+        if FDown then
+          bgra := FBGRAClick
+        else
+          case FButtonState of
+            msNone: bgra := FBGRANormal;
+            msHover: bgra := FBGRAHover;
+            msClicked: bgra := FBGRAClick;
+          end;
+        if bgra.NeedRender then
+          Render(bgra, TBCButtonState(bgra.CustomData));
+        bgra.DrawPart(GetButtonRect, aCanvas, Left, Top, False);
+        // Drop down button
+        case FDownButtonState of
+          msNone: bgra := FBGRANormal;
+          msHover: bgra := FBGRAHover;
+          msClicked: bgra := FBGRAClick;
+        end;
+        if bgra.NeedRender then
+          Render(bgra, TBCButtonState(bgra.CustomData));
+        bgra.DrawPart(GetDropDownRect, aCanvas, Left + GetDropDownRect.Left,
+          Top + GetDropDownRect.Top, False);
+      end;
+    end;
+  end;
+
+  LimitMemoryUsage;
 end;
 
 procedure TCustomBCButton.SetGlobalOpacity(const AValue: byte);

+ 6 - 3
bgracontrols.lpk

@@ -223,13 +223,16 @@
         <UnitName Value="BCBrightAndContrast"/>
       </Item41>
     </Files>
-    <RequiredPkgs Count="2">
+    <RequiredPkgs Count="3">
       <Item1>
-        <PackageName Value="BGRABitmapPack"/>
+        <PackageName Value="BGRAControlsFX"/>
       </Item1>
       <Item2>
-        <PackageName Value="IDEIntf"/>
+        <PackageName Value="BGRABitmapPack"/>
       </Item2>
+      <Item3>
+        <PackageName Value="IDEIntf"/>
+      </Item3>
     </RequiredPkgs>
     <UsageOptions>
       <UnitPath Value="$(PkgOutDir)"/>