Pārlūkot izejas kodu

edit grad/tex points

johann 5 gadi atpakaļ
vecāks
revīzija
c1bc55f9ab

+ 2 - 0
lazpaint/lazpaintmainform.pas

@@ -673,10 +673,12 @@ type
     procedure ManagerToolbarChanged(Sender: TObject);
     procedure VectorialFill_BackAdjustToShape(Sender: TObject);
     procedure VectorialFill_BackChange(Sender: TObject);
+    procedure VectorialFill_BackEditGradTexPoints(Sender: TObject);
     procedure VectorialFill_BackResize(Sender: TObject);
     procedure VectorialFill_BackTypeChange(Sender: TObject);
     procedure VectorialFill_PenAdjustToShape(Sender: TObject);
     procedure VectorialFill_PenChange(Sender: TObject);
+    procedure VectorialFill_PenEditGradTexPoints(Sender: TObject);
     procedure VectorialFill_PenResize(Sender: TObject);
     procedure VectorialFill_PenTypeChange(Sender: TObject);
     procedure VectorialFill_ShowBackFill(Sender: TObject; Shift: TShiftState;

+ 16 - 2
lazpaint/maintoolbar.inc

@@ -21,6 +21,8 @@ begin
   VectorialFill_Back.OnFillTypeChange:=@VectorialFill_BackTypeChange;
   VectorialFill_Pen.OnAdjustToShape:=@VectorialFill_PenAdjustToShape;
   VectorialFill_Back.OnAdjustToShape:=@VectorialFill_BackAdjustToShape;
+  VectorialFill_Pen.OnEditGradTexPoints:=@VectorialFill_PenEditGradTexPoints;
+  VectorialFill_Back.OnEditGradTexPoints:=@VectorialFill_BackEditGradTexPoints;
   VectorialFill_Pen.OnResize:=@VectorialFill_PenResize;
   VectorialFill_Back.OnResize:=@VectorialFill_BackResize;
   Label_Pen.OnMouseMove:=@VectorialFill_ShowPenFill;
@@ -529,8 +531,10 @@ begin
 
   UpdateCurveModeToolbar;
 
-  VectorialFill_Pen.CanAdjustToShape := ToolManager.ToolProvideCommand(tcPenAdjustToShape);
+  VectorialFill_Pen.CanAdjustToShape := ToolManager.ToolProvideCommand(tcForeAdjustToShape);
   VectorialFill_Back.CanAdjustToShape := ToolManager.ToolProvideCommand(tcBackAdjustToShape);
+  VectorialFill_Pen.CanEditGradTexPoints := ToolManager.ToolProvideCommand(tcForeEditGradTexPoints);
+  VectorialFill_Back.CanEditGradTexPoints := ToolManager.ToolProvideCommand(tcBackEditGradTexPoints);
 end;
 
 procedure TFMain.QueryArrange;
@@ -806,6 +810,11 @@ begin
   FInFillChange:= false;
 end;
 
+procedure TFMain.VectorialFill_BackEditGradTexPoints(Sender: TObject);
+begin
+  ToolManager.ToolCommand(tcBackEditGradTexPoints);
+end;
+
 procedure TFMain.VectorialFill_BackResize(Sender: TObject);
 begin
   QueryArrange;
@@ -823,7 +832,7 @@ end;
 
 procedure TFMain.VectorialFill_PenAdjustToShape(Sender: TObject);
 begin
-  ToolManager.ToolCommand(tcPenAdjustToShape);
+  ToolManager.ToolCommand(tcForeAdjustToShape);
 end;
 
 procedure TFMain.VectorialFill_PenChange(Sender: TObject);
@@ -848,6 +857,11 @@ begin
   FInFillChange:= false;
 end;
 
+procedure TFMain.VectorialFill_PenEditGradTexPoints(Sender: TObject);
+begin
+  ToolManager.ToolCommand(tcForeEditGradTexPoints);
+end;
+
 procedure TFMain.VectorialFill_PenResize(Sender: TObject);
 begin
   QueryArrange;

+ 1 - 1
lazpaint/tools/utool.pas

@@ -47,7 +47,7 @@ type
   TEraserMode = (emEraseAlpha, emSoften);
   TToolCommand = (tcCut, tcCopy, tcPaste, tcDelete, tcFinish, tcMoveUp, tcMoveDown, tcMoveToFront, tcMoveToBack,
     tcAlignLeft, tcCenterHorizontally, tcAlignRight, tcAlignTop, tcCenterVertically, tcAlignBottom,
-    tcShapeToSpline, tcPenAdjustToShape, tcBackAdjustToShape);
+    tcShapeToSpline, tcForeAdjustToShape, tcBackAdjustToShape, tcForeEditGradTexPoints, tcBackEditGradTexPoints);
 
   TDeformationGridMode = (gmDeform, gmMovePointWithoutDeformation);
 

+ 37 - 1
lazpaint/tools/utooltext.pas

@@ -6,7 +6,7 @@ interface
 
 uses
   Classes, SysUtils, UTool, UToolVectorial, LCLType, Graphics, BGRABitmap, BGRABitmapTypes, BGRATextFX,
-  BGRAGradients, LCVectorOriginal;
+  BGRAGradients, LCVectorOriginal, LCVectorialFill;
 
 type
 
@@ -29,6 +29,10 @@ type
     function SlowShape: boolean; override;
     procedure QuickDefineEnd; override;
     function RoundCoordinate(ptF: TPointF): TPointF; override;
+    function ForeGradTexMode: TVectorShapeUsermode; override;
+    function BackGradTexMode: TVectorShapeUsermode; override;
+    function ShapeForeFill: TVectorialFill; override;
+    function ShapeBackFill: TVectorialFill; override;
   public
     constructor Create(AManager: TToolManager); override;
     function GetContextualToolbars: TContextualToolbars; override;
@@ -205,6 +209,38 @@ begin
   result := PointF(floor(ptF.x)+0.5,floor(ptF.y)+0.5);
 end;
 
+function TToolText.ForeGradTexMode: TVectorShapeUsermode;
+begin
+  if FSwapColor then result := vsuEditOutlineFill else
+    result := vsuEditPenFill;
+end;
+
+function TToolText.BackGradTexMode: TVectorShapeUsermode;
+begin
+  if FSwapColor then result := vsuEditPenFill else
+    result := vsuEditOutlineFill;
+end;
+
+function TToolText.ShapeForeFill: TVectorialFill;
+begin
+  if Assigned(FShape) then
+  begin
+    if FSwapColor then result := FShape.OutlineFill else
+      result := FShape.PenFill;
+  end else
+    result := nil;
+end;
+
+function TToolText.ShapeBackFill: TVectorialFill;
+begin
+  if Assigned(FShape) then
+  begin
+    if FSwapColor then result := FShape.PenFill else
+      result := FShape.OutlineFill;
+  end else
+    result := nil;
+end;
+
 constructor TToolText.Create(AManager: TToolManager);
 begin
   inherited Create(AManager);

+ 103 - 6
lazpaint/tools/utoolvectorial.pas

@@ -62,6 +62,10 @@ type
     procedure UpdateUseOriginal;
     function ReplaceLayerAndAddShape(out ARect: TRect): TCustomImageDifference; virtual;
     procedure ShapeValidated; virtual;
+    function ForeGradTexMode: TVectorShapeUsermode; virtual;
+    function BackGradTexMode: TVectorShapeUsermode; virtual;
+    function ShapeForeFill: TVectorialFill; virtual;
+    function ShapeBackFill: TVectorialFill; virtual;
   public
     function ValidateShape: TRect;
     function CancelShape: TRect;
@@ -125,6 +129,10 @@ type
     function ConvertToSpline: boolean;
     function GetEditMode: TEditShapeMode;
     function InvalidEditMode: boolean;
+    function ForeGradTexMode: TVectorShapeUsermode; virtual;
+    function BackGradTexMode: TVectorShapeUsermode; virtual;
+    function ShapeForeFill: TVectorialFill; virtual;
+    function ShapeBackFill: TVectorialFill; virtual;
   public
     constructor Create(AManager: TToolManager); override;
     destructor Destroy; override;
@@ -916,6 +924,37 @@ begin
     result := false;
 end;
 
+function TEditShapeTool.ForeGradTexMode: TVectorShapeUsermode;
+begin
+  result := vsuEditPenFill;
+end;
+
+function TEditShapeTool.BackGradTexMode: TVectorShapeUsermode;
+begin
+  if (GetEditMode = esmShape) and (GetVectorOriginal.SelectedShape is TTextShape) then
+    result := vsuEditOutlineFill
+  else
+    result := vsuEditBackFill;
+end;
+
+function TEditShapeTool.ShapeForeFill: TVectorialFill;
+begin
+  if GetEditMode = esmShape then result := GetVectorOriginal.SelectedShape.PenFill
+  else result := nil;
+end;
+
+function TEditShapeTool.ShapeBackFill: TVectorialFill;
+begin
+  if GetEditMode = esmShape then
+  begin
+    if GetVectorOriginal.SelectedShape is TTextShape then
+      result := GetVectorOriginal.SelectedShape.OutlineFill
+    else
+      result := GetVectorOriginal.SelectedShape.BackFill;
+  end
+  else result := nil;
+end;
+
 constructor TEditShapeTool.Create(AManager: TToolManager);
 begin
   inherited Create(AManager);
@@ -1240,8 +1279,14 @@ begin
           tcAlignLeft..tcAlignBottom: AlignShape(GetVectorOriginal.SelectedShape, ACommand,
                        Manager.Image.LayerOriginalMatrix[Manager.Image.CurrentLayerIndex],
                        rect(0,0,Manager.Image.Width,Manager.Image.Height));
-          tcPenAdjustToShape: GetVectorOriginal.SelectedShape.PenFill.FitGeometry(SuggestGradientBox);
-          tcBackAdjustToShape: GetVectorOriginal.SelectedShape.BackFill.FitGeometry(SuggestGradientBox);
+          tcForeEditGradTexPoints: if GetVectorOriginal.SelectedShape.Usermode = ForeGradTexMode then
+                                    GetVectorOriginal.SelectedShape.Usermode := vsuEdit else
+                                    GetVectorOriginal.SelectedShape.Usermode := ForeGradTexMode;
+          tcBackEditGradTexPoints: if GetVectorOriginal.SelectedShape.Usermode = BackGradTexMode then
+                                    GetVectorOriginal.SelectedShape.Usermode := vsuEdit else
+                                    GetVectorOriginal.SelectedShape.Usermode := BackGradTexMode;
+          tcForeAdjustToShape: ShapeForeFill.FitGeometry(SuggestGradientBox);
+          tcBackAdjustToShape: ShapeBackFill.FitGeometry(SuggestGradientBox);
           tcShapeToSpline: result := ConvertToSpline;
           else result := false;
         end;
@@ -1329,8 +1374,12 @@ function TEditShapeTool.ToolProvideCommand(ACommand: TToolCommand): boolean;
 begin
   case ACommand of
   tcCut,tcCopy,tcDelete: result:= GetEditMode in [esmShape,esmOtherOriginal,esmGradient];
-  tcPenAdjustToShape: result := GetEditMode = esmShape;
+  tcForeAdjustToShape: result := GetEditMode = esmShape;
   tcBackAdjustToShape: result := GetEditMode in [esmShape,esmGradient];
+  tcForeEditGradTexPoints: result := (GetEditMode = esmShape) and
+                     (ForeGradTexMode in GetVectorOriginal.SelectedShape.Usermodes);
+  tcBackEditGradTexPoints: result := (GetEditMode = esmShape) and
+                     (BackGradTexMode in GetVectorOriginal.SelectedShape.Usermodes);
   tcShapeToSpline: result:= (GetEditMode = esmShape)
                             and TCurveShape.CanCreateFrom(GetVectorOriginal.SelectedShape);
   tcAlignLeft..tcAlignBottom: result:= GetEditMode in [esmShape, esmOtherOriginal, esmSelection];
@@ -1477,6 +1526,38 @@ begin
   //nothing
 end;
 
+function TVectorialTool.ForeGradTexMode: TVectorShapeUsermode;
+begin
+  if FSwapColor then result := vsuEditBackFill else
+    result := vsuEditPenFill;
+end;
+
+function TVectorialTool.BackGradTexMode: TVectorShapeUsermode;
+begin
+  if FSwapColor then result := vsuEditPenFill else
+    result := vsuEditBackFill;
+end;
+
+function TVectorialTool.ShapeForeFill: TVectorialFill;
+begin
+  if Assigned(FShape) then
+  begin
+    if FSwapColor then result := FShape.BackFill else
+      result := FShape.PenFill;
+  end else
+    result := nil;
+end;
+
+function TVectorialTool.ShapeBackFill: TVectorialFill;
+begin
+  if Assigned(FShape) then
+  begin
+    if FSwapColor then result := FShape.PenFill else
+      result := FShape.BackFill;
+  end else
+    result := nil;
+end;
+
 function TVectorialTool.ValidateShape: TRect;
 var
   layerId: LongInt;
@@ -1937,8 +2018,20 @@ begin
         Action.NotifyChange(toolDest, r);
         result := true;
       end;
-  tcPenAdjustToShape: if Assigned(FShape) then FShape.PenFill.FitGeometry(SuggestGradientBox);
-  tcBackAdjustToShape: if Assigned(FShape) then FShape.BackFill.FitGeometry(SuggestGradientBox);
+  tcForeAdjustToShape: if Assigned(FShape) then ShapeForeFill.FitGeometry(SuggestGradientBox);
+  tcBackAdjustToShape: if Assigned(FShape) then ShapeBackFill.FitGeometry(SuggestGradientBox);
+  tcForeEditGradTexPoints: if Assigned(FShape) and not FQuickDefine then
+                          begin
+                            if FShape.Usermode = ForeGradTexMode then
+                              FShape.Usermode := vsuEdit else
+                              FShape.Usermode := ForeGradTexMode;
+                          end;
+  tcBackEditGradTexPoints: if Assigned(FShape) and not FQuickDefine then
+                          begin
+                            if FShape.Usermode = BackGradTexMode then
+                              FShape.Usermode := vsuEdit else
+                              FShape.Usermode := BackGradTexMode;
+                          end;
   tcFinish: begin
               toolDest := GetToolDrawingLayer;
               r := ValidateShape;
@@ -1963,7 +2056,11 @@ begin
   case ACommand of
   tcCopy,tcCut: Result:= not IsSelectingTool and not FQuickDefine and Assigned(FShape);
   tcFinish: result := not IsIdle;
-  tcPenAdjustToShape, tcBackAdjustToShape: result := not IsSelectingTool and Assigned(FShape);
+  tcForeAdjustToShape, tcBackAdjustToShape: result := not IsSelectingTool and Assigned(FShape) and not FQuickDefine;
+  tcForeEditGradTexPoints: result := not IsSelectingTool and Assigned(FShape) and not FQuickDefine and
+                            (vsuEditPenFill in FShape.Usermodes);
+  tcBackEditGradTexPoints: result := not IsSelectingTool and Assigned(FShape) and not FQuickDefine and
+                            (vsuEditPenFill in FShape.Usermodes);
   tcShapeToSpline: result:= not IsSelectingTool and not FQuickDefine and Assigned(FShape)
                             and TCurveShape.CanCreateFrom(FShape);
   tcAlignLeft..tcAlignBottom: Result:= not FQuickDefine and Assigned(FShape);

+ 22 - 0
lazpaintcontrols/lcvectorialfillcontrol.pas

@@ -25,6 +25,7 @@ type
     function GetAllowedFillTypes: TVectorialFillTypes;
     function GetAverageColor: TBGRAPixel;
     function GetCanAdjustToShape: boolean;
+    function GetCanEditGradTexPoints: boolean;
     function GetFillType: TVectorialFillType;
     function GetGradEndColor: TBGRAPixel;
     function GetGradInterp: TBGRAColorInterpolation;
@@ -48,6 +49,7 @@ type
       Shift: TShiftState; X, Y: Integer);
     procedure SetAllowedFillTypes(AValue: TVectorialFillTypes);
     procedure SetCanAdjustToShape(AValue: boolean);
+    procedure SetCanEditGradTexPoints(AValue: boolean);
     procedure SetFillType(AValue: TVectorialFillType);
     procedure SetGradEndColor(AValue: TBGRAPixel);
     procedure SetGradientType(AValue: TGradientType);
@@ -65,6 +67,7 @@ type
   protected
     FInterface: TVectorialFillInterface;
     FOnAdjustToShape: TNotifyEvent;
+    FOnEditGradTexPoints: TNotifyEvent;
     FOnChooseColor: TChooseColorEvent;
     FOnFillChange: TNotifyEvent;
     FOnFillTypeChange: TNotifyEvent;
@@ -73,6 +76,7 @@ type
     procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
       {%H-}WithThemeSpace: Boolean); override;
     procedure DoOnAdjustToShape(Sender: TObject);
+    procedure DoOnEditGradTexPoints(Sender: TObject);
     procedure DoOnFillChange(Sender: TObject);
     procedure DoOnFillTypeChange(Sender: TObject);
     procedure DoOnTextureClick(Sender: TObject);
@@ -108,10 +112,12 @@ type
     property ToolIconSize: integer read GetToolIconSize write SetToolIconSize;
     property VerticalPadding: integer read GetVerticalPadding write SetVerticalPadding;
     property AllowedFillTypes: TVectorialFillTypes read GetAllowedFillTypes write SetAllowedFillTypes;
+    property CanEditGradTexPoints: boolean read GetCanEditGradTexPoints write SetCanEditGradTexPoints;
     property OnChooseColor: TChooseColorEvent read FOnChooseColor write SetOnChooseColor;
     property OnFillChange: TNotifyEvent read FOnFillChange write FOnFillChange;
     property OnTextureChange: TNotifyEvent read FOnTextureChange write FOnTextureChange;
     property OnAdjustToShape: TNotifyEvent read FOnAdjustToShape write FOnAdjustToShape;
+    property OnEditGradTexPoints: TNotifyEvent read FOnEditGradTexPoints write FOnEditGradTexPoints;
     property OnFillTypeChange: TNotifyEvent read FOnFillTypeChange write FOnFillTypeChange;
     property OnTextureClick: TNotifyEvent read FOnTextureClick write SetOnTextureClick;
     property OnMouseDown;
@@ -161,6 +167,11 @@ begin
   result := FInterface.CanAdjustToShape;
 end;
 
+function TLCVectorialFillControl.GetCanEditGradTexPoints: boolean;
+begin
+  result := FInterface.CanEditGradTexPoints;
+end;
+
 function TLCVectorialFillControl.GetFillType: TVectorialFillType;
 begin
   result := FInterface.FillType;
@@ -267,6 +278,11 @@ begin
   FInterface.CanAdjustToShape := AValue;
 end;
 
+procedure TLCVectorialFillControl.SetCanEditGradTexPoints(AValue: boolean);
+begin
+  FInterface.CanEditGradTexPoints:= AValue;
+end;
+
 procedure TLCVectorialFillControl.SetFillType(AValue: TVectorialFillType);
 begin
   FInterface.FillType := AValue;
@@ -361,6 +377,11 @@ begin
   if Assigned(FOnAdjustToShape) then FOnAdjustToShape(self);
 end;
 
+procedure TLCVectorialFillControl.DoOnEditGradTexPoints(Sender: TObject);
+begin
+  if Assigned(FOnEditGradTexPoints) then FOnEditGradTexPoints(self);
+end;
+
 procedure TLCVectorialFillControl.DoOnFillChange(Sender: TObject);
 begin
   if Assigned(FOnFillChange) then FOnFillChange(self);
@@ -393,6 +414,7 @@ begin
   FInterface.OnFillChange:=@DoOnFillChange;
   FInterface.OnTextureChange:=@DoOnTextureChange;
   FInterface.OnAdjustToShape:=@DoOnAdjustToShape;
+  FInterface.OnEditGradTexPoints:=@DoOnEditGradTexPoints;
   FInterface.OnFillTypeChange:=@DoOnFillTypeChange;
   FInterface.OnMouseMove:=@InterfaceMouseMove;
   FInterface.OnMouseDown:=@InterfaceMouseDown;

+ 72 - 25
lazpaintcontrols/lcvectorialfillinterface.pas

@@ -25,13 +25,16 @@ type
 
   TVectorialFillInterface = class(TComponent)
   private
+    FCanEditGradTexPoints: boolean;
     FOnMouseDown: TMouseEvent;
     FOnMouseEnter: TNotifyEvent;
     FOnMouseLeave: TNotifyEvent;
     FOnMouseMove: TMouseMoveEvent;
     FOnMouseUp: TMouseEvent;
+    procedure EditGradTextPointsClick(Sender: TObject);
     procedure Preview_MouseUp(Sender: TObject; Button: TMouseButton;
       {%H-}Shift: TShiftState; X, {%H-}Y: Integer);
+    procedure SetCanEditGradTexPoints(AValue: boolean);
     procedure SetVerticalPadding(AValue: integer);
     procedure ToolbarMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
@@ -74,8 +77,8 @@ type
     FButtonFillNone, FButtonFillSolid,
     FButtonFillGradient, FButtonFillTexture: TToolButton;
     FOnFillChange, FOnFillTypeChange: TNotifyEvent;
-    FButtonAdjustToShape: TToolButton;
-    FOnAdjustToShape: TNotifyEvent;
+    FButtonEditGradTexPoints, FButtonAdjustToShape: TToolButton;
+    FOnEditGradTexPoints, FOnAdjustToShape: TNotifyEvent;
 
     FSolidColorInterfaceCreated: boolean;
     FShapeSolidColor: TShape;
@@ -142,6 +145,7 @@ type
 //    procedure ShapeStartColorMouseUp({%H-}Sender: TObject; {%H-}Button: TMouseButton;
 //      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
     procedure UpdateAccordingToFillType;
+    procedure UpdateTopToolbar;
     procedure UpdatePreview;
     procedure UpdateShapeSolidColor;
     procedure UpdateTextureParams;
@@ -187,10 +191,12 @@ type
     property TextureRepetition: TTextureRepetition read FTexRepetition write SetTextureRepetition;
     property TextureOpacity: byte read FTexOpacity write SetTextureOpacity;
     property CanAdjustToShape: boolean read FCanAdjustToShape write SetCanAdjustToShape;
+    property CanEditGradTexPoints: boolean read FCanEditGradTexPoints write SetCanEditGradTexPoints;
     property OnFillChange: TNotifyEvent read FOnFillChange write FOnFillChange;
     property OnTextureChange: TNotifyEvent read FOnTextureChange write FOnTextureChange;
     property OnTextureClick: TNotifyEvent read FOnTextureClick write SetOnTextureClick;
     property OnAdjustToShape: TNotifyEvent read FOnAdjustToShape write FOnAdjustToShape;
+    property OnEditGradTexPoints: TNotifyEvent read FOnEditGradTexPoints write FOnEditGradTexPoints;
     property OnFillTypeChange: TNotifyEvent read FOnFillTypeChange write FOnFillTypeChange;
     property OnChooseColor: TChooseColorEvent read FOnChooseColor write FOnChooseColor;
     property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
@@ -313,8 +319,11 @@ begin
 end;
 
 procedure TVectorialFillInterface.SetFillType(AValue: TVectorialFillType);
+var
+  prevValue: TVectorialFillType;
 begin
   if FFillType=AValue then Exit;
+  prevValue := FFillType;
   FFillType:=AValue;
   UpdateAccordingToFillType;
   UpdatePreview;
@@ -367,6 +376,38 @@ begin
   end;
 end;
 
+procedure TVectorialFillInterface.UpdateTopToolbar;
+var
+  x: Integer;
+begin
+  FToolbar.BeginUpdate;
+  x := FToolbar.Indent;
+  FButtonFillNone.Left := x;
+  //FButtonFillNone.Wrap := [vftSolid,vftGradient,vftTexture]*FAllowedFillTypes = [];
+  FButtonFillNone.Visible:= vftNone in FAllowedFillTypes;
+  if vftNone in FAllowedFillTypes then inc(x, FButtonFillNone.Width);
+  FButtonFillSolid.Left := x;
+  //FButtonFillSolid.Wrap := [vftGradient,vftTexture]*FAllowedFillTypes = [];
+  FButtonFillSolid.Visible:= vftSolid in FAllowedFillTypes;
+  if vftSolid in FAllowedFillTypes then inc(x, FButtonFillSolid.Width);
+  FButtonFillGradient.Left := x;
+  //FButtonFillGradient.Wrap := [vftTexture]*FAllowedFillTypes = [];
+  FButtonFillGradient.Visible:= vftGradient in FAllowedFillTypes;
+  if vftGradient in FAllowedFillTypes then inc(x, FButtonFillGradient.Width);
+  FButtonFillTexture.Left := x;
+  FButtonFillTexture.Visible:= vftTexture in FAllowedFillTypes;
+  if vftTexture in FAllowedFillTypes then inc(x, FButtonFillTexture.Width);
+
+  FPreview.Left := x;
+  inc(x, FPreview.Width);
+
+  FButtonEditGradTexPoints.Left := x;
+  inc(x, FButtonEditGradTexPoints.Width);
+
+  FButtonAdjustToShape.Left := x;
+  FToolbar.EndUpdate;
+end;
+
 procedure TVectorialFillInterface.UpdatePreview;
 var
   bmp, thumb: TBGRABitmap;
@@ -457,7 +498,21 @@ end;
 procedure TVectorialFillInterface.UpdateButtonAdjustToShape;
 begin
   if Assigned(FButtonAdjustToShape) then
+  begin
     FButtonAdjustToShape.Enabled := FCanAdjustToShape and (FillType in[vftGradient,vftTexture]);
+    if FillType in[vftGradient,vftTexture] then
+      FButtonAdjustToShape.Style := tbsButton
+    else
+      FButtonAdjustToShape.Style := tbsDivider;
+  end;
+  if Assigned(FButtonEditGradTexPoints) then
+  begin
+    FButtonEditGradTexPoints.Enabled := FCanEditGradTexPoints and (FillType in [vftGradient,vftTexture]);
+    if FillType in [vftGradient,vftTexture] then
+      FButtonEditGradTexPoints.Style := tbsButton
+    else
+      FButtonEditGradTexPoints.Style := tbsDivider;
+  end;
 end;
 
 procedure TVectorialFillInterface.UpDownEndAlphaChange(Sender: TObject;
@@ -752,6 +807,8 @@ begin
   AddToolbarControl(FToolbar, FPreview);
   AttachMouseEvent(FPreview);
 
+  FButtonEditGradTexPoints := AddToolbarButton(FToolbar, 'Edit gradient/texture points', 25, @EditGradTextPointsClick);
+  AttachMouseEvent(FButtonEditGradTexPoints);
   FButtonAdjustToShape := AddToolbarButton(FToolbar, 'Adjust to shape', 21, @AdjustToShapeClick);
   AttachMouseEvent(FButtonAdjustToShape);
   FButtonAdjustToShape.Wrap := true;
@@ -928,33 +985,11 @@ end;
 
 procedure TVectorialFillInterface.SetAllowedFillTypes(
   AValue: TVectorialFillTypes);
-var
-  x: Integer;
 begin
   Include(AValue, FFillType); //cannot exclude current type
   if FAllowedFillTypes=AValue then Exit;
   FAllowedFillTypes:=AValue;
-  FToolbar.BeginUpdate;
-  x := FToolbar.Indent;
-  FButtonFillNone.Left := x;
-  //FButtonFillNone.Wrap := [vftSolid,vftGradient,vftTexture]*FAllowedFillTypes = [];
-  FButtonFillNone.Visible:= vftNone in FAllowedFillTypes;
-  if vftNone in FAllowedFillTypes then inc(x, FButtonFillNone.Width);
-  FButtonFillSolid.Left := x;
-  //FButtonFillSolid.Wrap := [vftGradient,vftTexture]*FAllowedFillTypes = [];
-  FButtonFillSolid.Visible:= vftSolid in FAllowedFillTypes;
-  if vftSolid in FAllowedFillTypes then inc(x, FButtonFillSolid.Width);
-  FButtonFillGradient.Left := x;
-  //FButtonFillGradient.Wrap := [vftTexture]*FAllowedFillTypes = [];
-  FButtonFillGradient.Visible:= vftGradient in FAllowedFillTypes;
-  if vftGradient in FAllowedFillTypes then inc(x, FButtonFillGradient.Width);
-  FButtonFillTexture.Left := x;
-  FButtonFillTexture.Visible:= vftTexture in FAllowedFillTypes;
-  if vftTexture in FAllowedFillTypes then inc(x, FButtonFillTexture.Width);
-  FPreview.Left := x;
-  inc(x, FPreview.Width);
-  FButtonAdjustToShape.Left := x;
-  FToolbar.EndUpdate;
+  UpdateTopToolbar;
 end;
 
 procedure TVectorialFillInterface.SetOnTextureClick(AValue: TNotifyEvent);
@@ -1055,6 +1090,18 @@ begin
   end;
 end;
 
+procedure TVectorialFillInterface.EditGradTextPointsClick(Sender: TObject);
+begin
+  if Assigned(FOnEditGradTexPoints) then FOnEditGradTexPoints(self);
+end;
+
+procedure TVectorialFillInterface.SetCanEditGradTexPoints(AValue: boolean);
+begin
+  if FCanEditGradTexPoints=AValue then Exit;
+  FCanEditGradTexPoints:=AValue;
+  UpdateButtonAdjustToShape;
+end;
+
 procedure TVectorialFillInterface.ToolbarMouseEnter(Sender: TObject);
 begin
   If Assigned(FOnMouseEnter) then FOnMouseEnter(self);

+ 172 - 1
resources/fillimages.lrs

@@ -2228,6 +2228,177 @@ LazarusResources.Add('gradientreflect16','LZP',[
   +#0#0#0'{1D7098C8-7796-4576-A730-8F77803A391C}'#1#0#0#0#1#128#9'6'#28#1#0#0#0
   +#0#0#0'originals'
 ]);
+LazarusResources.Add('movegradpoint32','LZP',[
+  'LazPaint'#0#0#0#0'0'#0#0#0' '#0#0#0' '#0#0#0#1#0#0#0'"'#4#0#0#0#0#0#0#2#1#0#0
+  +#0#0#0#0#238#8#0#0#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0' '#0#0#0' '#8#6
+  +#0#0#0'szz'#244#0#0#3#185'IDATx'#156#205#150#9'HTA'#24#199'M'#11#146#16#140
+  +#138#196' 7'#143'n'#143'J-K-'#205'cm[uk5'#175#210'.\'#180'2'#239#204'J'#172
+  +#164#211#202#14#13#175'%+'#162'B'#138#192#142']W'#243',Z*'#138#162#164#195'J'
+  +'S,'#195#146#148#232#250'z'#223#184#251'r_'#30'o,'#165#129'?;ov'#224#247'{3'
+  +#243'fFO'#239'?,'#238'L'#228'L'#212#154#200'5mCR'#226#205''''#9#234#196'"a{H'
+  +'p'#192'O'#12#214#177#13#255#27'l'#184';'#130'VG'#132'~'#191'U'#173#132'/'#29
+  +#239'H'#176#142'm'#26#137'A'#29#9'9'#190'mm'#149#18#224#219'G'#157'`'#155'H'
+  +#228#247#195#216','#226#189#192'Yqg'#128'9'#215#159#128#26#135#28#223#26#161
+  +#149#229#215#160#162#236'*'#169'c[HP '#140#158#224#3'3'#189#21'`'#141#17'*'
+  +#193#198'G'#9#182#152'%'#165'`'#199'd'#150#8#163#130#217'K'#153#136'U0G\'#6
+  +#246#190']A'#9'*'#1#230#25#12#12#12'@q'#237#18'+0q'#154#15#248'G'#151#194#178
+  +#141'e '#141')'#135#192#216#10#8#138#175#132#144#196'j'#8'K'#174#129'U)'#183
+  +' <'#245'6'#172#222'~'#7#214#166#169'a}'#250']'#136#220'u'#15#28#252#248#9
+  +#232'L'#1#10'h%'#178#14#237#3#177'X'#2#214#206'Q'#212'pY'#198'}p'#240'/'#231
+  +'%'#208#181#8#195'W'#146#133#167#21'044$'#18'f'#150#246#224#25'*'#167#134'G'
+  +#237'y'#0#142'<'#5#176#196#155'['#185'}'#17#137'$'#172#0'N'#129'V'#194'Er'
+  +#128#26#190'a'#239'C'#152#235#127#147#183#128#158#169']'#246'S'#147')2V'#0
+  +#167#227'F7'#137'E'#210'L*'#248#166#253#143'`'#174#132'B'#0';'#206#240'R'#232
+  +#8'p%'#22#175'8'#204#27#30's'#240'1'#204'[F)'#128#159#26'W'#128'+'#225#25#156
+  +#197#11#30'{'#232#9#189#128'u/'#2'\'#9'a'#216#241'~'#225#241'G'#158#130#211
+  +#242#10'J'#1#161#178'W'#1#174#132'(<'#187'OxBV'#29#189#0#238'p}'#9'p%'#196'k'
+  +'N'#246#10'O:'#246#12#230'K)'#5'ly'#8'p%'#252#215#229#246#8'O>'#241#156#17
+  +#168#164#20'`'#246'u>'#2#152#238#251#196'rY'#193#31#240#148#156#151#176' '
+  +#128'R'#192#142'B'#0's'#189#164#152#221#182#3#162#10'u'#224'[O'#214#211#11
+  +#224#169#214#159'@['#235'k8['#148#7'q'#155#163'a'#250#180#169'l'#127'#c'#19
+  +'H<'#250#132#133'o'#203'}'#5#206#129'U'#180#2#170'~'#5#138'/'#156'f'#251'`'
+  +#172'l'#188#192'M'#146#2#161'q'#231'u'#224';'#242#223#208#11#224'y'#206#21
+  +#168#173'R'#192#237#26#21#251#220#212'PG'#230'~'#148#209#24#136#202#168#253
+  +'c'#216#181#240#180#130#6'pYA+ '#254'-'#208#242#246#25'$'#196'm$u'#19#147#241
+  +#240#161#165#158#149'HJ'#136'!'#237'RY^'#175#240'ty#'#184#6'U'#211#9#224'MF+'
+  +' '#16'L$'#191#195'G'#140'$'#191#5#185#199'Y'#129#251#234'J'#205#240'{'#192
+  +#150#236#23'='#194'w'#158'j'#162#23#192'+'#148'V'#128#28#195#226'dX'#153'p'
+  +#133#169#235'3'#11'n'#10't|j"'#2'?'#191#182#129#159#239#18#210'omjI'#143#240
+  +#221'E'#205#176'0x'#0#2#230'3='#192#210#198#27#194#24#176'v'#135's'#244#136
+  +'$'#176#226#139#167#217'Q('#185'r'#129#180'9y'#203'z'#132'g'#156'ia'#4'j'#232
+  +#4#240#14#231#224#167'bRJ.'#19'x'#158#227#137'f'#235'YD`'#174'.'#243#225'kg+'
+  +#17#232'lo'#6#11#139'Idt'#28'}/'#147#5#135'C'#142#193'7G'#248'"J'#129's}]'
+  +#175'G'#141's'#255#140#18#167#10's'#160'0'#255#4#8#189'='#216#233#26';9'#169
+  +#241'o'#174#229'|'#139'T'#175#219#247#175#201'k&'#153'LL'#255#21#164#175#162
+  +#207#228'^7'#232'<&'#195#134#2#204#149#24'r'#232#160#148'_'#220#190#130#9#30
+  +'Et'#18#0#0#0#0'IEND'#174'B`'#130' '#0#0#0' '#0#0#0#7#0#0#0'Preview'#16#244#0
+  +#0#0'$'#0#134'B'#159#203#203#159'B'#25#0#136's'#217#242#254#254#242#217's'#23
+  +#0#131'B'#217#252's'#131#252#217'B'#22#0#130#159#242'u'#130#253#235#14#202#1
+  +#167'f'#130#203#254#22#255#1#202'f'#130#203#254#22#255#1#202'f'#130#159#242
+  +#22#255#1#202'f'#130'B'#217#22#255#1#202'g'#130's'#248#21#255#1#202'h'#1#216
+  +#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1
+  +#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1
+  +#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255
+  +#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1
+  +#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#167#7#202
+  +#1#244'u'#1#228#6#202#1#167#17#0'A'#12'T'#255#225#141#1#26#24#0#134#2#206#225
+  +#141'8'#1#27#0#130#2#1'1'#0#224#154#0#0#0#144#0'"MZa'#199#248#198#255'K'#16
+  +' '#194#193'Z'#17#205','#152#153#137#152#152#153#131#3#186#30#205'P'#170#170
+  +#170#169#170#170#129'25'#145'M-h5a'#9#31'Ej6"K=l7'#26#24#185'@n7+Co8EqHs9KtM'
+  +'v:Pw:Sy;'#184'Uz'#239#165'r*'#13'u|<'#173'%A[~'#198#200#230#11'j'#127'='#233
+  +'t'#24#237'vT'#129'> '#4#157#207'%x'#130'=]'#3'*'#245#254'Oc'#132'?"$\6'#173
+  +#181'9'#133'?55/>'#250#246'#6@'#11#161#158'H'#20#224#158#0#0#0#144#0'!KY`'
+  +#196#245#195#251'K'#31'<'#191#190'X'#27#195'G'#137'A'#21'IJKL'#2'M'#132'N'#3
+  +#183')'#205'k'#170#170#170#170#170#170#129'2O'#142'M<'#133'P_'#9'$['#135'P%K'
+  +'Q'#136'P0'''#183'T'#138'QFW'#140'RY'#142'\'#144'S_'#145'b'#147'Td'#149'Th'
+  +#151'U'#181'j'#152#236#162'p)'#16#146#154'V'#170'.Qr'#156#195#197#227#13#133
+  +#157'W'#229'r'#24#233'th'#159'X '#5#154#203'.'#150#161'Mt'#3')'#241#250'N{'
+  ,#162'Y,.tD'#171#178'G'#164'YOOE='#246#242'#NY'#21#158#156'G&'#224#154#0#0#0
+  +#146#0' HU['#187#234#187#240'O`'#186#183#182'VI'#186#186'Aj'#187#188#189#190
+  +#131#3#175'I'#205#188#169#169#169#169#169#169#129'2'#190#137'Qj'#207#191']'#9
+  +'4'#159#209#191'AQ'#139#210#192#150'h'#175#141#212#192#186#143#213#192#145
+  +#215#148#216#193#150#217#152#219#193#154#220#194#157#222#194#173#158#223#225
+  +#155'k('#24#215#224#195#163'Fy'#169#226#186#189#217#19#198#227#195#219'm'#23
+  +#223'o'#155#228#196#30#8#148#194'D'#221#230'w'#178#2''''#230#239'J'#181#231
+  +#196'DG'#178'g'#163#170'h'#233#197#189#188#162':'#236#231'!'#176#197'B'#151
+  +#149'Dv'#224#222#1#0#0'f'#212#1#153#135'w'#137#185#152'wW'#138#208#4#8#131#7
+  +#9#10#15#11#232#27#186#201'6'#208#14#153#153#153#153#153#153#153#128#138#11#0
+  +#3#6#8#0#29#30#6#14#239#185#153#153#153#153#153#153#144#139#11#0#2#7#8#0#0#29
+  +'./0'#206'!'#153#153#153#153#153#157#144#139#11#0#1'3'#5#0#0'4'#29'56'#206'"'
+  +#153#153#153#153#153#222#144#138#11#0'9:'#0#0#30'4'#29';'#206'#'#153#153#153
+  +#153#157#237#144#138#11'>?'#0#0#8'@4'#29'A'#205'%'#153#153#153#157#237#233
+  +#139#11#11'D'#0#0#8#8'@4'#29'E'#204''''#153#153#157#237#236#144#195#11#141
+  +#130#0#0#3#8#132'@4'#29'H'#203')'#153#157#237#236#182#195#11#142#130#0#0#4#8
+  +#132'@4'#29'J'#202'+'#157#237#236#186#144#195#11#143#130#0#0#5#8#132'@4'#29
+  +'M'#201'1'#237#236#186#182#133#11#11#19#0#0#6#8#132'@4'#29'O'#200'<'#236#186
+  +#186#144#133#11#11#20#0#0#7#8#132'@4'#29'R'#199'F'#186#186#185#133#11#11#21#0
+  +#0#8#8#132#30'4'#29'U'#198'K'#186#187#144#133#11#11#22#0#0#9#8#132'X'#0#29'Y'
+  +#229#27#188'P'#133#11#11#23#0#0#6#8#228#201#153#141#0#0'_`VZab'#11#11#24#0#0
+  +#6#8#1'cb'#227#233#144#197'V'#207#227#143#11#11#25#0#0#8#8'hi'#8#8'j4kl'#200
+  +'P'#187#207#238#144#143#11#11#26#0#0'op'#0'qr'#8#8's'#0't'#198'S'#188#254#224
+  +#159'uv'#11#11#27#0#0'w'#0'x'#0'y'#8#8'z'#0'{|Zagmu}v'#11#11#28#0#0#29#197'~'
+  +#153#153#186#8#131#132#0#133'agmu}'#134#135#11#11#28#136#137#138'BF'#139#0
+  +#140#8#8#141#0#142'gmu}'#134#143#144#11#11'-'#145#146'=CG'#147#0#148#149#8
+  +#150#151#128#152'nvv'#135#144#153#9#11#136#154#0#155#156#157#0#0#158#7#11'o'
+  +#224'TBGRALayeredBitmap'#26#0#28#0#0#0#1#0#0#0#0#0#0#0#3#0#0#0' '#0#0#0' '#0
+  +#0#0'K'#5#0#0#0#0#0#0'H'#0#0#0#1#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0'5'#0#0#0#255
+  +#255#0#0#203#4#0#0#0#0#0#0#156#21#191#183#226#215'F'#19#134'i'#221'H3'#199#31
+  +#213#0#0#128'?'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128'?'#0#0#0#0' '#0#0#0' '#0#0#0
+  +#6#0#0#0'Layer1'#16#244#0#0#0'$'#0#134'B'#159#203#203#159'B'#25#0#136's'#217
+  +#242#254#254#242#217's'#23#0#131'B'#217#252's'#131#252#217'B'#22#0#130#159
+  +#242'u'#130#253#235#14#202#1#167'f'#130#203#254#22#255#1#202'f'#130#203#254
+  +#22#255#1#202'f'#130#159#242#22#255#1#202'f'#130'B'#217#22#255#1#202'g'#130
+  +'s'#248#21#255#1#202'h'#1#216#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21
+  +#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202
+  +'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202
+  +#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1
+  +#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1#202#21#255#1#202'h'#1
+  +#202#21#255#1#202'h'#1#167#7#202#1#244'u'#1#228#6#202#1#167#17#0'A'#12'T'#255
+  +#225#141#1#26#24#0#134#2#206#225#141'8'#1#27#0#130#2#1'1'#0#224#154#0#0#0#144
+  +#0'"MZa'#199#248#198#255'K'#16' '#194#193'Z'#17#205','#152#153#137#152#152
+  +#153#131#3#186#30#205'P'#170#170#170#169#170#170#129'25'#145'M-h5a'#9#31'Ej6'
+  +'"K=l7'#26#24#185'@n7+Co8EqHs9KtMv:Pw:Sy;'#184'Uz'#239#165'r*'#13'u|<'#173'%'
+  +'A[~'#198#200#230#11'j'#127'='#233't'#24#237'vT'#129'> '#4#157#207'%x'#130'='
+  +']'#3'*'#245#254'Oc'#132'?"$\6'#173#181'9'#133'?55/>'#250#246'#6@'#11#161#158
+  +'H'#20#224#158#0#0#0#144#0'!KY`'#196#245#195#251'K'#31'<'#191#190'X'#27#195
+  +'G'#137'A'#21'IJKL'#2'M'#132'N'#3#183')'#205'k'#170#170#170#170#170#170#129
+  +'2O'#142'M<'#133'P_'#9'$['#135'P%KQ'#136'P0'''#183'T'#138'QFW'#140'RY'#142'\'
+  +#144'S_'#145'b'#147'Td'#149'Th'#151'U'#181'j'#152#236#162'p)'#16#146#154'V'
+  +#170'.Qr'#156#195#197#227#13#133#157'W'#229'r'#24#233'th'#159'X '#5#154#203
+  +'.'#150#161'Mt'#3')'#241#250'N{'#162'Y,.tD'#171#178'G'#164'YOOE='#246#242'#N'
+  +'Y'#21#158#156'G&'#224#154#0#0#0#146#0' HU['#187#234#187#240'O`'#186#183#182
+  +'VI'#186#186'Aj'#187#188#189#190#131#3#175'I'#205#188#169#169#169#169#169#169
+  +#129'2'#190#137'Qj'#207#191']'#9'4'#159#209#191'AQ'#139#210#192#150'h'#175
+  +#141#212#192#186#143#213#192#145#215#148#216#193#150#217#152#219#193#154#220
+  +#194#157#222#194#173#158#223#225#155'k('#24#215#224#195#163'Fy'#169#226#186
+  +#189#217#19#198#227#195#219'm'#23#223'o'#155#228#196#30#8#148#194'D'#221#230
+  +'w'#178#2''''#230#239'J'#181#231#196'DG'#178'g'#163#170'h'#233#197#189#188
+  +#162':'#236#231'!'#176#197'B'#151#149'Dv'#224#222#1#0#0'f'#212#1#153#135'w'
+  +#137#185#152'wW'#138#208#4#8#131#7#9#10#15#11#232#27#186#201'6'#208#14#153
+  +#153#153#153#153#153#153#128#138#11#0#3#6#8#0#29#30#6#14#239#185#153#153#153
+  +#153#153#153#144#139#11#0#2#7#8#0#0#29'./0'#206'!'#153#153#153#153#153#157
+  ,#144#139#11#0#1'3'#5#0#0'4'#29'56'#206'"'#153#153#153#153#153#222#144#138#11
+  +#0'9:'#0#0#30'4'#29';'#206'#'#153#153#153#153#157#237#144#138#11'>?'#0#0#8'@'
+  +'4'#29'A'#205'%'#153#153#153#157#237#233#139#11#11'D'#0#0#8#8'@4'#29'E'#204
+  +''''#153#153#157#237#236#144#195#11#141#130#0#0#3#8#132'@4'#29'H'#203')'#153
+  +#157#237#236#182#195#11#142#130#0#0#4#8#132'@4'#29'J'#202'+'#157#237#236#186
+  +#144#195#11#143#130#0#0#5#8#132'@4'#29'M'#201'1'#237#236#186#182#133#11#11#19
+  +#0#0#6#8#132'@4'#29'O'#200'<'#236#186#186#144#133#11#11#20#0#0#7#8#132'@4'#29
+  +'R'#199'F'#186#186#185#133#11#11#21#0#0#8#8#132#30'4'#29'U'#198'K'#186#187
+  +#144#133#11#11#22#0#0#9#8#132'X'#0#29'Y'#229#27#188'P'#133#11#11#23#0#0#6#8
+  +#228#201#153#141#0#0'_`VZab'#11#11#24#0#0#6#8#1'cb'#227#233#144#197'V'#207
+  +#227#143#11#11#25#0#0#8#8'hi'#8#8'j4kl'#200'P'#187#207#238#144#143#11#11#26#0
+  +#0'op'#0'qr'#8#8's'#0't'#198'S'#188#254#224#159'uv'#11#11#27#0#0'w'#0'x'#0'y'
+  +#8#8'z'#0'{|Zagmu}v'#11#11#28#0#0#29#197'~'#153#153#186#8#131#132#0#133'agmu'
+  +'}'#134#135#11#11#28#136#137#138'BF'#139#0#140#8#8#141#0#142'gmu}'#134#143
+  +#144#11#11'-'#145#146'=CG'#147#0#148#149#8#150#151#128#152'nvv'#135#144#153#9
+  +#11#136#154#0#155#156#157#0#0#158#7#11'o'#224'TMemDirectory'#26#0#0')'#4#0#0
+  +#0#0#0#0#25#0#0#0#0#0#0#0'3vectorrect203cbaca2bevelgradient3853acff,9abbfcff'
+  +'linear4,432,32RGBpad'#7#0#0#0#0#128#5#8'9'#0#0#0#0#0#0#0'class'#0#128#6#17
+  +'A'#0#0#0#0#0#0#0'colors'#0#128#13#6'R'#0#0#0#0#0#0#0'gradient-type'#0#128#6
+  +#3'X'#0#0#0#0#0#0#0'origin'#0#128#6#5'['#0#0#0#0#0#0#0'x-axis'#0#128#19#3'`'
+  +#0#0#0#0#0#0#0'color-interpolation'#0#128#10#3'c'#0#0#0#0#0#0#0'repetition15'
+  +',15.525.5,15.515,26.5'#9#0#0#0#0#128#5#4''''#0#0#0#0#0#0#0'class'#0#128#9#8
+  +'+'#0#0#0#0#0#0#0'pen-color'#0#128#9#1'3'#0#0#0#0#0#0#0'pen-width'#0#128#9#0
+  +'4'#0#0#0#0#0#0#0'pen-style'#0#128#10#5'4'#0#0#0#0#0#0#0'join-style'#1#128#9
+  +#153'f'#0#0#0#0#0#0#0'back-fill'#0#128#6#7#255#0#0#0#0#0#0#0'origin'#0#128#6
+  +#9#6#1#0#0#0#0#0#0'x-axis'#0#128#6#7#15#1#0#0#0#0#0#0'y-axisellipse000000d22'
+  +'fffbf0ff6.5,5.510.5,5.56.5,9.5'#8#0#0#0#0#128#5#7#203#1#0#0#0#0#0#0'class'#0
+  +#128#9#8#210#1#0#0#0#0#0#0'pen-color'#0#128#9#1#218#1#0#0#0#0#0#0'pen-width'
+  +#0#128#9#0#219#1#0#0#0#0#0#0'pen-style'#0#128#10#8#219#1#0#0#0#0#0#0'back-co'
+  +'lor'#0#128#6#7#227#1#0#0#0#0#0#0'origin'#0#128#6#8#234#1#0#0#0#0#0#0'x-axis'
+  +#0#128#6#7#242#1#0#0#0#0#0#0'y-axispolylineblack2bevelfffbf0ff6.5,6.5,10.5,1'
+  +'3.5,18,15,19.56,24.5,22,28.5,27,20,19true'#9#0#0#0#0#128#5#8#153#2#0#0#0#0#0
+  +#0'class'#0#128#9#5#161#2#0#0#0#0#0#0'pen-color'#0#128#9#1#166#2#0#0#0#0#0#0
+  +'pen-width'#0#128#9#0#167#2#0#0#0#0#0#0'pen-style'#0#128#10#5#167#2#0#0#0#0#0
+  +#0'join-style'#0#128#10#8#172#2#0#0#0#0#0#0'back-color'#0#128#1#28#180#2#0#0
+  +#0#0#0#0'x'#0#128#1#23#208#2#0#0#0#0#0#0'y'#0#128#6#4#231#2#0#0#0#0#0#0'clos'
+  +'ed'#5#0#0#0#0#128#5#1' '#0#0#0#0#0#0#0'count'#0#128#5#6'!'#0#0#0#0#0#0#0'cl'
+  +'ass'#1#128#6#181#22#1#0#0#0#0#0#0'shape1'#1#128#6#160#249#1#0#0#0#0#0#0'sha'
+  +'pe2'#1#128#6#172#235#2#0#0#0#0#0#0'shape3'#1#0#0#0#1#128'&\'#151#3#0#0#0#0#0
+  +#0'{9C15BFB7-E2D7-4613-8669-DD4833C71FD5}'#1#0#0#0#1#128#9'6'#243#3#0#0#0#0#0
+  +#0'originals'
+]);
 LazarusResources.Add('gradientreflected16','LZP',[
   'LazPaint'#0#0#0#0'0'#0#0#0#16#0#0#0#16#0#0#0#1#0#0#0#219#0#0#0#0#0#0#0#2#1#0
   +#0#0#0#0#0#221#1#0#0#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#16#0#0#0#16#8
@@ -2283,5 +2454,5 @@ LazarusResources.Add('fillimages','LST',[
   +'tsrgb16.lzp,gradientrgb16.lzp,gradienthuecw16.lzp,gradienthueccw16.lzp,grad'
   +'ientcorrhuecw16.lzp,gradientcorrhueccw16.lzp,texturenorepeat16.lzp,texturer'
   +'epeatx16.lzp,texturerepeaty16.lzp,texturerepeatboth16.lzp,texturefit16.lzp,'
-  +'textureopen32.lzp,swapgradcolor16.lzp,texture16.lzp'
+  +'textureopen32.lzp,swapgradcolor16.lzp,texture16.lzp,movegradpoint32.lzp'
 ]);

+ 1 - 0
resources/fillimages.lst

@@ -23,3 +23,4 @@ texturefit16.lzp
 textureopen32.lzp
 swapgradcolor16.lzp
 texture16.lzp
+movegradpoint32.lzp

BIN
resources/fillimages24.png


BIN
resources/vector/fill/movegradpoint32.lzp