Esempio n. 1
0
        IarImage CombineLayers(IarImage layers, IarArchive iarc)
        {
            layers.Info.Stride = (int)layers.Info.Width * 4;
            layers.Info.BPP    = 32;
            var pixels = new byte[layers.Info.Stride * (int)layers.Info.Height];
            var output = new IarImage(layers.Info, pixels);

            using (var mem = new MemoryStream(layers.Data))
                using (var input = new BinaryReader(mem))
                {
                    int offset_x = 0, offset_y = 0;
                    var dir = (List <Entry>)iarc.Dir;
                    while (input.BaseStream.Position < input.BaseStream.Length)
                    {
                        int cmd = input.ReadByte();
                        switch (cmd)
                        {
                        case 0x21:
                            offset_x += input.ReadInt16();
                            offset_y += input.ReadInt16();
                            break;

                        case 0x00:
                        case 0x20:
                        {
                            int index = input.ReadInt32();
                            if (index < 0 || index >= dir.Count)
                            {
                                throw new InvalidFormatException("Invalid image layer index");
                            }
                            var layer = new IarImage(iarc, dir[index]);
                            layer.Info.OffsetX -= offset_x;
                            layer.Info.OffsetY -= offset_y;
                            if (0x20 == cmd)
                            {
                                output.ApplyMask(layer);
                            }
                            else
                            {
                                output.Blend(layer);
                            }
                        }
                        break;

                        default:
                            Trace.WriteLine(string.Format("Unknown layer type 0x{0:X2}", cmd), "IAR");
                            break;
                        }
                    }
                    return(output);
                }
        }
Esempio n. 2
0
        IarImage CombineLayers(IarImage layers, IarArchive iarc)
        {
            layers.Info.Stride = (int)layers.Info.Width * 4;
            layers.Info.BPP = 32;
            var pixels = new byte[layers.Info.Stride * (int)layers.Info.Height];
            var output = new IarImage (layers.Info, pixels);
            using (var mem = new MemoryStream (layers.Data))
            using (var input = new BinaryReader (mem))
            {
                int offset_x = 0, offset_y = 0;
                var dir = (List<Entry>)iarc.Dir;
                while (input.BaseStream.Position < input.BaseStream.Length)
                {
                    int cmd = input.ReadByte();
                    switch (cmd)
                    {
                    case 0x21:
                        offset_x += input.ReadInt16();
                        offset_y += input.ReadInt16();
                        break;

                    case 0x00:
                    case 0x20:
                        {
                            int index = input.ReadInt32();
                            if (index < 0 || index >= dir.Count)
                                throw new InvalidFormatException ("Invalid image layer index");
                            var layer = new IarImage (iarc, dir[index]);
                            layer.Info.OffsetX -= offset_x;
                            layer.Info.OffsetY -= offset_y;
                            if (0x20 == cmd)
                                output.ApplyMask (layer);
                            else
                                output.Blend (layer);
                        }
                        break;

                    default:
                        Trace.WriteLine (string.Format ("Unknown layer type 0x{0:X2}", cmd), "IAR");
                        break;
                    }
                }
                return output;
            }
        }