public void Import(string filename, Gtk.Window parent) { FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read); pdn.Document loaded = PaintDotNetFileLoader.FromStream((stream)); // Create a new document and add an initial layer. Pinta.Core.Document doc = PintaCore.Workspace.CreateAndActivateDocument(filename, new Gdk.Size(loaded.Width, loaded.Height)); doc.HasFile = true; doc.Workspace.CanvasSize = doc.ImageSize; int index = 0; foreach (BitmapLayer l in loaded.Layers) { UserLayer layer = doc.CreateLayer(l.Name, l.Width, l.Height); doc.Insert(layer, index++); layer.Hidden = !l.Visible; // pdn stores visible, not hidden layer.BlendMode = ConvertBlendMode(l.BlendMode); layer.Opacity = Convert.ToDouble(l.Opacity) / 255.0; // pdn stores opacity with 255 as max // Copy over the image data to the layer's surface. CopyToSurface(l.Surface.Data.Buffer, layer.Surface); } }
public void Import(string fileName, Gtk.Window parent) { ZipFile file = new ZipFile(fileName); XmlDocument stackXml = new XmlDocument(); stackXml.Load(file.GetInputStream(file.GetEntry("stack.xml"))); XmlElement imageElement = stackXml.DocumentElement; int width = int.Parse(imageElement.GetAttribute("w")); int height = int.Parse(imageElement.GetAttribute("h")); Size imagesize = new Size(width, height); Document doc = PintaCore.Workspace.CreateAndActivateDocument(fileName, imagesize); doc.HasFile = true; XmlElement stackElement = (XmlElement)stackXml.GetElementsByTagName("stack")[0]; XmlNodeList layerElements = stackElement.GetElementsByTagName("layer"); if (layerElements.Count == 0) { throw new XmlException("No layers found in OpenRaster file"); } doc.ImageSize = imagesize; doc.Workspace.CanvasSize = imagesize; for (int i = 0; i < layerElements.Count; i++) { XmlElement layerElement = (XmlElement)layerElements[i]; int x = int.Parse(GetAttribute(layerElement, "x", "0")); int y = int.Parse(GetAttribute(layerElement, "y", "0")); string name = GetAttribute(layerElement, "name", string.Format("Layer {0}", i)); try { // Write the file to a temporary file first // Fixes a bug when running on .Net ZipEntry zf = file.GetEntry(layerElement.GetAttribute("src")); Stream s = file.GetInputStream(zf); string tmp_file = System.IO.Path.GetTempFileName(); using (Stream stream_out = File.Open(tmp_file, FileMode.OpenOrCreate)) { byte[] buffer = new byte[2048]; while (true) { int len = s.Read(buffer, 0, buffer.Length); if (len > 0) { stream_out.Write(buffer, 0, len); } else { break; } } } UserLayer layer = doc.CreateLayer(name); doc.Insert(layer, 0); layer.Opacity = double.Parse(GetAttribute(layerElement, "opacity", "1"), GetFormat()); layer.BlendMode = StandardToBlendMode(GetAttribute(layerElement, "composite-op", "svg:src-over")); using (var fs = new FileStream(tmp_file, FileMode.Open)) using (Pixbuf pb = new Pixbuf(fs)) { using (Context g = new Context(layer.Surface)) { CairoHelper.SetSourcePixbuf(g, pb, x, y); g.Paint(); } } try { File.Delete(tmp_file); } catch { } } catch { MessageDialog md = new MessageDialog(parent, DialogFlags.Modal, MessageType.Error, ButtonsType.Ok, "Could not import layer \"{0}\" from {0}", name, file); md.Title = "Error"; md.Run(); md.Destroy(); } } file.Close(); }