Exemplo n.º 1
0
        public override void Open()
        {
            Close();

            Header   = TexHeader.Read(IOStream);
            Palettes = Header.TryReadPalette(IOStream);
        }
Exemplo n.º 2
0
        private static void FillIndexedProperties(TexHeader header, GLTexture palettes)
        {
            using (GLService.AcquireContext())
            {
                int frameBuffer = GL.Ext.GenFramebuffer();
                GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, frameBuffer);
                GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, palettes.Id, 0);

                byte[] pixels = new byte[4];
                GL.ReadPixels(0, 0, 1, 1, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, pixels);
                GL.Ext.DeleteFramebuffer(frameBuffer);

                if (pixels[3] == 0)
                {
                    header.ColorKeyFlag = 1;
                }
            }

            header.BytesPerPixel = 1;
            header.BitDepth      = 8;
            header.BitsPerIndex  = 8;
            header.BitsPerPixel  = 8;

            header.PaletteFlag               = 1;
            header.NumberOfPalettes          = palettes.Height;
            header.NumberOfColorsPerPalette1 = palettes.Width;
            header.NumberOfColorsPerPalette2 = palettes.Width;
            header.PaletteSize               = palettes.Width * palettes.Height;

            header.Unknown7 = 288;
            header.Unknown8 = 224;
        }
Exemplo n.º 3
0
        public void Convert()
        {
            using (Stream input = new FileStream(_inputFile, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                TexHeader       header   = TexHeader.Read(input);
                BitmapPalette[] palettes = header.TryReadPalette(input);

                if (palettes.Length == 0)
                {
                    using (Stream output = new FileStream(_outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
                        Convert(input, output, header);
                }
                else
                {
                    using (Stream output = new FileStream(_outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
                        Convert(input, output, header, palettes[0]);

                    for (int i = 0; i < palettes.Length; i++)
                    {
                        string fileName = Path.ChangeExtension(_outputFile, string.Empty) + "_" + i.ToString("D" + palettes.Length / 10 + 1) + ".act";
                        using (Stream output = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
                            SavePalette(palettes[i], output);
                    }
                }
            }
        }
Exemplo n.º 4
0
        public static TexHeader Create(GLTexture texture, GLTexture palettes, bool b)
        {
            TexHeader result = new TexHeader
            {
                Version           = TexVersion.FF8,
                ImageWidth        = texture.Width,
                ImageHeight       = texture.Height,
                ColorKeyArrayFlag = 0,

                MinAlphaBit     = 4,
                MaxAlphaBit     = 8,
                MinBitsPerColor = 4,
                MaxBitsPerColor = 8,
                MinBitsPerPixel = 8,
                MaxBitsPerPixel = 32,
                ReferenceAlpha  = 255
            };

            if (texture.PixelFormat.GLPixelInternalFormat == PixelInternalFormat.R8)
            {
                if (palettes == null)
                {
                    throw new ArgumentNullException("palettes");
                }

                FillIndexedProperties(result, palettes);
            }
            else
            {
                throw new NotSupportedException(String.Format("Неподдерживаемый формат изображения: {0}.", texture.PixelFormat.GLPixelInternalFormat));
            }

            return(result);
        }
Exemplo n.º 5
0
        private TexHeader CreateHeader(GLTexture texture, GLTexture palettes, bool hasKeyColor)
        {
            TexHeader header = new TexHeader
            {
                Version           = TexVersion.FF8,
                ImageWidth        = texture.Width,
                ImageHeight       = texture.Height,
                ColorKeyArrayFlag = 0,

                MinAlphaBit     = 4,
                MaxAlphaBit     = 8,
                MinBitsPerColor = 4,
                MaxBitsPerColor = 8,
                MinBitsPerPixel = 8,
                MaxBitsPerPixel = 32,
                ReferenceAlpha  = 255,

                // Палитра
                ColorKeyFlag              = hasKeyColor ? 1 : 0,
                BytesPerPixel             = 1,
                BitDepth                  = 8,
                BitsPerIndex              = 8,
                BitsPerPixel              = 8,
                PaletteFlag               = 1,
                NumberOfPalettes          = palettes.Height,
                NumberOfColorsPerPalette1 = palettes.Width,
                NumberOfColorsPerPalette2 = palettes.Width,
                PaletteSize               = palettes.Width * palettes.Height,
                Unknown7                  = 288,
                Unknown8                  = 224
            };

            return(header);
        }
Exemplo n.º 6
0
        public static TexHeader Read(Stream input)
        {
            TexHeader result = input.ReadStruct <TexHeader>();

            result.Validate();

            return(result);
        }
Exemplo n.º 7
0
        private void WriteIndexedImage(GLTexture texture, GLTexture palette)
        {
            byte[]    palettesPixels = palette.GetManagedPixelsArray(PixelFormat.Format32bppArgb);
            TexHeader header         = CreateHeader(texture, palette, palettesPixels[3] == 0);

            _output.WriteStruct(header);
            _output.Write(palettesPixels, 0, palettesPixels.Length);
            using (SafeHGlobalHandle pixels = texture.GetUnmanagedPixelsArray(PixelFormat.Format8bppIndexed))
                using (UnmanagedMemoryStream input = pixels.OpenStream(FileAccess.Read))
                    input.CopyTo(_output);
        }
Exemplo n.º 8
0
        private void Convert(Stream input, Stream output, TexHeader header, BitmapPalette palette)
        {
            using (GLTexture layer = header.TryReadData(input))
            {
                throw new NotImplementedException();
                //BitmapSource source = BitmapSource.Create(header.ImageWidth, header.ImageHeight, 96, 96, PixelFormats.Indexed8, palette, data.DangerousGetHandle(), (int)data.ByteLength, header.ImageWidth);

                //PngBitmapEncoder encoder = new PngBitmapEncoder { Interlace = PngInterlaceOption.Off };
                //encoder.Frames.Add(BitmapFrame.Create(source));
                //encoder.Save(output);
            }
        }
Exemplo n.º 9
0
        private void Convert(Stream input, Stream output, TexHeader header)
        {
            using (GLTexture layer = header.TryReadData(input))
            {
                throw new NotImplementedException();
                //TexPixelFormatsConverter converter = new TexPixelFormatsConverter(header, data, PixelFormats.Bgra32);
                //using (SafeHGlobalHandle result = converter.Convert())
                //{
                //    data.Dispose();
                //    BitmapSource source = BitmapSource.Create(header.ImageWidth, header.ImageHeight, 96, 96, PixelFormats.Bgra32, null, result.DangerousGetHandle(), (int)result.ByteLength, header.ImageWidth * 4);

                //    PngBitmapEncoder encoder = new PngBitmapEncoder { Interlace = PngInterlaceOption.Off };
                //    encoder.Frames.Add(BitmapFrame.Create(source));
                //    encoder.Save(output);
                //}
            }
        }
Exemplo n.º 10
0
        public TexPixelFormatsConverter(TexHeader header, SafeHGlobalHandle data, PixelFormat format)
        {
            if (header == null)
            {
                throw new ArgumentException("header");
            }
            if (data == null || data.IsInvalid)
            {
                throw new ArgumentException("data");
            }
            if (format != PixelFormats.Bgra32)
            {
                throw new ArgumentOutOfRangeException("format");
            }

            _header = header;
            _source = data;
            _format = format;

            _buff = new byte[header.BytesPerPixel];
        }
Exemplo n.º 11
0
        public static TexHeader Create(BitmapFrame frame, BitmapPalette[] palettes)
        {
            TexHeader result = new TexHeader
            {
                Version           = TexVersion.FF8,
                ImageWidth        = frame.PixelWidth,
                ImageHeight       = frame.PixelHeight,
                ColorKeyArrayFlag = 0,

                MinAlphaBit     = 4,
                MaxAlphaBit     = 8,
                MinBitsPerColor = 4,
                MaxBitsPerColor = 8,
                MinBitsPerPixel = 8,
                MaxBitsPerPixel = 32,
                ReferenceAlpha  = 255
            };

            if (frame.Format == PixelFormats.Indexed8)
            {
                if (palettes == null || palettes.Length == 0)
                {
                    throw new ArgumentNullException("palettes");
                }

                FillIndexedProperties(result, palettes);
            }
            else if (frame.Format == PixelFormats.Bgra32)
            {
                FillBgraProperties(result);
            }
            else
            {
                throw new NotSupportedException(String.Format("Неподдерживаемый формат изображения: {0}, поддерживаются только {1} и {2}.", frame.Format, PixelFormats.Bgra32, PixelFormats.Indexed8));
            }

            return(result);
        }
Exemplo n.º 12
0
        public void Convert()
        {
            BitmapPalette[] palettes = TryFindPalettes(_inputFile);

            using (Stream input = new FileStream(_inputFile, FileMode.Open, FileAccess.Read, FileShare.Read))
                using (Stream output = new FileStream(_outputFile, FileMode.Open, FileAccess.Write, FileShare.None))
                {
                    PngBitmapDecoder decoder = new PngBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                    BitmapFrame      frame   = decoder.Frames[0];

                    TexHeader header = TexHeader.Create(frame, palettes);
                    output.WriteStruct(header);

                    if (palettes != null)
                    {
                        WriteIndexedImage(output, frame, palettes);
                    }
                    else
                    {
                        WriteBgraImage(output, frame);
                    }
                }
        }
Exemplo n.º 13
0
        private static void FillIndexedProperties(TexHeader header, BitmapPalette[] palettes)
        {
            BitmapPalette palette = palettes[0];
            Color         color   = palette.Colors[0];

            if (color.A == 0)
            {
                header.ColorKeyFlag = 1;
            }

            header.BytesPerPixel = 1;
            header.BitDepth      = 8;
            header.BitsPerIndex  = 8;
            header.BitsPerPixel  = 8;

            header.PaletteFlag               = 1;
            header.NumberOfPalettes          = palettes.Length;
            header.NumberOfColorsPerPalette1 = palette.Colors.Count;
            header.NumberOfColorsPerPalette2 = palette.Colors.Count;
            header.PaletteSize               = palettes.Length * palette.Colors.Count;

            header.Unknown7 = 288;
            header.Unknown8 = 224;
        }
Exemplo n.º 14
0
 public override void Close()
 {
     IOStream.Seek(0, SeekOrigin.Begin);
     Header   = null;
     Palettes = null;
 }
Exemplo n.º 15
0
 private static void FillBgraProperties(TexHeader header)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 16
0
 public TexTexture2DReader(TexHeader header, Stream input)
 {
     _header = Exceptions.CheckArgumentNull(header, "header");
     _input  = Exceptions.CheckReadableStream(input, "input");
 }