예제 #1
0
        public static ObservableCollection <Layer> ToLayers(this SerializableDocument serializableDocument)
        {
            ObservableCollection <Layer> layers = new ObservableCollection <Layer>();

            for (int i = 0; i < serializableDocument.Layers.Count; i++)
            {
                SerializableLayer serLayer = serializableDocument.Layers[i];
                Layer             layer    =
                    new Layer(serLayer.Name, BitmapUtils.BytesToWriteableBitmap(serLayer.Width, serLayer.Height, serLayer.BitmapBytes))
                {
                    IsVisible = serLayer.IsVisible,
                    Offset    = new Thickness(serLayer.OffsetX, serLayer.OffsetY, 0, 0),
                    Opacity   = serLayer.Opacity,
                    MaxHeight = serializableDocument.Height,
                    MaxWidth  = serializableDocument.Width,
                };
                if (serLayer.LayerGuid != Guid.Empty)
                {
                    layer.ChangeGuid(serLayer.LayerGuid);
                }
                layers.Add(layer);
            }

            return(layers);
        }
예제 #2
0
 public static void ClearGroupLayerIndexes(this SerializableDocument document)
 {
     foreach (SerializableGroup group in document.Groups)
     {
         group.SerializedStartLayer = group.SerializedEndLayer = -1;
     }
 }
예제 #3
0
        public static SerializableDocument Deserialize(Stream stream, LoadOptions loadOptions = null)
        {
            var doc = new SerializableDocument {
                Options = loadOptions
            };

            stream.ReadBFast(doc.ReadBuffer).Count();
            return(doc);
        }
예제 #4
0
        public void TestThatWriteToBinaryFileCreatesFile()
        {
            SerializableDocument doc = new SerializableDocument(new Document(10, 10));

            BinarySerialization.WriteToBinaryFile(Path, doc);

            Assert.True(File.Exists(Path));

            File.Delete(Path);
        }
예제 #5
0
    public void CanCreateSKImageFromLayer()
    {
        SerializableDocument document = PixiParser.Deserialize("./Files/16x16,PPD-3.pixi");

        SerializableLayer layer = document.Layers[0];

        using SKImage image = layer.ToSKImage();

        Assert.Equal(layer.Width, image.Width);
    }
예제 #6
0
        public static WpfObservableRangeCollection <Layer> ToLayers(this SerializableDocument document)
        {
            WpfObservableRangeCollection <Layer> layers = new();

            foreach (SerializableLayer slayer in document)
            {
                layers.Add(slayer.ToLayer(document.Width, document.Height));
            }

            return(layers);
        }
예제 #7
0
        public ZoneTree DoZoning()
        {
            this.ApplyDomModifications();
            var    msdocument = _documentFactory.Create(_msDoc, _url);
            string html, text;
            var    sDocument = SerializableDocument.Create(msdocument, out html, out text);

            _elementClassifier.Execute(sDocument);
            var zoneTree = _zoneTreeBuilder.Build(sDocument);

            return(zoneTree);
        }
예제 #8
0
 public static SerializableEntityTable FindEntityTable(this SerializableDocument doc, string name)
 {
     // Not very efficient ... but there are not very many entity tables
     foreach (var et in doc.EntityTables)
     {
         if (et.Name == name)
         {
             return(et);
         }
     }
     return(null);
 }
예제 #9
0
 public Document(SerializableDocument document)
 {
     _Document    = document;
     Header       = _Document.Header;
     Nodes        = _Document.Nodes.ToIArray();
     Geometry     = _Document.Geometry;
     StringTable  = _Document.StringTable.ToIArray();
     EntityTables = _Document.EntityTables.ToLookup(
         et => DocumentExtensions.GetTableKeyFromTableName(et.Name),
         et => et.ToEntityTable(this));
     Assets = _Document.Assets.ToLookup(et => et.Name, et => et);
 }
    public byte[] SerializeAndCreate()
    {
        SerializableDocument document = Helper.CreateDocument(Size, Layers, false);

        for (int i = 0; i < Layers; i++)
        {
            SKData encoded = bitmaps[i].Encode(SKEncodedImageFormat.Png, 100);
            document.Layers[i].PngBytes = encoded.AsSpan().ToArray();
        }

        return(PixiParser.Serialize(benchmarkDocument));
    }
예제 #11
0
        public static void Serialize(this SerializableDocument doc, Stream stream)
        {
            var bldr         = new BFastBuilder();
            var headerBuffer = doc.Header.ToString().ToBytesUtf8();

            bldr.Add(BufferNames.Header, headerBuffer.ToBuffer());
            bldr.Add(BufferNames.Assets, doc.Assets);
            bldr.Add(BufferNames.Entities, doc.EntityTables.ToBFastBuilder());
            bldr.Add(BufferNames.Strings, doc.StringTable.PackStrings().ToBuffer());
            bldr.Add(BufferNames.Geometry, doc.Geometry.ToG3DWriter());
            bldr.Add(BufferNames.Nodes, doc.Nodes.ToBuffer());
            bldr.Write(stream);
        }
예제 #12
0
        public void TestThatToDocumentConvertsCorrectly()
        {
            Document             document = GenerateSampleDocument();
            SerializableDocument doc      = new SerializableDocument(document);

            Document convertedDocument = doc.ToDocument();

            Assert.Equal(document.Height, convertedDocument.Height);
            Assert.Equal(document.Width, convertedDocument.Width);
            Assert.Equal(document.Swatches, convertedDocument.Swatches);
            Assert.Equal(document.Layers.Select(x => x.LayerBitmap.ToByteArray()),
                         convertedDocument.Layers.Select(x => x.LayerBitmap.ToByteArray()));
        }
예제 #13
0
        public static SerializableDocument ToSerializable(this Document document)
        {
            SerializableDocument serializable = new SerializableDocument
            {
                Width    = document.Width,
                Height   = document.Height,
                Layers   = document.Layers.Select(x => x.ToSerializable()).ToList(),
                Groups   = document.LayerStructure.Groups.Select(x => x.ToSerializable()).ToArray(),
                Swatches = document.Swatches.Select(x => SDColor.FromArgb(x.A, x.R, x.G, x.B)).ToList()
            };

            return(serializable);
        }
예제 #14
0
    public static void IncreaseGroupLayerIndexes(this SerializableDocument document, int start)
    {
        foreach (SerializableGroup group in document.Groups)
        {
            if (group.SerializedStartLayer >= start)
            {
                group.SerializedStartLayer++;
            }

            if (group.SerializedEndLayer >= start)
            {
                group.SerializedStartLayer++;
            }
        }
    }
예제 #15
0
    public static void DecreaseGroupLayerIndexes(this SerializableDocument document, int start)
    {
        foreach (SerializableGroup group in document.Groups)
        {
            if (group.SerializedStartLayer > start)
            {
                group.SerializedStartLayer = Max(group.SerializedStartLayer - 1, -1);
            }

            if (group.SerializedEndLayer > start)
            {
                group.SerializedEndLayer = Max(group.SerializedEndLayer - 1, -1);
            }
        }
    }
예제 #16
0
    /// <summary>
    /// Serializes a <see cref="SerializableDocument"/> into bytes and saves them into a stream.
    /// </summary>
    /// <param name="document">The document to serialize.</param>
    /// <returns>The total number of bytes written to the stream.</returns>
    public static int Serialize(SerializableDocument document, Stream stream)
    {
        document.FileVersion = FileVersion;

        byte[] messagePack = MessagePackSerializer.Serialize(document, MessagePack.Resolvers.StandardResolverAllowPrivate.Options);

#if NET5_0_OR_GREATER
        stream.Write(BitConverter.GetBytes(messagePack.Length));
        stream.Write(messagePack);
#else
        stream.Write(BitConverter.GetBytes(messagePack.Length), 0, 4);
        stream.Write(messagePack, 0, messagePack.Length);
#endif

        return(messagePack.Length + 4);
    }
예제 #17
0
        private static unsafe SerializableDocument GetSerializable(DataObject data, out CropData cropData)
        {
            MemoryStream         pixiStream = data.GetData("PIXI") as MemoryStream;
            SerializableDocument document   = PixiParser.Deserialize(pixiStream);

            if (data.GetDataPresent(typeof(CropData)))
            {
                cropData = CropData.FromStream(data.GetData(typeof(CropData)) as MemoryStream);
            }
            else
            {
                cropData = new CropData(document.Width, document.Height, 0, 0);
            }

            return(document);
        }
예제 #18
0
    public void SerializeAndDeserializeEmptyLayer()
    {
        SerializableDocument document = new()
        {
            Width  = 1,
            Height = 1
        };

        document.Layers.Add("Base Layer");

        var serialized = PixiParser.Serialize(document);

        SerializableDocument deserialized = PixiParser.Deserialize(serialized);

        AssertEqual(document, deserialized);
    }
예제 #19
0
        public static Document ToDocument(this SerializableDocument serializableDocument)
        {
            Document document = new Document(serializableDocument.Width, serializableDocument.Height)
            {
                Layers   = serializableDocument.ToLayers(),
                Swatches = new ObservableCollection <SKColor>(serializableDocument.Swatches.ToSKColors())
            };

            document.LayerStructure.Groups = serializableDocument.ToGroups(document);

            if (document.Layers.Count > 0)
            {
                document.SetMainActiveLayer(0);
            }
            document.Renderer.ForceRerender();

            return(document);
        }
예제 #20
0
        public static Document ToDocument(this SerializableDocument serializableDocument)
        {
            Document document = new Document(serializableDocument.Width, serializableDocument.Height)
            {
                Layers   = serializableDocument.ToLayers(),
                Swatches = new ObservableCollection <Color>(serializableDocument.Swatches.Select(x =>
                                                                                                 Color.FromArgb(x.A, x.R, x.G, x.B)))
            };

            document.LayerStructure.Groups = serializableDocument.ToGroups();

            if (document.Layers.Count > 0)
            {
                document.SetMainActiveLayer(0);
            }

            return(document);
        }
예제 #21
0
    /// <summary>
    /// Serializes a <see cref="SerializableDocument"/> into bytes.
    /// </summary>
    /// <param name="document">The document to serialize.</param>
    /// <returns>The serialized bytes.</returns>
    public static byte[] Serialize(SerializableDocument document)
    {
        MemoryStream stream = new();

        Serialize(document, stream);

        stream.Seek(0, SeekOrigin.Begin);

        byte[] buffer = new byte[stream.Length];

#if NET5_0_OR_GREATER
        stream.Read(buffer);
#else
        stream.Read(buffer, 0, buffer.Length);
#endif

        return(buffer);
    }
예제 #22
0
        public void TestThatReadFromBinaryFileReadsCorrectly()
        {
            Document document = new Document(10, 10);

            document.Layers.Add(new Layer("yeet"));
            document.Swatches.Add(Colors.Green);

            SerializableDocument doc = new SerializableDocument(document);

            BinarySerialization.WriteToBinaryFile(Path, doc);

            SerializableDocument file = BinarySerialization.ReadFromBinaryFile <SerializableDocument>(Path);

            Assert.Equal(doc.Layers, file.Layers);
            Assert.Equal(doc.Height, file.Height);
            Assert.Equal(doc.Width, file.Width);
            Assert.Equal(doc.Swatches, file.Swatches);
        }
예제 #23
0
        public void TestThatToLayersConvertsCorrectly()
        {
            Document             document = GenerateSampleDocument();
            SerializableDocument doc      = new SerializableDocument(document);

            System.Collections.ObjectModel.ObservableCollection <Layer> layers = doc.ToLayers();
            for (int i = 0; i < layers.Count; i++)
            {
                Assert.Equal(document.Layers[i].LayerBitmap.ToByteArray(), layers[i].ConvertBitmapToBytes());
                Assert.Equal(document.Layers[i].Height, layers[i].Height);
                Assert.Equal(document.Layers[i].Width, layers[i].Width);
                Assert.Equal(document.Layers[i].MaxHeight, layers[i].MaxHeight);
                Assert.Equal(document.Layers[i].MaxWidth, layers[i].MaxWidth);
                Assert.Equal(document.Layers[i].Offset, layers[i].Offset);
                Assert.Equal(document.Layers[i].Opacity, layers[i].Opacity);
                Assert.Equal(document.Layers[i].IsVisible, layers[i].IsVisible);
            }
        }
예제 #24
0
    /// <summary>
    /// Draws all layers on top of a <see cref="SKBitmap"/>
    /// </summary>
    /// <param name="document"></param>
    /// <returns>The <see cref="SKBitmap"/> instance</returns>
    public static SKBitmap LayersToSKBitmap(this SerializableDocument document)
    {
        SKImageInfo info = new(document.Width, document.Height, SKColorType.RgbaF32, SKAlphaType.Unpremul, SKColorSpace.CreateSrgb());

        using SKSurface surface = SKSurface.Create(info);
        SKCanvas canvas = surface.Canvas;

        using SKPaint paint = new();

        foreach (SerializableLayer layer in document)
        {
            if (layer.PngBytes == null || layer.PngBytes.Length == 0)
            {
                continue;
            }

            bool visible = document.Layers.GetFinalLayerVisibilty(layer);

            if (!visible)
            {
                continue;
            }

            double opacity = document.Layers.GetFinalLayerOpacity(layer);

            if (opacity == 0)
            {
                continue;
            }

            using SKColorFilter filter = SKColorFilter.CreateBlendMode(SKColors.White.WithAlpha((byte)(opacity * 255)), SKBlendMode.DstIn);
            paint.ColorFilter          = filter;

            canvas.DrawImage(layer.ToSKImage(), layer.OffsetX, layer.OffsetY, paint);
        }

        SKBitmap bitmap = new(info);

        surface.ReadPixels(info, bitmap.GetPixels(), info.RowBytes, 0, 0);

        return(bitmap);
    }
예제 #25
0
    public void SerializingAndDeserialzingWorks()
    {
        SerializableDocument document = new()
        {
            Height = 1,
            Width  = 1
        };

        document.Swatches.Add(255, 255, 255);

        SerializableLayer layer = document.Layers.Add("Base Layer", 1, 1, false, 0.5f, 1, 1);

        layer.PngBytes = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF };

        document.Groups.Add(new SerializableGroup("Base Group"));

        byte[] serialized = PixiParser.Serialize(document);

        SerializableDocument deserializedDocument = PixiParser.Deserialize(serialized);

        AssertEqual(document, deserializedDocument);
    }
예제 #26
0
        /// <summary>
        /// Builds the zone tree
        /// </summary>
        /// <param name="classifiedDoc">The classified html document</param>
        /// <returns>
        /// a zone tree
        /// </returns>
        public ZoneTree Build(SerializableDocument classifiedDoc)
        {
            try
            {
                _currentId = 0;
                var bodyZone    = new Zone(_currentId, null);
                var bodyElement = (SerializableElement)classifiedDoc.Body;
                bodyZone.AddElement(bodyElement);
                this.Build(bodyZone);

                this.CropZoneText(bodyZone, classifiedDoc.Text);
                this.SetDisplayOrder(bodyZone);
                var tree = new ZoneTree(bodyZone, classifiedDoc);

                this.RunPostProcessingSteps(tree);

                return(tree);
            }
            catch (Exception ex)
            {
                throw new Exception("Error building zone tree", ex);
            }
        }
예제 #27
0
        public static void AssertEquals(SerializableDocument d1, SerializableDocument d2, bool compareStringTables = true)
        {
            Assert.AreEqual(d1.EntityTables.Count, d2.EntityTables.Count);
            Assert.AreEqual(d1.Header, d2.Header);
            Assert.AreEqual(d1.Nodes, d2.Nodes);
            if (compareStringTables)
            {
                var strings1 = d1.StringTable.OrderBy(x => x).ToArray();
                var strings2 = d2.StringTable.OrderBy(x => x).ToArray();
                Assert.AreEqual(strings1, strings2);
            }

            // TODO: upgrade to a proper Geometry comparer
            //Assert.AreEqual(d1.Geometry.FaceCount(), d2.Geometry.FaceCount());
            //Assert.AreEqual(d1.Geometry.VertexCount(), d2.Geometry.VertexCount());

            Assert.AreEqual(d1.Assets.Length, d2.Assets.Length);

            for (var i = 0; i < d1.EntityTables.Count; ++i)
            {
                AssertEquals(d1.EntityTables[i], d2.EntityTables[i]);
            }
        }
예제 #28
0
    public static SerializableDocument CreateDocument(int size, int layers, bool encodePng = true)
    {
        var benchmarkDocument = new SerializableDocument()
        {
            Width  = size,
            Height = size
        };

        benchmarkDocument.Swatches.Add(255, 255, 255, 255);

        for (int i = 0; i < layers; i++)
        {
            var layer = new SerializableLayer(size, size);

            if (encodePng)
            {
                layer.FromSKBitmap(CreateSKBitmap(size));
            }

            benchmarkDocument.Layers.Add(layer);
        }

        return(benchmarkDocument);
    }
예제 #29
0
    private static void AssertEqual(SerializableDocument document, SerializableDocument otherDocument)
    {
        Assert.Equal(document.FileVersion, otherDocument.FileVersion);
        Assert.Equal(document.Height, otherDocument.Height);
        Assert.Equal(document.Width, otherDocument.Width);
        Assert.Equal(document.Swatches.Count, otherDocument.Swatches.Count);
        Assert.Equal(document.Layers.Count, document.Layers.Count);
        Assert.Equal(document.Groups.Count, document.Groups.Count);

        for (int i = 0; i < document.Swatches.Count; i++)
        {
            Assert.Equal(document.Swatches[i], otherDocument.Swatches[i]);
        }

        for (int i = 0; i < document.Layers.Count; i++)
        {
            Assert.Equal(document.Layers[i], otherDocument.Layers[i]);
        }

        for (int i = 0; i < document.Groups.Count; i++)
        {
            Assert.Equal(document.Groups[i], otherDocument.Groups[i]);
        }
    }
예제 #30
0
        public void TestThatSerializableDocumentCreatesCorrectly()
        {
            Document             document = GenerateSampleDocument();
            SerializableDocument doc      = new SerializableDocument(document);

            Color swatch = document.Swatches.First();
            Tuple <byte, byte, byte, byte> color = Tuple.Create(swatch.A, swatch.R, swatch.G, swatch.B);

            Assert.Equal(document.Width, doc.Width);
            Assert.Equal(document.Height, doc.Height);
            Assert.Equal(color, doc.Swatches.First());
            for (int i = 0; i < doc.Layers.Length; i++)
            {
                Assert.Equal(document.Layers[i].ConvertBitmapToBytes(), doc.Layers[i].BitmapBytes);
                Assert.Equal(document.Layers[i].OffsetX, doc.Layers[i].OffsetX);
                Assert.Equal(document.Layers[i].OffsetY, doc.Layers[i].OffsetY);
                Assert.Equal(document.Layers[i].Width, doc.Layers[i].Width);
                Assert.Equal(document.Layers[i].Height, doc.Layers[i].Height);
                Assert.Equal(document.Layers[i].MaxWidth, doc.Layers[i].MaxWidth);
                Assert.Equal(document.Layers[i].MaxHeight, doc.Layers[i].MaxHeight);
                Assert.Equal(document.Layers[i].IsVisible, doc.Layers[i].IsVisible);
                Assert.Equal(document.Layers[i].Opacity, doc.Layers[i].Opacity);
            }
        }