소스 검색

started changes

johann 5 년 전
부모
커밋
9e5cb1c7c0

+ 22 - 3
lazpaint/dialog/filter/uphongfilter.pas

@@ -53,6 +53,7 @@ type
     FCenter: TPointF;
     FCenter: TPointF;
     FHeightMap: TBGRABitmap;
     FHeightMap: TBGRABitmap;
     FWorkspaceColor: TColor;
     FWorkspaceColor: TColor;
+    FTexture: TBGRACustomBitmap;
     function GetCurrentLightPos: TPointF;
     function GetCurrentLightPos: TPointF;
     procedure InitParams;
     procedure InitParams;
     procedure PreviewNeeded;
     procedure PreviewNeeded;
@@ -120,6 +121,7 @@ end;
 procedure TFPhongFilter.FormDestroy(Sender: TObject);
 procedure TFPhongFilter.FormDestroy(Sender: TObject);
 begin
 begin
   FreeAndNil(FHeightMap);
   FreeAndNil(FHeightMap);
+  if Assigned(FTexture) then FTexture.Free;
 end;
 end;
 
 
 
 
@@ -213,10 +215,27 @@ begin
 end;
 end;
 
 
 procedure TFPhongFilter.InitParams;
 procedure TFPhongFilter.InitParams;
+var
+  texOpacity: Byte;
 begin
 begin
   FInitializing:= true;
   FInitializing:= true;
-  Radio_UseTexture.Enabled := (FilterConnector.LazPaintInstance.ToolManager.GetTexture <> nil);
-  if Radio_UseTexture.Enabled then Radio_UseTexture.Checked := true
+  Radio_UseTexture.Enabled := (FilterConnector.LazPaintInstance.ToolManager.BackFill.Texture <> nil);
+  if FTexture <> nil then
+  begin
+    FTexture.FreeReference;
+    FTexture := nil;
+  end;
+  if Radio_UseTexture.Enabled then
+  begin
+    Radio_UseTexture.Checked := true;
+    texOpacity := FilterConnector.LazPaintInstance.ToolManager.BackFill.TextureOpacity;
+    if texOpacity <> 255 then
+    begin
+      FTexture := FilterConnector.LazPaintInstance.ToolManager.BackFill.Texture.Duplicate;
+      FTexture.ApplyGlobalOpacity(texOpacity);
+    end else
+      FTexture := FilterConnector.LazPaintInstance.ToolManager.BackFill.Texture.NewReference;
+  end
   else Radio_UsePenColor.Checked := true;
   else Radio_UsePenColor.Checked := true;
   SpinEdit_Altitude.Value := FilterConnector.LazPaintInstance.Config.DefaultPhongFilterAltitude;
   SpinEdit_Altitude.Value := FilterConnector.LazPaintInstance.Config.DefaultPhongFilterAltitude;
   with FilterConnector.LazPaintInstance.ToolManager.LightPosition do
   with FilterConnector.LazPaintInstance.ToolManager.LightPosition do
@@ -377,7 +396,7 @@ begin
   if FHeightMap <> nil then
   if FHeightMap <> nil then
   begin
   begin
     if Radio_UseTexture.Checked then
     if Radio_UseTexture.Checked then
-      shader.DrawScan(result, FHeightMap, SpinEdit_Altitude.Value,0,0,FilterConnector.LazPaintInstance.ToolManager.GetTextureAfterAlpha)
+      shader.DrawScan(result, FHeightMap, SpinEdit_Altitude.Value, 0, 0, FTexture)
     else if Radio_UsePenColor.Checked then
     else if Radio_UsePenColor.Checked then
       shader.Draw(result, FHeightMap, SpinEdit_Altitude.Value,0,0,FilterConnector.LazPaintInstance.ToolManager.ForeColor)
       shader.Draw(result, FHeightMap, SpinEdit_Altitude.Value,0,0,FilterConnector.LazPaintInstance.ToolManager.ForeColor)
     else if Radio_UseKeep.Checked then
     else if Radio_UseKeep.Checked then

+ 11 - 18
lazpaint/lazpaintinstance.pas

@@ -46,7 +46,7 @@ type
     function ScriptImageRepeat(AVars: TVariableSet): TScriptResult;
     function ScriptImageRepeat(AVars: TVariableSet): TScriptResult;
     function ScriptImageResample(AParams: TVariableSet): TScriptResult;
     function ScriptImageResample(AParams: TVariableSet): TScriptResult;
     procedure SelectionInstanceOnRun(AInstance: TLazPaintCustomInstance);
     procedure SelectionInstanceOnRun(AInstance: TLazPaintCustomInstance);
-    procedure ToolColorChanged(Sender: TObject);
+    procedure ToolFillChanged(Sender: TObject);
     procedure PythonScriptCommand({%H-}ASender: TObject; ACommand, AParam: UTF8String; out
     procedure PythonScriptCommand({%H-}ASender: TObject; ACommand, AParam: UTF8String; out
       AResult: UTF8String);
       AResult: UTF8String);
     procedure PythonBusy({%H-}Sender: TObject);
     procedure PythonBusy({%H-}Sender: TObject);
@@ -152,7 +152,7 @@ type
     procedure AssignBitmap(bmp: TBGRABitmap); override;
     procedure AssignBitmap(bmp: TBGRABitmap); override;
     procedure EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream = nil; ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil; AOnExit: TLazPaintInstanceEvent = nil; ABlackAndWhite: boolean = false); override;
     procedure EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream = nil; ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil; AOnExit: TLazPaintInstanceEvent = nil; ABlackAndWhite: boolean = false); override;
     procedure EditSelection; override;
     procedure EditSelection; override;
-    procedure EditTexture; override;
+    function EditTexture(ASource: TBGRABitmap): TBGRABitmap; override;
     function ProcessCommandLine: boolean; override;
     function ProcessCommandLine: boolean; override;
     function ProcessCommands(commands: TStringList): boolean; override;
     function ProcessCommands(commands: TStringList): boolean; override;
     procedure ChangeIconSize(size: integer); override;
     procedure ChangeIconSize(size: integer); override;
@@ -323,7 +323,7 @@ begin
   FToolManager := TToolManager.Create(FImage, self, nil, BlackAndWhite, FScriptContext);
   FToolManager := TToolManager.Create(FImage, self, nil, BlackAndWhite, FScriptContext);
   UseConfig(TIniFile.Create(''));
   UseConfig(TIniFile.Create(''));
   FToolManager.OnPopup := @OnToolPopup;
   FToolManager.OnPopup := @OnToolPopup;
-  FToolManager.OnColorChanged:=@ToolColorChanged;
+  FToolManager.OnFillChanged:= @ToolFillChanged;
   FSelectionEditConfig := nil;
   FSelectionEditConfig := nil;
   FTextureEditConfig := nil;
   FTextureEditConfig := nil;
 
 
@@ -916,19 +916,18 @@ begin
   imageActions.Free;
   imageActions.Free;
 end;
 end;
 
 
-procedure TLazPaintInstance.EditTexture;
-var tex: TBGRABitmap;
+function TLazPaintInstance.EditTexture(ASource: TBGRABitmap): TBGRABitmap;
 begin
 begin
   try
   try
     if FTextureEditConfig = nil then
     if FTextureEditConfig = nil then
       FTextureEditConfig := TStringStream.Create('[General]'+LineEnding+
       FTextureEditConfig := TStringStream.Create('[General]'+LineEnding+
         'DefaultImageWidth=256'+LineEnding+
         'DefaultImageWidth=256'+LineEnding+
         'DefaultImageHeight=256'+LineEnding);
         'DefaultImageHeight=256'+LineEnding);
-    tex := ToolManager.BorrowTexture;
+    result := ASource.Duplicate as TBGRABitmap;
     try
     try
-      EditBitmap(tex,FTextureEditConfig,rsEditTexture,nil,nil,BlackAndWhite);
+      EditBitmap(result,FTextureEditConfig,rsEditTexture,nil,nil,BlackAndWhite);
     finally
     finally
-      ToolManager.SetTexture(tex);
+      if result.Equals(ASource) then FreeAndNil(result);
     end;
     end;
   except
   except
     on ex: Exception do
     on ex: Exception do
@@ -942,10 +941,10 @@ begin
   AInstance.Config.SetDefaultImageHeight(Image.Height);
   AInstance.Config.SetDefaultImageHeight(Image.Height);
 end;
 end;
 
 
-procedure TLazPaintInstance.ToolColorChanged(Sender: TObject);
+procedure TLazPaintInstance.ToolFillChanged(Sender: TObject);
 begin
 begin
   ColorToFChooseColor;
   ColorToFChooseColor;
-  if Assigned(FMain) then FMain.UpdateColorToolbar(false);
+  if Assigned(FMain) then FMain.UpdateFillToolbar(false);
 end;
 end;
 
 
 function TLazPaintInstance.GetIcons(ASize: integer): TImageList;
 function TLazPaintInstance.GetIcons(ASize: integer): TImageList;
@@ -1403,20 +1402,14 @@ begin
   FormsNeeded;
   FormsNeeded;
   if InColorFromFChooseColor then exit;
   if InColorFromFChooseColor then exit;
   InColorFromFChooseColor := True;
   InColorFromFChooseColor := True;
-  if FChooseColor.colorTarget = ctForeColor then
-    ToolManager.ForeColor := FChooseColor.GetCurrentColor else
-  if FChooseColor.colorTarget = ctBackColor then
-    ToolManager.BackColor := FChooseColor.GetCurrentColor;
+  SetColor(FChooseColor.colorTarget, FChooseColor.GetCurrentColor);
   InColorFromFChooseColor := false;
   InColorFromFChooseColor := false;
 end;
 end;
 
 
 procedure TLazPaintInstance.ColorToFChooseColor;
 procedure TLazPaintInstance.ColorToFChooseColor;
 begin
 begin
   if not Assigned(FChooseColor) or InColorFromFChooseColor then exit;
   if not Assigned(FChooseColor) or InColorFromFChooseColor then exit;
-  if FChooseColor.colorTarget = ctForeColor then
-    FChooseColor.SetCurrentColor(ToolManager.ForeColor) else
-  if FChooseColor.colorTarget = ctBackColor then
-    FChooseColor.SetCurrentColor(ToolManager.BackColor);
+  FChooseColor.SetCurrentColor(GetColor(FChooseColor.colorTarget));
 end;
 end;
 
 
 function TLazPaintInstance.ShowSaveOptionDlg(AParameters: TVariableSet;
 function TLazPaintInstance.ShowSaveOptionDlg(AParameters: TVariableSet;

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 251 - 650
lazpaint/lazpaintmainform.lfm


+ 42 - 104
lazpaint/lazpaintmainform.pas

@@ -16,8 +16,9 @@ uses
   BGRABitmap, BGRABitmapTypes, BGRALayers, BGRASVGOriginal, BGRAGradientScanner,
   BGRABitmap, BGRABitmapTypes, BGRALayers, BGRASVGOriginal, BGRAGradientScanner,
 
 
   LazPaintType, UMainFormLayout, UTool, UImage, UImageAction, UZoom, UImageView,
   LazPaintType, UMainFormLayout, UTool, UImage, UImageAction, UZoom, UImageView,
-  UImageObservation, UConfig, LCScaleDPI, UResourceStrings,
-  UMenu, uscripting, ubrowseimages, UToolPolygon, UToolVectorial, LCVectorRectShapes,
+  UImageObservation, UConfig, LCScaleDPI, UResourceStrings, UMenu, uscripting,
+  ubrowseimages, UToolPolygon, UToolVectorial, LCVectorRectShapes,
+  LCVectorialFillControl, LCVectorialFill,
 
 
   laztablet, udarktheme, UScriptType;
   laztablet, udarktheme, UScriptType;
 
 
@@ -38,8 +39,16 @@ type
     EditMoveDown: TAction;
     EditMoveDown: TAction;
     EditMoveToFront: TAction;
     EditMoveToFront: TAction;
     EditMoveUp: TAction;
     EditMoveUp: TAction;
+    Image_SwapColors: TImage;
+    Label_Pen: TLabel;
+    Label_Back: TLabel;
     Label_ShadowOffset: TLabel;
     Label_ShadowOffset: TLabel;
     Label_TextBlur: TLabel;
     Label_TextBlur: TLabel;
+    VectorialFill_Pen: TLCVectorialFillControl;
+    VectorialFill_Back: TLCVectorialFillControl;
+    Panel_BackFill: TPanel;
+    Panel_SwapColor: TPanel;
+    Panel_PenFill: TPanel;
     Panel_TextShadow: TPanel;
     Panel_TextShadow: TPanel;
     Panel_CloseShape: TPanel;
     Panel_CloseShape: TPanel;
     SpinEdit_TextBlur: TBCTrackbarUpdown;
     SpinEdit_TextBlur: TBCTrackbarUpdown;
@@ -52,10 +61,7 @@ type
     ComboBox_ArrowEnd: TBCComboBox;
     ComboBox_ArrowEnd: TBCComboBox;
     ComboBox_BrushSelect: TBCComboBox;
     ComboBox_BrushSelect: TBCComboBox;
     Combo_SplineStyle: TBCComboBox;
     Combo_SplineStyle: TBCComboBox;
-    Combo_GradientColorspace: TBCComboBox;
-    SpinEdit_PenOpacity: TBCTrackbarUpdown;
     FilterWaveDisplacement: TAction;
     FilterWaveDisplacement: TAction;
-    SpinEdit_BackOpacity: TBCTrackbarUpdown;
     SpinEdit_Eraser: TBCTrackbarUpdown;
     SpinEdit_Eraser: TBCTrackbarUpdown;
     SpinEdit_GridNbX: TBCTrackbarUpdown;
     SpinEdit_GridNbX: TBCTrackbarUpdown;
     SpinEdit_GridNbY: TBCTrackbarUpdown;
     SpinEdit_GridNbY: TBCTrackbarUpdown;
@@ -68,7 +74,6 @@ type
     SpinEdit_TextOutlineWidth: TBCTrackbarUpdown;
     SpinEdit_TextOutlineWidth: TBCTrackbarUpdown;
     SpinEdit_PhongBorderSize: TBCTrackbarUpdown;
     SpinEdit_PhongBorderSize: TBCTrackbarUpdown;
     SpinEdit_TextSize: TBCTrackbarUpdown;
     SpinEdit_TextSize: TBCTrackbarUpdown;
-    SpinEdit_TextureOpacity: TBCTrackbarUpdown;
     Tool_CloseShape: TToolButton;
     Tool_CloseShape: TToolButton;
     Tool_TextShadow: TToolButton;
     Tool_TextShadow: TToolButton;
     ViewDarkTheme: TAction;
     ViewDarkTheme: TAction;
@@ -213,8 +218,6 @@ type
     RenderCyclicPerlinNoise: TAction;
     RenderCyclicPerlinNoise: TAction;
     RenderWood: TAction;
     RenderWood: TAction;
     RenderPlastik: TAction;
     RenderPlastik: TAction;
-    ToolNoTexture: TAction;
-    ToolLoadTexture: TAction;
     RenderPerlinNoise: TAction;
     RenderPerlinNoise: TAction;
     FilterBlurFast: TAction;
     FilterBlurFast: TAction;
     FilterPlane: TAction;
     FilterPlane: TAction;
@@ -342,39 +345,29 @@ type
     ToolButton20: TToolButton;
     ToolButton20: TToolButton;
     ToolButton3: TToolButton;
     ToolButton3: TToolButton;
     Tool_GridMoveWithoutDeformation: TToolButton;
     Tool_GridMoveWithoutDeformation: TToolButton;
-    Image_CurrentTexture: TImage;
-    Panel_Texture: TPanel;
     Panel_PenStyle: TPanel;
     Panel_PenStyle: TPanel;
     Panel_LineCap: TPanel;
     Panel_LineCap: TPanel;
     Panel_JoinStyle: TPanel;
     Panel_JoinStyle: TPanel;
     ToolBar11: TToolBar;
     ToolBar11: TToolBar;
-    ToolBar4: TToolBar;
-    ToolButton1: TToolButton;
-    ToolButton2: TToolButton;
     Tool_JoinBevel: TToolButton;
     Tool_JoinBevel: TToolButton;
     Tool_JoinRound: TToolButton;
     Tool_JoinRound: TToolButton;
     Tool_CapSquare: TToolButton;
     Tool_CapSquare: TToolButton;
     Tool_CapFlat: TToolButton;
     Tool_CapFlat: TToolButton;
     Tool_CapRound: TToolButton;
     Tool_CapRound: TToolButton;
     ToolBar10: TToolBar;
     ToolBar10: TToolBar;
-    Tool_SinGradient: TToolButton;
     Tool_JoinMiter: TToolButton;
     Tool_JoinMiter: TToolButton;
     Label_Coordinates: TLabel;
     Label_Coordinates: TLabel;
     Panel_Coordinates: TPanel;
     Panel_Coordinates: TPanel;
-    Image_SwapColors: TImage;
     Label_Eraser: TLabel;
     Label_Eraser: TLabel;
     Image_CurrentTool: TImage;
     Image_CurrentTool: TImage;
-    Label_Pen: TLabel;
-    Label_Back: TLabel;
     Label_CurrentZoom: TLabel;
     Label_CurrentZoom: TLabel;
     Panel_Undo: TPanel;
     Panel_Undo: TPanel;
     Panel_CopyPaste: TPanel;
     Panel_CopyPaste: TPanel;
     Panel_ToolbarBackground: TPanel;
     Panel_ToolbarBackground: TPanel;
     Panel_File: TPanel;
     Panel_File: TPanel;
-    Panel_GradientType: TPanel;
     Panel_Tool: TPanel;
     Panel_Tool: TPanel;
     Panel_Zoom: TPanel;
     Panel_Zoom: TPanel;
-    Panel_Color: TPanel;
+    Panel_ColorDiff: TPanel;
     Panel_PenWidth: TPanel;
     Panel_PenWidth: TPanel;
     Panel_Eraser: TPanel;
     Panel_Eraser: TPanel;
     Panel_Tolerance: TPanel;
     Panel_Tolerance: TPanel;
@@ -382,14 +375,11 @@ type
     Label_PenWidth: TLabel;
     Label_PenWidth: TLabel;
     Tool_DrawShapeBorder: TToolButton;
     Tool_DrawShapeBorder: TToolButton;
     Tool_FillShape: TToolButton;
     Tool_FillShape: TToolButton;
-    Shape_BackColor: TShape;
-    Shape_PenColor: TShape;
     Label_Tolerance: TLabel;
     Label_Tolerance: TLabel;
     ToolBar2: TToolBar;
     ToolBar2: TToolBar;
     ToolBar3: TToolBar;
     ToolBar3: TToolBar;
     ToolBar5: TToolBar;
     ToolBar5: TToolBar;
     ToolBar6: TToolBar;
     ToolBar6: TToolBar;
-    ToolBar7: TToolBar;
     ToolBar8: TToolBar;
     ToolBar8: TToolBar;
     ToolBar9: TToolBar;
     ToolBar9: TToolBar;
     ToolButton14: TToolButton;
     ToolButton14: TToolButton;
@@ -403,11 +393,7 @@ type
     ToolButton30: TToolButton;
     ToolButton30: TToolButton;
     ToolButton5: TToolButton;
     ToolButton5: TToolButton;
     ToolButton6: TToolButton;
     ToolButton6: TToolButton;
-    Tool_DiamondGradient: TToolButton;
-    Tool_LinearGradient: TToolButton;
     Tool_ProgressiveFloodfill: TToolButton;
     Tool_ProgressiveFloodfill: TToolButton;
-    Tool_RadialGradient: TToolButton;
-    Tool_ReflectedGradient: TToolButton;
     ToolButton_ZoomOriginal: TToolButton;
     ToolButton_ZoomOriginal: TToolButton;
     ColorDialog1: TColorDialog;
     ColorDialog1: TColorDialog;
     ActionList1: TActionList;
     ActionList1: TActionList;
@@ -535,10 +521,9 @@ type
     procedure SpinEdit_ShapeAltitudeChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_ShapeAltitudeChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_BrushSpacingChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_BrushSpacingChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_TextSizeChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_TextSizeChange(Sender: TObject; AByUser: boolean);
-    procedure SpinEdit_TextureOpacityChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_TextBlurChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_TextBlurChange(Sender: TObject; AByUser: boolean);
     procedure GridNb_SpinEditChange(Sender: TObject; AByUser: boolean);
     procedure GridNb_SpinEditChange(Sender: TObject; AByUser: boolean);
-    procedure Image_CurrentTextureClick(Sender: TObject);
+    procedure VectorialFill_TextureClick(Sender: TObject);
     procedure PaintBox_PenPreviewPaint(Sender: TObject);
     procedure PaintBox_PenPreviewPaint(Sender: TObject);
     procedure PaintBox_PictureMouseDown(Sender: TObject; Button: TMouseButton;
     procedure PaintBox_PictureMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
       Shift: TShiftState; X, Y: Integer);
@@ -595,11 +580,6 @@ type
     procedure Tool_PhongShapeRectangleClick(Sender: TObject);
     procedure Tool_PhongShapeRectangleClick(Sender: TObject);
     procedure Tool_PhongShapeRoundRectClick(Sender: TObject);
     procedure Tool_PhongShapeRoundRectClick(Sender: TObject);
     procedure Tool_PhongShapeSphereClick(Sender: TObject);
     procedure Tool_PhongShapeSphereClick(Sender: TObject);
-    procedure Tool_SinGradientClick(Sender: TObject);
-    procedure Combo_GradientColorspaceChange(Sender: TObject);
-    procedure ToolLoadTextureExecute(Sender: TObject);
-    procedure ToolNoTextureExecute(Sender: TObject);
-    procedure ToolNoTextureUpdate(Sender: TObject);
     procedure Tool_CapFlatClick(Sender: TObject);
     procedure Tool_CapFlatClick(Sender: TObject);
     procedure Tool_CapRoundClick(Sender: TObject);
     procedure Tool_CapRoundClick(Sender: TObject);
     procedure Tool_CapSquareClick(Sender: TObject);
     procedure Tool_CapSquareClick(Sender: TObject);
@@ -644,19 +624,13 @@ type
       {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
       {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
     procedure SpinEdit_PenWidthChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_PenWidthChange(Sender: TObject; AByUser: boolean);
     procedure Tool_CloseShapeClick(Sender: TObject);
     procedure Tool_CloseShapeClick(Sender: TObject);
-    procedure Shape_BackColorMouseDown(Sender: TObject; Button: TMouseButton;
-      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
-    procedure Shape_PenColorMouseDown(Sender: TObject; Button: TMouseButton;
-      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
-    procedure SpinEdit_BackOpacityChange(Sender: TObject; AByUser: boolean);
-    procedure SpinEdit_PenOpacityChange(Sender: TObject; AByUser: boolean);
+    procedure VectorialFill_BackChooseColor({%H-}ASender: TObject; AButton: TMouseButton;
+              AColorIndex: integer; var {%H-}AColorValue: TBGRAPixel; out AHandled: boolean);
+    procedure VectorialFill_PenChooseColor({%H-}ASender: TObject; AButton: TMouseButton;
+              AColorIndex: integer; var {%H-}AColorValue: TBGRAPixel; out AHandled: boolean);
     procedure SpinEdit_ArrowSizeChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_ArrowSizeChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_ToleranceChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_ToleranceChange(Sender: TObject; AByUser: boolean);
-    procedure Tool_DiamondGradientClick(Sender: TObject);
-    procedure Tool_LinearGradientClick(Sender: TObject);
     procedure Tool_ProgressiveFloodfillClick(Sender: TObject);
     procedure Tool_ProgressiveFloodfillClick(Sender: TObject);
-    procedure Tool_RadialGradientClick(Sender: TObject);
-    procedure Tool_ReflectedGradientClick(Sender: TObject);
     procedure Tool_AliasingClick(Sender: TObject);
     procedure Tool_AliasingClick(Sender: TObject);
     procedure Tool_DrawShapeBorderClick(Sender: TObject);
     procedure Tool_DrawShapeBorderClick(Sender: TObject);
     procedure Tool_FillShapeClick(Sender: TObject);
     procedure Tool_FillShapeClick(Sender: TObject);
@@ -679,7 +653,6 @@ type
     procedure ManagerDeformationGridSizeChanged(Sender: TObject);
     procedure ManagerDeformationGridSizeChanged(Sender: TObject);
     procedure ManagerEraserChanged(Sender: TObject);
     procedure ManagerEraserChanged(Sender: TObject);
     procedure ManagerFloodFillOptionChanged(Sender: TObject);
     procedure ManagerFloodFillOptionChanged(Sender: TObject);
-    procedure ManagerGradientChanged(Sender: TObject);
     procedure ManagerJoinStyleChanged(Sender: TObject);
     procedure ManagerJoinStyleChanged(Sender: TObject);
     procedure ManagerLineCapChanged(Sender: TObject);
     procedure ManagerLineCapChanged(Sender: TObject);
     procedure ManagerPerspectiveOptionChanged(Sender: TObject);
     procedure ManagerPerspectiveOptionChanged(Sender: TObject);
@@ -693,15 +666,15 @@ type
     procedure ManagerTextOutlineChanged(Sender: TObject);
     procedure ManagerTextOutlineChanged(Sender: TObject);
     procedure ManagerTextPhongChanged(Sender: TObject);
     procedure ManagerTextPhongChanged(Sender: TObject);
     procedure ManagerTextShadowChanged(Sender: TObject);
     procedure ManagerTextShadowChanged(Sender: TObject);
-    procedure ManagerTextureChanged(Sender: TObject);
     procedure ManagerShapeOptionChanged(Sender: TObject);
     procedure ManagerShapeOptionChanged(Sender: TObject);
     procedure ManagerToleranceChanged(Sender: TObject);
     procedure ManagerToleranceChanged(Sender: TObject);
     procedure ManagerToolbarChanged(Sender: TObject);
     procedure ManagerToolbarChanged(Sender: TObject);
+    procedure VectorialFill_BackChange(Sender: TObject);
+    procedure VectorialFill_PenChange(Sender: TObject);
   private
   private
     { private declarations }
     { private declarations }
     FLayout: TMainFormLayout;
     FLayout: TMainFormLayout;
 
 
-    FActiveSpinEdit: TBCTrackbarUpdown;
     FLastWidth,FLastHeight,FLastBPP,FLastFrameIndex: integer;
     FLastWidth,FLastHeight,FLastBPP,FLastFrameIndex: integer;
     {$IFDEF LINUX}
     {$IFDEF LINUX}
     FTopMostHiddenMinimised: TTopMostInfo;
     FTopMostHiddenMinimised: TTopMostInfo;
@@ -717,7 +690,7 @@ type
 
 
     FLoadInitialDir, FSaveInitialDir: string;
     FLoadInitialDir, FSaveInitialDir: string;
     FSaveSelectionInitialFilename: string;
     FSaveSelectionInitialFilename: string;
-    FInPenWidthChange, FInBrush, FInShapeRatio, FInEraserOption,
+    FInFillChange, FInPenWidthChange, FInBrush, FInShapeRatio, FInEraserOption,
     FInSplineStyleChange, FInFloodfillOption, FInTolerance,
     FInSplineStyleChange, FInFloodfillOption, FInTolerance,
     FInTextFont, FInTextAlign, FInTextShadow,
     FInTextFont, FInTextAlign, FInTextShadow,
     FInPerspective, FInGridNb: Boolean;
     FInPerspective, FInGridNb: Boolean;
@@ -756,7 +729,6 @@ type
     procedure UpdateStatusText;
     procedure UpdateStatusText;
     procedure CreateToolbarElements;
     procedure CreateToolbarElements;
     function GetCurrentToolAction: TAction;
     function GetCurrentToolAction: TAction;
-    procedure NoTextureIcon;
     procedure RegisterToolbarElements;
     procedure RegisterToolbarElements;
     procedure InitToolbarElements;
     procedure InitToolbarElements;
     procedure UpdateToolOptions;
     procedure UpdateToolOptions;
@@ -771,7 +743,6 @@ type
     procedure UpdateTextShadowToolbar;
     procedure UpdateTextShadowToolbar;
     procedure UpdateLineCapToolbar;
     procedure UpdateLineCapToolbar;
     procedure UpdateSplineStyleToolbar;
     procedure UpdateSplineStyleToolbar;
-    procedure UpdateGradientToolbar;
     procedure UpdatePenWidthToolbar;
     procedure UpdatePenWidthToolbar;
     procedure UpdatePhongToolbar;
     procedure UpdatePhongToolbar;
     procedure UpdateToleranceToolbar;
     procedure UpdateToleranceToolbar;
@@ -803,19 +774,17 @@ type
     procedure ToggleImageListVisible;
     procedure ToggleImageListVisible;
     procedure ToggleColorsVisible;
     procedure ToggleColorsVisible;
     procedure ToggleLayersVisible;
     procedure ToggleLayersVisible;
-    procedure ShowColorDialogForPen;
-    procedure ShowColorDialogForBack;
+    procedure ShowColorDialogFor(ATarget: TColorTarget);
     procedure ShowPenPreview(ShouldRepaint: boolean= False);
     procedure ShowPenPreview(ShouldRepaint: boolean= False);
     procedure HidePenPreview(TimeMs: Integer = 300);
     procedure HidePenPreview(TimeMs: Integer = 300);
     procedure OnPaintHandler;
     procedure OnPaintHandler;
     procedure OnImageChangedHandler({%H-}AEvent: TLazPaintImageObservationEvent);
     procedure OnImageChangedHandler({%H-}AEvent: TLazPaintImageObservationEvent);
-    procedure UpdateTextureIcon;
     procedure LabelAutosize(ALabel: TLabel);
     procedure LabelAutosize(ALabel: TLabel);
     procedure AskMergeSelection(ACaption: string);
     procedure AskMergeSelection(ACaption: string);
     procedure ReleaseMouseButtons(Shift: TShiftState);
     procedure ReleaseMouseButtons(Shift: TShiftState);
     procedure UpdateSpecialKeys({%H-}Shift: TShiftState);
     procedure UpdateSpecialKeys({%H-}Shift: TShiftState);
     procedure UpdateCurveModeToolbar;
     procedure UpdateCurveModeToolbar;
-    function ShowOpenTextureDialog: boolean;
+    function ShowOpenTextureDialog(ATargetFill: TVectorialFill): boolean;
     procedure ShowNoPicture;
     procedure ShowNoPicture;
     procedure SetCurveMode(AMode: TToolSplineMode);
     procedure SetCurveMode(AMode: TToolSplineMode);
     procedure IncreasePenSize;
     procedure IncreasePenSize;
@@ -868,7 +837,7 @@ type
       AAllowDuplicate: boolean = false; AEntryToLoad: integer = -1): Boolean;
       AAllowDuplicate: boolean = false; AEntryToLoad: integer = -1): Boolean;
     function PictureCanvasOfs: TPoint;
     function PictureCanvasOfs: TPoint;
     procedure UpdateLineCapBar;
     procedure UpdateLineCapBar;
-    procedure UpdateColorToolbar(AUpdateColorDiff: boolean);
+    procedure UpdateFillToolbar(AUpdateColorDiff: boolean);
     procedure UpdateToolbar;
     procedure UpdateToolbar;
     function ChooseTool(Tool : TPaintToolType): boolean;
     function ChooseTool(Tool : TPaintToolType): boolean;
     procedure PictureSelectedLayerIndexChanged({%H-}sender: TLazPaintImage);
     procedure PictureSelectedLayerIndexChanged({%H-}sender: TLazPaintImage);
@@ -974,10 +943,10 @@ begin
   m.PredefinedMainMenus([MenuFile,MenuEdit,MenuSelect,MenuView, MenuImage,MenuRemoveTransparency,
   m.PredefinedMainMenus([MenuFile,MenuEdit,MenuSelect,MenuView, MenuImage,MenuRemoveTransparency,
     MenuColors,MenuTool, MenuFilter,MenuRadialBlur, MenuRender,MenuHelp]);
     MenuColors,MenuTool, MenuFilter,MenuRadialBlur, MenuRender,MenuHelp]);
   m.Toolbars([Panel_Embedded,Panel_File,Panel_Zoom,Panel_Undo,Panel_CopyPaste,Panel_Coordinates,
   m.Toolbars([Panel_Embedded,Panel_File,Panel_Zoom,Panel_Undo,Panel_CopyPaste,Panel_Coordinates,
-    Panel_Tool,Panel_Color,Panel_Texture,Panel_Grid,
+    Panel_Tool,Panel_ColorDiff,Panel_Grid,
     Panel_ShapeOption,Panel_PenWidth,Panel_PenStyle,Panel_JoinStyle,
     Panel_ShapeOption,Panel_PenWidth,Panel_PenStyle,Panel_JoinStyle,
     Panel_CloseShape,Panel_LineCap,Panel_Aliasing,
     Panel_CloseShape,Panel_LineCap,Panel_Aliasing,
-    Panel_SplineStyle,Panel_Eraser,Panel_Tolerance,Panel_GradientType,Panel_Text,Panel_TextShadow,Panel_TextOutline,
+    Panel_SplineStyle,Panel_Eraser,Panel_Tolerance,Panel_Text,Panel_TextShadow,Panel_TextOutline,
     Panel_PhongShape,Panel_Altitude,Panel_PerspectiveOption,Panel_Brush,Panel_Ratio],Panel_ToolbarBackground);
     Panel_PhongShape,Panel_Altitude,Panel_PerspectiveOption,Panel_Brush,Panel_Ratio],Panel_ToolbarBackground);
   m.ImageList := LazPaintInstance.Icons[ScaleY(16, 96)];
   m.ImageList := LazPaintInstance.Icons[ScaleY(16, 96)];
   m.Apply;
   m.Apply;
@@ -1007,7 +976,6 @@ begin
   begin
   begin
     if ToolManager.OnToolChanged = @ManagerToolChanged then ToolManager.OnToolChanged := nil;
     if ToolManager.OnToolChanged = @ManagerToolChanged then ToolManager.OnToolChanged := nil;
     if ToolManager.OnToolbarChanged = @ManagerToolbarChanged then ToolManager.OnToolbarChanged := nil;
     if ToolManager.OnToolbarChanged = @ManagerToolbarChanged then ToolManager.OnToolbarChanged := nil;
-    if ToolManager.OnTextureChanged = @ManagerTextureChanged then ToolManager.OnTextureChanged := nil;
     if ToolManager.OnEraserChanged = @ManagerEraserChanged then ToolManager.OnEraserChanged := nil;
     if ToolManager.OnEraserChanged = @ManagerEraserChanged then ToolManager.OnEraserChanged := nil;
     if ToolManager.OnPenWidthChanged = @ManagerPenWidthChanged then ToolManager.OnPenWidthChanged := nil;
     if ToolManager.OnPenWidthChanged = @ManagerPenWidthChanged then ToolManager.OnPenWidthChanged := nil;
     if ToolManager.OnBrushChanged = @ManagerBrushChanged then ToolManager.OnBrushChanged := nil;
     if ToolManager.OnBrushChanged = @ManagerBrushChanged then ToolManager.OnBrushChanged := nil;
@@ -1023,7 +991,6 @@ begin
     if ToolManager.OnTextShadowChanged = @ManagerTextShadowChanged then ToolManager.OnTextShadowChanged := nil;
     if ToolManager.OnTextShadowChanged = @ManagerTextShadowChanged then ToolManager.OnTextShadowChanged := nil;
     if ToolManager.OnLineCapChanged = @ManagerLineCapChanged then ToolManager.OnLineCapChanged := nil;
     if ToolManager.OnLineCapChanged = @ManagerLineCapChanged then ToolManager.OnLineCapChanged := nil;
     if ToolManager.OnSplineStyleChanged = @ManagerSplineStyleChanged then ToolManager.OnSplineStyleChanged := nil;
     if ToolManager.OnSplineStyleChanged = @ManagerSplineStyleChanged then ToolManager.OnSplineStyleChanged := nil;
-    if ToolManager.OnGradientChanged = @ManagerGradientChanged then ToolManager.OnGradientChanged := nil;
     if ToolManager.OnPhongShapeChanged = @ManagerPhongShapeChanged then ToolManager.OnPhongShapeChanged := nil;
     if ToolManager.OnPhongShapeChanged = @ManagerPhongShapeChanged then ToolManager.OnPhongShapeChanged := nil;
     if ToolManager.OnToleranceChanged = @ManagerToleranceChanged then ToolManager.OnToleranceChanged := nil;
     if ToolManager.OnToleranceChanged = @ManagerToleranceChanged then ToolManager.OnToleranceChanged := nil;
     if ToolManager.OnDeformationGridChanged = @ManagerDeformationGridSizeChanged then ToolManager.OnDeformationGridChanged := nil;
     if ToolManager.OnDeformationGridChanged = @ManagerDeformationGridSizeChanged then ToolManager.OnDeformationGridChanged := nil;
@@ -1089,7 +1056,6 @@ begin
   ToolManager.SetCurrentToolType(ptHand);
   ToolManager.SetCurrentToolType(ptHand);
   ToolManager.OnToolChanged  :=  @ManagerToolChanged;
   ToolManager.OnToolChanged  :=  @ManagerToolChanged;
   ToolManager.OnToolbarChanged:=@ManagerToolbarChanged;
   ToolManager.OnToolbarChanged:=@ManagerToolbarChanged;
-  ToolManager.OnTextureChanged := @ManagerTextureChanged;
   ToolManager.OnEraserChanged:=@ManagerEraserChanged;
   ToolManager.OnEraserChanged:=@ManagerEraserChanged;
   ToolManager.OnPenWidthChanged:= @ManagerPenWidthChanged;
   ToolManager.OnPenWidthChanged:= @ManagerPenWidthChanged;
   ToolManager.OnBrushChanged:=@ManagerBrushChanged;
   ToolManager.OnBrushChanged:=@ManagerBrushChanged;
@@ -1105,7 +1071,6 @@ begin
   ToolManager.OnTextShadowChanged:=@ManagerTextShadowChanged;
   ToolManager.OnTextShadowChanged:=@ManagerTextShadowChanged;
   ToolManager.OnLineCapChanged := @ManagerLineCapChanged;
   ToolManager.OnLineCapChanged := @ManagerLineCapChanged;
   ToolManager.OnSplineStyleChanged:=@ManagerSplineStyleChanged;
   ToolManager.OnSplineStyleChanged:=@ManagerSplineStyleChanged;
-  ToolManager.OnGradientChanged:=@ManagerGradientChanged;
   ToolManager.OnPhongShapeChanged:=@ManagerPhongShapeChanged;
   ToolManager.OnPhongShapeChanged:=@ManagerPhongShapeChanged;
   ToolManager.OnToleranceChanged:=@ManagerToleranceChanged;
   ToolManager.OnToleranceChanged:=@ManagerToleranceChanged;
   ToolManager.OnDeformationGridChanged:=@ManagerDeformationGridSizeChanged;
   ToolManager.OnDeformationGridChanged:=@ManagerDeformationGridSizeChanged;
@@ -1244,7 +1209,7 @@ begin
     else
     else
       exit;
       exit;
   end;
   end;
-  if (CurrentTool in[ptText,ptEditShape]) and TextSpinEditFocused then SpinEdit_PenOpacity.SetFocus;
+  if (CurrentTool in[ptText,ptEditShape]) and TextSpinEditFocused then VectorialFill_Pen.SetFocus;
   Image.CurrentState.LayeredBitmap.EditorFocused := true;
   Image.CurrentState.LayeredBitmap.EditorFocused := true;
 
 
   FormMouseMovePos := Point(X,Y);
   FormMouseMovePos := Point(X,Y);
@@ -2721,27 +2686,6 @@ begin
   ToolLayerMapping.Enabled := Image.CurrentLayerVisible and Image.SelectionMaskEmpty;
   ToolLayerMapping.Enabled := Image.CurrentLayerVisible and Image.SelectionMaskEmpty;
 end;
 end;
 
 
-procedure TFMain.ToolLoadTextureExecute(Sender: TObject);
-begin
-  ShowOpenTextureDialog;
-end;
-
-procedure TFMain.ToolNoTextureExecute(Sender: TObject);
-begin
-  try
-    ToolManager.SetTexture(nil);
-  except
-    on ex:Exception do
-      LazPaintInstance.ShowError(RemoveTrail(ToolNoTexture.Hint),ex.Message);
-  end;
-end;
-
-procedure TFMain.ToolNoTextureUpdate(Sender: TObject);
-begin
-  ToolNoTexture.Enabled := (ToolManager.GetTexture <> nil)
-    and (CurrentTool <> ptTextureMapping);
-end;
-
 procedure TFMain.ViewColorsExecute(Sender: TObject);
 procedure TFMain.ViewColorsExecute(Sender: TObject);
 begin
 begin
   ToggleColorsVisible;
   ToggleColorsVisible;
@@ -2991,27 +2935,30 @@ begin
                       FImageActions.RemoveSelection;
                       FImageActions.RemoveSelection;
                       texMapBounds := newTexture.GetImageBounds;
                       texMapBounds := newTexture.GetImageBounds;
                       BGRAReplace(newTexture, newTexture.GetPart(texMapBounds));
                       BGRAReplace(newTexture, newTexture.GetPart(texMapBounds));
-                      ToolManager.SetTexture(newTexture);
+                      ToolManager.BackFill.SetTexture(newTexture, AffineMatrixIdentity,
+                        ToolManager.BackFill.TextureOpacity, ToolManager.BackFill.TextureRepetition);
                       newTexture.FreeReference;
                       newTexture.FreeReference;
                     end;
                     end;
                   end;
                   end;
                 end;
                 end;
               end;
               end;
             end;
             end;
-            if (ToolManager.GetTexture = nil) or ToolManager.GetTexture.Empty then
+            if (ToolManager.BackFill.Texture = nil) or
+               ToolManager.BackFill.Texture.Empty then
             begin
             begin
               if useSelection then
               if useSelection then
               begin
               begin
                 Tool := ptHand;
                 Tool := ptHand;
                 result := srException;
                 result := srException;
               end else
               end else
-              if not ShowOpenTextureDialog then
+              if not ShowOpenTextureDialog(ToolManager.BackFill) then
               begin
               begin
                 Tool := ptHand;
                 Tool := ptHand;
                 result := srCancelledByUser;
                 result := srCancelledByUser;
               end
               end
               else
               else
-              if (ToolManager.GetTexture = nil) or ToolManager.GetTexture.Empty then
+              if (ToolManager.BackFill.Texture = nil) or
+                ToolManager.BackFill.Texture.Empty then
               begin
               begin
                 Tool := ptHand;
                 Tool := ptHand;
                 result := srException;
                 result := srException;
@@ -3822,7 +3769,7 @@ begin
   {$ENDIF}
   {$ENDIF}
 end;
 end;
 
 
-function TFMain.ShowOpenTextureDialog: boolean;
+function TFMain.ShowOpenTextureDialog(ATargetFill: TVectorialFill): boolean;
 var newTex: TBGRABitmap;
 var newTex: TBGRABitmap;
   texFilename: string;
   texFilename: string;
   topMostInfo: TTopMostInfo;
   topMostInfo: TTopMostInfo;
@@ -3865,7 +3812,8 @@ begin
           newTex := LoadFlatImageUTF8(texFilename).bmp;
           newTex := LoadFlatImageUTF8(texFilename).bmp;
         if LazPaintInstance.BlackAndWhite then
         if LazPaintInstance.BlackAndWhite then
           newTex.InplaceGrayscale;
           newTex.InplaceGrayscale;
-        ToolManager.SetTexture(newTex);
+        ATargetFill.SetTexture(newTex, AffineMatrixIdentity,
+          ATargetFill.TextureOpacity, ATargetFill.TextureRepetition);
         newTex.FreeReference;
         newTex.FreeReference;
         newTex := nil;
         newTex := nil;
         result := true;
         result := true;
@@ -4153,6 +4101,8 @@ end;
 {****************************** Picture ************************}
 {****************************** Picture ************************}
 
 
 procedure TFMain.OnPaintHandler;
 procedure TFMain.OnPaintHandler;
+var
+  ac: TWinControl;
 begin
 begin
   if FirstPaint then
   if FirstPaint then
   begin
   begin
@@ -4164,11 +4114,10 @@ begin
 
 
   if Assigned(FImageView) then FImageView.DoPaint(PictureCanvasOfs, FLayout.WorkArea, InShowNoPicture);
   if Assigned(FImageView) then FImageView.DoPaint(PictureCanvasOfs, FLayout.WorkArea, InShowNoPicture);
   DelayedPaintPicture:= false;
   DelayedPaintPicture:= false;
-  if FActiveSpinEdit <> nil then
-  begin
-    FActiveSpinEdit.DelayTimer;
-    FActiveSpinEdit := nil;
-  end;
+
+  ac := ActiveControl;
+  if ac is TBCTrackbarUpdown then
+    TBCTrackbarUpdown(ac).DelayTimer;
 
 
   InFormPaint := false;
   InFormPaint := false;
   FLastPaintDate := Now;
   FLastPaintDate := Now;
@@ -4292,11 +4241,6 @@ begin
   UpdateFloodFillToolbar;
   UpdateFloodFillToolbar;
 end;
 end;
 
 
-procedure TFMain.ManagerGradientChanged(Sender: TObject);
-begin
-  UpdateGradientToolbar;
-end;
-
 procedure TFMain.ManagerJoinStyleChanged(Sender: TObject);
 procedure TFMain.ManagerJoinStyleChanged(Sender: TObject);
 begin
 begin
   UpdateJoinStyleToolbar;
   UpdateJoinStyleToolbar;
@@ -4362,12 +4306,6 @@ begin
   UpdateTextShadowToolbar;
   UpdateTextShadowToolbar;
 end;
 end;
 
 
-procedure TFMain.ManagerTextureChanged(Sender: TObject);
-begin
-  UpdateTextureIcon;
-  SpinEdit_TextureOpacity.Value := ToolManager.TextureOpacity;
-end;
-
 procedure TFMain.ManagerShapeOptionChanged(Sender: TObject);
 procedure TFMain.ManagerShapeOptionChanged(Sender: TObject);
 begin
 begin
   UpdateToolOptions;
   UpdateToolOptions;

+ 47 - 5
lazpaint/lazpainttype.pas

@@ -5,8 +5,8 @@ unit LazPaintType;
 interface
 interface
 
 
 uses
 uses
-  Classes, SysUtils, Inifiles, BGRABitmap, BGRABitmapTypes, uconfig, uimage, utool, Forms, BGRALayers, Graphics, Menus,
-  uscripting, Dialogs, Controls
+  Classes, SysUtils, Inifiles, BGRABitmap, BGRABitmapTypes, UConfig, UImage, UTool, Forms, BGRALayers, Graphics, Menus,
+  UScripting, Dialogs, Controls
   {$IFDEF LINUX}, InterfaceBase{$ENDIF};
   {$IFDEF LINUX}, InterfaceBase{$ENDIF};
 
 
 const
 const
@@ -107,7 +107,8 @@ function IsOnlyRenderChange(const ARect:TRect): boolean;
 
 
 type
 type
     ArrayOfBGRABitmap = array of TBGRABitmap;
     ArrayOfBGRABitmap = array of TBGRABitmap;
-    TColorTarget = (ctForeColor, ctBackColor);
+    TColorTarget = (ctForeColorSolid, ctForeColorStartGrad, ctForeColorEndGrad,
+                    ctBackColorSolid, ctBackColorStartGrad, ctBackColorEndGrad);
     TFlipOption = (foAuto, foWholePicture, foSelection, foCurrentLayer);
     TFlipOption = (foAuto, foWholePicture, foSelection, foCurrentLayer);
 
 
     PImageEntry = ^TImageEntry;
     PImageEntry = ^TImageEntry;
@@ -217,7 +218,7 @@ type
     procedure UseConfig(ini: TInifile); virtual; abstract;
     procedure UseConfig(ini: TInifile); virtual; abstract;
     procedure AssignBitmap(bmp: TBGRABitmap); virtual; abstract;
     procedure AssignBitmap(bmp: TBGRABitmap); virtual; abstract;
     procedure EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream = nil; ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil; AOnExit: TLazPaintInstanceEvent = nil; ABlackAndWhite : boolean = false); virtual; abstract;
     procedure EditBitmap(var bmp: TBGRABitmap; ConfigStream: TStream = nil; ATitle: String = ''; AOnRun: TLazPaintInstanceEvent = nil; AOnExit: TLazPaintInstanceEvent = nil; ABlackAndWhite : boolean = false); virtual; abstract;
-    procedure EditTexture; virtual; abstract;
+    function EditTexture(ASource: TBGRABitmap): TBGRABitmap; virtual; abstract;
     procedure EditSelection; virtual; abstract;
     procedure EditSelection; virtual; abstract;
     function ProcessCommandLine: boolean; virtual; abstract;
     function ProcessCommandLine: boolean; virtual; abstract;
     function ProcessCommands(commands: TStringList): boolean; virtual; abstract;
     function ProcessCommands(commands: TStringList): boolean; virtual; abstract;
@@ -235,6 +236,8 @@ type
     function RunScript(AFilename: string): boolean; virtual; abstract;
     function RunScript(AFilename: string): boolean; virtual; abstract;
     procedure ColorFromFChooseColor; virtual; abstract;
     procedure ColorFromFChooseColor; virtual; abstract;
     procedure ColorToFChooseColor; virtual; abstract;
     procedure ColorToFChooseColor; virtual; abstract;
+    function GetColor(ATarget: TColorTarget): TBGRAPixel;
+    procedure SetColor(ATarget: TColorTarget; AColor: TBGRAPixel);
     function ShowSaveOptionDlg(AParameters: TVariableSet; AOutputFilenameUTF8: string; ASkipOptions: boolean): boolean; virtual; abstract;
     function ShowSaveOptionDlg(AParameters: TVariableSet; AOutputFilenameUTF8: string; ASkipOptions: boolean): boolean; virtual; abstract;
     function ShowColorIntensityDlg(AParameters: TVariableSet): TScriptResult; virtual; abstract;
     function ShowColorIntensityDlg(AParameters: TVariableSet): TScriptResult; virtual; abstract;
     function ShowColorLightnessDlg(AParameters: TVariableSet): TScriptResult; virtual; abstract;
     function ShowColorLightnessDlg(AParameters: TVariableSet): TScriptResult; virtual; abstract;
@@ -346,7 +349,7 @@ function CSSToPascalCase(AIdentifier: string): string;
 
 
 implementation
 implementation
 
 
-uses LCLType, BGRAUTF8, LCLIntf, FileUtil, UResourceStrings;
+uses LCLType, BGRAUTF8, LCLIntf, FileUtil, UResourceStrings, LCVectorialFill;
 
 
 function LazPaintVersionStr: string;
 function LazPaintVersionStr: string;
 var numbers: TStringList;
 var numbers: TStringList;
@@ -632,6 +635,45 @@ begin
   result := 1;
   result := 1;
 end;
 end;
 
 
+function TLazPaintCustomInstance.GetColor(ATarget: TColorTarget): TBGRAPixel;
+begin
+  case ATarget of
+    ctForeColorSolid: result := ToolManager.ForeColor;
+    ctForeColorStartGrad: if ToolManager.ForeFill.FillType = vftGradient then
+                            result := ToolManager.ForeFill.Gradient.StartColor
+                          else result := ToolManager.ForeColor;
+    ctForeColorEndGrad: if ToolManager.ForeFill.FillType = vftGradient then
+                          result := ToolManager.ForeFill.Gradient.EndColor
+                        else result := ToolManager.ForeColor;
+    ctBackColorSolid: result := ToolManager.BackColor;
+    ctBackColorStartGrad: if ToolManager.BackFill.FillType = vftGradient then
+                            result := ToolManager.BackFill.Gradient.StartColor
+                          else result := ToolManager.BackColor;
+    ctBackColorEndGrad: if ToolManager.BackFill.FillType = vftGradient then
+                          result := ToolManager.BackFill.Gradient.EndColor
+                        else result := ToolManager.BackColor;
+  else
+    result := BGRAPixelTransparent;
+  end;
+end;
+
+procedure TLazPaintCustomInstance.SetColor(ATarget: TColorTarget;
+  AColor: TBGRAPixel);
+begin
+  case ATarget of
+    ctForeColorSolid: ToolManager.ForeColor := AColor;
+    ctForeColorStartGrad: if ToolManager.ForeFill.FillType = vftGradient then
+                            ToolManager.ForeFill.Gradient.StartColor := AColor;
+    ctForeColorEndGrad: if ToolManager.ForeFill.FillType = vftGradient then
+                          ToolManager.ForeFill.Gradient.EndColor := AColor;
+    ctBackColorSolid: ToolManager.BackColor := AColor;
+    ctBackColorStartGrad: if ToolManager.BackFill.FillType = vftGradient then
+                            ToolManager.BackFill.Gradient.StartColor := AColor;
+    ctBackColorEndGrad: if ToolManager.BackFill.FillType = vftGradient then
+                          ToolManager.BackFill.Gradient.EndColor := AColor;
+  end;
+end;
+
 procedure TLazPaintCustomInstance.SetBlackAndWhite(AValue: boolean);
 procedure TLazPaintCustomInstance.SetBlackAndWhite(AValue: boolean);
 begin
 begin
   if FBlackAndWhite=AValue then Exit;
   if FBlackAndWhite=AValue then Exit;

+ 107 - 204
lazpaint/maintoolbar.inc

@@ -1,5 +1,5 @@
 procedure TFMain.CreateToolbarElements;
 procedure TFMain.CreateToolbarElements;
-var ci: TBGRAColorInterpolation;
+var
   ps: TPenStyle;
   ps: TPenStyle;
 begin
 begin
   if FToolbarElementsInitDone then exit;
   if FToolbarElementsInitDone then exit;
@@ -8,10 +8,13 @@ begin
   Panel_ToolbarBackground.PopupMenu := PopupToolbar;
   Panel_ToolbarBackground.PopupMenu := PopupToolbar;
   Perspective_Repeat.OnClick := @Perspective_RepeatClick;
   Perspective_Repeat.OnClick := @Perspective_RepeatClick;
   Perspective_TwoPlanes.OnClick := @Perspective_TwoPlanesClick;
   Perspective_TwoPlanes.OnClick := @Perspective_TwoPlanesClick;
-  Shape_PenColor.OnMouseDown := @Shape_PenColorMouseDown;
-  Shape_BackColor.OnMouseDown := @Shape_BackColorMouseDown;
+  VectorialFill_Pen.OnChooseColor := @VectorialFill_PenChooseColor;
+  VectorialFill_Back.OnChooseColor := @VectorialFill_BackChooseColor;
+  VectorialFill_Pen.OnTextureClick := @VectorialFill_TextureClick;
+  VectorialFill_Back.OnTextureClick := @VectorialFill_TextureClick;
+  VectorialFill_Pen.OnFillChange:=@VectorialFill_PenChange;
+  VectorialFill_Back.OnFillChange:=@VectorialFill_BackChange;
   Image_SwapColors.OnMouseDown := @Image_SwapColorsMouseDown;
   Image_SwapColors.OnMouseDown := @Image_SwapColorsMouseDown;
-  Image_CurrentTexture.OnClick := @Image_CurrentTextureClick;
   Tool_DrawShapeBorder.OnClick := @Tool_DrawShapeBorderClick;
   Tool_DrawShapeBorder.OnClick := @Tool_DrawShapeBorderClick;
   Tool_Aliasing.OnClick := @Tool_AliasingClick;
   Tool_Aliasing.OnClick := @Tool_AliasingClick;
   Tool_FillShape.OnClick := @Tool_FillShapeClick;
   Tool_FillShape.OnClick := @Tool_FillShapeClick;
@@ -54,14 +57,6 @@ begin
   PaintBox_PenPreview.OnMouseMove := @Panel_PenWidthMouseMove;
   PaintBox_PenPreview.OnMouseMove := @Panel_PenWidthMouseMove;
   PaintBox_PenPreview.OnMouseDown := @PaintBox_PenPreviewMouseDown;
   PaintBox_PenPreview.OnMouseDown := @PaintBox_PenPreviewMouseDown;
   PaintBox_PenPreview.OnPaint := @PaintBox_PenPreviewPaint;
   PaintBox_PenPreview.OnPaint := @PaintBox_PenPreviewPaint;
-  Tool_LinearGradient.OnClick := @Tool_LinearGradientClick;
-  Tool_ReflectedGradient.OnClick := @Tool_ReflectedGradientClick;
-  Tool_DiamondGradient.OnClick := @Tool_DiamondGradientClick;
-  Tool_RadialGradient.OnClick := @Tool_RadialGradientClick;
-  Tool_SinGradient.OnClick := @Tool_SinGradientClick;
-  for ci := low(TBGRAColorInterpolation) to high(TBGRAColorInterpolation) do
-    Combo_GradientColorspace.Items.Add(GradientColorSpaceToDisplay(ci));
-  Combo_GradientColorspace.OnChange := @Combo_GradientColorspaceChange;
   Tool_PhongShapeRectangle.OnClick := @Tool_PhongShapeRectangleClick;
   Tool_PhongShapeRectangle.OnClick := @Tool_PhongShapeRectangleClick;
   Tool_PhongShapeRoundRect.OnClick := @Tool_PhongShapeRoundRectClick;
   Tool_PhongShapeRoundRect.OnClick := @Tool_PhongShapeRoundRectClick;
   Tool_PhongShapeSphere.OnClick := @Tool_PhongShapeSphereClick;
   Tool_PhongShapeSphere.OnClick := @Tool_PhongShapeSphereClick;
@@ -84,14 +79,6 @@ begin
   Combo_Ratio.OnChange := @Combo_RatioChange;
   Combo_Ratio.OnChange := @Combo_RatioChange;
 
 
   Panel_LineCap_FullSize := Panel_LineCap.Width;
   Panel_LineCap_FullSize := Panel_LineCap.Width;
-  SpinEdit_PenOpacity.Increment := 15;
-  SpinEdit_PenOpacity.OnChange := @SpinEdit_PenOpacityChange;
-
-  SpinEdit_BackOpacity.Increment := 15;
-  SpinEdit_BackOpacity.OnChange := @SpinEdit_BackOpacityChange;
-
-  SpinEdit_TextureOpacity.Increment := 15;
-  SpinEdit_TextureOpacity.OnChange := @SpinEdit_TextureOpacityChange;
 
 
   SpinEdit_Eraser.Increment := 15;
   SpinEdit_Eraser.Increment := 15;
   SpinEdit_Eraser.OnChange := @SpinEdit_EraserChange;
   SpinEdit_Eraser.OnChange := @SpinEdit_EraserChange;
@@ -207,7 +194,6 @@ begin
   LabelAutosize(Label_Brush);
   LabelAutosize(Label_Brush);
   LabelAutosize(Label_Spacing);
   LabelAutosize(Label_Spacing);
   Image_SwapColors.Hint := Image_SwapColors.Hint + ' (X)';
   Image_SwapColors.Hint := Image_SwapColors.Hint + ' (X)';
-  NoTextureIcon;
 
 
   Tool_CurveModeAuto.Hint := Tool_CurveModeAuto.Hint + ' (A)';
   Tool_CurveModeAuto.Hint := Tool_CurveModeAuto.Hint + ' (A)';
   Tool_CurveModeAngle.Hint := Tool_CurveModeAngle.Hint + ' (X)';
   Tool_CurveModeAngle.Hint := Tool_CurveModeAngle.Hint + ' (X)';
@@ -275,7 +261,6 @@ begin
   ToolManager.LineCapControls.Add(Panel_LineCap);
   ToolManager.LineCapControls.Add(Panel_LineCap);
   ToolManager.EraserControls.Add(Panel_Eraser);
   ToolManager.EraserControls.Add(Panel_Eraser);
   ToolManager.ToleranceControls.Add(Panel_Tolerance);
   ToolManager.ToleranceControls.Add(Panel_Tolerance);
-  ToolManager.GradientControls.Add(Panel_GradientType);
   ToolManager.DeformationControls.Add(Panel_Grid);
   ToolManager.DeformationControls.Add(Panel_Grid);
   ToolManager.TextControls.Add(Panel_Text);
   ToolManager.TextControls.Add(Panel_Text);
   ToolManager.TextShadowControls.Add(Panel_TextShadow);
   ToolManager.TextShadowControls.Add(Panel_TextShadow);
@@ -283,8 +268,7 @@ begin
   ToolManager.PhongControls.Add(Panel_PhongShape);
   ToolManager.PhongControls.Add(Panel_PhongShape);
   ToolManager.AltitudeControls.Add(Panel_Altitude);
   ToolManager.AltitudeControls.Add(Panel_Altitude);
   ToolManager.PerspectiveControls.Add(Panel_PerspectiveOption);
   ToolManager.PerspectiveControls.Add(Panel_PerspectiveOption);
-  ToolManager.PenColorControls.Add(Panel_Color);
-  ToolManager.TextureControls.Add(Panel_Texture);
+  ToolManager.FillControls.Add(Panel_ColorDiff);
   ToolManager.BrushControls.Add(Panel_Brush);
   ToolManager.BrushControls.Add(Panel_Brush);
   ToolManager.RatioControls.Add(Panel_Ratio);
   ToolManager.RatioControls.Add(Panel_Ratio);
 end;
 end;
@@ -315,18 +299,6 @@ begin
   ComboBox_PenStyle.ItemIndex := ord(ToolManager.PenStyle);
   ComboBox_PenStyle.ItemIndex := ord(ToolManager.PenStyle);
 end;
 end;
 
 
-procedure TFMain.UpdateGradientToolbar;
-begin
-  case ToolManager.GradientType of
-  gtLinear: Tool_LinearGradient.Down := true;
-  gtReflected: Tool_ReflectedGradient.Down := true;
-  gtDiamond: Tool_DiamondGradient.Down := true;
-  gtRadial: Tool_RadialGradient.Down := true;
-  end;
-  Tool_SinGradient.Down := ToolManager.GradientSine;
-  Combo_GradientColorspace.ItemIndex := Combo_GradientColorspace.Items.IndexOf(GradientColorSpaceToDisplay(ToolManager.GradientColorspace));
-end;
-
 procedure TFMain.UpdatePenWidthToolbar;
 procedure TFMain.UpdatePenWidthToolbar;
 begin
 begin
   if FInPenWidthChange then exit;
   if FInPenWidthChange then exit;
@@ -470,7 +442,7 @@ begin
   Panel_File.Visible := not LazPaintInstance.Embedded;
   Panel_File.Visible := not LazPaintInstance.Embedded;
 
 
   UpdateToolImage;
   UpdateToolImage;
-  UpdateColorToolbar(true);
+  UpdateFillToolbar(true);
   UpdatePenWidthToolbar;
   UpdatePenWidthToolbar;
   UpdatePenStyleToolbar;
   UpdatePenStyleToolbar;
   UpdateJoinStyleToolbar;
   UpdateJoinStyleToolbar;
@@ -485,7 +457,6 @@ begin
   UpdateToleranceToolbar;
   UpdateToleranceToolbar;
   UpdateFloodfillToolbar;
   UpdateFloodfillToolbar;
   UpdatePerspectiveToolbar;
   UpdatePerspectiveToolbar;
-  UpdateGradientToolbar;
   UpdateDeformationGridToolbar;
   UpdateDeformationGridToolbar;
   UpdateSplineStyleToolbar;
   UpdateSplineStyleToolbar;
   UpdateCurveModeToolbar;
   UpdateCurveModeToolbar;
@@ -493,7 +464,6 @@ begin
   UpdateTextPhongToolbar;
   UpdateTextPhongToolbar;
   UpdateTextFontToolbar;
   UpdateTextFontToolbar;
   UpdateTextShadowToolbar;
   UpdateTextShadowToolbar;
-  SpinEdit_TextureOpacity.Value := ToolManager.TextureOpacity;
   UpdatePhongToolbar;
   UpdatePhongToolbar;
   ComboBox_BrushSelect.Clear;
   ComboBox_BrushSelect.Clear;
   for i := 0 to ToolManager.BrushCount-1 do
   for i := 0 to ToolManager.BrushCount-1 do
@@ -502,32 +472,19 @@ begin
     ComboBox_BrushSelect.ItemIndex := 0;
     ComboBox_BrushSelect.ItemIndex := 0;
 end;
 end;
 
 
-procedure TFMain.UpdateColorToolbar(AUpdateColorDiff: boolean);
+procedure TFMain.UpdateFillToolbar(AUpdateColorDiff: boolean);
 var
 var
   colorChange: boolean;
   colorChange: boolean;
+  prevPenColor, prevBackColor, newPenColor, newBackColor: TBGRAPixel;
 begin
 begin
-  colorChange:= false;
-  if Shape_PenColor.Brush.Color <> BGRAToColor(ToolManager.ForeColor) then
-  begin
-    Shape_PenColor.Brush.Color := BGRAToColor(ToolManager.ForeColor);
-    colorChange:= true;
-  end;
-  if SpinEdit_PenOpacity.Value <> ToolManager.ForeColor.alpha then
-  begin
-    SpinEdit_PenOpacity.Value := ToolManager.ForeColor.alpha;
-    colorChange:= true;
-  end;
+  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;
 
 
-  if Shape_BackColor.Brush.Color <> BGRAToColor(ToolManager.BackColor) then
-  begin
-    Shape_BackColor.Brush.Color := BGRAToColor(ToolManager.BackColor);
-    colorChange:= true;
-  end;
-  if SpinEdit_BackOpacity.Value <> ToolManager.BackColor.alpha then
-  begin
-    SpinEdit_BackOpacity.Value := ToolManager.BackColor.alpha;
-    colorChange:= true;
-  end;
+  colorChange := (newPenColor <> prevPenColor) or (newBackColor <> prevBackColor);
 
 
   if colorChange or AUpdateColorDiff then
   if colorChange or AUpdateColorDiff then
   begin
   begin
@@ -605,33 +562,6 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TFMain.NoTextureIcon;
-var lIcon: TBitmap;
-begin
-  Image_CurrentTexture.Picture.Clear;
-  lIcon := TBitmap.Create;
-  ImageList16.GetBitmap(56,lIcon);
-  Image_CurrentTexture.Picture.Assign(lIcon);
-  lIcon.Free;
-end;
-
-procedure TFMain.UpdateTextureIcon;
-var
-  IconBGRA: TBGRABitmap;
-  IconBmp: TBitmap;
-begin
-  if ToolManager.GetTexture = nil then
-  begin
-    NoTextureIcon;
-    exit;
-  end;
-  IconBGRA := ToolManager.GetTexture.Resample(Image_CurrentTexture.Width,Image_CurrentTexture.Height) as TBGRABitmap;
-  IconBmp := IconBGRA.MakeBitmapCopy(ColorToRGB(clBtnFace));
-  FreeAndNil(IconBGRA);
-  Image_CurrentTexture.Picture.Assign(IconBmp);
-  IconBmp.Free;
-end;
-
 function TFMain.TextSpinEditFocused: boolean;
 function TFMain.TextSpinEditFocused: boolean;
 begin
 begin
   result := SpinEdit_TextSize.Focused or SpinEdit_TextBlur.Focused or SpinEdit_TextShadowX.Focused or
   result := SpinEdit_TextSize.Focused or SpinEdit_TextBlur.Focused or SpinEdit_TextShadowX.Focused or
@@ -694,18 +624,6 @@ begin
       SpinEdit_TextSize.Value, ToolManager.TextFontStyle);
       SpinEdit_TextSize.Value, ToolManager.TextFontStyle);
     UpdateTextSizeIncrement;
     UpdateTextSizeIncrement;
     FInTextFont:= false;
     FInTextFont:= false;
-    FActiveSpinEdit := SpinEdit_TextSize;
-  end;
-end;
-
-procedure TFMain.SpinEdit_TextureOpacityChange(Sender: TObject; AByUser: boolean);
-begin
-  if AByUser and initialized then
-  begin
-    if ToolManager.TextureOpacity = SpinEdit_TextureOpacity.Value then exit;
-    ToolManager.TextureOpacity := SpinEdit_TextureOpacity.Value;
-    UpdateEditPicture(True);
-    FActiveSpinEdit := SpinEdit_TextureOpacity;
   end;
   end;
 end;
 end;
 
 
@@ -718,7 +636,6 @@ begin
     ToolManager.TextShadowBlurRadius := SpinEdit_TextBlur.Value/PenWidthFactor;
     ToolManager.TextShadowBlurRadius := SpinEdit_TextBlur.Value/PenWidthFactor;
     FInTextShadow := false;
     FInTextShadow := false;
     UpdateEditPicture(True);
     UpdateEditPicture(True);
-    FActiveSpinEdit := SpinEdit_TextBlur;
   end;
   end;
 end;
 end;
 
 
@@ -761,7 +678,6 @@ begin
     ToolManager.TextShadowOffset := Point(SpinEdit_TextShadowX.Value, ToolManager.TextShadowOffset.Y);
     ToolManager.TextShadowOffset := Point(SpinEdit_TextShadowX.Value, ToolManager.TextShadowOffset.Y);
     FInTextShadow := false;
     FInTextShadow := false;
     UpdateEditPicture(True);
     UpdateEditPicture(True);
-    FActiveSpinEdit := SpinEdit_TextShadowX;
   end;
   end;
 end;
 end;
 
 
@@ -774,7 +690,6 @@ begin
     ToolManager.TextShadowOffset := Point(ToolManager.TextShadowOffset.X, SpinEdit_TextShadowY.Value);
     ToolManager.TextShadowOffset := Point(ToolManager.TextShadowOffset.X, SpinEdit_TextShadowY.Value);
     FInTextShadow := false;
     FInTextShadow := false;
     UpdateEditPicture(True);
     UpdateEditPicture(True);
-    FActiveSpinEdit := SpinEdit_TextShadowY;
   end;
   end;
 end;
 end;
 
 
@@ -812,62 +727,87 @@ begin
   UpdateEditPicture;
   UpdateEditPicture;
 end;
 end;
 
 
-procedure TFMain.Shape_PenColorMouseDown(Sender: TObject; Button: TMouseButton;
-  Shift: TShiftState; X, Y: Integer);
-begin
-  if LazPaintInstance.ChooseColorVisible and (Button = mbLeft) then
-    LazPaintInstance.ChooseColorTarget := ctForeColor
-  else
-    ShowColorDialogForPen;
+procedure TFMain.VectorialFill_BackChange(Sender: TObject);
+begin
+  if FInFillChange then exit;
+  FInFillChange:= true;
+  ToolManager.BackFill.Assign(VectorialFill_Back);
+  if (VectorialFill_Back.FillType = vftSolid) and
+     (LazPaintInstance.ChooseColorTarget in [ctBackColorStartGrad,ctBackColorEndGrad]) then
+    LazPaintInstance.ChooseColorTarget := ctBackColorSolid else
+  if (VectorialFill_Back.FillType = vftGradient) and
+     (LazPaintInstance.ChooseColorTarget = ctBackColorSolid) then
+    LazPaintInstance.ChooseColorTarget := ctBackColorStartGrad else
+  if (VectorialFill_Back.FillType in [vftSolid,vftGradient]) and
+     (LazPaintInstance.ChooseColorTarget in
+     [ctBackColorSolid,ctBackColorStartGrad,ctBackColorEndGrad]) then
+      LazPaintInstance.ColorToFChooseColor;
+  UpdateEditPicture;
+  FInFillChange:= false;
+end;
+
+procedure TFMain.VectorialFill_PenChange(Sender: TObject);
+begin
+  if FInFillChange then exit;
+  FInFillChange:= true;
+  ToolManager.ForeFill.Assign(VectorialFill_Pen);
+  if (VectorialFill_Pen.FillType = vftSolid) and
+     (LazPaintInstance.ChooseColorTarget in [ctForeColorStartGrad,ctForeColorEndGrad]) then
+    LazPaintInstance.ChooseColorTarget := ctForeColorSolid else
+  if (VectorialFill_Pen.FillType = vftGradient) and
+     (LazPaintInstance.ChooseColorTarget = ctForeColorSolid) then
+    LazPaintInstance.ChooseColorTarget := ctForeColorStartGrad else
+  if (VectorialFill_Pen.FillType in [vftSolid,vftGradient]) and
+     (LazPaintInstance.ChooseColorTarget in
+     [ctForeColorSolid,ctForeColorStartGrad,ctForeColorEndGrad]) then
+      LazPaintInstance.ColorToFChooseColor;
+  UpdateEditPicture;
+  FInFillChange:= false;
 end;
 end;
 
 
-procedure TFMain.ShowColorDialogForPen;
+procedure TFMain.VectorialFill_PenChooseColor(ASender: TObject; AButton: TMouseButton;
+  AColorIndex: integer; var AColorValue: TBGRAPixel; out AHandled: boolean);
+var
+  target: TColorTarget;
 begin
 begin
-  ColorDialog1.Color := BGRAToColor(ToolManager.ForeColor);
-  if ColorDialog1.Execute then
-  begin
-    ToolManager.ForeColor := ColorToBGRA(ColorDialog1.Color,ToolManager.ForeColor.alpha);
-    LazPaintInstance.ColorToFChooseColor;
-    UpdateEditPicture;
+  AHandled := true;
+  case AColorIndex of
+    -1: target := ctForeColorSolid;
+    0: target := ctForeColorStartGrad;
+    1: target := ctForeColorEndGrad;
+    else exit;
   end;
   end;
+  if LazPaintInstance.ChooseColorVisible and (AButton = mbLeft) then
+    LazPaintInstance.ChooseColorTarget := target
+  else
+    ShowColorDialogFor(target);
 end;
 end;
 
 
-procedure TFMain.SpinEdit_PenOpacityChange(Sender: TObject; AByUser: boolean);
+procedure TFMain.VectorialFill_BackChooseColor(ASender: TObject; AButton: TMouseButton;
+  AColorIndex: integer; var AColorValue: TBGRAPixel; out AHandled: boolean);
+var
+  target: TColorTarget;
 begin
 begin
-  if AByUser and initialized then
-  begin
-    if ToolManager.ForeColor.alpha = SpinEdit_PenOpacity.value then exit;
-    with ToolManager.ForeColor do
-      ToolManager.ForeColor := BGRA(red,green,blue,SpinEdit_PenOpacity.value);
-    LazPaintInstance.ColorToFChooseColor;
-    UpdateEditPicture;
+  AHandled := true;
+  case AColorIndex of
+    -1: target := ctBackColorSolid;
+    0: target := ctBackColorStartGrad;
+    1: target := ctBackColorEndGrad;
+    else exit;
   end;
   end;
-end;
-
-procedure TFMain.Shape_BackColorMouseDown(Sender: TObject;
-  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
-begin
-  if LazPaintInstance.ChooseColorVisible and (Button = mbLeft) then
-    LazPaintInstance.ChooseColorTarget := ctBackColor
+  if LazPaintInstance.ChooseColorVisible and (AButton = mbLeft) then
+    LazPaintInstance.ChooseColorTarget := target
   else
   else
-    ShowColorDialogForBack;
+    ShowColorDialogFor(target);
 end;
 end;
 
 
-procedure TFMain.ShowColorDialogForBack;
+procedure TFMain.ShowColorDialogFor(ATarget: TColorTarget);
+var sourceColor: TBGRAPixel;
 begin
 begin
-  ColorDialog1.Color := BGRAToColor(ToolManager.BackColor);
+  sourceColor := LazPaintInstance.GetColor(ATarget);
+  ColorDialog1.Color := sourceColor.ToColor;
   if ColorDialog1.Execute then
   if ColorDialog1.Execute then
-    ToolManager.BackColor := ColorToBGRA(ColorDialog1.Color,ToolManager.BackColor.alpha);
-end;
-
-procedure TFMain.SpinEdit_BackOpacityChange(Sender: TObject; AByUser: boolean);
-begin
-  if AByUser and initialized then
-  begin
-    if ToolManager.BackColor.alpha = SpinEdit_BackOpacity.value then exit;
-    with ToolManager.BackColor do
-      ToolManager.BackColor := BGRA(red,green,blue,SpinEdit_BackOpacity.value);
-  end;
+    LazPaintInstance.SetColor(ATarget, ColorToBGRA(ColorDialog1.Color,sourceColor.alpha));
 end;
 end;
 
 
 procedure TFMain.Image_SwapColorsMouseDown(Sender: TObject; Button: TMouseButton;
 procedure TFMain.Image_SwapColorsMouseDown(Sender: TObject; Button: TMouseButton;
@@ -887,10 +827,27 @@ begin
   end;
   end;
 end;
 end;
 
 
-procedure TFMain.Image_CurrentTextureClick(Sender: TObject);
-begin
-  LazPaintInstance.EditTexture;
-  UpdateEditPicture;
+procedure TFMain.VectorialFill_TextureClick(Sender: TObject);
+var
+  vfc: TLCVectorialFillControl;
+  newTex: TBGRABitmap;
+  target: TVectorialFill;
+begin
+  vfc := Sender as TLCVectorialFillControl;
+  newTex := LazPaintInstance.EditTexture(vfc.Texture);
+  if Assigned(newTex) then
+  begin
+    FInFillChange:= true;
+    vfc.Texture := newTex;
+    FInFillChange:= false;
+    if vfc = VectorialFill_Back then target := ToolManager.BackFill
+    else if vfc = VectorialFill_Pen then target := ToolManager.ForeFill
+    else target := nil;
+    if Assigned(target) then
+      target.SetTexture(newTex, AffineMatrixIdentity, target.TextureOpacity, target.TextureRepetition);
+    newTex.FreeReference;
+    UpdateEditPicture;
+  end;
 end;
 end;
 
 
 procedure TFMain.Tool_AliasingClick(Sender: TObject);
 procedure TFMain.Tool_AliasingClick(Sender: TObject);
@@ -1450,60 +1407,6 @@ begin
   ToolHotSpot.Visible := Image.IsCursor;
   ToolHotSpot.Visible := Image.IsCursor;
 end;
 end;
 
 
-procedure TFMain.Tool_LinearGradientClick(Sender: TObject);
-begin
-  if Tool_LinearGradient.Down then
-  begin
-    ToolManager.GradientType := gtLinear;
-    UpdateEditPicture;
-  end;
-end;
-
-procedure TFMain.Tool_ReflectedGradientClick(Sender: TObject);
-begin
-  if Tool_ReflectedGradient.Down then
-  begin
-    ToolManager.GradientType := gtReflected;
-    UpdateEditPicture;
-  end;
-end;
-
-procedure TFMain.Tool_DiamondGradientClick(Sender: TObject);
-begin
-  if Tool_DiamondGradient.Down then
-  begin
-    ToolManager.GradientType := gtDiamond;
-    UpdateEditPicture;
-  end;
-end;
-
-procedure TFMain.Tool_RadialGradientClick(Sender: TObject);
-begin
-  if Tool_RadialGradient.Down then
-  begin
-    ToolManager.GradientType := gtRadial;
-    UpdateEditPicture;
-  end;
-end;
-
-procedure TFMain.Tool_SinGradientClick(Sender: TObject);
-begin
-  if initialized then
-  begin
-    ToolManager.GradientSine := Tool_SinGradient.Down;
-    UpdateEditPicture;
-  end;
-end;
-
-procedure TFMain.Combo_GradientColorspaceChange(Sender: TObject);
-begin
-  if initialized then
-  begin
-    ToolManager.GradientColorspace := DisplayToGradientColorSpace(Combo_GradientColorspace.Text);
-    UpdateEditPicture(True);
-  end;
-end;
-
 procedure TFMain.SpinEdit_PhongBorderSizeChange(Sender: TObject; AByUser: boolean);
 procedure TFMain.SpinEdit_PhongBorderSizeChange(Sender: TObject; AByUser: boolean);
 begin
 begin
   if AByUser and initialized then
   if AByUser and initialized then

+ 259 - 197
lazpaint/tools/utool.pas

@@ -7,7 +7,8 @@ interface
 uses
 uses
   Classes, Types, SysUtils, Graphics, BGRABitmap, BGRABitmapTypes, uimage, UImageType,
   Classes, Types, SysUtils, Graphics, BGRABitmap, BGRABitmapTypes, uimage, UImageType,
   ULayerAction, LCLType, Controls, UBrushType, UConfig, LCVectorPolyShapes,
   ULayerAction, LCLType, Controls, UBrushType, UConfig, LCVectorPolyShapes,
-  BGRAGradientScanner, BGRALayerOriginal, LCVectorRectShapes, UScripting;
+  BGRAGradientScanner, BGRALayerOriginal, LCVectorRectShapes, UScripting,
+  LCVectorialFill, BGRAGradientOriginal;
 
 
 const
 const
   VK_SNAP = {$IFDEF DARWIN}VK_LWIN{$ELSE}VK_CONTROL{$ENDIF};
   VK_SNAP = {$IFDEF DARWIN}VK_LWIN{$ELSE}VK_CONTROL{$ENDIF};
@@ -34,9 +35,9 @@ const
 function StrToPaintToolType(const s: ansistring): TPaintToolType;
 function StrToPaintToolType(const s: ansistring): TPaintToolType;
 
 
 type
 type
-  TContextualToolbar = (ctColor, ctPenWidth, ctPenStyle, ctAliasing, ctShape, ctEraserOption, ctTolerance,
-    ctGradient, ctDeformation, ctCloseShape, ctLineCap, ctJoinStyle, ctSplineStyle, ctText, ctTextShadow,
-    ctPhong, ctAltitude, ctPerspective, ctBrush, ctTexture, ctRatio);
+  TContextualToolbar = (ctFill, ctPenWidth, ctPenStyle, ctAliasing, ctShape, ctEraserOption, ctTolerance,
+    ctDeformation, ctCloseShape, ctLineCap, ctJoinStyle, ctSplineStyle, ctText, ctTextShadow,
+    ctPhong, ctAltitude, ctPerspective, ctBrush, ctRatio);
   TContextualToolbars = set of TContextualToolbar;
   TContextualToolbars = set of TContextualToolbar;
 
 
 type
 type
@@ -109,6 +110,7 @@ type
     function ToolUp: TRect; virtual;
     function ToolUp: TRect; virtual;
     function ToolCommand({%H-}ACommand: TToolCommand): boolean; virtual;
     function ToolCommand({%H-}ACommand: TToolCommand): boolean; virtual;
     function ToolProvideCommand({%H-}ACommand: TToolCommand): boolean; virtual;
     function ToolProvideCommand({%H-}ACommand: TToolCommand): boolean; virtual;
+    function SuggestGradientBox: TAffineBox; virtual;
     function GetContextualToolbars: TContextualToolbars; virtual;
     function GetContextualToolbars: TContextualToolbars; virtual;
     function GetToolDrawingLayer: TBGRABitmap;
     function GetToolDrawingLayer: TBGRABitmap;
     procedure RestoreBackupDrawingLayer;
     procedure RestoreBackupDrawingLayer;
@@ -162,7 +164,7 @@ type
     FBlackAndWhite: boolean;
     FBlackAndWhite: boolean;
     FScriptContext: TScriptContext;
     FScriptContext: TScriptContext;
     FToolPressure: single;
     FToolPressure: single;
-    FInTool: boolean;
+    FInTool, FInToolUpdate: boolean;
     FCurrentTool : TGenericTool;
     FCurrentTool : TGenericTool;
     FCurrentToolType : TPaintToolType;
     FCurrentToolType : TPaintToolType;
     FToolCurrentCursorPos: TPointF;
     FToolCurrentCursorPos: TPointF;
@@ -173,12 +175,10 @@ type
     FOnToolbarChanged: TNotifyEvent;
     FOnToolbarChanged: TNotifyEvent;
     FOnPopupToolHandler: TOnPopupToolHandler;
     FOnPopupToolHandler: TOnPopupToolHandler;
 
 
-    FForeColor, FBackColor: TBGRAPixel;
+    FForeFill, FBackFill: TVectorialFill;
+    FForeLastGradient, FBackLastGradient: TBGRALayerGradientOriginal;
     FEraserMode: TEraserMode;
     FEraserMode: TEraserMode;
     FEraserAlpha: byte;
     FEraserAlpha: byte;
-    FTexture: TBGRABitmap;
-    FTextureAfterAlpha: TBGRABitmap;
-    FTextureOpactiy: byte;
     FBrushInfoList: TList;
     FBrushInfoList: TList;
     FBrushInfoListChanged: boolean;
     FBrushInfoListChanged: boolean;
     FBrushIndex: integer;
     FBrushIndex: integer;
@@ -203,9 +203,6 @@ type
     FArrowStart,FArrowEnd: TArrowKind;
     FArrowStart,FArrowEnd: TArrowKind;
     FArrowSize: TPointF;
     FArrowSize: TPointF;
     FSplineStyle: TSplineStyle;
     FSplineStyle: TSplineStyle;
-    FGradientType: TGradientType;
-    FGradientSine: boolean;
-    FGradientColorspace: TBGRAColorInterpolation;
     FPhongShapeAltitude: integer;
     FPhongShapeAltitude: integer;
     FPhongShapeBorderSize: integer;
     FPhongShapeBorderSize: integer;
     FPhongShapeKind: TPhongShapeKind;
     FPhongShapeKind: TPhongShapeKind;
@@ -216,9 +213,8 @@ type
     FPerspectiveOptions: TPerspectiveOptions;
     FPerspectiveOptions: TPerspectiveOptions;
     FShapeRatio: Single;
     FShapeRatio: Single;
 
 
-    FOnColorChanged: TNotifyEvent;
+    FOnFillChanged: TNotifyEvent;
     FOnEraserChanged: TNotifyEvent;
     FOnEraserChanged: TNotifyEvent;
-    FOnGradientChanged: TNotifyEvent;
     FOnJoinStyleChanged: TNotifyEvent;
     FOnJoinStyleChanged: TNotifyEvent;
     FOnLineCapChanged: TNotifyEvent;
     FOnLineCapChanged: TNotifyEvent;
     FOnPenStyleChanged: TNotifyEvent;
     FOnPenStyleChanged: TNotifyEvent;
@@ -230,13 +226,14 @@ type
     FOnTextOutlineChanged: TNotifyEvent;
     FOnTextOutlineChanged: TNotifyEvent;
     FOnTextPhongChanged, FOnLightChanged: TNotifyEvent;
     FOnTextPhongChanged, FOnLightChanged: TNotifyEvent;
     FOnTextShadowChanged: TNotifyEvent;
     FOnTextShadowChanged: TNotifyEvent;
-    FOnTextureChanged: TNotifyEvent;
     FOnShapeOptionChanged, FOnShapeRatioChanged: TNotifyEvent;
     FOnShapeOptionChanged, FOnShapeRatioChanged: TNotifyEvent;
     FOnDeformationGridChanged: TNotifyEvent;
     FOnDeformationGridChanged: TNotifyEvent;
     FOnToleranceChanged: TNotifyEvent;
     FOnToleranceChanged: TNotifyEvent;
     FOnFloodFillOptionChanged: TNotifyEvent;
     FOnFloodFillOptionChanged: TNotifyEvent;
     FOnPerspectiveOptionChanged: TNotifyEvent;
     FOnPerspectiveOptionChanged: TNotifyEvent;
 
 
+    procedure BackFillChange(ASender: TObject;
+      var ADiff: TCustomVectorialFillDiff);
     function GetCursor: TCursor;
     function GetCursor: TCursor;
     function GetBackColor: TBGRAPixel;
     function GetBackColor: TBGRAPixel;
     function GetBrushAt(AIndex: integer): TLazPaintBrush;
     function GetBrushAt(AIndex: integer): TLazPaintBrush;
@@ -253,6 +250,8 @@ type
     function GetTextFontSize: single;
     function GetTextFontSize: single;
     function GetTextFontStyle: TFontStyles;
     function GetTextFontStyle: TFontStyles;
     function GetTextureOpacity: byte;
     function GetTextureOpacity: byte;
+    procedure ForeFillChange({%H-}ASender: TObject;
+      var ADiff: TCustomVectorialFillDiff);
     function ScriptGetAliasing(AVars: TVariableSet): TScriptResult;
     function ScriptGetAliasing(AVars: TVariableSet): TScriptResult;
     function ScriptGetArrowEnd(AVars: TVariableSet): TScriptResult;
     function ScriptGetArrowEnd(AVars: TVariableSet): TScriptResult;
     function ScriptGetArrowSize(AVars: TVariableSet): TScriptResult;
     function ScriptGetArrowSize(AVars: TVariableSet): TScriptResult;
@@ -269,13 +268,19 @@ type
     function ScriptGetFontName(AVars: TVariableSet): TScriptResult;
     function ScriptGetFontName(AVars: TVariableSet): TScriptResult;
     function ScriptGetFontSize(AVars: TVariableSet): TScriptResult;
     function ScriptGetFontSize(AVars: TVariableSet): TScriptResult;
     function ScriptGetFontStyle(AVars: TVariableSet): TScriptResult;
     function ScriptGetFontStyle(AVars: TVariableSet): TScriptResult;
-    function ScriptGetGradientColorspace(AVars: TVariableSet): TScriptResult;
-    function ScriptGetGradientSine(AVars: TVariableSet): TScriptResult;
-    function ScriptGetGradientType(AVars: TVariableSet): TScriptResult;
+    function ScriptGetGradientColorspace(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptGetGradientRepetition(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptGetGradientType(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptGetBackGradientColorspace(AVars: TVariableSet): TScriptResult;
+    function ScriptGetBackGradientRepetition(AVars: TVariableSet): TScriptResult;
+    function ScriptGetBackGradientType(AVars: TVariableSet): TScriptResult;
+    function ScriptGetForeGradientColorspace(AVars: TVariableSet): TScriptResult;
+    function ScriptGetForeGradientRepetition(AVars: TVariableSet): TScriptResult;
+    function ScriptGetForeGradientType(AVars: TVariableSet): TScriptResult;
     function ScriptGetJoinStyle(AVars: TVariableSet): TScriptResult;
     function ScriptGetJoinStyle(AVars: TVariableSet): TScriptResult;
     function ScriptGetLightPosition(AVars: TVariableSet): TScriptResult;
     function ScriptGetLightPosition(AVars: TVariableSet): TScriptResult;
     function ScriptGetLineCap(AVars: TVariableSet): TScriptResult;
     function ScriptGetLineCap(AVars: TVariableSet): TScriptResult;
-    function ScriptGetPenColor(AVars: TVariableSet): TScriptResult;
+    function ScriptGetForeColor(AVars: TVariableSet): TScriptResult;
     function ScriptGetPenStyle(AVars: TVariableSet): TScriptResult;
     function ScriptGetPenStyle(AVars: TVariableSet): TScriptResult;
     function ScriptGetPenWidth(AVars: TVariableSet): TScriptResult;
     function ScriptGetPenWidth(AVars: TVariableSet): TScriptResult;
     function ScriptGetPerspectiveOptions(AVars: TVariableSet): TScriptResult;
     function ScriptGetPerspectiveOptions(AVars: TVariableSet): TScriptResult;
@@ -304,13 +309,19 @@ type
     function ScriptSetFontName(AVars: TVariableSet): TScriptResult;
     function ScriptSetFontName(AVars: TVariableSet): TScriptResult;
     function ScriptSetFontSize(AVars: TVariableSet): TScriptResult;
     function ScriptSetFontSize(AVars: TVariableSet): TScriptResult;
     function ScriptSetFontStyle(AVars: TVariableSet): TScriptResult;
     function ScriptSetFontStyle(AVars: TVariableSet): TScriptResult;
-    function ScriptSetGradientColorspace(AVars: TVariableSet): TScriptResult;
-    function ScriptSetGradientSine(AVars: TVariableSet): TScriptResult;
-    function ScriptSetGradientType(AVars: TVariableSet): TScriptResult;
+    function ScriptSetGradientColorspace(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptSetGradientRepetition(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptSetGradientType(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+    function ScriptSetBackGradientColorspace(AVars: TVariableSet): TScriptResult;
+    function ScriptSetBackGradientRepetition(AVars: TVariableSet): TScriptResult;
+    function ScriptSetBackGradientType(AVars: TVariableSet): TScriptResult;
+    function ScriptSetForeGradientColorspace(AVars: TVariableSet): TScriptResult;
+    function ScriptSetForeGradientRepetition(AVars: TVariableSet): TScriptResult;
+    function ScriptSetForeGradientType(AVars: TVariableSet): TScriptResult;
     function ScriptSetJoinStyle(AVars: TVariableSet): TScriptResult;
     function ScriptSetJoinStyle(AVars: TVariableSet): TScriptResult;
     function ScriptSetLightPosition(AVars: TVariableSet): TScriptResult;
     function ScriptSetLightPosition(AVars: TVariableSet): TScriptResult;
     function ScriptSetLineCap(AVars: TVariableSet): TScriptResult;
     function ScriptSetLineCap(AVars: TVariableSet): TScriptResult;
-    function ScriptSetPenColor(AVars: TVariableSet): TScriptResult;
+    function ScriptSetForeColor(AVars: TVariableSet): TScriptResult;
     function ScriptSetPenStyle(AVars: TVariableSet): TScriptResult;
     function ScriptSetPenStyle(AVars: TVariableSet): TScriptResult;
     function ScriptSetPenWidth(AVars: TVariableSet): TScriptResult;
     function ScriptSetPenWidth(AVars: TVariableSet): TScriptResult;
     function ScriptSetPerspectiveOptions(AVars: TVariableSet): TScriptResult;
     function ScriptSetPerspectiveOptions(AVars: TVariableSet): TScriptResult;
@@ -336,9 +347,6 @@ type
     procedure SetEraserMode(AValue: TEraserMode);
     procedure SetEraserMode(AValue: TEraserMode);
     procedure SetFloodFillOptions(AValue: TFloodFillOptions);
     procedure SetFloodFillOptions(AValue: TFloodFillOptions);
     procedure SetForeColor(AValue: TBGRAPixel);
     procedure SetForeColor(AValue: TBGRAPixel);
-    procedure SetGradientColorspace(AValue: TBGRAColorInterpolation);
-    procedure SetGradientSine(AValue: boolean);
-    procedure SetGradientType(AValue: TGradientType);
     procedure SetJoinStyle(AValue: TPenJoinStyle);
     procedure SetJoinStyle(AValue: TPenJoinStyle);
     procedure SetLightAltitude(AValue: integer);
     procedure SetLightAltitude(AValue: integer);
     procedure SetLightPosition(AValue: TPointF);
     procedure SetLightPosition(AValue: TPointF);
@@ -357,7 +365,6 @@ type
     procedure SetTextShadow(AValue: boolean);
     procedure SetTextShadow(AValue: boolean);
     procedure SetTextShadowBlurRadius(AValue: single);
     procedure SetTextShadowBlurRadius(AValue: single);
     procedure SetTextShadowOffset(AValue: TPoint);
     procedure SetTextShadowOffset(AValue: TPoint);
-    procedure SetTextureOpacity(AValue: byte);
     procedure SetTolerance(AValue: byte);
     procedure SetTolerance(AValue: byte);
     procedure ToolCloseAndReopenImmediatly;
     procedure ToolCloseAndReopenImmediatly;
   protected
   protected
@@ -371,9 +378,9 @@ type
     BitmapToVirtualScreen: TBitmapToVirtualScreenFunction;
     BitmapToVirtualScreen: TBitmapToVirtualScreenFunction;
     PenWidthControls, AliasingControls, EraserControls, ToleranceControls,
     PenWidthControls, AliasingControls, EraserControls, ToleranceControls,
     ShapeControls, PenStyleControls, JoinStyleControls, SplineStyleControls,
     ShapeControls, PenStyleControls, JoinStyleControls, SplineStyleControls,
-    CloseShapeControls, LineCapControls, GradientControls, DeformationControls,
+    CloseShapeControls, LineCapControls, DeformationControls,
     TextControls, TextShadowControls, PhongControls, AltitudeControls,
     TextControls, TextShadowControls, PhongControls, AltitudeControls,
-    PerspectiveControls,PenColorControls,TextureControls,
+    PerspectiveControls,FillControls,
     BrushControls, RatioControls: TList;
     BrushControls, RatioControls: TList;
 
 
     constructor Create(AImage: TLazPaintImage; AConfigProvider: IConfigProvider;
     constructor Create(AImage: TLazPaintImage; AConfigProvider: IConfigProvider;
@@ -419,13 +426,9 @@ type
 
 
     procedure RenderTool(formBitmap: TBGRABitmap);
     procedure RenderTool(formBitmap: TBGRABitmap);
     function GetRenderBounds(VirtualScreenWidth, VirtualScreenHeight: integer): TRect;
     function GetRenderBounds(VirtualScreenWidth, VirtualScreenHeight: integer): TRect;
+    function SuggestGradientBox: TAffineBox;
 
 
     procedure SwapToolColors;
     procedure SwapToolColors;
-    procedure SetTexture(ATexture: TBGRABitmap); overload;
-    procedure SetTexture(ATexture: TBGRABitmap; AOpacity: byte); overload;
-    function GetTextureAfterAlpha: TBGRABitmap;
-    function GetTexture: TBGRABitmap;
-    function BorrowTexture: TBGRABitmap;
     procedure AddBrush(brush: TLazPaintBrush);
     procedure AddBrush(brush: TLazPaintBrush);
     procedure RemoveBrushAt(index: integer);
     procedure RemoveBrushAt(index: integer);
     procedure SetTextFont(AName: string; ASize: single; AStyle: TFontStyles);
     procedure SetTextFont(AName: string; ASize: single; AStyle: TFontStyles);
@@ -441,13 +444,12 @@ type
     property ToolSleeping: boolean read GetToolSleeping;
     property ToolSleeping: boolean read GetToolSleeping;
     property Cursor: TCursor read GetCursor;
     property Cursor: TCursor read GetCursor;
 
 
+    property ForeFill: TVectorialFill read FForeFill;
+    property BackFill: TVectorialFill read FBackFill;
     property ForeColor: TBGRAPixel read GetForeColor write SetForeColor;
     property ForeColor: TBGRAPixel read GetForeColor write SetForeColor;
     property BackColor: TBGRAPixel read GetBackColor write SetBackColor;
     property BackColor: TBGRAPixel read GetBackColor write SetBackColor;
     property EraserMode: TEraserMode read FEraserMode write SetEraserMode;
     property EraserMode: TEraserMode read FEraserMode write SetEraserMode;
     property EraserAlpha: byte read FEraserAlpha write SetEraserAlpha;
     property EraserAlpha: byte read FEraserAlpha write SetEraserAlpha;
-    property Texture: TBGRABitmap read GetTexture write SetTexture;
-    property TextureAfterAlpha: TBGRABitmap read GetTextureAfterAlpha;
-    property TextureOpacity: byte read GetTextureOpacity write SetTextureOpacity;
     property PenWidth: single read GetPenWidth write SetPenWidth;
     property PenWidth: single read GetPenWidth write SetPenWidth;
     property PenStyle: TPenStyle read FPenStyle write SetPenStyle;
     property PenStyle: TPenStyle read FPenStyle write SetPenStyle;
     property JoinStyle: TPenJoinStyle read FJoinStyle write SetJoinStyle;
     property JoinStyle: TPenJoinStyle read FJoinStyle write SetJoinStyle;
@@ -478,9 +480,6 @@ type
     property ArrowEnd: TArrowKind read FArrowEnd write SetArrowEnd;
     property ArrowEnd: TArrowKind read FArrowEnd write SetArrowEnd;
     property ArrowSize: TPointF read FArrowSize write SetArrowSize;
     property ArrowSize: TPointF read FArrowSize write SetArrowSize;
     property SplineStyle: TSplineStyle read FSplineStyle write SetSplineStyle;
     property SplineStyle: TSplineStyle read FSplineStyle write SetSplineStyle;
-    property GradientType: TGradientType read FGradientType write SetGradientType;
-    property GradientSine: boolean read FGradientSine write SetGradientSine;
-    property GradientColorspace: TBGRAColorInterpolation read FGradientColorspace write SetGradientColorspace;
     property PhongShapeAltitude: integer read FPhongShapeAltitude write SetPhongShapeAltitude;
     property PhongShapeAltitude: integer read FPhongShapeAltitude write SetPhongShapeAltitude;
     property PhongShapeBorderSize: integer read FPhongShapeBorderSize write SetPhongShapeBorderSize;
     property PhongShapeBorderSize: integer read FPhongShapeBorderSize write SetPhongShapeBorderSize;
     property PhongShapeKind: TPhongShapeKind read FPhongShapeKind write SetPhongShapeKind;
     property PhongShapeKind: TPhongShapeKind read FPhongShapeKind write SetPhongShapeKind;
@@ -497,8 +496,7 @@ type
     property OnToolbarChanged: TNotifyEvent read FOnToolbarChanged write FOnToolbarChanged;
     property OnToolbarChanged: TNotifyEvent read FOnToolbarChanged write FOnToolbarChanged;
     property OnPopup: TOnPopupToolHandler read FOnPopupToolHandler write FOnPopupToolHandler;
     property OnPopup: TOnPopupToolHandler read FOnPopupToolHandler write FOnPopupToolHandler;
     property OnEraserChanged: TNotifyEvent read FOnEraserChanged write FOnEraserChanged;
     property OnEraserChanged: TNotifyEvent read FOnEraserChanged write FOnEraserChanged;
-    property OnTextureChanged: TNotifyEvent read FOnTextureChanged write FOnTextureChanged;
-    property OnColorChanged: TNotifyEvent read FOnColorChanged write FOnColorChanged;
+    property OnFillChanged: TNotifyEvent read FOnFillChanged write FOnFillChanged;
     property OnPenWidthChanged: TNotifyEvent read FOnPenWidthChanged write FOnPenWidthChanged;
     property OnPenWidthChanged: TNotifyEvent read FOnPenWidthChanged write FOnPenWidthChanged;
     property OnBrushChanged: TNotifyEvent read FOnBrushChanged write FOnBrushChanged;
     property OnBrushChanged: TNotifyEvent read FOnBrushChanged write FOnBrushChanged;
     property OnBrushListChanged: TNotifyEvent read FOnBrushListChanged write FOnBrushListChanged;
     property OnBrushListChanged: TNotifyEvent read FOnBrushListChanged write FOnBrushListChanged;
@@ -514,7 +512,6 @@ type
     property OnTextShadowChanged: TNotifyEvent read FOnTextShadowChanged write FOnTextShadowChanged;
     property OnTextShadowChanged: TNotifyEvent read FOnTextShadowChanged write FOnTextShadowChanged;
     property OnLineCapChanged: TNotifyEvent read FOnLineCapChanged write FOnLineCapChanged;
     property OnLineCapChanged: TNotifyEvent read FOnLineCapChanged write FOnLineCapChanged;
     property OnSplineStyleChanged: TNotifyEvent read FOnSplineStyleChanged write FOnSplineStyleChanged;
     property OnSplineStyleChanged: TNotifyEvent read FOnSplineStyleChanged write FOnSplineStyleChanged;
-    property OnGradientChanged: TNotifyEvent read FOnGradientChanged write FOnGradientChanged;
     property OnPhongShapeChanged: TNotifyEvent read FOnPhongShapeChanged write FOnPhongShapeChanged;
     property OnPhongShapeChanged: TNotifyEvent read FOnPhongShapeChanged write FOnPhongShapeChanged;
     property OnDeformationGridChanged: TNotifyEvent read FOnDeformationGridChanged write FOnDeformationGridChanged;
     property OnDeformationGridChanged: TNotifyEvent read FOnDeformationGridChanged write FOnDeformationGridChanged;
     property OnToleranceChanged: TNotifyEvent read FOnToleranceChanged write FOnToleranceChanged;
     property OnToleranceChanged: TNotifyEvent read FOnToleranceChanged write FOnToleranceChanged;
@@ -528,7 +525,7 @@ function ToolPopupMessageToStr(AMessage :TToolPopupMessage; AKey: Word = 0): str
 implementation
 implementation
 
 
 uses UGraph, LCScaleDPI, LazPaintType, UCursors, BGRATextFX, ULoading, UResourceStrings,
 uses UGraph, LCScaleDPI, LazPaintType, UCursors, BGRATextFX, ULoading, UResourceStrings,
-  BGRATransform, LCVectorOriginal, BGRAGradientOriginal, BGRASVGOriginal, math;
+  BGRATransform, LCVectorOriginal, BGRASVGOriginal, math;
 
 
 function StrToPaintToolType(const s: ansistring): TPaintToolType;
 function StrToPaintToolType(const s: ansistring): TPaintToolType;
 var pt: TPaintToolType;
 var pt: TPaintToolType;
@@ -915,9 +912,21 @@ begin
   result := false;
   result := false;
 end;
 end;
 
 
+function TGenericTool.SuggestGradientBox: TAffineBox;
+var
+  m: TAffineMatrix;
+begin
+  result := TAffineBox.AffineBox(RectF(PointF(0,0),PointF(Manager.Image.Width,Manager.Image.Height)));
+  if not IsSelectingTool and Manager.Image.SelectionMaskEmpty then
+  begin
+    m := Manager.Image.LayerOriginalMatrix[Manager.Image.CurrentLayerIndex];
+    result := AffineMatrixInverse(m)*result;
+  end;
+end;
+
 function TGenericTool.GetContextualToolbars: TContextualToolbars;
 function TGenericTool.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  result := [ctColor,ctTexture];
+  result := [ctFill];
 end;
 end;
 
 
 function TGenericTool.GetToolDrawingLayer: TBGRABitmap;
 function TGenericTool.GetToolDrawingLayer: TBGRABitmap;
@@ -1027,13 +1036,7 @@ end;
 
 
 procedure TToolManager.SetBackColor(AValue: TBGRAPixel);
 procedure TToolManager.SetBackColor(AValue: TBGRAPixel);
 begin
 begin
-  if (AValue.red = FBackColor.red) and
-     (AValue.green = FBackColor.green) and
-     (AValue.blue = FBackColor.blue) and
-     (AValue.alpha = FBackColor.alpha) then exit;
-  FBackColor := AValue;
-  ToolUpdate;
-  if Assigned(FOnColorChanged) then FOnColorChanged(self);
+  FBackFill.SolidColor := AValue;
 end;
 end;
 
 
 procedure TToolManager.SetDeformationGridMode(AValue: TDeformationGridMode);
 procedure TToolManager.SetDeformationGridMode(AValue: TDeformationGridMode);
@@ -1070,37 +1073,7 @@ end;
 
 
 procedure TToolManager.SetForeColor(AValue: TBGRAPixel);
 procedure TToolManager.SetForeColor(AValue: TBGRAPixel);
 begin
 begin
-  if (AValue.red = FForeColor.red) and
-     (AValue.green = FForeColor.green) and
-     (AValue.blue = FForeColor.blue) and
-     (AValue.alpha = FForeColor.alpha) then exit;
-  FForeColor := AValue;
-  ToolUpdate;
-  if Assigned(FOnColorChanged) then FOnColorChanged(self);
-end;
-
-procedure TToolManager.SetGradientColorspace(AValue: TBGRAColorInterpolation);
-begin
-  if FGradientColorspace=AValue then Exit;
-  FGradientColorspace:=AValue;
-  ToolUpdate;
-  if Assigned(FOnGradientChanged) then FOnGradientChanged(self);
-end;
-
-procedure TToolManager.SetGradientSine(AValue: boolean);
-begin
-  if FGradientSine=AValue then Exit;
-  FGradientSine:=AValue;
-  ToolUpdate;
-  if Assigned(FOnGradientChanged) then FOnGradientChanged(self);
-end;
-
-procedure TToolManager.SetGradientType(AValue: TGradientType);
-begin
-  if FGradientType=AValue then Exit;
-  FGradientType:=AValue;
-  ToolUpdate;
-  if Assigned(FOnGradientChanged) then FOnGradientChanged(self);
+  FForeFill.SolidColor := AValue;
 end;
 end;
 
 
 procedure TToolManager.SetJoinStyle(AValue: TPenJoinStyle);
 procedure TToolManager.SetJoinStyle(AValue: TPenJoinStyle);
@@ -1266,15 +1239,6 @@ begin
   if Assigned(FOnTextShadowChanged) then FOnTextShadowChanged(self);
   if Assigned(FOnTextShadowChanged) then FOnTextShadowChanged(self);
 end;
 end;
 
 
-procedure TToolManager.SetTextureOpacity(AValue: byte);
-begin
-  if AValue = FTextureOpactiy then exit;
-  FreeAndNil(FTextureAfterAlpha);
-  FTextureOpactiy := AValue;
-  ToolUpdate;
-  if Assigned(FOnTextureChanged) then FOnTextureChanged(self);
-end;
-
 procedure TToolManager.SetTolerance(AValue: byte);
 procedure TToolManager.SetTolerance(AValue: byte);
 begin
 begin
   if FTolerance=AValue then Exit;
   if FTolerance=AValue then Exit;
@@ -1323,9 +1287,9 @@ end;
 function TToolManager.GetBackColor: TBGRAPixel;
 function TToolManager.GetBackColor: TBGRAPixel;
 begin
 begin
   if BlackAndWhite then
   if BlackAndWhite then
-    result := BGRAToGrayscale(FBackColor)
+    result := BGRAToGrayscale(FBackFill.AverageColor)
   else
   else
-    result := FBackColor;
+    result := FBackFill.AverageColor;
 end;
 end;
 
 
 function TToolManager.GetBrushAt(AIndex: integer): TLazPaintBrush;
 function TToolManager.GetBrushAt(AIndex: integer): TLazPaintBrush;
@@ -1376,12 +1340,25 @@ begin
   if toolCursor <> crDefault then result := toolCursor;
   if toolCursor <> crDefault then result := toolCursor;
 end;
 end;
 
 
+procedure TToolManager.BackFillChange(ASender: TObject;
+  var ADiff: TCustomVectorialFillDiff);
+begin
+  if FInToolUpdate then exit;
+  ToolUpdate;
+  if Assigned(FOnFillChanged) then FOnFillChanged(self);
+  if FBackFill.FillType = vftGradient then
+  begin
+    FBackLastGradient.Free;
+    FBackLastGradient := FBackFill.Gradient.Duplicate as TBGRALayerGradientOriginal;
+  end;
+end;
+
 function TToolManager.GetForeColor: TBGRAPixel;
 function TToolManager.GetForeColor: TBGRAPixel;
 begin
 begin
   if BlackAndWhite then
   if BlackAndWhite then
-    result := BGRAToGrayscale(FForeColor)
+    result := BGRAToGrayscale(FForeFill.AverageColor)
   else
   else
-    result := FForeColor;
+    result := FForeFill.AverageColor;
 end;
 end;
 
 
 function TToolManager.GetMaxDeformationGridSize: TSize;
 function TToolManager.GetMaxDeformationGridSize: TSize;
@@ -1433,7 +1410,20 @@ end;
 
 
 function TToolManager.GetTextureOpacity: byte;
 function TToolManager.GetTextureOpacity: byte;
 begin
 begin
-  result := FTextureOpactiy;
+
+end;
+
+procedure TToolManager.ForeFillChange(ASender: TObject;
+  var ADiff: TCustomVectorialFillDiff);
+begin
+  if FInToolUpdate then exit;
+  ToolUpdate;
+  if Assigned(FOnFillChanged) then FOnFillChanged(self);
+  if FForeFill.FillType = vftGradient then
+  begin
+    FForeLastGradient.Free;
+    FForeLastGradient := FForeFill.Gradient.Duplicate as TBGRALayerGradientOriginal;
+  end;
 end;
 end;
 
 
 function TToolManager.ScriptGetAliasing(AVars: TVariableSet): TScriptResult;
 function TToolManager.ScriptGetAliasing(AVars: TVariableSet): TScriptResult;
@@ -1561,10 +1551,11 @@ begin
   result := srOk;
   result := srOk;
 end;
 end;
 
 
-function TToolManager.ScriptGetGradientColorspace(AVars: TVariableSet): TScriptResult;
+function TToolManager.ScriptGetGradientColorspace(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
 begin
 begin
   result := srOk;
   result := srOk;
-  case GradientColorspace of
+  if AFill.FillType <> vftGradient then result := srException else
+  case AFill.Gradient.ColorInterpolation of
   ciStdRGB: AVars.Strings['Result'] := 'StdRGB';
   ciStdRGB: AVars.Strings['Result'] := 'StdRGB';
   ciLinearRGB: AVars.Strings['Result'] := 'LinearRGB';
   ciLinearRGB: AVars.Strings['Result'] := 'LinearRGB';
   ciLinearHSLPositive: AVars.Strings['Result'] := 'LinearHSLPositive';
   ciLinearHSLPositive: AVars.Strings['Result'] := 'LinearHSLPositive';
@@ -1575,16 +1566,24 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TToolManager.ScriptGetGradientSine(AVars: TVariableSet): TScriptResult;
+function TToolManager.ScriptGetGradientRepetition(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
 begin
 begin
   result := srOk;
   result := srOk;
-  AVars.Booleans['Result'] := GradientSine;
+  if AFill.FillType <> vftGradient then result := srException else
+  case AFill.Gradient.Repetition of
+  grPad: AVars.Strings['Result'] := 'Pad';
+  grRepeat: AVars.Strings['Result'] := 'Repeat';
+  grReflect: AVars.Strings['Result'] := 'Reflect';
+  grSine: AVars.Strings['Result'] := 'Sine';
+  else result := srException;
+  end;
 end;
 end;
 
 
-function TToolManager.ScriptGetGradientType(AVars: TVariableSet): TScriptResult;
+function TToolManager.ScriptGetGradientType(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
 begin
 begin
   result := srOk;
   result := srOk;
-  case GradientType of
+  if AFill.FillType <> vftGradient then result := srException else
+  case AFill.Gradient.GradientType of
   gtLinear: AVars.Strings['Result'] := 'Linear';
   gtLinear: AVars.Strings['Result'] := 'Linear';
   gtReflected: AVars.Strings['Result'] := 'Reflected';
   gtReflected: AVars.Strings['Result'] := 'Reflected';
   gtDiamond: AVars.Strings['Result'] := 'Diamond';
   gtDiamond: AVars.Strings['Result'] := 'Diamond';
@@ -1594,6 +1593,36 @@ begin
   end;
   end;
 end;
 end;
 
 
+function TToolManager.ScriptGetBackGradientColorspace(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetGradientColorspace(AVars, FBackFill);
+end;
+
+function TToolManager.ScriptGetBackGradientRepetition(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetGradientRepetition(AVars, FBackFill);
+end;
+
+function TToolManager.ScriptGetBackGradientType(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetGradientType(AVars, FBackFill);
+end;
+
+function TToolManager.ScriptGetForeGradientColorspace(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetGradientColorspace(AVars, FForeFill);
+end;
+
+function TToolManager.ScriptGetForeGradientRepetition(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetGradientRepetition(AVars, FForeFill);
+end;
+
+function TToolManager.ScriptGetForeGradientType(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptGetGradientType(AVars, FForeFill);
+end;
+
 function TToolManager.ScriptGetJoinStyle(AVars: TVariableSet): TScriptResult;
 function TToolManager.ScriptGetJoinStyle(AVars: TVariableSet): TScriptResult;
 begin
 begin
   result := srOk;
   result := srOk;
@@ -1622,7 +1651,7 @@ begin
   result := srOk;
   result := srOk;
 end;
 end;
 
 
-function TToolManager.ScriptGetPenColor(AVars: TVariableSet): TScriptResult;
+function TToolManager.ScriptGetForeColor(AVars: TVariableSet): TScriptResult;
 begin
 begin
   AVars.Pixels['Result'] := ForeColor;
   AVars.Pixels['Result'] := ForeColor;
   result := srOk;
   result := srOk;
@@ -1926,37 +1955,93 @@ begin
   result := srOk;
   result := srOk;
 end;
 end;
 
 
-function TToolManager.ScriptSetGradientColorspace(AVars: TVariableSet): TScriptResult;
+function TToolManager.ScriptSetGradientColorspace(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
 begin
 begin
+  if AFill.FillType <> vftGradient then exit(srException);
   result := srOk;
   result := srOk;
   case AVars.Strings['Colorspace'] of
   case AVars.Strings['Colorspace'] of
-  'StdRGB': GradientColorspace := ciStdRGB;
-  'LinearRGB': GradientColorspace := ciLinearRGB;
-  'LinearHSLPositive': GradientColorspace := ciLinearHSLPositive;
-  'LinearHSLNegative': GradientColorspace := ciLinearHSLNegative;
-  'GSBPositive': GradientColorspace := ciGSBPositive;
-  'GSBNegative': GradientColorspace := ciGSBNegative;
+  'StdRGB': AFill.Gradient.ColorInterpolation:= ciStdRGB;
+  'LinearRGB': AFill.Gradient.ColorInterpolation:= ciLinearRGB;
+  'LinearHSLPositive': AFill.Gradient.ColorInterpolation:= ciLinearHSLPositive;
+  'LinearHSLNegative': AFill.Gradient.ColorInterpolation:= ciLinearHSLNegative;
+  'GSBPositive': AFill.Gradient.ColorInterpolation:= ciGSBPositive;
+  'GSBNegative': AFill.Gradient.ColorInterpolation:= ciGSBNegative;
   else result := srInvalidParameters;
   else result := srInvalidParameters;
   end;
   end;
 end;
 end;
 
 
-function TToolManager.ScriptSetGradientSine(AVars: TVariableSet): TScriptResult;
+function TToolManager.ScriptSetGradientRepetition(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
 begin
 begin
+  if AFill.FillType <> vftGradient then exit(srException);
   result := srOk;
   result := srOk;
-  GradientSine:= AVars.Booleans['Enabled'];
+  case AVars.Strings['Repetition'] of
+    'Pad': AFill.Gradient.Repetition:= grPad;
+    'Repeat': AFill.Gradient.Repetition:= grRepeat;
+    'Reflect': AFill.Gradient.Repetition:= grReflect;
+    'Sine': AFill.Gradient.Repetition:= grSine;
+    else result := srInvalidParameters;
+  end;
 end;
 end;
 
 
-function TToolManager.ScriptSetGradientType(AVars: TVariableSet): TScriptResult;
+function TToolManager.ScriptSetGradientType(AVars: TVariableSet; AFill: TVectorialFill): TScriptResult;
+var
+  gt: TGradientType;
+  b: TAffineBox;
 begin
 begin
   result := srOk;
   result := srOk;
   case AVars.Strings['GradientType'] of
   case AVars.Strings['GradientType'] of
-  'Linear': GradientType:= gtLinear;
-  'Reflected': GradientType := gtReflected;
-  'Diamond': GradientType := gtDiamond;
-  'Radial': GradientType := gtRadial;
-  'Angular': GradientType := gtAngular;
+  'Linear': gt := gtLinear;
+  'Reflected': gt := gtReflected;
+  'Diamond': gt := gtDiamond;
+  'Radial': gt := gtRadial;
+  'Angular': gt := gtAngular;
   else result := srInvalidParameters;
   else result := srInvalidParameters;
   end;
   end;
+  if AFill.FillType = vftGradient then
+    AFill.Gradient.GradientType:= gt
+  else
+  begin
+    FBackLastGradient.GradientType:= gt;
+    b := SuggestGradientBox;
+    if gt = gtLinear then FBackLastGradient.Origin := b.TopLeft else
+      FBackLastGradient.Origin := (b.TopLeft+b.BottomRight)*0.5;
+    FBackLastGradient.XAxis := b.BottomRight;
+    FBackLastGradient.YAxis := EmptyPointF;
+    FBackLastGradient.FocalPoint := EmptyPointF;
+    FBackLastGradient.Radius := 1;
+    FBackLastGradient.FocalRadius := 0;
+    AFill.SetGradient(FBackLastGradient, False);
+  end;
+end;
+
+function TToolManager.ScriptSetBackGradientColorspace(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetGradientColorspace(AVars, FBackFill);
+end;
+
+function TToolManager.ScriptSetBackGradientRepetition(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetGradientRepetition(AVars, FBackFill);
+end;
+
+function TToolManager.ScriptSetBackGradientType(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetGradientType(AVars, FBackFill);
+end;
+
+function TToolManager.ScriptSetForeGradientColorspace(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetGradientColorspace(AVars, FForeFill);
+end;
+
+function TToolManager.ScriptSetForeGradientRepetition(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetGradientRepetition(AVars, FForeFill);
+end;
+
+function TToolManager.ScriptSetForeGradientType(AVars: TVariableSet): TScriptResult;
+begin
+  result := ScriptSetGradientType(AVars, FForeFill);
 end;
 end;
 
 
 function TToolManager.ScriptSetJoinStyle(AVars: TVariableSet): TScriptResult;
 function TToolManager.ScriptSetJoinStyle(AVars: TVariableSet): TScriptResult;
@@ -1994,7 +2079,7 @@ begin
   result := srOk;
   result := srOk;
 end;
 end;
 
 
-function TToolManager.ScriptSetPenColor(AVars: TVariableSet): TScriptResult;
+function TToolManager.ScriptSetForeColor(AVars: TVariableSet): TScriptResult;
 begin
 begin
   ForeColor := AVars.Pixels['Color'];
   ForeColor := AVars.Pixels['Color'];
   ToolUpdate;
   ToolUpdate;
@@ -2196,11 +2281,16 @@ begin
   FScriptContext := AScriptContext;
   FScriptContext := AScriptContext;
   RegisterScriptFunctions(True);
   RegisterScriptFunctions(True);
 
 
-  FForeColor := BGRABlack;
-  FBackColor := BGRA(0,0,255);
-  FTexture := nil;
-  FTextureOpactiy:= 255;
-  FTextureAfterAlpha := nil;
+  FForeFill := TVectorialFill.Create;
+  FForeFill.SolidColor := BGRABlack;
+  FForeFill.OnChange:=@ForeFillChange;
+  FBackFill := TVectorialFill.Create;
+  FBackFill.SolidColor := CSSSkyBlue;
+  FBackFill.OnChange:=@BackFillChange;
+  FForeLastGradient:= TBGRALayerGradientOriginal.Create;
+  FForeLastGradient.ColorInterpolation:= ciLinearRGB;
+  FBackLastGradient:= TBGRALayerGradientOriginal.Create;
+  FBackLastGradient.ColorInterpolation:= ciLinearRGB;
   FNormalPenWidth := 5;
   FNormalPenWidth := 5;
   FEraserWidth := 10;
   FEraserWidth := 10;
   FEraserAlpha := 255;
   FEraserAlpha := 255;
@@ -2217,9 +2307,6 @@ begin
   FSplineStyle := ssEasyBezier;
   FSplineStyle := ssEasyBezier;
   FFloodFillOptions := [ffProgressive];
   FFloodFillOptions := [ffProgressive];
   FTolerance := 64;
   FTolerance := 64;
-  FGradientType := gtLinear;
-  FGradientSine := false;
-  FGradientColorspace := ciLinearRGB;
   FTextOutline := False;
   FTextOutline := False;
   FTextOutlineWidth := 2;
   FTextOutlineWidth := 2;
   FTextShadow := false;
   FTextShadow := false;
@@ -2250,15 +2337,13 @@ begin
   SplineStyleControls := TList.Create;
   SplineStyleControls := TList.Create;
   EraserControls := TList.Create;
   EraserControls := TList.Create;
   ToleranceControls := TList.Create;
   ToleranceControls := TList.Create;
-  GradientControls := TList.Create;
   DeformationControls := TList.Create;
   DeformationControls := TList.Create;
   TextControls := TList.Create;
   TextControls := TList.Create;
   TextShadowControls := TList.Create;
   TextShadowControls := TList.Create;
   PhongControls := TList.Create;
   PhongControls := TList.Create;
   AltitudeControls := TList.Create;
   AltitudeControls := TList.Create;
   PerspectiveControls := TList.Create;
   PerspectiveControls := TList.Create;
-  PenColorControls := TList.Create;
-  TextureControls := TList.Create;
+  FillControls := TList.Create;
   BrushControls := TList.Create;
   BrushControls := TList.Create;
   RatioControls := TList.Create;
   RatioControls := TList.Create;
 
 
@@ -2283,15 +2368,13 @@ begin
   SplineStyleControls.Free;
   SplineStyleControls.Free;
   EraserControls.Free;
   EraserControls.Free;
   ToleranceControls.Free;
   ToleranceControls.Free;
-  GradientControls.Free;
   DeformationControls.Free;
   DeformationControls.Free;
   TextControls.Free;
   TextControls.Free;
   TextShadowControls.Free;
   TextShadowControls.Free;
   PhongControls.Free;
   PhongControls.Free;
   AltitudeControls.Free;
   AltitudeControls.Free;
   PerspectiveControls.Free;
   PerspectiveControls.Free;
-  PenColorControls.Free;
-  TextureControls.Free;
+  FillControls.Free;
   BrushControls.Free;
   BrushControls.Free;
   RatioControls.Free;
   RatioControls.Free;
 
 
@@ -2299,9 +2382,8 @@ begin
     BrushAt[i].Free;
     BrushAt[i].Free;
   FBrushInfoList.Free;
   FBrushInfoList.Free;
 
 
-  FTexture.FreeReference;
-  FTexture := nil;
-  FTextureAfterAlpha.Free;
+  FForeFill.Free;
+  FBackFill.Free;
 
 
   RegisterScriptFunctions(False);
   RegisterScriptFunctions(False);
   inherited Destroy;
   inherited Destroy;
@@ -2496,10 +2578,9 @@ begin
   if Assigned(FCurrentTool) then
   if Assigned(FCurrentTool) then
     contextualToolbars := FCurrentTool.GetContextualToolbars
     contextualToolbars := FCurrentTool.GetContextualToolbars
   else
   else
-    contextualToolbars := [ctColor,ctTexture];
+    contextualToolbars := [ctFill];
 
 
-  OrResult(SetControlsVisible(PenColorControls, ctColor in contextualToolbars));
-  OrResult(SetControlsVisible(TextureControls, ctTexture in contextualToolbars));
+  OrResult(SetControlsVisible(FillControls, ctFill in contextualToolbars));
   OrResult(SetControlsVisible(BrushControls, ctBrush in contextualToolbars));
   OrResult(SetControlsVisible(BrushControls, ctBrush in contextualToolbars));
   OrResult(SetControlsVisible(ShapeControls, ctShape in contextualToolbars));
   OrResult(SetControlsVisible(ShapeControls, ctShape in contextualToolbars));
   OrResult(SetControlsVisible(PenWidthControls, (ctPenWidth in contextualToolbars) and (toDrawShape in ShapeOptions)));
   OrResult(SetControlsVisible(PenWidthControls, (ctPenWidth in contextualToolbars) and (toDrawShape in ShapeOptions)));
@@ -2511,7 +2592,6 @@ begin
   OrResult(SetControlsVisible(SplineStyleControls, ctSplineStyle in contextualToolbars));
   OrResult(SetControlsVisible(SplineStyleControls, ctSplineStyle in contextualToolbars));
   OrResult(SetControlsVisible(EraserControls, ctEraserOption in contextualToolbars));
   OrResult(SetControlsVisible(EraserControls, ctEraserOption in contextualToolbars));
   OrResult(SetControlsVisible(ToleranceControls, ctTolerance in contextualToolbars));
   OrResult(SetControlsVisible(ToleranceControls, ctTolerance in contextualToolbars));
-  OrResult(SetControlsVisible(GradientControls, ctGradient in contextualToolbars));
   OrResult(SetControlsVisible(DeformationControls, ctDeformation in contextualToolbars));
   OrResult(SetControlsVisible(DeformationControls, ctDeformation in contextualToolbars));
   OrResult(SetControlsVisible(TextControls, ctText in contextualToolbars));
   OrResult(SetControlsVisible(TextControls, ctText in contextualToolbars));
   OrResult(SetControlsVisible(TextShadowControls, ctTextShadow in contextualToolbars));
   OrResult(SetControlsVisible(TextShadowControls, ctTextShadow in contextualToolbars));
@@ -2547,8 +2627,8 @@ end;
 procedure TToolManager.RegisterScriptFunctions(ARegister: boolean);
 procedure TToolManager.RegisterScriptFunctions(ARegister: boolean);
 begin
 begin
   if not Assigned(FScriptContext) then exit;
   if not Assigned(FScriptContext) then exit;
-  FScriptContext.RegisterScriptFunction('ToolSetPenColor', @ScriptSetPenColor, ARegister);
-  FScriptContext.RegisterScriptFunction('ToolGetPenColor', @ScriptGetPenColor, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetForeColor', @ScriptSetForeColor, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetForeColor', @ScriptGetForeColor, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetBackColor', @ScriptSetBackColor, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetBackColor', @ScriptSetBackColor, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetBackColor', @ScriptGetBackColor, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetBackColor', @ScriptGetBackColor, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetEraserMode', @ScriptSetEraserMode, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetEraserMode', @ScriptSetEraserMode, ARegister);
@@ -2598,12 +2678,18 @@ begin
   FScriptContext.RegisterScriptFunction('ToolGetArrowSize', @ScriptGetArrowSize, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetArrowSize', @ScriptGetArrowSize, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetSplineStyle', @ScriptSetSplineStyle, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetSplineStyle', @ScriptSetSplineStyle, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetSplineStyle', @ScriptGetSplineStyle, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetSplineStyle', @ScriptGetSplineStyle, ARegister);
-  FScriptContext.RegisterScriptFunction('ToolSetGradientType', @ScriptSetGradientType, ARegister);
-  FScriptContext.RegisterScriptFunction('ToolGetGradientType', @ScriptGetGradientType, ARegister);
-  FScriptContext.RegisterScriptFunction('ToolSetGradientSine', @ScriptSetGradientSine, ARegister);
-  FScriptContext.RegisterScriptFunction('ToolGetGradientSine', @ScriptGetGradientSine, ARegister);
-  FScriptContext.RegisterScriptFunction('ToolSetGradientColorspace', @ScriptSetGradientColorspace, ARegister);
-  FScriptContext.RegisterScriptFunction('ToolGetGradientColorspace', @ScriptGetGradientColorspace, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetForeGradientType', @ScriptSetForeGradientType, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetForeGradientType', @ScriptGetForeGradientType, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetForeGradientRepetition', @ScriptSetForeGradientRepetition, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetForeGradientRepetition', @ScriptGetForeGradientRepetition, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetForeGradientColorspace', @ScriptSetForeGradientColorspace, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetForeGradientColorspace', @ScriptGetForeGradientColorspace, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetBackGradientType', @ScriptSetBackGradientType, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetBackGradientType', @ScriptGetBackGradientType, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetBackGradientRepetition', @ScriptSetBackGradientRepetition, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetBackGradientRepetition', @ScriptGetBackGradientRepetition, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolSetBackGradientColorspace', @ScriptSetBackGradientColorspace, ARegister);
+  FScriptContext.RegisterScriptFunction('ToolGetBackGradientColorspace', @ScriptGetBackGradientColorspace, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetPhongShapeAltitude', @ScriptSetPhongShapeAltitude, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetPhongShapeAltitude', @ScriptSetPhongShapeAltitude, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetPhongShapeAltitude', @ScriptGetPhongShapeAltitude, ARegister);
   FScriptContext.RegisterScriptFunction('ToolGetPhongShapeAltitude', @ScriptGetPhongShapeAltitude, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetPhongShapeBorderSize', @ScriptSetPhongShapeBorderSize, ARegister);
   FScriptContext.RegisterScriptFunction('ToolSetPhongShapeBorderSize', @ScriptSetPhongShapeBorderSize, ARegister);
@@ -2662,58 +2748,24 @@ end;
 
 
 procedure TToolManager.SwapToolColors;
 procedure TToolManager.SwapToolColors;
 var
 var
-  tmp: TBGRAPixel;
-begin
-  if (FForeColor.red = FBackColor.red) and
-     (FForeColor.green = FBackColor.green) and
-     (FForeColor.blue = FBackColor.blue) and
-     (FForeColor.alpha = FBackColor.alpha) then exit;
-  tmp := FForeColor;
-  FForeColor := FBackColor;
-  FBackColor := tmp;
-  if Assigned(FOnColorChanged) then FOnColorChanged(self);
-end;
-
-procedure TToolManager.SetTexture(ATexture: TBGRABitmap);
-begin
-  SetTexture(ATexture, TextureOpacity);
-end;
-
-procedure TToolManager.SetTexture(ATexture: TBGRABitmap; AOpacity: byte);
-begin
-  if (ATexture = FTexture) and (AOpacity = FTextureOpactiy) then exit;
-  if ATexture<>FTexture then
+  tmpFill: TVectorialFill;
+begin
+  if FForeFill.Equals(FBackFill) then exit;
+  tmpFill := FForeFill.Duplicate;
+  FForeFill.Assign(FBackFill);
+  FBackFill.Assign(tmpFill);
+  tmpFill.Free;
+  if FForeFill.FillType = vftGradient then
   begin
   begin
-    FTexture.FreeReference;
-    FTexture := ATexture.NewReference as TBGRABitmap;
+    FForeLastGradient.Free;
+    FForeLastGradient := FForeFill.Gradient.Duplicate as TBGRALayerGradientOriginal;
   end;
   end;
-  FTextureOpactiy:= AOpacity;
-  FreeAndNil(FTextureAfterAlpha);
-  ToolUpdate;
-  if Assigned(FOnTextureChanged) then FOnTextureChanged(self);
-end;
-
-function TToolManager.GetTextureAfterAlpha: TBGRABitmap;
-begin
-  if (FTextureAfterAlpha = nil) and (FTexture <> nil) then
+  if FBackFill.FillType = vftGradient then
   begin
   begin
-    FTextureAfterAlpha := FTexture.Duplicate as TBGRABitmap;
-    FTextureAfterAlpha.ApplyGlobalOpacity(FTextureOpactiy);
+    FBackLastGradient.Free;
+    FBackLastGradient := FBackFill.Gradient.Duplicate as TBGRALayerGradientOriginal;
   end;
   end;
-  result := FTextureAfterAlpha;
-end;
-
-function TToolManager.GetTexture: TBGRABitmap;
-begin
-  result := FTexture;
-end;
-
-function TToolManager.BorrowTexture: TBGRABitmap;
-begin
-  result := FTexture;
-  FTexture := nil;
-  FreeAndNil(FTextureAfterAlpha);
-  if Assigned(FOnTextureChanged) then FOnTextureChanged(self);
+  if Assigned(FOnFillChanged) then FOnFillChanged(self);
 end;
 end;
 
 
 procedure TToolManager.AddBrush(brush: TLazPaintBrush);
 procedure TToolManager.AddBrush(brush: TLazPaintBrush);
@@ -2966,6 +3018,7 @@ var changed: TRect;
 begin
 begin
   if FInTool then exit(false);
   if FInTool then exit(false);
   FInTool := true;
   FInTool := true;
+  FInToolUpdate := true;
   try
   try
     if ToolCanBeUsed then
     if ToolCanBeUsed then
       changed := currentTool.ToolUpdate
       changed := currentTool.ToolUpdate
@@ -2978,6 +3031,7 @@ begin
     if result then NotifyImageOrSelectionChanged(CurrentTool.LastToolDrawingLayer, changed);
     if result then NotifyImageOrSelectionChanged(CurrentTool.LastToolDrawingLayer, changed);
   finally
   finally
     FInTool := false;
     FInTool := false;
+    FInToolUpdate := false;
   end;
   end;
 end;
 end;
 
 
@@ -3036,6 +3090,14 @@ begin
     result := EmptyRect;
     result := EmptyRect;
 end;
 end;
 
 
+function TToolManager.SuggestGradientBox: TAffineBox;
+begin
+  if Assigned(CurrentTool) then
+    result := CurrentTool.SuggestGradientBox
+  else
+    result := TAffineBox.AffineBox(RectF(PointF(0,0),PointF(Image.Width,Image.Height)));
+end;
+
 function TToolManager.GetDeformationGridSize: TSize;
 function TToolManager.GetDeformationGridSize: TSize;
 begin
 begin
   result := Size(DeformationGridNbX, DeformationGridNbY);
   result := Size(DeformationGridNbX, DeformationGridNbY);

+ 2 - 2
lazpaint/tools/utoolbasic.pas

@@ -361,7 +361,7 @@ end;
 
 
 function TToolPen.GetContextualToolbars: TContextualToolbars;
 function TToolPen.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor,ctTexture,ctPenWidth,ctAliasing];
+  Result:= [ctFill,ctTexture,ctPenWidth,ctAliasing];
 end;
 end;
 
 
 destructor TToolPen.Destroy;
 destructor TToolPen.Destroy;
@@ -406,7 +406,7 @@ end;
 
 
 function TToolColorPicker.GetContextualToolbars: TContextualToolbars;
 function TToolColorPicker.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor];
+  Result:= [ctFill];
 end;
 end;
 
 
 { TToolHand }
 { TToolHand }

+ 1 - 1
lazpaint/tools/utoolbrush.pas

@@ -216,7 +216,7 @@ end;
 
 
 function TToolBrush.GetContextualToolbars: TContextualToolbars;
 function TToolBrush.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor,ctPenWidth,ctBrush];
+  Result:= [ctFill,ctPenWidth,ctBrush];
 end;
 end;
 
 
 { TToolGenericBrush }
 { TToolGenericBrush }

+ 29 - 5
lazpaint/tools/utooldeformationgrid.pas

@@ -47,6 +47,8 @@ type
   private
   private
     class var FHintShowed: boolean;
     class var FHintShowed: boolean;
     FCurrentBounds: TRect;
     FCurrentBounds: TRect;
+    FLastTexture: TBGRABitmap;
+    FTextureAfterAlpha: TBGRABitmap;
     FAdaptedTexture: TBGRABitmap;
     FAdaptedTexture: TBGRABitmap;
     FCanReadaptTexture: boolean;
     FCanReadaptTexture: boolean;
     FHighQuality: boolean;
     FHighQuality: boolean;
@@ -431,9 +433,9 @@ begin
   begin
   begin
     if ShiftKey then
     if ShiftKey then
     begin
     begin
-      if (Manager.GetTexture <> nil) and (Manager.GetTexture.Height <> 0)
-        and (Manager.GetTexture.Width <> 0) then
-        ratio := Manager.GetTexture.Width/Manager.GetTexture.Height;
+      if (Manager.BackFill.Texture <> nil) and (Manager.BackFill.Texture.Height <> 0)
+        and (Manager.BackFill.Texture.Width <> 0) then
+        ratio := Manager.BackFill.Texture.Width/Manager.BackFill.Texture.Height;
 
 
       newSize := ptF - quad[0];
       newSize := ptF - quad[0];
       avgSize := (abs(newSize.x)+abs(newSize.y))/2;
       avgSize := (abs(newSize.x)+abs(newSize.y))/2;
@@ -539,7 +541,27 @@ end;
 
 
 function TToolTextureMapping.GetTexture: TBGRABitmap;
 function TToolTextureMapping.GetTexture: TBGRABitmap;
 begin
 begin
-  result := Manager.GetTextureAfterAlpha;
+  if Manager.BackFill.Texture = FLastTexture then
+  begin
+    if FTextureAfterAlpha <> nil then
+      result := FTextureAfterAlpha
+    else
+      result := Manager.BackFill.Texture;
+  end
+  else
+  begin
+    if (Manager.BackFill.Texture <> nil) and (Manager.BackFill.TextureOpacity <> 255) then
+    begin
+      FTextureAfterAlpha := Manager.BackFill.Texture.Duplicate as TBGRABitmap;
+      FTextureAfterAlpha.ApplyGlobalOpacity(Manager.BackFill.TextureOpacity);
+      result := FTextureAfterAlpha;
+    end else
+    begin
+      result := Manager.BackFill.Texture;
+      FreeAndNil(FTextureAfterAlpha);
+    end;
+    FLastTexture := Manager.BackFill.Texture;
+  end;
 end;
 end;
 
 
 procedure TToolTextureMapping.OnTryStop(sender: TCustomLayerAction);
 procedure TToolTextureMapping.OnTryStop(sender: TCustomLayerAction);
@@ -609,6 +631,7 @@ begin
   inherited Create(AManager);
   inherited Create(AManager);
   FCurrentBounds := EmptyRect;
   FCurrentBounds := EmptyRect;
   FHighQuality:= False;
   FHighQuality:= False;
+  FLastTexture := nil;
   quadDefined:= false;
   quadDefined:= false;
   definingQuad:= false;
   definingQuad:= false;
 end;
 end;
@@ -745,7 +768,7 @@ end;
 
 
 function TToolTextureMapping.GetContextualToolbars: TContextualToolbars;
 function TToolTextureMapping.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctTexture,ctPerspective];
+  Result:= [ctFill,ctPerspective];
 end;
 end;
 
 
 function TToolTextureMapping.Render(VirtualScreen: TBGRABitmap;
 function TToolTextureMapping.Render(VirtualScreen: TBGRABitmap;
@@ -804,6 +827,7 @@ end;
 destructor TToolTextureMapping.Destroy;
 destructor TToolTextureMapping.Destroy;
 begin
 begin
   ValidateAction;
   ValidateAction;
+  FreeAndNil(FTextureAfterAlpha);
   FreeAndNil(FAdaptedTexture);
   FreeAndNil(FAdaptedTexture);
   inherited Destroy;
   inherited Destroy;
 end;
 end;

+ 2 - 2
lazpaint/tools/utoolfloodfill.pas

@@ -109,7 +109,7 @@ end;
 
 
 function TToolGradient.GetContextualToolbars: TContextualToolbars;
 function TToolGradient.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor, ctGradient];
+  Result:= [ctFill, ctGradient];
 end;
 end;
 
 
 function TToolGradient.SlowShape: boolean;
 function TToolGradient.SlowShape: boolean;
@@ -150,7 +150,7 @@ end;
 
 
 function TToolFloodFill.GetContextualToolbars: TContextualToolbars;
 function TToolFloodFill.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor,ctTexture,ctTolerance];
+  Result:= [ctFill,ctTexture,ctTolerance];
 end;
 end;
 
 
 initialization
 initialization

+ 1 - 1
lazpaint/tools/utoolphong.pas

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

+ 4 - 4
lazpaint/tools/utoolpolygon.pas

@@ -79,7 +79,7 @@ end;
 
 
 function TToolEllipse.GetContextualToolbars: TContextualToolbars;
 function TToolEllipse.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctPenStyle];
+  Result:= [ctFill,ctShape,ctPenWidth,ctPenStyle];
 end;
 end;
 
 
 { TToolRectangle }
 { TToolRectangle }
@@ -91,7 +91,7 @@ end;
 
 
 function TToolRectangle.GetContextualToolbars: TContextualToolbars;
 function TToolRectangle.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctPenStyle,ctJoinStyle];
+  Result:= [ctFill,ctShape,ctPenWidth,ctPenStyle,ctJoinStyle];
 end;
 end;
 
 
 { TToolSpline }
 { TToolSpline }
@@ -172,7 +172,7 @@ end;
 
 
 function TToolSpline.GetContextualToolbars: TContextualToolbars;
 function TToolSpline.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctPenStyle,ctLineCap,ctSplineStyle];
+  Result:= [ctFill,ctShape,ctPenWidth,ctPenStyle,ctLineCap,ctSplineStyle];
 end;
 end;
 
 
 { TToolPolygon }
 { TToolPolygon }
@@ -254,7 +254,7 @@ end;
 
 
 function TToolPolygon.GetContextualToolbars: TContextualToolbars;
 function TToolPolygon.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor,ctTexture,ctShape,ctPenWidth,ctPenStyle,ctJoinStyle,ctLineCap];
+  Result:= [ctFill,ctShape,ctPenWidth,ctPenStyle,ctJoinStyle,ctLineCap];
 end;
 end;
 
 
 initialization
 initialization

+ 1 - 1
lazpaint/tools/utooltext.pas

@@ -216,7 +216,7 @@ end;
 
 
 function TToolText.GetContextualToolbars: TContextualToolbars;
 function TToolText.GetContextualToolbars: TContextualToolbars;
 begin
 begin
-  Result:= [ctColor,ctTexture,ctText,ctTextShadow];
+  Result:= [ctFill,ctTexture,ctText,ctTextShadow];
   if Manager.TextPhong then include(result, ctAltitude);
   if Manager.TextPhong then include(result, ctAltitude);
 end;
 end;
 
 

+ 160 - 231
lazpaint/tools/utoolvectorial.pas

@@ -72,6 +72,7 @@ type
     function ToolKeyUp(var key: Word): TRect; override;
     function ToolKeyUp(var key: Word): TRect; override;
     function ToolCommand(ACommand: TToolCommand): boolean; override;
     function ToolCommand(ACommand: TToolCommand): boolean; override;
     function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
     function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
+    function SuggestGradientBox: TAffineBox; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction):TRect; override;
     function Render(VirtualScreen: TBGRABitmap; {%H-}VirtualScreenWidth, {%H-}VirtualScreenHeight: integer; BitmapToVirtualScreen: TBitmapToVirtualScreenFunction):TRect; override;
     property IsIdle: boolean read GetIsIdle;
     property IsIdle: boolean read GetIsIdle;
     property IsHandDrawing: boolean read GetIsHandDrawing;
     property IsHandDrawing: boolean read GetIsHandDrawing;
@@ -121,7 +122,6 @@ type
     function FixLayerOffset: boolean; override;
     function FixLayerOffset: boolean; override;
     function GetCurrentSplineMode: TToolSplineMode;
     function GetCurrentSplineMode: TToolSplineMode;
     procedure SetCurrentSplineMode(AMode: TToolSplineMode);
     procedure SetCurrentSplineMode(AMode: TToolSplineMode);
-    function IsGradientShape(AShape: TVectorShape): boolean;
     function ConvertToSpline: boolean;
     function ConvertToSpline: boolean;
     function GetEditMode: TEditShapeMode;
     function GetEditMode: TEditShapeMode;
     function InvalidEditMode: boolean;
     function InvalidEditMode: boolean;
@@ -136,6 +136,7 @@ type
     function ToolUp: TRect; override;
     function ToolUp: TRect; override;
     function ToolCommand(ACommand: TToolCommand): boolean; override;
     function ToolCommand(ACommand: TToolCommand): boolean; override;
     function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
     function ToolProvideCommand(ACommand: TToolCommand): boolean; override;
+    function SuggestGradientBox: TAffineBox; override;
     property CurrentSplineMode: TToolSplineMode read GetCurrentSplineMode write SetCurrentSplineMode;
     property CurrentSplineMode: TToolSplineMode read GetCurrentSplineMode write SetCurrentSplineMode;
   end;
   end;
 
 
@@ -200,6 +201,22 @@ begin
   end;
   end;
 end;
 end;
 
 
+procedure AssignFill(ATarget, ASource: TVectorialFill; const ABox: TAffineBox);
+var
+  temp: TVectorialFill;
+begin
+  if ASource.IsFullyTransparent then ATarget.Clear
+  else if ATarget.FillType <> ASource.FillType then
+  begin
+    temp := ATarget.Duplicate;
+    temp.AssignExceptGeometry(ASource);
+    temp.FitGeometry(ABox);
+    ATarget.Assign(temp);
+    temp.Free;
+  end else
+    ATarget.AssignExceptGeometry(ASource);
+end;
+
 { TEditShapeTool }
 { TEditShapeTool }
 
 
 procedure TEditShapeTool.SelectShape(ASender: TObject; AShape: TVectorShape;
 procedure TEditShapeTool.SelectShape(ASender: TObject; AShape: TVectorShape;
@@ -241,93 +258,75 @@ var
 begin
 begin
   m := Manager.Image.LayerOriginalMatrix[Manager.Image.CurrentLayerIndex];
   m := Manager.Image.LayerOriginalMatrix[Manager.Image.CurrentLayerIndex];
   zoom := (VectLen(m[1,1],m[2,1])+VectLen(m[1,2],m[2,2]))/2;
   zoom := (VectLen(m[1,1],m[2,1])+VectLen(m[1,2],m[2,2]))/2;
-  if IsGradientShape(AShape) then
+  if AShape.Usermode in [vsuEditBackFill, vsuEditPenFill] then
+    AShape.Usermode := vsuEdit;
+  opt := Manager.ShapeOptions;
+  if AShape.Fields*[vsfPenFill,vsfBackFill,vsfPenStyle] = [vsfPenFill,vsfBackFill,vsfPenStyle] then
   begin
   begin
-    Manager.ForeColor := AShape.BackFill.Gradient.StartColor;
-    Manager.BackColor := AShape.BackFill.Gradient.EndColor;
-    Manager.GradientType:= AShape.BackFill.Gradient.GradientType;
-    Manager.GradientColorspace:= AShape.BackFill.Gradient.ColorInterpolation;
-    Manager.GradientSine:= AShape.BackFill.Gradient.Repetition = grSine;
-    Manager.SetTexture(nil);
-    AShape.Usermode := vsuEditBackFill;
-  end else
-  begin
-    if AShape.Usermode in [vsuEditBackFill, vsuEditPenFill] then
-      AShape.Usermode := vsuEdit;
-    opt := Manager.ShapeOptions;
-    if AShape.Fields*[vsfPenFill,vsfBackFill,vsfPenStyle] = [vsfPenFill,vsfBackFill,vsfPenStyle] then
-    begin
-      if AShape.BackFill.FillType = vftNone then
-      begin;
-        exclude(opt,toFillShape);
-        doFill := false;
-      end
-      else
-      begin
-        include(opt,toFillShape);
-        doFill := true;
-      end;
-      ps := BGRAToPenStyle(AShape.PenStyle);
-      if (ps = psClear) or (AShape.PenFill.FillType = vftNone) then
-      begin
-        exclude(opt,toDrawShape);
-        doDraw := false;
-      end
-      else
-      begin
-        include(opt,toDrawShape);
-        Manager.PenStyle := ps;
-        doDraw := true;
-      end;
-    end else
+    if AShape.BackFill.FillType = vftNone then
+    begin;
+      exclude(opt,toFillShape);
+      doFill := false;
+    end
+    else
     begin
     begin
-      doDraw := vsfPenFill in AShape.Fields;
-      doFill := vsfBackFill in AShape.Fields;
+      include(opt,toFillShape);
+      doFill := true;
     end;
     end;
-
-    if doDraw then
+    ps := BGRAToPenStyle(AShape.PenStyle);
+    if (ps = psClear) or (AShape.PenFill.FillType = vftNone) then
     begin
     begin
-      case AShape.PenFill.FillType of
-        vftSolid: Manager.ForeColor := AShape.PenFill.SolidColor;
-        vftNone: Manager.ForeColor := BGRA(Manager.ForeColor.red,
-          Manager.ForeColor.green,Manager.ForeColor.blue,0);
-      end;
-    end;
-    if doFill then
+      exclude(opt,toDrawShape);
+      doDraw := false;
+    end
+    else
     begin
     begin
-      case AShape.BackFill.FillType of
-        vftSolid: Manager.BackColor := AShape.BackFill.SolidColor;
-        vftNone: Manager.BackColor := BGRA(Manager.BackColor.red,
-          Manager.BackColor.green,Manager.BackColor.blue,0);
-      end;
+      include(opt,toDrawShape);
+      Manager.PenStyle := ps;
+      doDraw := true;
     end;
     end;
-    if doFill and (AShape.BackFill.FillType = vftTexture) then
-      Manager.SetTexture(AShape.BackFill.Texture,AShape.BackFill.TextureOpacity)
-    else if doDraw and (AShape.PenFill.FillType = vftTexture) then
-      Manager.SetTexture(AShape.PenFill.Texture,AShape.PenFill.TextureOpacity)
+  end else
+  begin
+    doDraw := vsfPenFill in AShape.Fields;
+    doFill := vsfBackFill in AShape.Fields;
+  end;
+
+  if doDraw then
+  begin
+    if AShape.PenFill.FillType = vftNone then
+      Manager.ForeColor := BGRA(Manager.ForeColor.red,
+        Manager.ForeColor.green,Manager.ForeColor.blue,0)
     else
     else
-      Manager.SetTexture(nil);
+      Manager.ForeFill.Assign(AShape.PenFill);
+  end;
+  if doFill then
+  begin
+    if AShape.BackFill.FillType = vftNone then
+      Manager.BackColor := BGRA(Manager.BackColor.red,
+        Manager.BackColor.green,Manager.BackColor.blue,0)
+    else
+      Manager.BackFill.Assign(AShape.BackFill);
+  end;
 
 
-    if toDrawShape in opt then
+  if toDrawShape in opt then
+  begin
+    if vsfPenWidth in AShape.Fields then Manager.PenWidth := AShape.PenWidth*zoom;
+    if vsfJoinStyle in AShape.Fields then Manager.JoinStyle:= AShape.JoinStyle;
+    if AShape is TCustomPolypointShape then
     begin
     begin
-      if vsfPenWidth in AShape.Fields then Manager.PenWidth := AShape.PenWidth*zoom;
-      if vsfJoinStyle in AShape.Fields then Manager.JoinStyle:= AShape.JoinStyle;
-      if AShape is TCustomPolypointShape then
-      begin
-        if TCustomPolypointShape(AShape).Closed then
-          include(opt, toCloseShape)
-        else
-          exclude(opt, toCloseShape);
-        Manager.LineCap := TCustomPolypointShape(AShape).LineCap;
-        Manager.ArrowSize := TCustomPolypointShape(AShape).ArrowSize;
-        Manager.ArrowStart := TCustomPolypointShape(AShape).ArrowStartKind;
-        Manager.ArrowEnd := TCustomPolypointShape(AShape).ArrowEndKind;
-      end;
-      if AShape is TCurveShape then
-        Manager.SplineStyle := TCurveShape(AShape).SplineStyle;
+      if TCustomPolypointShape(AShape).Closed then
+        include(opt, toCloseShape)
+      else
+        exclude(opt, toCloseShape);
+      Manager.LineCap := TCustomPolypointShape(AShape).LineCap;
+      Manager.ArrowSize := TCustomPolypointShape(AShape).ArrowSize;
+      Manager.ArrowStart := TCustomPolypointShape(AShape).ArrowStartKind;
+      Manager.ArrowEnd := TCustomPolypointShape(AShape).ArrowEndKind;
     end;
     end;
-    Manager.ShapeOptions := opt;
+    if AShape is TCurveShape then
+      Manager.SplineStyle := TCurveShape(AShape).SplineStyle;
   end;
   end;
+  Manager.ShapeOptions := opt;
 
 
   if AShape is TTextShape then
   if AShape is TTextShape then
   with TTextShape(AShape) do
   with TTextShape(AShape) do
@@ -342,8 +341,7 @@ begin
       Manager.SetTextOutline(false, Manager.TextOutlineWidth) else
       Manager.SetTextOutline(false, Manager.TextOutlineWidth) else
     begin
     begin
       Manager.SetTextOutline(true, OutlineWidth);
       Manager.SetTextOutline(true, OutlineWidth);
-      if OutlineFill.FillType = vftSolid then
-        Manager.BackColor := OutlineFill.SolidColor;
+      Manager.BackFill.Assign(OutlineFill);
     end;
     end;
   end;
   end;
 
 
@@ -473,126 +471,75 @@ var
   doDraw, doFill: Boolean;
   doDraw, doFill: Boolean;
   m: TAffineMatrix;
   m: TAffineMatrix;
   zoom: Single;
   zoom: Single;
+  gradBox: TAffineBox;
 begin
 begin
   case GetEditMode of
   case GetEditMode of
   esmShape:
   esmShape:
     with GetVectorOriginal do
     with GetVectorOriginal do
     try
     try
       BindOriginalEvent(true);
       BindOriginalEvent(true);
+      gradBox := SelectedShape.SuggestGradientBox(AffineMatrixIdentity);
       m := AffineMatrixInverse(Manager.Image.LayerOriginalMatrix[Manager.Image.CurrentLayerIndex]);
       m := AffineMatrixInverse(Manager.Image.LayerOriginalMatrix[Manager.Image.CurrentLayerIndex]);
       zoom := (VectLen(m[1,1],m[2,1])+VectLen(m[1,2],m[2,2]))/2;
       zoom := (VectLen(m[1,1],m[2,1])+VectLen(m[1,2],m[2,2]))/2;
-      if IsGradientShape(SelectedShape) then
-      begin
-        SelectedShape.BackFill.Gradient.StartColor := Manager.ForeColor;
-        SelectedShape.BackFill.Gradient.EndColor := Manager.BackColor;
-        SelectedShape.BackFill.Gradient.GradientType := Manager.GradientType;
-        SelectedShape.BackFill.Gradient.ColorInterpolation := Manager.GradientColorspace;
-        if (SelectedShape.BackFill.Gradient.Repetition in[grSine,grPad]) or
-          Manager.GradientSine then
-        begin
-          if Manager.GradientSine then
-            SelectedShape.BackFill.Gradient.Repetition := grSine
-          else
-            SelectedShape.BackFill.Gradient.Repetition := grPad;
-        end;
-      end else
+      if SelectedShape.Fields*[vsfPenFill,vsfBackFill,vsfPenStyle] = [vsfPenFill,vsfBackFill,vsfPenStyle] then
       begin
       begin
-        if SelectedShape.Fields*[vsfPenFill,vsfBackFill,vsfPenStyle] = [vsfPenFill,vsfBackFill,vsfPenStyle] then
-        begin
-          doDraw := toDrawShape in Manager.ShapeOptions;
-          doFill := toFillShape in Manager.ShapeOptions;
-
-          if doDraw then
-            SelectedShape.PenStyle := PenStyleToBGRA(Manager.PenStyle)
-          else
-            SelectedShape.PenStyle := ClearPenStyle;
+        doDraw := toDrawShape in Manager.ShapeOptions;
+        doFill := toFillShape in Manager.ShapeOptions;
 
 
-          if vsfPenWidth in SelectedShape.Fields then SelectedShape.PenWidth := Manager.PenWidth*zoom;
-          if vsfJoinStyle in SelectedShape.Fields then SelectedShape.JoinStyle := Manager.JoinStyle;
-          if SelectedShape is TCustomPolypointShape then
-          begin
-            TCustomPolypointShape(SelectedShape).Closed := toCloseShape in Manager.ShapeOptions;
-            if not TCustomPolypointShape(SelectedShape).Closed then
-            begin
-              TCustomPolypointShape(SelectedShape).LineCap:= Manager.LineCap;
-              TCustomPolypointShape(SelectedShape).ArrowSize:= Manager.ArrowSize;
-              TCustomPolypointShape(SelectedShape).ArrowStartKind:= Manager.ArrowStart;
-              TCustomPolypointShape(SelectedShape).ArrowEndKind:= Manager.ArrowEnd;
-            end;
-          end;
-          if SelectedShape is TCurveShape then
-            TCurveShape(SelectedShape).SplineStyle:= Manager.SplineStyle;
-        end else
-        begin
-          doDraw := vsfPenFill in SelectedShape.Fields;
-          doFill := vsfBackFill in SelectedShape.Fields;
-        end;
-        if doFill then
-        begin
-          if Assigned(Manager.GetTexture) then
-          begin
-            if SelectedShape.BackFill.FillType = vftTexture then
-            begin
-              SelectedShape.BackFill.SetTexture(Manager.GetTexture,
-                SelectedShape.BackFill.TextureMatrix,Manager.TextureOpacity,
-                SelectedShape.BackFill.TextureRepetition);
-            end else
-            if SelectedShape.BackFill.FillType <> vftGradient then
-              SelectedShape.BackFill.SetTexture(Manager.GetTexture, AffineMatrixIdentity,
-                    Manager.TextureOpacity);
-          end else
-          begin
-            if SelectedShape.BackFill.FillType <> vftGradient then
-              SelectedShape.BackFill.SetSolid(Manager.BackColor);
-          end;
-        end else
-          if vsfBackFill in SelectedShape.Fields then
-            SelectedShape.BackFill.Clear;
         if doDraw then
         if doDraw then
+          SelectedShape.PenStyle := PenStyleToBGRA(Manager.PenStyle)
+        else
+          SelectedShape.PenStyle := ClearPenStyle;
+
+        if vsfPenWidth in SelectedShape.Fields then SelectedShape.PenWidth := Manager.PenWidth*zoom;
+        if vsfJoinStyle in SelectedShape.Fields then SelectedShape.JoinStyle := Manager.JoinStyle;
+        if SelectedShape is TCustomPolypointShape then
         begin
         begin
-          if Assigned(Manager.GetTexture) and not doFill then
-          begin
-            if SelectedShape.PenFill.FillType = vftTexture then
-            begin
-              SelectedShape.PenFill.SetTexture(Manager.GetTexture,
-                SelectedShape.PenFill.TextureMatrix,Manager.TextureOpacity,
-                SelectedShape.PenFill.TextureRepetition);
-            end else
-            if SelectedShape.PenFill.FillType <> vftGradient then
-              SelectedShape.PenFill.SetTexture(Manager.GetTexture, AffineMatrixIdentity,
-                    Manager.TextureOpacity);
-          end else
+          TCustomPolypointShape(SelectedShape).Closed := toCloseShape in Manager.ShapeOptions;
+          if not TCustomPolypointShape(SelectedShape).Closed then
           begin
           begin
-            if SelectedShape.PenFill.FillType <> vftGradient then
-              SelectedShape.PenFill.SetSolid(Manager.ForeColor);
+            TCustomPolypointShape(SelectedShape).LineCap:= Manager.LineCap;
+            TCustomPolypointShape(SelectedShape).ArrowSize:= Manager.ArrowSize;
+            TCustomPolypointShape(SelectedShape).ArrowStartKind:= Manager.ArrowStart;
+            TCustomPolypointShape(SelectedShape).ArrowEndKind:= Manager.ArrowEnd;
           end;
           end;
         end;
         end;
-        if SelectedShape is TTextShape then
-        with TTextShape(SelectedShape) do
-        begin
-          PenPhong := Manager.TextPhong;
-          LightPosition := m*Manager.LightPosition;
-          AltitudePercent := Manager.PhongShapeAltitude;
-          ParagraphAlignment := Manager.TextAlign;
-          FontName:= Manager.TextFontName;
-          FontEmHeight:= Manager.TextFontSize*zoom*Manager.Image.DPI/72;
-          FontStyle := Manager.TextFontStyle;
-          if Manager.TextOutline then
-          begin
-            OutlineWidth := Manager.TextOutlineWidth;
-            if OutlineFill.FillType in[vftNone,vftSolid] then
-              OutlineFill.SetSolid(Manager.BackColor);
-          end else
-            OutlineFill.Clear;
-        end;
-        if SelectedShape is TPhongShape then
-        with TPhongShape(SelectedShape) do
+        if SelectedShape is TCurveShape then
+          TCurveShape(SelectedShape).SplineStyle:= Manager.SplineStyle;
+      end else
+      begin
+        doDraw := vsfPenFill in SelectedShape.Fields;
+        doFill := vsfBackFill in SelectedShape.Fields;
+      end;
+      if doFill then AssignFill(SelectedShape.BackFill, Manager.BackFill, gradBox)
+      else if vsfBackFill in SelectedShape.Fields then
+          SelectedShape.BackFill.Clear;
+      if doDraw then AssignFill(SelectedShape.PenFill, Manager.ForeFill, gradBox);
+
+      if SelectedShape is TTextShape then
+      with TTextShape(SelectedShape) do
+      begin
+        PenPhong := Manager.TextPhong;
+        LightPosition := m*Manager.LightPosition;
+        AltitudePercent := Manager.PhongShapeAltitude;
+        ParagraphAlignment := Manager.TextAlign;
+        FontName:= Manager.TextFontName;
+        FontEmHeight:= Manager.TextFontSize*zoom*Manager.Image.DPI/72;
+        FontStyle := Manager.TextFontStyle;
+        if Manager.TextOutline then
         begin
         begin
-          ShapeKind := Manager.PhongShapeKind;
-          LightPosition := Manager.LightPosition;
-          ShapeAltitudePercent := Manager.PhongShapeAltitude;
-          BorderSizePercent := Manager.PhongShapeBorderSize;
-        end;
+          OutlineWidth := Manager.TextOutlineWidth;
+          AssignFill(OutLineFill, Manager.BackFill, gradBox);
+        end else
+          OutlineFill.Clear;
+      end;
+      if SelectedShape is TPhongShape then
+      with TPhongShape(SelectedShape) do
+      begin
+        ShapeKind := Manager.PhongShapeKind;
+        LightPosition := Manager.LightPosition;
+        ShapeAltitudePercent := Manager.PhongShapeAltitude;
+        BorderSizePercent := Manager.PhongShapeBorderSize;
       end;
       end;
     finally
     finally
       BindOriginalEvent(false);
       BindOriginalEvent(false);
@@ -600,19 +547,9 @@ begin
   esmGradient:
   esmGradient:
     try
     try
       BindOriginalEvent(true);
       BindOriginalEvent(true);
-      with GetGradientOriginal do
-      begin
-        StartColor := Manager.ForeColor;
-        EndColor := Manager.BackColor;
-        GradientType:= Manager.GradientType;
-        if (Repetition in [grSine,grPad]) or Manager.GradientSine then
-        begin
-          if Manager.GradientSine then
-            Repetition := grSine
-          else
-            Repetition := grPad;
-        end;
-        ColorInterpolation := Manager.GradientColorspace;
+      case Manager.BackFill.FillType of
+      vftGradient: GetGradientOriginal.AssignExceptGeometry(Manager.BackFill.Gradient);
+      vftSolid: GetGradientOriginal.SetColors(Manager.BackFill.SolidColor, Manager.BackFill.SolidColor);
       end;
       end;
     finally
     finally
       BindOriginalEvent(false);
       BindOriginalEvent(false);
@@ -802,7 +739,7 @@ function TEditShapeTool.GetContextualToolbars: TContextualToolbars;
 var
 var
   shape: TVectorShape;
   shape: TVectorShape;
 begin
 begin
-  Result:= [ctColor,ctTexture];
+  Result:= [ctFill];
   case GetEditMode of
   case GetEditMode of
   esmShape:
   esmShape:
     begin
     begin
@@ -817,10 +754,8 @@ begin
         result := result + [ctText];
         result := result + [ctText];
         if TTextShape(shape).PenPhong then include(result, ctAltitude);
         if TTextShape(shape).PenPhong then include(result, ctAltitude);
       end;
       end;
-      if IsGradientShape(shape) then
-        result := result - [ctShape,ctTexture,ctPenWidth,ctPenStyle,ctJoinStyle,ctLineCap] + [ctGradient];
     end;
     end;
-  esmGradient: result := [ctColor,ctGradient];
+  esmGradient: result := [ctFill];
   end;
   end;
 end;
 end;
 
 
@@ -926,13 +861,6 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TEditShapeTool.IsGradientShape(AShape: TVectorShape): boolean;
-begin
-  result := (vsfBackFill in AShape.Fields) and (AShape.BackFill.FillType = vftGradient) and
-        (not (vsfPenFill in AShape.Fields) or (AShape.PenFill.FillType = vftNone)) and
-        (not (vsfOutlineFill in AShape.Fields) or (AShape.OutlineFill.FillType = vftNone));
-end;
-
 function TEditShapeTool.ConvertToSpline: boolean;
 function TEditShapeTool.ConvertToSpline: boolean;
 var
 var
   shapeBefore: TVectorShape;
   shapeBefore: TVectorShape;
@@ -1239,14 +1167,7 @@ begin
       if not FIsEditingGradient then
       if not FIsEditingGradient then
       begin
       begin
         FIsEditingGradient:= true;
         FIsEditingGradient:= true;
-        with GetGradientOriginal do
-        begin
-          Manager.ForeColor := StartColor;
-          Manager.BackColor := EndColor;
-          Manager.GradientType := GradientType;
-          Manager.GradientSine := (Repetition = grSine);
-          Manager.GradientColorspace := ColorInterpolation;
-        end;
+        Manager.BackFill.SetGradient(GetGradientOriginal, false);
         Manager.UpdateContextualToolbars;
         Manager.UpdateContextualToolbars;
         handled := true;
         handled := true;
         result := OnlyRenderChange;
         result := OnlyRenderChange;
@@ -1410,6 +1331,14 @@ begin
   end;
   end;
 end;
 end;
 
 
+function TEditShapeTool.SuggestGradientBox: TAffineBox;
+begin
+  if GetEditMode = esmShape then
+    result := GetVectorOriginal.SelectedShape.SuggestGradientBox(AffineMatrixIdentity)
+  else
+    result:= inherited SuggestGradientBox;
+end;
+
 { TVectorialTool }
 { TVectorialTool }
 
 
 procedure TVectorialTool.ShapeChange(ASender: TObject; ABounds: TRectF; ADiff: TVectorShapeDiff);
 procedure TVectorialTool.ShapeChange(ASender: TObject; ABounds: TRectF; ADiff: TVectorShapeDiff);
@@ -1626,22 +1555,19 @@ procedure TVectorialTool.AssignShapeStyle(AMatrix: TAffineMatrix);
 var
 var
   f: TVectorShapeFields;
   f: TVectorShapeFields;
   zoom: Single;
   zoom: Single;
+  gradBox: TAffineBox;
 begin
 begin
   zoom := (VectLen(AMatrix[1,1],AMatrix[2,1])+VectLen(AMatrix[1,2],AMatrix[2,2]))/2;
   zoom := (VectLen(AMatrix[1,1],AMatrix[2,1])+VectLen(AMatrix[1,2],AMatrix[2,2]))/2;
   f:= FShape.Fields;
   f:= FShape.Fields;
+  gradBox := FShape.SuggestGradientBox(AffineMatrixIdentity);
   if vsfPenFill in f then
   if vsfPenFill in f then
   begin
   begin
     if Manager.ShapeOptionDraw then
     if Manager.ShapeOptionDraw then
     begin
     begin
-      if (not (vsfBackFill in f) or not Manager.ShapeOptionFill) and (Manager.GetTexture <> nil) then
-        FShape.PenFill.SetTexture(Manager.GetTexture,AMatrix,Manager.TextureOpacity)
+      if FSwapColor then
+        AssignFill(FShape.PenFill, Manager.BackFill, gradBox)
       else
       else
-      begin
-        if FSwapColor then
-          FShape.PenFill.SetSolid(Manager.BackColor)
-        else
-          FShape.PenFill.SetSolid(Manager.ForeColor);
-      end;
+        AssignFill(FShape.PenFill, Manager.ForeFill, gradBox);
     end else
     end else
       FShape.PenFill.Clear;
       FShape.PenFill.Clear;
   end;
   end;
@@ -1652,15 +1578,10 @@ begin
   begin
   begin
     if Manager.ShapeOptionFill then
     if Manager.ShapeOptionFill then
     begin
     begin
-      if Manager.GetTexture <> nil then
-        FShape.BackFill.SetTexture(Manager.GetTexture,AffineMatrixIdentity,Manager.TextureOpacity)
+      if FSwapColor then
+        AssignFill(FShape.BackFill, Manager.ForeFill, gradBox)
       else
       else
-      begin
-        if FSwapColor then
-          FShape.BackFill.SetSolid(Manager.ForeColor)
-        else
-          FShape.BackFill.SetSolid(Manager.BackColor);
-      end;
+        AssignFill(FShape.BackFill, Manager.BackFill, gradBox);
     end else
     end else
       FShape.BackFill.Clear;
       FShape.BackFill.Clear;
   end;
   end;
@@ -2036,6 +1957,14 @@ begin
   end;
   end;
 end;
 end;
 
 
+function TVectorialTool.SuggestGradientBox: TAffineBox;
+begin
+  if Assigned(FShape) then
+    result := FShape.SuggestGradientBox(AffineMatrixIdentity)
+  else
+    result:= inherited SuggestGradientBox;
+end;
+
 function TVectorialTool.Render(VirtualScreen: TBGRABitmap; VirtualScreenWidth,
 function TVectorialTool.Render(VirtualScreen: TBGRABitmap; VirtualScreenWidth,
   VirtualScreenHeight: integer;
   VirtualScreenHeight: integer;
   BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect;
   BitmapToVirtualScreen: TBitmapToVirtualScreenFunction): TRect;

+ 6 - 1
lazpaint/umenu.pas

@@ -52,7 +52,7 @@ implementation
 
 
 uses UResourceStrings, BGRAUTF8, LCScaleDPI, ComCtrls, Graphics,
 uses UResourceStrings, BGRAUTF8, LCScaleDPI, ComCtrls, Graphics,
   StdCtrls, BGRAText, math, udarktheme, BCTrackbarUpdown, BCTypes,
   StdCtrls, BGRAText, math, udarktheme, BCTrackbarUpdown, BCTypes,
-  ugraph, BCComboBox, BGRABitmapTypes;
+  ugraph, BCComboBox, BGRABitmapTypes, LCVectorialFillControl;
 
 
 { TMainFormMenu }
 { TMainFormMenu }
 
 
@@ -414,6 +414,11 @@ begin
         if assigned(FImageList) then TToolbar(Controls[j]).Images := FImageList;
         if assigned(FImageList) then TToolbar(Controls[j]).Images := FImageList;
         TToolbar(Controls[j]).ButtonWidth := TToolbar(Controls[j]).Images.Width+ScaleX(6, 96);
         TToolbar(Controls[j]).ButtonWidth := TToolbar(Controls[j]).Images.Width+ScaleX(6, 96);
         TToolbar(Controls[j]).ButtonHeight := TToolbar(Controls[j]).Images.Height+ScaleY(6, 96);
         TToolbar(Controls[j]).ButtonHeight := TToolbar(Controls[j]).Images.Height+ScaleY(6, 96);
+      end else
+      if Controls[j] is TLCVectorialFillControl then
+      begin
+        if assigned(FImageList) then
+          TLCVectorialFillControl(Controls[j]).ToolIconSize:= FImageList.Height;
       end;
       end;
     end;
     end;
   end;
   end;

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.