Exemplo n.º 1
0
        public static void BasicUndoProcess(Layer[] layers, UndoLayer[] data, object[] args)
        {
            if (args.Length > 0 && args[0] is Document document)
            {
                for (int i = 0; i < layers.Length; i++)
                {
                    Layer     layer      = layers[i];
                    UndoLayer layerData  = data[i];
                    var       foundLayer = document.Layers.FirstOrDefault(x => x.GuidValue == layerData.LayerGuid);

                    if (foundLayer != null)
                    {
                        ApplyChunkToLayer(foundLayer, layerData.SerializedRect, layer.LayerBitmap);
                    }
                    else
                    {
                        document.RemoveLayer(layerData.LayerIndex, false);
                        document.Layers.Insert(layerData.LayerIndex, layer);
                    }

                    if (layerData.IsActive)
                    {
                        document.SetMainActiveLayer(layerData.LayerIndex);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Loads saved layers from disk.
        /// </summary>
        /// <returns>Array of saved layers.</returns>
        public Layer[] LoadLayersFromDevice()
        {
            Layer[] layers = new Layer[StoredLayers.Length];
            for (int i = 0; i < StoredLayers.Length; i++)
            {
                UndoLayer storedLayer = StoredLayers[i];
                var       bitmap      = Importer.ImportImage(storedLayer.StoredPngLayerName, storedLayer.Width, storedLayer.Height);
                layers[i] = new Layer(storedLayer.Name, bitmap)
                {
                    Offset              = new System.Windows.Thickness(storedLayer.OffsetX, storedLayer.OffsetY, 0, 0),
                    Opacity             = storedLayer.Opacity,
                    MaxWidth            = storedLayer.MaxWidth,
                    MaxHeight           = storedLayer.MaxHeight,
                    IsVisible           = storedLayer.IsVisible,
                    IsActive            = storedLayer.IsActive,
                    Width               = storedLayer.Width,
                    Height              = storedLayer.Height,
                    LayerHighlightColor = storedLayer.LayerHighlightColor
                };
                layers[i].ChangeGuid(storedLayer.LayerGuid);

                File.Delete(StoredLayers[i].StoredPngLayerName);
            }

            layersToStore = layers.Select(x => x.LayerGuid);
            return(layers);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Generates UndoLayer[] StoredLayers data.
        /// </summary>
        private void GenerateUndoLayers()
        {
            StoredLayers = new UndoLayer[layersToStore.Count()];
            int i = 0;

            foreach (var layerGuid in layersToStore)
            {
                Layer layer = document.Layers.First(x => x.LayerGuid == layerGuid);
                if (!document.Layers.Contains(layer))
                {
                    throw new ArgumentException("Provided document doesn't contain selected layer");
                }

                layer.ClipCanvas();

                int    index   = document.Layers.IndexOf(layer);
                string pngName = layer.Name + Guid.NewGuid().ToString();
                StoredLayers[i] = new UndoLayer(
                    Path.Join(
                        UndoChangeLocation,
                        Convert.ToBase64String(Encoding.UTF8.GetBytes(pngName)) + ".png"),
                    layer,
                    index);
                i++;
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Generates UndoLayer[] StoredLayers data.
        /// </summary>
        private void GenerateUndoLayers(LayerChunk[] chunks)
        {
            StoredLayers = new UndoLayer[layersToStore.Count];
            int i = 0;

            foreach (var layerGuid in layersToStore)
            {
                Layer layer = Document.Layers.First(x => x.GuidValue == layerGuid);
                if (!Document.Layers.Contains(layer))
                {
                    throw new ArgumentException("Provided document doesn't contain selected layer");
                }

                int    index    = Document.Layers.IndexOf(layer);
                string fileName = layer.Name + Guid.NewGuid();
                StoredLayers[i] = new UndoLayer(
                    Path.Join(
                        UndoChangeLocation,
                        Convert.ToBase64String(Encoding.UTF8.GetBytes(fileName)) + ".undoimg"),
                    layer,
                    index,
                    chunks[i].AbsoluteChunkRect);
                i++;
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Loads saved layers from disk.
        /// </summary>
        /// <returns>Array of saved layers.</returns>
        public Layer[] LoadLayersFromDevice()
        {
            Layer[] layers = new Layer[StoredLayers.Length];
            for (int i = 0; i < StoredLayers.Length; i++)
            {
                UndoLayer storedLayer = StoredLayers[i];
                var       bitmap      = Importer.LoadFromGZippedBytes(storedLayer.StoredPngLayerName);
                layers[i] = new Layer(storedLayer.Name, bitmap, storedLayer.MaxWidth, storedLayer.MaxHeight)
                {
                    Width               = storedLayer.Width,
                    Height              = storedLayer.Height,
                    Offset              = new Thickness(storedLayer.OffsetX, storedLayer.OffsetY, 0, 0),
                    Opacity             = storedLayer.Opacity,
                    IsVisible           = storedLayer.IsVisible,
                    IsActive            = storedLayer.IsActive,
                    LayerHighlightColor = storedLayer.LayerHighlightColor
                };

                layers[i].ChangeGuid(storedLayer.LayerGuid);

                File.Delete(StoredLayers[i].StoredPngLayerName);
            }

            layersToStore = layers.Select(x => x.GuidValue).ToList();
            return(layers);
        }
Exemplo n.º 6
0
        public void SaveLayersOnDevice()
        {
            int i = 0;

            foreach (var layerGuid in layersToStore)
            {
                Layer     layer       = Document.Layers.First(x => x.GuidValue == layerGuid);
                UndoLayer storedLayer = StoredLayers[i];
                if (Directory.Exists(Path.GetDirectoryName(storedLayer.StoredPngLayerName)))
                {
                    // Calculate absolute rect to relative rect
                    SKRectI finalRect = SKRectI.Create(
                        storedLayer.SerializedRect.Left - layer.OffsetX,
                        storedLayer.SerializedRect.Top - layer.OffsetY,
                        storedLayer.SerializedRect.Width,
                        storedLayer.SerializedRect.Height);

                    using var image = layer.LayerBitmap.SkiaSurface.Snapshot();
                    using Surface targetSizeSurface = new Surface(finalRect.Width, finalRect.Height);

                    targetSizeSurface.SkiaSurface.Canvas.DrawImage(image, finalRect, SKRect.Create(0, 0, finalRect.Width, finalRect.Height), Surface.ReplacingPaint);

                    //DebugSavePng(targetSizeSurface, storedLayer);

                    Exporter.SaveAsGZippedBytes(storedLayer.StoredPngLayerName, targetSizeSurface);
                }

                i++;
            }

            layersToStore = new List <Guid>();
        }
Exemplo n.º 7
0
        public void TestThatConstructorGeneratesUndoLayersProperly()
        {
            using Document testDocument = GenerateTestDocument();

            using StorageBasedChange change = new StorageBasedChange(testDocument, testDocument.Layers, UndoStoreLocation);

            Assert.Equal(testDocument.Layers.Count, change.StoredLayers.Length);

            for (int i = 0; i < change.StoredLayers.Length; i++)
            {
                Layer     testLayer = testDocument.Layers[i];
                UndoLayer layer     = change.StoredLayers[i];

                Assert.Equal(testLayer.Name, layer.Name);
                Assert.Equal(testLayer.Width, layer.Width);
                Assert.Equal(testLayer.Height, layer.Height);
                Assert.Equal(testLayer.IsActive, layer.IsActive);
                Assert.Equal(testLayer.IsVisible, layer.IsVisible);
                Assert.Equal(testLayer.OffsetX, layer.OffsetX);
                Assert.Equal(testLayer.OffsetY, layer.OffsetY);
                Assert.Equal(testLayer.MaxWidth, layer.MaxWidth);
                Assert.Equal(testLayer.MaxHeight, layer.MaxHeight);
                Assert.Equal(testLayer.Opacity, layer.Opacity);
            }
        }
Exemplo n.º 8
0
 private static void DebugSavePng(Surface surface, UndoLayer storedLayer)
 {
     //Debug png visualization
     using var targetSizeImage = surface.SkiaSurface.Snapshot();
     using (var data = targetSizeImage.Encode(SKEncodedImageFormat.Png, 100))
         using (var stream = File.OpenWrite(storedLayer.StoredPngLayerName + ".png"))
         {
             // save the data to a stream
             data.SaveTo(stream);
         }
 }
Exemplo n.º 9
0
        public void SaveLayersOnDevice()
        {
            int i = 0;

            foreach (var layerGuid in layersToStore)
            {
                Layer     layer       = document.Layers.First(x => x.LayerGuid == layerGuid);
                UndoLayer storedLayer = StoredLayers[i];
                if (Directory.Exists(Path.GetDirectoryName(storedLayer.StoredPngLayerName)))
                {
                    Exporter.SaveAsPng(storedLayer.StoredPngLayerName, storedLayer.Width, storedLayer.Height, layer.LayerBitmap);
                }

                i++;
            }

            layersToStore = Array.Empty <Guid>();
        }