瀏覽代碼

fix vector coords in transformed layer

Johann 6 年之前
父節點
當前提交
f19532ccb5
共有 2 個文件被更改,包括 28 次插入16 次删除
  1. 27 15
      lazpaint/tools/utoolvectorial.pas
  2. 1 1
      lazpaintcontrols/lcvectorpolyshapes.pas

+ 27 - 15
lazpaint/tools/utoolvectorial.pas

@@ -384,21 +384,24 @@ end;
 function TVectorialTool.DoToolDown(toolDest: TBGRABitmap; pt: TPoint;
   ptF: TPointF; rightBtn: boolean): TRect;
 var
-  viewPt: TPointF;
+  viewPt, shapePt: TPointF;
   cur: TOriginalEditorCursor;
   handled: boolean;
 begin
   result := EmptyRect;
   FRightDown := rightBtn;
   FLeftDown := not rightBtn;
-  FLastPos := ptF;
+  with Manager.Image.LayerOffset[Manager.Image.CurrentLayerIndex] do
+    FLastPos := AffineMatrixTranslation(X,Y)*ptF;
   if Assigned(FShape) then
   begin
-    with Manager.Image.LayerOffset[Manager.Image.CurrentLayerIndex] do
-      viewPt := FEditor.Matrix*AffineMatrixInverse(VectorTransform)*AffineMatrixTranslation(X,Y)*ptF;
+    viewPt := FEditor.Matrix*AffineMatrixInverse(VectorTransform)*FLastPos;
     FEditor.MouseDown(rightBtn, FShiftState, viewPt.X,viewPt.Y, cur, handled);
     if not handled and Assigned(FShape) then
-      FShape.MouseDown(rightBtn, FShiftState, ptF.X,ptF.Y, cur, handled);
+    begin
+      shapePt := AffineMatrixInverse(VectorTransform)*FLastPos;
+      FShape.MouseDown(rightBtn, FShiftState, shapePt.X,shapePt.Y, cur, handled);
+    end;
     UpdateCursor(cur);
     if handled then exit
     else result := RectUnion(result, ValidateShape);
@@ -407,7 +410,7 @@ begin
   if FShape=nil then
   begin
     if UseOriginal and
-      ((Manager.Image.LayerOriginal[Manager.Image.CurrentLayerIndex] as TVectorOriginal).ShapeCount >= 10) then
+      ((Manager.Image.LayerOriginal[Manager.Image.CurrentLayerIndex] as TVectorOriginal).ShapeCount >= 50) then
     begin
       MessagePopup(rsTooManyShapesInLayer, 3000);
     end
@@ -422,12 +425,15 @@ begin
       FSwapColor:= rightBtn;
       FShape := CreateShape;
       FQuickDefine := true;
-      FQuickDefineStartPoint := RoundCoordinate(ptF);
+      FQuickDefineStartPoint := RoundCoordinate(FLastPos);
       FQuickDefineEndPoint := FQuickDefineStartPoint;
       FShape.BeginUpdate;
         QuickDefineShape(FQuickDefineStartPoint,FQuickDefineEndPoint);
         FLastShapeTransform := AffineMatrixInverse(VectorTransform);
         FShape.Transform(FLastShapeTransform);
+        shapePt := AffineMatrixInverse(VectorTransform)*FLastPos;
+        handled := false;
+        FShape.MouseMove(FShiftState, shapePt.X,shapePt.Y, cur, handled);
         AssignShapeStyle(FLastShapeTransform);
       FShape.EndUpdate;
       FShape.OnChange:= @ShapeChange;
@@ -443,11 +449,12 @@ function TVectorialTool.DoToolMove(toolDest: TBGRABitmap; pt: TPoint;
 var
   s: TPointF;
   avg: single;
-  viewPt: TPointF;
+  viewPt, shapePt: TPointF;
   handled: boolean;
   cur: TOriginalEditorCursor;
 begin
-  FLastPos := ptF;
+  with Manager.Image.LayerOffset[Manager.Image.CurrentLayerIndex] do
+    FLastPos := AffineMatrixTranslation(X,Y)*ptF;
   if FQuickDefine then
   begin
     FQuickDefineEndPoint := RoundCoordinate(ptF);
@@ -467,11 +474,13 @@ begin
     result := OnlyRenderChange;
   end else
   begin
-    with Manager.Image.LayerOffset[Manager.Image.CurrentLayerIndex] do
-      viewPt := FEditor.Matrix*AffineMatrixInverse(VectorTransform)*AffineMatrixTranslation(X,Y)*ptF;
+    viewPt := FEditor.Matrix*AffineMatrixInverse(VectorTransform)*FLastPos;
     FEditor.MouseMove(FShiftState, viewPt.X,viewPt.Y, cur, handled);
     if not handled and Assigned(FShape) then
-      FShape.MouseMove(FShiftState, ptF.X,ptF.Y, cur, handled);
+    begin
+      shapePt := AffineMatrixInverse(VectorTransform)*FLastPos;
+      FShape.MouseMove(FShiftState, shapePt.X,shapePt.Y, cur, handled);
+    end;
     UpdateCursor(cur);
     if handled then result := OnlyRenderChange
     else result := EmptyRect;
@@ -503,7 +512,7 @@ end;
 
 function TVectorialTool.ToolUp: TRect;
 var
-  viewPt: TPointF;
+  viewPt, shapePt: TPointF;
   cur: TOriginalEditorCursor;
   handled, wasRight: boolean;
 begin
@@ -517,10 +526,13 @@ begin
     QuickDefineEnd;
   end else
   begin
-    viewPt := FEditor.Matrix*FLastPos;
+    viewPt := FEditor.Matrix*AffineMatrixInverse(VectorTransform)*FLastPos;
     FEditor.MouseUp(wasRight, FShiftState, viewPt.X,viewPt.Y, cur, handled);
     if not handled and Assigned(FShape) then
-      FShape.MouseUp(wasRight, FShiftState, FLastPos.X,FLastPos.Y, cur, handled);
+    begin
+      shapePt := AffineMatrixInverse(VectorTransform)*FLastPos;
+      FShape.MouseUp(wasRight, FShiftState, shapePt.X,shapePt.Y, cur, handled);
+    end;
     UpdateCursor(cur);
     result := EmptyRect;
   end;

+ 1 - 1
lazpaintcontrols/lcvectorpolyshapes.pas

@@ -824,7 +824,7 @@ begin
   for i:= 0 to PointCount-1 do
     if isEmptyPointF(Points[i]) then
       FPoints[i].editorIndex := -1
-    else if (FAddingPoint and (i = PointCount-1)) then
+    else if (FAddingPoint and (i = PointCount-1) and (PointCount > 1)) then
     begin
       FPoints[i].editorIndex := -1;
       FCenterPoint += Points[i];