Browse Source

Resize 'PreviewImage' for big Pixifiles to fit max size allowed

Xiphereal 3 years ago
parent
commit
76af7a8927

+ 12 - 3
PixiEditor/Models/DataHolders/RecentlyOpenedDocument.cs

@@ -85,9 +85,18 @@ namespace PixiEditor.Models.DataHolders
                     return null;
                 }
 
-                return PixiFileMaxSizeChecker.IsFileUnderMaxSize(serializableDocument) ?
-                    BitmapUtils.GeneratePreviewBitmap(serializableDocument.Layers, serializableDocument.Width, serializableDocument.Height, 80, 50)
-                    : null;
+                WriteableBitmap writeableBitmap =
+                    BitmapUtils.GeneratePreviewBitmap(serializableDocument.Layers, serializableDocument.Width, serializableDocument.Height, 80, 50);
+
+                const int MaxWidthInPixels = 1080;
+                const int MaxHeightInPixels = 1080;
+                const int MaxLayerCount = 5;
+                PixiFileMaxSizeChecker pixiFileMaxSizeChecker =
+                    new PixiFileMaxSizeChecker(maxPixelCountAllowed: MaxWidthInPixels * MaxHeightInPixels * MaxLayerCount);
+
+                return pixiFileMaxSizeChecker.IsFileUnderMaxSize(serializableDocument) ?
+                    writeableBitmap
+                    : writeableBitmap.Resize(width: 1080, height: 1080, WriteableBitmapExtensions.Interpolation.Bilinear);
             }
             else if (FileExtension is ".png" or ".jpg" or ".jpeg")
             {

+ 9 - 5
PixiEditor/Models/IO/PixiFileMaxSizeChecker.cs

@@ -2,14 +2,18 @@
 
 namespace PixiEditor.Models.IO
 {
-    internal static class PixiFileMaxSizeChecker
+    internal class PixiFileMaxSizeChecker
     {
-        // Result of 1080 (Width) * 1080 (Height) * 5 (Layers count).
-        private const int MaxBitCountAllowed = 5832000;
+        private readonly int maxPixelCountAllowed;
 
-        public static bool IsFileUnderMaxSize(SerializableDocument fileToCheck)
+        public PixiFileMaxSizeChecker(int maxPixelCountAllowed)
         {
-            return fileToCheck.Height * fileToCheck.Width * fileToCheck.Layers.Count < MaxBitCountAllowed;
+            this.maxPixelCountAllowed = maxPixelCountAllowed;
+        }
+
+        public bool IsFileUnderMaxSize(SerializableDocument fileToCheck)
+        {
+            return fileToCheck.Height * fileToCheck.Width * fileToCheck.Layers.Count < maxPixelCountAllowed;
         }
     }
 }

+ 11 - 3
PixiEditorTests/ModelsTests/DataHoldersTests/RecentlyOpenedDocumentTests.cs

@@ -1,4 +1,5 @@
 using PixiEditor.Models.DataHolders;
+using PixiEditor.Parser;
 using System;
 using Xunit;
 
@@ -8,14 +9,21 @@ namespace PixiEditorTests.ModelsTests.DataHoldersTests
     public class RecentlyOpenedDocumentTests
     {
         [Fact]
-        public void TestThatForBigPixiFilesPreviewImageIsNotLoaded()
+        public void TestThatForBigPixiFilesPreviewImageIsResizedToMaxSize()
         {
             string bigFilePath = $@"{Environment.CurrentDirectory}\..\..\..\ModelsTests\IO\BigPixiFile.pixi";
             RecentlyOpenedDocument recentlyOpenedDocument = new RecentlyOpenedDocument(bigFilePath);
 
-            var bigFilePreviewImage = recentlyOpenedDocument.PreviewBitmap;
+            var bigPixiFilePreviewImage = recentlyOpenedDocument.PreviewBitmap;
 
-            Assert.Null(bigFilePreviewImage);
+            const int MaxWidthInPixels = 1080;
+            Assert.True(bigPixiFilePreviewImage.PixelWidth <= MaxWidthInPixels);
+
+            const int MaxHeightInPixels = 1080;
+            Assert.True(bigPixiFilePreviewImage.PixelHeight <= MaxHeightInPixels);
+
+            // This is a workaround for checking the Pixi file layers.
+            Assert.True(PixiParser.Deserialize(bigFilePath).Layers.Count <= 5);
         }
 
         [Fact]