Browse Source

IClonable image

flabbet 1 year ago
parent
commit
d4b969af83

+ 1 - 0
src/PixiEditor.DrawingApi.Core/Bridge/Operations/IImageImplementation.cs

@@ -20,5 +20,6 @@ namespace PixiEditor.DrawingApi.Core.Bridge.Operations
         public int GetWidth(IntPtr objectPointer);
         public int GetHeight(IntPtr objectPointer);
         public object GetNativeImage(IntPtr objectPointer);
+        public Image Clone(Image image);
     }
 }

+ 6 - 1
src/PixiEditor.DrawingApi.Core/Surface/ImageData/Image.cs

@@ -12,7 +12,7 @@ namespace PixiEditor.DrawingApi.Core.Surface.ImageData
     ///     <para />
     ///     <para>An image always has a non-zero dimensions. If there is a request to create a new image, either directly or via a surface, and either of the requested dimensions are zero, then <see langword="null" /> will be returned.</para>
     /// </remarks>
-    public class Image : NativeObject
+    public class Image : NativeObject, ICloneable
     {
         public override object Native => DrawingBackendApi.Current.ImageImplementation.GetNativeImage(ObjectPointer);
 
@@ -55,5 +55,10 @@ namespace PixiEditor.DrawingApi.Core.Surface.ImageData
         {
             return DrawingBackendApi.Current.ImageImplementation.Encode(this, format, quality);
         }
+
+        public object Clone()
+        {
+            return DrawingBackendApi.Current.ImageImplementation.Clone(this);
+        }
     }
 }

+ 9 - 0
src/PixiEditor.DrawingApi.Skia/Implementations/SkiaImageImplementation.cs

@@ -110,6 +110,15 @@ namespace PixiEditor.DrawingApi.Skia.Implementations
         {
             return ManagedInstances[objectPointer].Height;
         }
+        
+        public Image Clone(Image image)
+        {
+            var native = ManagedInstances[image.ObjectPointer];
+            var encoded = native.Encode();
+            var clone = SKImage.FromEncodedData(encoded);
+            ManagedInstances[clone.Handle] = clone;
+            return new Image(clone.Handle);
+        }
 
         public object GetNativeImage(IntPtr objectPointer)
         {