Пример #1
0
        public G1T(byte[] Data)
        {
            //GT1G is little endian
            //G1TG is big endian
            EndianBinaryReader br = new EndianBinaryReader(new MemoryStream(Data), Endian.LittleEndian);

            textureInfo.Magic        = br.ReadStrings(4); //Get Magic
            textureInfo.Version      = br.ReadStrings(4); //Get Version
            textureInfo.Size         = br.ReadUInt32();
            textureInfo.HeaderSize   = br.ReadUInt32();   //Get HeaderSize
            textureInfo.texture_nums = br.ReadUInt32();
            br.BaseStream.Seek(textureInfo.HeaderSize, SeekOrigin.Begin);
            texture_bmps          = new Bitmap[textureInfo.texture_nums];
            output_pixeldata      = new List <byte[]>();
            textureInfo.p_offsets = Struct.Unpack(string.Format("<{0}I", textureInfo.texture_nums), br.ReadBytes((int)textureInfo.texture_nums * 4));

            br.BaseStream.Seek(textureInfo.HeaderSize + textureInfo.texture_nums * 4, SeekOrigin.Begin);
            for (int i = 0; i < textureInfo.texture_nums; i++)
            {
                br.BaseStream.Seek(textureInfo.p_offsets[i] + textureInfo.HeaderSize, 0);
                g1tTexture texture = new g1tTexture(br);
                textureInfo.p_offsets[i] = texture.position;
                if (texture.textureFormat == PixelDataFormat.FormatDXT5)
                {
                    TextureConv tc = new TextureConv();
                    byte[]      output;
                    Bitmap      bm = tc.GetDXT5Bitmap(texture.Data, texture.Width, texture.Height, out output, true);
                    texture_bmps[i] = bm;
                    output_pixeldata.Add(output);
                }
            }
        }
Пример #2
0
        public unsafe Texture2D GetGumpXNA(int index, bool replaceMask080808 = false)
        {
            if (index < 0)
            {
                return(null);
            }

            if (m_TextureCache[index] == null)
            {
                int  length, extra;
                bool patched;

                BinaryFileReader reader = m_FileIndex.Seek(index, out length, out extra, out patched);
                if (reader == null)
                {
                    return(null);
                }

                int width  = (extra >> 16) & 0xFFFF;
                int height = extra & 0xFFFF;

                int metrics_dataread_start = (int)reader.Position;

                int[]    lookups  = reader.ReadInts(height);
                ushort[] fileData = reader.ReadUShorts(length - (height * 2));

                ushort[] pixels = new ushort[width * height];

                fixed(ushort *line = &pixels[0])
                {
                    fixed(ushort *data = &fileData[0])
                    {
                        for (int y = 0; y < height; ++y)
                        {
                            ushort *dataRef = data + (lookups[y] - height) * 2;

                            ushort *cur = line + (y * width);
                            ushort *end = cur + width;

                            while (cur < end)
                            {
                                ushort  color = *dataRef++;
                                ushort *next  = cur + *dataRef++;

                                if (color == 0)
                                {
                                    cur = next;
                                }
                                else
                                {
                                    color |= 0x8000;
                                    while (cur < next)
                                    {
                                        *cur++ = color;
                                    }
                                }
                            }
                        }
                    }
                }

                Metrics.ReportDataRead(length);

                if (replaceMask080808)
                {
                    for (int i = 0; i < pixels.Length; i++)
                    {
                        if (pixels[i] == 0x8421)
                        {
                            pixels[i] = 0xFC1F;
                        }
                    }
                }

                Texture2D texture = new Texture2D(m_graphicsDevice, width, height, false, SurfaceFormat.Color);
                texture.SetData(TextureConv.Bgra5551ToArgb32(width, height, pixels));
                m_TextureCache[index] = texture;
            }
            return(m_TextureCache[index]);
        }