Browse Source

using gradient in tools, fix compilation

johann 5 years ago
parent
commit
91390e4952

+ 5 - 1
lazpaint/lazpaintinstance.pas

@@ -1546,11 +1546,15 @@ end;
 
 function TLazPaintInstance.GetChooseColorTarget: TColorTarget;
 begin
-  Result:= FChooseColor.colorTarget;
+  if Assigned(FChooseColor) then
+    Result:= FChooseColor.colorTarget
+  else
+    result := ctForeColorSolid;
 end;
 
 procedure TLazPaintInstance.SetChooseColorTarget(const AValue: TColorTarget);
 begin
+  if not Assigned(FChooseColor) then exit;
   FChooseColor.colorTarget:= AValue;
   ColorToFChooseColor;
 end;

+ 1 - 1
lazpaint/lazpaintmainform.pas

@@ -943,7 +943,7 @@ begin
   m.PredefinedMainMenus([MenuFile,MenuEdit,MenuSelect,MenuView, MenuImage,MenuRemoveTransparency,
     MenuColors,MenuTool, MenuFilter,MenuRadialBlur, MenuRender,MenuHelp]);
   m.Toolbars([Panel_Embedded,Panel_File,Panel_Zoom,Panel_Undo,Panel_CopyPaste,Panel_Coordinates,
-    Panel_Tool,Panel_ColorDiff,Panel_Grid,
+    Panel_Tool,Panel_PenFill,Panel_SwapColor,Panel_BackFill,Panel_ColorDiff,Panel_Grid,
     Panel_ShapeOption,Panel_PenWidth,Panel_PenStyle,Panel_JoinStyle,
     Panel_CloseShape,Panel_LineCap,Panel_Aliasing,
     Panel_SplineStyle,Panel_Eraser,Panel_Tolerance,Panel_Text,Panel_TextShadow,Panel_TextOutline,

+ 32 - 2
lazpaint/maintoolbar.inc

@@ -268,6 +268,9 @@ begin
   ToolManager.PhongControls.Add(Panel_PhongShape);
   ToolManager.AltitudeControls.Add(Panel_Altitude);
   ToolManager.PerspectiveControls.Add(Panel_PerspectiveOption);
+  ToolManager.FillControls.Add(Panel_PenFill);
+  ToolManager.FillControls.Add(Panel_SwapColor);
+  ToolManager.FillControls.Add(Panel_BackFill);
   ToolManager.FillControls.Add(Panel_ColorDiff);
   ToolManager.BrushControls.Add(Panel_Brush);
   ToolManager.RatioControls.Add(Panel_Ratio);
@@ -477,12 +480,15 @@ var
   colorChange: boolean;
   prevPenColor, prevBackColor, newPenColor, newBackColor: TBGRAPixel;
 begin
+  if FInFillChange then exit;
+  FInFillChange:= true;
   prevPenColor := VectorialFill_Pen.AverageColor;
   prevBackColor := VectorialFill_Back.AverageColor;
   VectorialFill_Pen.AssignFill(ToolManager.ForeFill);
   VectorialFill_Back.AssignFill(ToolManager.BackFill);
   newPenColor := VectorialFill_Pen.AverageColor;
   newBackColor := VectorialFill_Back.AverageColor;
+  FInFillChange:= false;
 
   colorChange := (newPenColor <> prevPenColor) or (newBackColor <> prevBackColor);
 
@@ -728,10 +734,22 @@ begin
 end;
 
 procedure TFMain.VectorialFill_BackChange(Sender: TObject);
+var
+  tempFill: TVectorialFill;
 begin
   if FInFillChange then exit;
   FInFillChange:= true;
-  ToolManager.BackFill.Assign(VectorialFill_Back);
+
+  if ToolManager.BackFill.FillType <> VectorialFill_Back.FillType then
+  begin
+    tempFill := TVectorialFill.Create;
+    VectorialFill_Back.UpdateFillExceptGeometry(tempFill);
+    tempFill.FitGeometry(ToolManager.SuggestGradientBox);
+    ToolManager.BackFill.Assign(tempFill);
+    tempFill.Free;
+  end else
+    VectorialFill_Back.UpdateFillExceptGeometry(ToolManager.BackFill);
+
   if (VectorialFill_Back.FillType = vftSolid) and
      (LazPaintInstance.ChooseColorTarget in [ctBackColorStartGrad,ctBackColorEndGrad]) then
     LazPaintInstance.ChooseColorTarget := ctBackColorSolid else
@@ -747,10 +765,22 @@ begin
 end;
 
 procedure TFMain.VectorialFill_PenChange(Sender: TObject);
+var
+  tempFill: TVectorialFill;
 begin
   if FInFillChange then exit;
   FInFillChange:= true;
-  ToolManager.ForeFill.Assign(VectorialFill_Pen);
+
+  if ToolManager.ForeFill.FillType <> VectorialFill_Pen.FillType then
+  begin
+    tempFill := TVectorialFill.Create;
+    VectorialFill_Pen.UpdateFillExceptGeometry(tempFill);
+    tempFill.FitGeometry(ToolManager.SuggestGradientBox);
+    ToolManager.ForeFill.Assign(tempFill);
+    tempFill.Free;
+  end else
+    VectorialFill_Pen.UpdateFillExceptGeometry(ToolManager.ForeFill);
+
   if (VectorialFill_Pen.FillType = vftSolid) and
      (LazPaintInstance.ChooseColorTarget in [ctForeColorStartGrad,ctForeColorEndGrad]) then
     LazPaintInstance.ChooseColorTarget := ctForeColorSolid else

+ 2 - 0
lazpaint/tools/utool.pas

@@ -2429,6 +2429,8 @@ begin
 
   FForeFill.Free;
   FBackFill.Free;
+  FForeLastGradient.Free;
+  FBackLastGradient.Free;
 
   RegisterScriptFunctions(False);
   inherited Destroy;

+ 6 - 4
lazpaint/tools/utoolbrush.pas

@@ -23,7 +23,7 @@ type
     procedure PrepareBrush(rightBtn: boolean); virtual; abstract;
     procedure ReleaseBrush; virtual; abstract;
     function StartDrawing(toolDest: TBGRABitmap; ptF: TPointF; rightBtn: boolean): TRect; override;
-    function ContinueDrawing(toolDest: TBGRABitmap; {%H-}originF, destF: TPointF): TRect; override;
+    function ContinueDrawing(toolDest: TBGRABitmap; {%H-}originF, destF: TPointF; rightBtn: boolean): TRect; override;
     function GetBrushAlpha(AAlpha: byte): byte;
   public
     constructor Create(AManager: TToolManager); override;
@@ -198,8 +198,11 @@ begin
 end;
 
 procedure TToolBrush.PrepareBrush(rightBtn: boolean);
+var
+  penColor: TBGRAPixel;
 begin
   FreeAndNil(coloredBrushImage);
+  if rightBtn then penColor := Manager.BackColor else penColor := Manager.ForeColor;
   coloredBrushImage := BrushInfo.MakeColoredBrushImage(BGRA(penColor.red,penColor.green,penColor.blue,GetBrushAlpha(penColor.alpha)));
 end;
 
@@ -239,14 +242,13 @@ begin
   if not SubPixelAccuracy then
     brushOrigin:= PointF(round(ptF.x),round(ptF.y))
   else brushOrigin := ptF;
-  if rightBtn then penColor := Manager.BackColor else penColor := Manager.ForeColor;
   originDrawn := false;
   PrepareBrush(rightBtn);
-  result := ContinueDrawing(toolDest,brushOrigin,brushOrigin);
+  result := ContinueDrawing(toolDest, brushOrigin, brushOrigin, rightBtn);
 end;
 
 function TToolGenericBrush.ContinueDrawing(toolDest: TBGRABitmap; originF,
-  destF: TPointF): TRect;
+  destF: TPointF; rightBtn: boolean): TRect;
 var v: TPointF;
   count: integer;
   len, minLen: single;

+ 10 - 30
lazpaint/tools/utoolfloodfill.pas

@@ -14,7 +14,6 @@ type
 
   TToolFloodFill = class(TGenericTool)
   protected
-    penColor: TBGRAPixel;
     function GetIsSelectingTool: boolean; override;
   public
     function DoToolDown(toolDest: TBGRABitmap; pt: TPoint; {%H-}ptF: TPointF;
@@ -40,7 +39,7 @@ type
 implementation
 
 uses ugraph, LazPaintType, BGRAGradientScanner, LCVectorRectShapes,
-  BGRATransform, UImageDiff;
+  BGRATransform, UImageDiff, LCVectorialFill;
 
 { TToolGradient }
 
@@ -60,17 +59,8 @@ end;
 
 procedure TToolGradient.AssignShapeStyle(AMatrix: TAffineMatrix);
 begin
-  with FShape.BackFill.Gradient do
-  begin
-    StartColor := Manager.ForeColor;
-    EndColor := Manager.BackColor;
-    GradientType := Manager.GradientType;
-    ColorInterpolation := Manager.GradientColorspace;
-    if Manager.GradientSine then
-      Repetition := grSine
-    else
-      Repetition := grPad;
-  end;
+  if Manager.BackFill.FillType = vftGradient then
+    FShape.BackFill.AssignExceptGeometry(Manager.BackFill);
 end;
 
 procedure TToolGradient.QuickDefineShape(AStart, AEnd: TPointF);
@@ -109,7 +99,7 @@ end;
 
 function TToolGradient.GetContextualToolbars: TContextualToolbars;
 begin
-  Result:= [ctFill, ctGradient];
+  Result:= [ctFill];
 end;
 
 function TToolGradient.SlowShape: boolean;
@@ -127,22 +117,12 @@ end;
 function TToolFloodFill.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
   ptF: TPointF; rightBtn: boolean): TRect;
 var
-   floodFillMask,floodFillTex: TBGRABitmap;
+  b: TUniversalBrush;
 begin
-  if rightBtn then penColor := Manager.BackColor else penColor := Manager.ForeColor;
-  if Manager.GetTextureAfterAlpha <> nil then
-  begin
-    floodFillMask := TBGRABitmap.Create(toolDest.Width,toolDest.Height,BGRABlack);
-    floodFillTex := Manager.GetTextureAfterAlpha.GetPart(rect(0,0,toolDest.Width,toolDest.Height)) as TBGRABitmap;
-    toolDest.ParallelFloodFill(pt.X, pt.Y, floodFillMask, BGRAWhite, fmSet, Manager.Tolerance);
-    floodFillTex.ApplyMask(floodFillMask);
-    toolDest.PutImage(0,0,floodFillTex,dmDrawWithTransparency);
-    floodFillMask.Free;
-    floodFillTex.Free;
-  end else
-    if ffProgressive in Manager.FloodFillOptions then
-      toolDest.FloodFill(pt.X, pt.Y, penColor, fmProgressive, Manager.Tolerance) else
-        toolDest.FloodFill(pt.X, pt.Y, penColor, fmDrawWithTransparency, Manager.Tolerance);
+  if rightBtn then b := GetBackUniversalBrush
+  else b := GetForeUniversalBrush;
+  toolDest.FloodFill(pt.X, pt.Y, b, ffProgressive in Manager.FloodFillOptions, Manager.Tolerance*$101);
+  ReleaseUniversalBrushes;
   Action.NotifyChange(toolDest, rect(0,0,toolDest.Width,toolDest.Height));
   ValidateAction;
   result := OnlyRenderChange;
@@ -150,7 +130,7 @@ end;
 
 function TToolFloodFill.GetContextualToolbars: TContextualToolbars;
 begin
-  Result:= [ctFill,ctTexture,ctTolerance];
+  Result:= [ctFill,ctTolerance];
 end;
 
 initialization

+ 1 - 1
lazpaint/tools/utoolphong.pas

@@ -37,7 +37,7 @@ end;
 
 function TToolPhong.GetContextualToolbars: TContextualToolbars;
 begin
-  Result:= [ctFill,ctTexture,ctPhong,ctAltitude];
+  Result:= [ctFill,ctPhong,ctAltitude];
 end;
 
 procedure TToolPhong.ShapeChange(ASender: TObject; ABounds: TRectF; ADiff: TVectorShapeDiff);

+ 7 - 2
lazpaint/tools/utoolselect.pas

@@ -81,7 +81,7 @@ type
   protected
     function GetIsSelectingTool: boolean; override;
     function StartDrawing(toolDest: TBGRABitmap; ptF: TPointF; rightBtn: boolean): TRect; override;
-    function ContinueDrawing(toolDest: TBGRABitmap; originF, destF: TPointF): TRect; override;
+    function ContinueDrawing(toolDest: TBGRABitmap; originF, destF: TPointF; rightBtn: boolean): TRect; override;
   public
     function GetContextualToolbars: TContextualToolbars; override;
   end;
@@ -588,6 +588,8 @@ end;
 
 function TToolSelectionPen.StartDrawing(toolDest: TBGRABitmap; ptF: TPointF;
   rightBtn: boolean): TRect;
+var
+  penColor: TBGRAPixel;
 begin
   if rightBtn then penColor := BGRABlack else penColor := BGRAWhite;
   toolDest.DrawLineAntialias(ptF.X,ptF.Y,ptF.X,ptF.Y,penColor,Manager.PenWidth,True);
@@ -595,8 +597,11 @@ begin
 end;
 
 function TToolSelectionPen.ContinueDrawing(toolDest: TBGRABitmap; originF,
-  destF: TPointF): TRect;
+  destF: TPointF; rightBtn: boolean): TRect;
+var
+  penColor: TBGRAPixel;
 begin
+  if rightBtn then penColor := BGRABlack else penColor := BGRAWhite;
   toolDest.DrawLineAntialias(destF.X,destF.Y,originF.X,originF.Y,penColor,Manager.PenWidth,False);
   result := GetShapeBounds([destF,originF],Manager.PenWidth+1);
 end;

+ 6 - 11
lazpaint/tools/utooltext.pas

@@ -156,23 +156,18 @@ begin
     FontName:= Manager.TextFontName;
     FontStyle:= Manager.TextFontStyle;
 
-    if Manager.GetTexture <> nil then
-      FShape.PenFill.SetTexture(Manager.GetTexture,AffineMatrixIdentity,Manager.TextureOpacity)
+    if FSwapColor then
+      FShape.PenFill.AssignExceptGeometry(Manager.BackFill)
     else
-    begin
-      if FSwapColor then
-        FShape.PenFill.SetSolid(Manager.BackColor)
-      else
-        FShape.PenFill.SetSolid(Manager.ForeColor);
-    end;
+      FShape.PenFill.AssignExceptGeometry(Manager.ForeFill);
 
     if Manager.TextOutline and (Manager.TextOutlineWidth>0) and
        (Manager.BackColor.alpha > 0) then
     begin
       if FSwapColor then
-        FShape.OutlineFill.SetSolid(Manager.ForeColor)
+        FShape.OutlineFill.AssignExceptGeometry(Manager.ForeFill)
       else
-        FShape.OutlineFill.SetSolid(Manager.BackColor);
+        FShape.OutlineFill.AssignExceptGeometry(Manager.BackFill);
       OutlineWidth := Manager.TextOutlineWidth;
     end
     else
@@ -216,7 +211,7 @@ end;
 
 function TToolText.GetContextualToolbars: TContextualToolbars;
 begin
-  Result:= [ctFill,ctTexture,ctText,ctTextShadow];
+  Result:= [ctFill,ctText,ctTextShadow];
   if Manager.TextPhong then include(result, ctAltitude);
 end;