Bläddra i källkod

fix vectorshape before bounds on fill change

Johann 6 år sedan
förälder
incheckning
3014ae39c5
1 ändrade filer med 15 tillägg och 3 borttagningar
  1. 15 3
      lazpaintcontrols/lcvectororiginal.pas

+ 15 - 3
lazpaintcontrols/lcvectororiginal.pas

@@ -140,6 +140,7 @@ type
     FRemoving: boolean;
     FDiffs: TVectorShapeDiffList;
     FFillChangeWithoutUpdate: boolean;
+    FFillBeforeChangeBounds: TRectF;
     function GetIsBack: boolean;
     function GetIsFront: boolean;
     procedure SetContainer(AValue: TVectorOriginal);
@@ -174,6 +175,7 @@ type
     function GetStroker: TBGRAPenStroker;
     property Stroker: TBGRAPenStroker read GetStroker;
     procedure FillChange({%H-}ASender: TObject; var ADiff: TCustomVectorialFillDiff); virtual;
+    procedure FillBeforeChange({%H-}ASender: TObject); virtual;
     procedure UpdateRenderStorage(ARenderBounds: TRect; AImage: TBGRACustomBitmap = nil);
     procedure DiscardRenderStorage;
     procedure RetrieveRenderStorage(AMatrix: TAffineMatrix; out ARenderBounds: TRect; out AImage: TBGRABitmap);
@@ -1321,6 +1323,7 @@ begin
   begin
     AFillVariable := TVectorialFill.Create;
     AFillVariable.OnChange := @FillChange;
+    AFillVariable.OnBeforeChange := @FillBeforeChange;
   end;
   result := AFillVariable;
 end;
@@ -1512,7 +1515,10 @@ procedure TVectorShape.FillChange(ASender: TObject; var ADiff: TCustomVectorialF
 var
   field: TVectorShapeField;
   h: TVectorShapeCommonFillDiff;
+  r: TRectF;
 begin
+  r := FFillBeforeChangeBounds;
+  FFillBeforeChangeBounds := EmptyRectF;
   if FFillChangeWithoutUpdate then exit;
   if FUpdateCount=0 then
   begin
@@ -1523,15 +1529,15 @@ begin
     else
     begin
       ADiff.Free;
-      DoOnChange(EmptyRectF, nil);
+      DoOnChange(r, nil);
       exit;
     end;
     if Assigned(ADiff) then
     begin
-      DoOnChange(EmptyRectF, TVectorShapeEmbeddedFillDiff.Create(field, ADiff));
+      DoOnChange(r, TVectorShapeEmbeddedFillDiff.Create(field, ADiff));
       ADiff := nil;
     end else
-      DoOnChange(EmptyRectF, nil);
+      DoOnChange(r, nil);
   end else
   if (FUpdateCount>0) and Assigned(ADiff) then
   begin
@@ -1560,6 +1566,11 @@ begin
   end;
 end;
 
+procedure TVectorShape.FillBeforeChange(ASender: TObject);
+begin
+  FFillBeforeChangeBounds := GetRenderBounds(InfiniteRect, AffineMatrixIdentity);
+end;
+
 procedure TVectorShape.UpdateRenderStorage(ARenderBounds: TRect; AImage: TBGRACustomBitmap);
 var
   obj: TBGRACustomOriginalStorage;
@@ -1701,6 +1712,7 @@ begin
   FRemoving:= false;
   FId := 0;
   FRenderIteration:= 0;
+  FFillBeforeChangeBounds := EmptyRectF;
 end;
 
 class function TVectorShape.CreateFromStorage(