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); } } } }
/// <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); }
/// <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++; } }
/// <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++; } }
/// <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); }
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>(); }
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); } }
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); } }
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>(); }