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