Browse Source

Use percent for radius

Krzysztof Krysiński 4 months ago
parent
commit
921deb98ef

+ 5 - 2
src/ChunkyImageLib/Operations/RectangleOperation.cs

@@ -39,13 +39,16 @@ internal class RectangleOperation : IMirroredDrawOperation
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
         surf.Canvas.Translate(-chunkPos * ChunkyImage.FullChunkSize);
         surf.Canvas.RotateRadians((float)Data.Angle, (float)rect.Center.X, (float)rect.Center.Y);
         surf.Canvas.RotateRadians((float)Data.Angle, (float)rect.Center.X, (float)rect.Center.Y);
 
 
+        double maxRadiusInPx = Math.Min(Data.Size.X, Data.Size.Y) / 2;
+        double radiusInPx = Data.CornerRadius * maxRadiusInPx;
+
         if (Data.AntiAliasing)
         if (Data.AntiAliasing)
         {
         {
-            DrawAntiAliased(surf, rect, Data.CornerRadius);
+            DrawAntiAliased(surf, rect, radiusInPx);
         }
         }
         else
         else
         {
         {
-            DrawPixelPerfect(surf, rect, innerRect, Data.CornerRadius);
+            DrawPixelPerfect(surf, rect, innerRect, radiusInPx);
         }
         }
 
 
         surf.Canvas.RestoreToCount(initial);
         surf.Canvas.RestoreToCount(initial);

+ 5 - 2
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/Shapes/Data/RectangleVectorData.cs

@@ -89,14 +89,17 @@ public class RectangleVectorData : ShapeVectorData, IReadOnlyRectangleData
 
 
     private void DrawRect(Canvas canvas, Paint paint)
     private void DrawRect(Canvas canvas, Paint paint)
     {
     {
-        if (CornerRadius == 0)
+        double maxRadiusPx = Math.Min(Size.X, Size.Y) / 2f;
+        double radiusPx = CornerRadius * maxRadiusPx;
+
+        if (radiusPx == 0)
         {
         {
             canvas.DrawRect(RectD.FromCenterAndSize(Center, Size), paint);
             canvas.DrawRect(RectD.FromCenterAndSize(Center, Size), paint);
         }
         }
         else
         else
         {
         {
             RectD rect = RectD.FromCenterAndSize(Center, Size);
             RectD rect = RectD.FromCenterAndSize(Center, Size);
-            canvas.DrawRoundRect((float)rect.Pos.X, (float)rect.Pos.Y, (float)rect.Width, (float)rect.Height, (float)CornerRadius, (float)CornerRadius, paint);
+            canvas.DrawRoundRect((float)rect.Pos.X, (float)rect.Pos.Y, (float)rect.Width, (float)rect.Height, (float)radiusPx, (float)radiusPx, paint);
         }
         }
     }
     }
 
 

+ 1 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/VectorRectangleToolExecutor.cs

@@ -44,7 +44,7 @@ internal class VectorRectangleToolExecutor : DrawableShapeToolExecutor<IVectorRe
         firstCenter = rectData.Center;
         firstCenter = rectData.Center;
         firstSize = rectData.Size;
         firstSize = rectData.Size;
         lastMatrix = rectData.TransformationMatrix;
         lastMatrix = rectData.TransformationMatrix;
-        toolViewModel.CornerRadius = rectData.CornerRadius;
+        toolViewModel.CornerRadius = (float)rectData.CornerRadius;
 
 
         return true;
         return true;
     }
     }

+ 1 - 1
src/PixiEditor/Models/Handlers/Tools/ICornerRadiusTool.cs

@@ -4,5 +4,5 @@ namespace PixiEditor.Models.Handlers.Tools;
 
 
 public interface ICornerRadiusTool
 public interface ICornerRadiusTool
 {
 {
-    public double CornerRadius { get; set; }
+    public float CornerRadius { get; set; }
 }
 }

+ 12 - 2
src/PixiEditor/Models/IO/CustomDocumentFormats/SvgDocumentBuilder.cs

@@ -333,10 +333,20 @@ internal class SvgDocumentBuilder : IDocumentBuilder
 
 
     private RectangleVectorData AddRect(SvgRectangle element)
     private RectangleVectorData AddRect(SvgRectangle element)
     {
     {
+        double rx = element.Rx.Unit?.PixelsValue ?? 0;
+        double ry = element.Ry.Unit?.PixelsValue ?? 0;
+        double width = element.Width.Unit?.PixelsValue ?? 0;
+        double height = element.Height.Unit?.PixelsValue ?? 0;
+
+        double shortestAxis = Math.Min(width, height);
+
+        double cornerRadius = Math.Max(rx, ry);
+        double cornerRadiusPercent = cornerRadius / (shortestAxis / 2f);
+
         return new RectangleVectorData(
         return new RectangleVectorData(
             element.X.Unit?.PixelsValue ?? 0, element.Y.Unit?.PixelsValue ?? 0,
             element.X.Unit?.PixelsValue ?? 0, element.Y.Unit?.PixelsValue ?? 0,
-            element.Width.Unit?.PixelsValue ?? 0, element.Height.Unit?.PixelsValue ?? 0)
-            { CornerRadius = (element.Rx.Unit?.PixelsValue ?? element.Ry.Unit?.PixelsValue) ?? 0 };
+            width, height)
+            { CornerRadius = cornerRadiusPercent };
     }
     }
 
 
     private TextVectorData AddText(SvgText element)
     private TextVectorData AddText(SvgText element)

+ 3 - 3
src/PixiEditor/ViewModels/Tools/Tools/RasterRectangleToolViewModel.cs

@@ -27,12 +27,12 @@ internal class RasterRectangleToolViewModel : ShapeTool, IRasterRectangleToolHan
     public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(ImageLayerNode);
     public override Type LayerTypeToCreateOnEmptyUse { get; } = typeof(ImageLayerNode);
 
 
 
 
-    [Settings.Size("RADIUS", 0, ExposedByDefault = true, Min = 0)]
-    public double CornerRadius
+    [Settings.Percent("RADIUS", 0, ExposedByDefault = true, Min = 0)]
+    public float CornerRadius
     {
     {
         get
         get
         {
         {
-            return GetValue<double>();
+            return GetValue<float>();
         }
         }
         set
         set
         {
         {

+ 3 - 3
src/PixiEditor/ViewModels/Tools/Tools/VectorRectangleToolViewModel.cs

@@ -31,12 +31,12 @@ internal class VectorRectangleToolViewModel : ShapeTool, IVectorRectangleToolHan
 
 
     private VecD cornerRadius = new VecD(0, 0);
     private VecD cornerRadius = new VecD(0, 0);
 
 
-    [Settings.Size("RADIUS", 0, ExposedByDefault = true, Min = 0)]
-    public double CornerRadius
+    [Settings.Percent("RADIUS", 0, ExposedByDefault = true, Min = 0)]
+    public float CornerRadius
     {
     {
         get
         get
         {
         {
-            return GetValue<double>();
+            return GetValue<float>();
         }
         }
         set
         set
         {
         {