protected override void Initalize() { // Check to see if what we are dealing with is a SVR texture if (!Is(encodedData)) { throw new NotAValidTextureException("This is not a valid GVR texture."); } // Determine the offsets of the GBIX (if present) and PVRT header chunks. if (PTMethods.Contains(encodedData, 0, Encoding.UTF8.GetBytes("GBIX"))) { gbixOffset = 0x00; pvrtOffset = 0x10; } else { gbixOffset = -1; pvrtOffset = 0x00; } // Read the global index (if it is present). If it is not present, just set it to 0. if (gbixOffset != -1) { globalIndex = BitConverter.ToUInt32(encodedData, gbixOffset + 0x08); } else { globalIndex = 0; } // Read information about the texture textureWidth = BitConverter.ToUInt16(encodedData, pvrtOffset + 0x0C); textureHeight = BitConverter.ToUInt16(encodedData, pvrtOffset + 0x0E); pixelFormat = (SvrPixelFormat)encodedData[pvrtOffset + 0x08]; dataFormat = (SvrDataFormat)encodedData[pvrtOffset + 0x09]; // Get the codecs and make sure we can decode using them pixelCodec = SvrPixelCodec.GetPixelCodec(pixelFormat); dataCodec = SvrDataCodec.GetDataCodec(dataFormat); if (dataCodec != null && pixelCodec != null) { dataCodec.PixelCodec = pixelCodec; canDecode = true; } // Set the palette and data offsets paletteEntries = dataCodec.PaletteEntries; if (!canDecode || paletteEntries == 0 || dataCodec.NeedsExternalPalette) { paletteOffset = -1; dataOffset = pvrtOffset + 0x10; } else { paletteOffset = pvrtOffset + 0x10; dataOffset = paletteOffset + (paletteEntries * (pixelCodec.Bpp >> 3)); } initalized = true; }
private bool Initalize(SvrPixelFormat pixelFormat, SvrDataFormat dataFormat) { // Set the default values hasGlobalIndex = true; globalIndex = 0; // Set the data format and pixel format and load the appropiate codecs this.pixelFormat = pixelFormat; pixelCodec = SvrPixelCodec.GetPixelCodec(pixelFormat); this.dataFormat = dataFormat; dataCodec = SvrDataCodec.GetDataCodec(dataFormat); // Make sure the pixel and data codecs exists and we can encode to it if (pixelCodec == null || !pixelCodec.CanEncode) { return(false); } if (dataCodec == null || !dataCodec.CanEncode) { return(false); } dataCodec.PixelCodec = pixelCodec; // Set the correct data format (it's ok to do it after getting the codecs). if (dataFormat == SvrDataFormat.Index4Rgb5a3Rectangle || dataFormat == SvrDataFormat.Index4Rgb5a3Square || dataFormat == SvrDataFormat.Index4Argb8Rectangle || dataFormat == SvrDataFormat.Index4Argb8Square) { if (textureWidth == textureHeight) // Square texture { if (pixelFormat == SvrPixelFormat.Rgb5a3) { dataFormat = SvrDataFormat.Index4Rgb5a3Square; } else { dataFormat = SvrDataFormat.Index4Argb8Square; } } else // Rectangular texture { if (pixelFormat == SvrPixelFormat.Rgb5a3) { dataFormat = SvrDataFormat.Index4Rgb5a3Rectangle; } else { dataFormat = SvrDataFormat.Index4Argb8Rectangle; } } } else if (dataFormat == SvrDataFormat.Index8Rgb5a3Rectangle || dataFormat == SvrDataFormat.Index8Rgb5a3Square || dataFormat == SvrDataFormat.Index8Argb8Rectangle || dataFormat == SvrDataFormat.Index8Argb8Square) { if (textureWidth == textureHeight) // Square texture { if (pixelFormat == SvrPixelFormat.Rgb5a3) { dataFormat = SvrDataFormat.Index8Rgb5a3Square; } else { dataFormat = SvrDataFormat.Index8Argb8Square; } } else // Rectangular texture { if (pixelFormat == SvrPixelFormat.Rgb5a3) { dataFormat = SvrDataFormat.Index8Rgb5a3Rectangle; } else { dataFormat = SvrDataFormat.Index8Argb8Rectangle; } } } if (dataCodec.PaletteEntries != 0) { // Convert the bitmap to an array containing indicies. decodedData = BitmapToRawIndexed(decodedBitmap, dataCodec.PaletteEntries, out texturePalette); // If this texture has an external palette file, set up the palette encoder if (dataCodec.NeedsExternalPalette) { paletteEncoder = new SvpPaletteEncoder(texturePalette, (ushort)dataCodec.PaletteEntries, pixelFormat, pixelCodec); } } else { // Convert the bitmap to an array decodedData = BitmapToRaw(decodedBitmap); } return(true); }