flabbet 1 рік тому
батько
коміт
5dd7e47187

+ 1 - 0
src/PixiEditor.DrawingApi.Core/Bridge/NativeObjectsImpl/IBitmapImplementation.cs

@@ -14,4 +14,5 @@ public interface IBitmapImplementation
     public VecI GetSize(IntPtr objectPointer);
     public byte[] GetBytes(IntPtr objectPointer);
     public ImageInfo GetInfo(IntPtr objectPointer);
+    public Pixmap? PeekPixels(IntPtr objectPointer);
 }

+ 5 - 0
src/PixiEditor.DrawingApi.Core/Surfaces/Bitmap.cs

@@ -33,4 +33,9 @@ public class Bitmap : NativeObject
     {
         return DrawingBackendApi.Current.BitmapImplementation.FromImage(snapshot.ObjectPointer);
     }
+
+    public Pixmap? PeekPixels()
+    {
+        return DrawingBackendApi.Current.BitmapImplementation.PeekPixels(ObjectPointer);
+    }
 }

+ 10 - 1
src/PixiEditor.DrawingApi.Core/Texture.cs

@@ -16,6 +16,9 @@ public class Texture : IDisposable
     public event SurfaceChangedEventHandler? Changed;
     
     public bool IsDisposed { get; private set; }
+    
+    private bool pixmapUpToDate;
+    private Pixmap pixmap;
 
     public Texture(VecI size)
     {
@@ -97,7 +100,13 @@ public class Texture : IDisposable
         if (vecI.X < 0 || vecI.X >= Size.X || vecI.Y < 0 || vecI.Y >= Size.Y)
             return null;
         
-        return Surface.PeekPixels().GetPixelColor(vecI.X, vecI.Y);
+        if (!pixmapUpToDate)
+        {
+            pixmapUpToDate = true;
+            pixmap = Surface.PeekPixels();
+        }
+        
+        return pixmap.GetPixelColor(vecI);
     }
 
     public void Dispose()

+ 17 - 6
src/PixiEditor.DrawingApi.Skia/Implementations/SkiaBitmapImplementation.cs

@@ -10,16 +10,20 @@ namespace PixiEditor.DrawingApi.Skia.Implementations
     public class SkiaBitmapImplementation : SkObjectImplementation<SKBitmap>, IBitmapImplementation
     {
         public SkiaImageImplementation ImageImplementation { get; }
-        public SkiaBitmapImplementation(SkiaImageImplementation imgImpl)
+        
+        private readonly SkiaPixmapImplementation _pixmapImplementation;
+
+        public SkiaBitmapImplementation(SkiaImageImplementation imgImpl, SkiaPixmapImplementation pixmapImplementation)
         {
             ImageImplementation = imgImpl;
+            _pixmapImplementation = pixmapImplementation;
         }
 
         public void Dispose(IntPtr objectPointer)
         {
             SKBitmap bitmap = ManagedInstances[objectPointer];
-            bitmap.Dispose();   
-            
+            bitmap.Dispose();
+
             ManagedInstances.TryRemove(objectPointer, out _);
         }
 
@@ -37,7 +41,7 @@ namespace PixiEditor.DrawingApi.Skia.Implementations
             ManagedInstances[skBitmap.Handle] = skBitmap;
             return new Bitmap(skBitmap.Handle);
         }
-        
+
         public VecI GetSize(IntPtr objectPointer)
         {
             SKBitmap bitmap = ManagedInstances[objectPointer];
@@ -47,15 +51,22 @@ namespace PixiEditor.DrawingApi.Skia.Implementations
         public byte[] GetBytes(IntPtr objectPointer)
         {
             SKBitmap bitmap = ManagedInstances[objectPointer];
-            return bitmap.Bytes; 
+            return bitmap.Bytes;
         }
-        
+
         public ImageInfo GetInfo(IntPtr objectPointer)
         {
             SKBitmap bitmap = ManagedInstances[objectPointer];
             return bitmap.Info.ToImageInfo();
         }
 
+        public Pixmap PeekPixels(IntPtr objectPointer)
+        {
+            SKBitmap bitmap = ManagedInstances[objectPointer];
+            SKPixmap pixmap = bitmap.PeekPixels();
+            return _pixmapImplementation.CreateFrom(pixmap);
+        }
+
         public object GetNativeBitmap(IntPtr objectPointer)
         {
             return ManagedInstances[objectPointer];

+ 3 - 1
src/PixiEditor.DrawingApi.Skia/Implementations/SkiaSurfaceImplementation.cs

@@ -31,7 +31,9 @@ namespace PixiEditor.DrawingApi.Skia.Implementations
             SKPixmap pixmap = ManagedInstances[drawingSurface.ObjectPointer].PeekPixels();
             if (pixmap == null)
             {
-                pixmap = (Bitmap.FromImage(drawingSurface.Snapshot()).Native as SKBitmap).PeekPixels();
+                using var snapshot = drawingSurface.Snapshot();
+                Bitmap bitmap = Bitmap.FromImage(snapshot);
+                return bitmap.PeekPixels();
             }
 
             return _pixmapImplementation.CreateFrom(pixmap);

+ 1 - 1
src/PixiEditor.DrawingApi.Skia/SkiaDrawingBackend.cs

@@ -75,7 +75,7 @@ namespace PixiEditor.DrawingApi.Skia
             
             SkiaImageImplementation imgImpl = new SkiaImageImplementation(dataImpl, pixmapImpl);
             ImageImplementation = imgImpl;
-            SkiaBitmapImplementation bitmapImpl = new SkiaBitmapImplementation(imgImpl);
+            SkiaBitmapImplementation bitmapImpl = new SkiaBitmapImplementation(imgImpl, pixmapImpl);
             BitmapImplementation = bitmapImpl;
             
             SkiaCanvasImplementation canvasImpl = new SkiaCanvasImplementation(paintImpl, imgImpl, bitmapImpl, pathImpl);