Ver código fonte

Merge pull request #452 from PixiEditor/parser-fixes-n-stuff

Parser support for clip and blend mode fixes
Krzysztof Krysiński 2 anos atrás
pai
commit
38e4ac7d11

+ 13 - 1
src/PixiEditor/Helpers/DocumentViewModelBuilder.cs

@@ -55,6 +55,8 @@ internal class DocumentViewModelBuilder : ChildrenBuilder
         public float Opacity { get; set; }
         
         public BlendMode BlendMode { get; set; }
+        
+        public bool ClipToMemberBelow { get; set; }
 
         public bool HasMask => maskBuilder is not null;
 
@@ -115,6 +117,12 @@ internal class DocumentViewModelBuilder : ChildrenBuilder
             GuidValue = guid;
             return this;
         }
+
+        public StructureMemberBuilder WithClipToBelow(bool value)
+        {
+            ClipToMemberBelow = value;
+            return this;
+        }
     }
 
     public class LayerBuilder : StructureMemberBuilder
@@ -148,6 +156,8 @@ internal class DocumentViewModelBuilder : ChildrenBuilder
         
         public new LayerBuilder WithBlendMode(BlendMode blendMode) => base.WithBlendMode(blendMode) as LayerBuilder;
         
+        public new LayerBuilder WithClipToBelow(bool value) => base.WithClipToBelow(value) as LayerBuilder;
+        
         public new LayerBuilder WithMask(Action<MaskBuilder> mask) => base.WithMask(mask) as LayerBuilder;
         
         public new LayerBuilder WithGuid(Guid guid) => base.WithGuid(guid) as LayerBuilder;
@@ -204,6 +214,8 @@ internal class DocumentViewModelBuilder : ChildrenBuilder
         
         public new FolderBuilder WithGuid(Guid guid) => base.WithGuid(guid) as FolderBuilder;
 
+        public FolderBuilder WithClipToBelow(bool value) => base.WithClipToBelow(value) as FolderBuilder;
+
         public FolderBuilder WithChildren(Action<ChildrenBuilder> children)
         {
             ChildrenBuilder childrenBuilder = new();
@@ -228,7 +240,7 @@ internal class DocumentViewModelBuilder : ChildrenBuilder
         {
             if(buffer.IsEmpty) return this;
             
-            Surface.DrawingSurface.Canvas.DrawBitmap(Bitmap.Decode(buffer), 0, 0);
+            Surface.DrawingSurface.Canvas.DrawBitmap(Bitmap.Decode(buffer), x, y);
             return this;
         }
     }

+ 7 - 4
src/PixiEditor/Helpers/Extensions/PixiParserDocumentEx.cs

@@ -10,8 +10,7 @@ internal static class PixiParserDocumentEx
     {
         return DocumentViewModel.Build(b =>
         {
-            b
-                .WithSize(document.Width, document.Height)
+            b.WithSize(document.Width, document.Height)
                 .WithPalette(document.Palette, x => new Color(x.R, x.G, x.B, x.A))
                 .WithSwatches(document.Swatches, x => new(x.R, x.G, x.B, x.A));
 
@@ -43,6 +42,7 @@ internal static class PixiParserDocumentEx
             .WithOpacity(folder.Opacity)
             .WithBlendMode((PixiEditor.ChangeableDocument.Enums.BlendMode)(int)folder.BlendMode)
             .WithChildren(x => BuildChildren(x, folder.Children))
+            .WithClipToBelow(folder.ClipToMemberBelow)
             .WithMask(folder.Mask, (x, m) => x.WithVisibility(m.Enabled).WithSurface(m.Width, m.Height, x => x.WithImage(m.ImageBytes, m.OffsetX, m.OffsetY)));
 
         void BuildLayer(DocumentViewModelBuilder.LayerBuilder builder, ImageLayer layer)
@@ -52,13 +52,16 @@ internal static class PixiParserDocumentEx
                 .WithVisibility(layer.Enabled)
                 .WithOpacity(layer.Opacity)
                 .WithBlendMode((PixiEditor.ChangeableDocument.Enums.BlendMode)(int)layer.BlendMode)
-                .WithSize(layer.Width, layer.Height)
+                .WithRect(layer.Width, layer.Height, layer.OffsetX, layer.OffsetY)
+                .WithClipToBelow(layer.ClipToMemberBelow)
                 .WithMask(layer.Mask,
                     (x, m) => x.WithVisibility(m.Enabled).WithSurface(m.Width, m.Height,
                         x => x.WithImage(m.ImageBytes, m.OffsetX, m.OffsetY)));
 
             if (layer.Width > 0 && layer.Height > 0)
-                builder.WithSurface(x => x.WithImage(layer.ImageBytes, layer.OffsetX, layer.OffsetY));
+            {
+                builder.WithSurface(x => x.WithImage(layer.ImageBytes, 0, 0));
+            }
         }
     }
 }

+ 3 - 1
src/PixiEditor/ViewModels/SubViewModels/Document/DocumentViewModel.Serialization.cs

@@ -64,6 +64,7 @@ internal partial class DocumentViewModel
             BlendMode = (BlendMode)(int)folder.BlendMode,
             Enabled = folder.IsVisible,
             Opacity = folder.Opacity,
+            ClipToMemberBelow = folder.ClipToMemberBelow,
             Mask = GetMask(folder.Mask, folder.MaskIsVisible)
         };
     }
@@ -79,7 +80,8 @@ internal partial class DocumentViewModel
         {
             Width = result?.Size.X ?? 0, Height = result?.Size.Y ?? 0, OffsetX = tightBounds?.X ?? 0, OffsetY = tightBounds?.Y ?? 0,
             Enabled = layer.IsVisible, BlendMode = (BlendMode)(int)layer.BlendMode, ImageBytes = bytes,
-            Name = layer.Name, Opacity = layer.Opacity, Mask = GetMask(layer.Mask, layer.MaskIsVisible)
+            ClipToMemberBelow = layer.ClipToMemberBelow, Name = layer.Name, 
+            Opacity = layer.Opacity, Mask = GetMask(layer.Mask, layer.MaskIsVisible)
         };
 
         return serializable;

+ 4 - 0
src/PixiEditor/ViewModels/SubViewModels/Document/DocumentViewModel.cs

@@ -215,6 +215,10 @@ internal partial class DocumentViewModel : NotifyableObject
 
             if (!member.IsVisible)
                 acc.AddActions(new StructureMemberIsVisible_Action(member.IsVisible, member.GuidValue));
+            
+            acc.AddActions(new StructureMemberBlendMode_Action(member.BlendMode, member.GuidValue));
+            
+            acc.AddActions(new StructureMemberClipToMemberBelow_Action(member.ClipToMemberBelow, member.GuidValue));
 
             if (member is DocumentViewModelBuilder.LayerBuilder layer && layer.Surface is not null)
             {