Insert() public method

public Insert ( Pinta.Core.UserLayer layer, int index ) : void
layer Pinta.Core.UserLayer
index int
return void
Example #1
0
        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);
            }
        }
Example #2
0
        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();
        }