コード例 #1
0
        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;
            }
        }
コード例 #2
0
        private int[] GetClut(TimImage image, int clutIndex)
        {
            switch (image.ImageType & 0x3)
            {
            case 0x00000000:
            case 0x00000001:
                return(DecodeClut(image.Cluts[clutIndex]));

            default:
                return(null);
            }
        }
コード例 #3
0
        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
            });
        }
コード例 #4
0
ファイル: GameImageReader.cs プロジェクト: rebootus/Esthar
        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);
            }
        }
コード例 #5
0
        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}.");
            }
        }
コード例 #6
0
        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);
        }
コード例 #7
0
 public IList <RawBitmap> Decode(TimImage image) =>
 Enumerable.Range(0, image.Cluts.Count).Select(i => Decode(image, i)).ToList();