示例#1
0
        public TextureFormat Open(System.IO.Stream formatData)
        {
            BinaryReader reader = new BinaryReader(formatData);

            try
            {
                char[] magic = reader.ReadChars(MAGIC.Length);
                if (new string(magic) != MAGIC)
                {
                    throw new TextureFormatException("Not a valid TX48 Texture!");
                }

                int bpp = reader.ReadInt32();
                if (bpp != 0 && bpp != 1)
                {
                    throw new TextureFormatException("Illegal Bit per pixel value!");
                }

                bpp = (bpp + 1) * 4;

                int width         = reader.ReadInt32();
                int height        = reader.ReadInt32();
                int paletteOffset = reader.ReadInt32();
                if (paletteOffset != 0x40)
                {
                    throw new TextureFormatException("TX48 Header is wrong!");
                }

                int paletteSize = reader.ReadInt32();
                int imageOffset = reader.ReadInt32();
                int imageSize   = reader.ReadInt32();
                reader.BaseStream.Position += 0x20;

                byte[] paletteData = reader.ReadBytes(paletteSize);
                byte[] imageData   = reader.ReadBytes(imageSize);

                PalettedTextureFormat.Builder builder = new PalettedTextureFormat.Builder();
                builder.SetPaletteCodec(ColorCodec.CODEC_32BIT_RGBA)
                .SetIndexCodec(IndexCodec.FromBitPerPixel(bpp));

                PalettedTextureFormat segment = builder.Build(imageData, paletteData, width, height);
                TX48Texture           texture = new TX48Texture();
                texture.TextureFormats.Add(segment);

                return(texture);
            }
            catch (Exception e)
            {
                if (e is TextureFormatException)
                {
                    throw;
                }
                throw new TextureFormatException(e.Message, e);
            }
        }
示例#2
0
        public void Save(TextureFormat txt, System.IO.Stream outFormatData)
        {
            TX48Texture texture = txt as TX48Texture;

            if (texture == null)
            {
                throw new TextureFormatException("Not a valid TX48Texture!");
            }

            BinaryWriter writer = new BinaryWriter(outFormatData);

            PalettedTextureFormat segment = texture.TextureFormats.First() as PalettedTextureFormat;

            byte[] img = segment.GetImageData();

            byte[] pal = segment.GetPaletteData().First();

            int widths  = segment.Width;
            int heights = segment.Height;
            int bpps    = segment.Bpp;


            writer.Write(MAGIC.ToCharArray());
            writer.Write(bpps / 4 - 1);

            writer.Write(widths);
            writer.Write(heights);

            writer.Write(0x40);
            writer.Write(pal.Length);

            writer.Write(0x40 + pal.Length);
            writer.Write(img.Length);

            for (int j = 0; j < 8; j++)
            {
                writer.Write(0);
            }

            writer.Write(pal);
            writer.Write(img);
        }
示例#3
0
 private void IndexedImageImportDialog_FormClosing(object sender, FormClosingEventArgs e)
 {
     // Pixel codec
     if (radioButtonRGB565.Checked)
     {
         outCodec = PixelCodec.RGB565;
     }
     else if (radioButtonARGB1555.Checked)
     {
         outCodec = PixelCodec.ARGB1555;
     }
     else if (radioButtonARGB4444.Checked)
     {
         outCodec = PixelCodec.ARGB4444;
     }
     else if (radioButtonARGB8888.Checked)
     {
         outCodec = PixelCodec.ARGB8888;
     }
     else if (radioButtonIntensity8A.Checked)
     {
         outCodec = PixelCodec.Intensity8A;
     }
     else if (radioButtonRGB5A3.Checked)
     {
         outCodec = PixelCodec.RGB5A3;
     }
     // Indexed format
     if (radioButtonIndex8.Checked)
     {
         outFormat = PalettedTextureFormat.Index8;
     }
     else if (radioButtonIndex4.Checked)
     {
         outFormat = PalettedTextureFormat.Index4;
     }
     else
     {
         outFormat = PalettedTextureFormat.NotIndexed;
     }
 }
示例#4
0
        public override void Save(TextureFormat texture, System.IO.Stream outFormatData)
        {
            TacticsOgreEFXTexture efxTexture = texture as TacticsOgreEFXTexture;

            if (efxTexture == null)
            {
                throw new TextureFormatException("Not a valid EFX Testure!");
            }

            BinaryWriter writer = new BinaryWriter(new MemoryStream());

            writer.Write(magic);
            writer.Write((byte)0);

            writer.Write(efxTexture.FormatSpecificData.Get <float>(SCALE_KEY));

            writer.Write((uint)0); //temporarily write dummy file size

            int fileSize = 0x10;

            foreach (TextureFormat segment in efxTexture.TextureFormats)
            {
                byte[] entryData            = null;
                int    fullEntrySize        = 0;
                int    sizeOfEntryNoHeader1 = 0;

                byte[] imgData = null, palData = null;
                PalettedTextureFormat palSegment   = segment as PalettedTextureFormat;
                DummyTexture          dummySegment = segment as DummyTexture;

                if (palSegment != null)
                {
                    imgData = palSegment.GetImageData();
                    IList <byte[]> palettes = palSegment.GetPaletteData();
                    if (palettes.Count > 1)
                    {
                        throw new TextureFormatException("EFX should not support multi palette images!");
                    }

                    palData = palettes.First();

                    fullEntrySize = 0x30 + imgData.Length + palData.Length;

                    entryData = imgData.Concat(palData).ToArray();
                }
                else if (dummySegment != null)
                {
                    entryData = dummySegment.FormatSpecificData.Get <byte[]>(RAW_DATA_KEY);

                    fullEntrySize = 0x10 + entryData.Length;
                }
                else
                {
                    throw new TextureFormatException("EFX segments should be Paletted or dummy!");
                }

                writer.Write(fullEntrySize);

                writer.Write(segment.FormatSpecificData.Get <ushort>(UNK1_KEY));
                writer.Write(segment.FormatSpecificData.Get <ushort>(UNK2_KEY));

                sizeOfEntryNoHeader1 = fullEntrySize - 0x10;

                if (palSegment != null)
                {
                    writer.Write((uint)sizeOfEntryNoHeader1);
                }
                else
                {
                    writer.Write(segment.FormatSpecificData.Get <uint>(ENTRY_NO_HEADER_KEY));
                }

                writer.Write(segment.FormatSpecificData.Get <ushort>(ID_KEY));
                writer.Write(segment.FormatSpecificData.Get <byte>(ENTRY_TYPE_KEY));
                writer.Write(segment.FormatSpecificData.Get <byte>(UNK3_KEY));

                if (palSegment != null)
                {
                    byte bpp = segment.FormatSpecificData.Get <byte>(BPP_KEY);
                    writer.Write(bpp);
                    writer.Write(segment.FormatSpecificData.Get <byte>(UNK4_KEY));
                    writer.Write(segment.FormatSpecificData.Get <ushort>(UNK5_KEY));
                    writer.Write((ushort)(1 << bpp));
                    writer.Write((ushort)segment.Width);
                    writer.Write((ushort)segment.Height);
                    writer.Write((ushort)segment.Width);
                    writer.Write((ushort)segment.Height);
                    writer.Write((ushort)0);
                    writer.Write(segment.FormatSpecificData.Get <uint>(UNK6_KEY));

                    int header2AndImgSize = 0x20 + imgData.Length;

                    writer.Write((uint)header2AndImgSize);
                    writer.Write((uint)sizeOfEntryNoHeader1);
                    writer.Write((uint)0);
                }

                writer.Write(entryData);

                fileSize += fullEntrySize;

                if (fullEntrySize % 4 != 0)
                {
                    fileSize = fileSize + 4 - fullEntrySize % 4;
                    writer.Write(Enumerable.Repeat((byte)0, 4 - fullEntrySize % 4).ToArray());
                }
            }
            writer.BaseStream.Position = 0x0C;
            writer.Write((uint)fileSize);

            byte[] finalData = (writer.BaseStream as MemoryStream).ToArray();
            outFormatData.Write(finalData, 0, finalData.Length);

            writer.Close();
        }