private void ConvertColors(int[] data, TimImage image, int clutIndex) { switch (image.ImageType & 0x3) { case 0x00000000: case 0x00000001: var clut = GetClut(image, clutIndex); for (var i = 0; i < data.Length; i++) { data[i] = clut[data[i]]; } break; case 0x00000002: for (var i = 0; i < data.Length; i++) { data[i] = _colorDecoder.Decode16Bit(data[i]); } break; case 0x00000003: for (var i = 0; i < data.Length; i++) { data[i] = _colorDecoder.Decode24Bit(data[i]); } break; } }
private int[] GetClut(TimImage image, int clutIndex) { switch (image.ImageType & 0x3) { case 0x00000000: case 0x00000001: return(DecodeClut(image.Cluts[clutIndex])); default: return(null); } }
public RawBitmap Decode(TimImage image, int clutIndex) { var data = DecodeData(image); ConvertColors(data, image, clutIndex); return(new RawBitmap { Data = data, Height = image.Height, Width = data.Length / image.Height }); }
public static GameImage FromTim(TimFileReader reader) { using (DisposableStack insurance = new DisposableStack(3)) { TimImage timImage = insurance.Add(reader.ReadImage()); short x = timImage.ImageHeader.X; short y = timImage.ImageHeader.Y; GLTexture layer = timImage.Layer; GLTexture palettes = insurance.Add(GLTextureFactory.FromBitmapPalettes(reader.Palettes == null ? null : reader.Palettes.Palettes)); GameImage result = new GameImage(x, y, layer, palettes); insurance.Clear(); return(result); } }
private int[] DecodeData(TimImage image) { switch (image.ImageType & 0x3) { case 0x00000000: return(_dataDecoder.Decode4Bit(image.Data, image.Stride * 2, image.Height)); case 0x00000001: return(_dataDecoder.Decode8Bit(image.Data, image.Stride * 2, image.Height)); case 0x00000002: return(_dataDecoder.Decode16Bit(image.Data, image.Stride * 2, image.Height)); case 0x00000003: return(_dataDecoder.Decode24Bit(image.Data, image.Stride * 2, image.Height)); default: throw new RhythmCodexException($"Unrecognized TIM image type {image.ImageType:X8}."); } }
public TimImage Read(Stream stream) { var reader = new BinaryReader(stream); if (reader.ReadInt32() != 0x00000010) { throw new RhythmCodexException("Unrecognized TIM image identifier."); } var cluts = new List <TimPalette>(); var result = new TimImage { ImageType = reader.ReadInt32(), Cluts = cluts }; var hasCluts = (result.ImageType & 0x8) != 0; if (hasCluts) { cluts.AddRange(ReadCluts(stream)); } var bpp = GetBpp(result.ImageType); var length = reader.ReadInt32(); result.OriginX = reader.ReadInt16(); result.OriginY = reader.ReadInt16(); result.Stride = reader.ReadInt16(); result.Height = reader.ReadInt16(); var padding = length - result.Stride * result.Height * 8 / bpp - 12; result.Data = reader.ReadBytes(length); if (padding > 0) { reader.ReadBytes(padding); } return(result); }
public IList <RawBitmap> Decode(TimImage image) => Enumerable.Range(0, image.Cluts.Count).Select(i => Decode(image, i)).ToList();