static private DecompressRGBBlock ( byte source, int sourcePosition, byte destination, int destinationStart, int destinationLineLength, bool isDXT1, bool isPremultiplied ) : void | ||
source | byte | |
sourcePosition | int | |
destination | byte | |
destinationStart | int | |
destinationLineLength | int | |
isDXT1 | bool | |
isPremultiplied | bool | |
return | void |
internal static void DecompressBC3Block(byte[] source, int sourceStart, byte[] destination, int decompressedStart, int decompressedLineLength, bool isPremultiplied) { // Alpha, +3 to select that channel. DDS_BlockHelpers.Decompress8BitBlock(source, sourceStart, destination, decompressedStart + 3, decompressedLineLength, false); // RGB DDS_BlockHelpers.DecompressRGBBlock(source, sourceStart + 8, destination, decompressedStart, decompressedLineLength, false, isPremultiplied); }
internal static void DecompressBC2Block(byte[] source, int sourceStart, byte[] destination, int decompressedStart, int decompressedLineLength, bool isPremultiplied) { // KFreon: Decompress alpha (only half of the texel count though, since each byte is 2 texels of alpha) for (int i = 0; i < 8; i++) { // Start + alphaOffset + lineOffset. // DecompressedStart = Top Left corner of texel in full image in bytes. // alphaOffset = effectively column offset in a row of bitmap. Since a compressed byte has 2 pixels worth of alpha, i % 2 * 8 skips 2 pixels of BGRA each byte read, +3 selects alpha channel. // lineOffset = texels aren't contiguous i.e. each row in texel isn't next to each other when decompressed. Need to skip to next line in entire bitmap. i / 2 is truncated by int cast, // so every 2 cycles (4 pixels, a full texel row) a bitmap line is skipped to the next line in texel. int offset = decompressedStart + ((i % 2) * 8 + 3) + (decompressedLineLength * (i / 2)); destination[offset] = (byte)(source[sourceStart + i] & 0xF0); // Decompress doesn't need formatDetails as it's just reading raw. destination[offset + 4] = (byte)(source[sourceStart + i] & 0x0F << 4); } // +8 skips the above alpha, otherwise it's just a BC1 RGB block DDS_BlockHelpers.DecompressRGBBlock(source, sourceStart + 8, destination, decompressedStart, decompressedLineLength, false, isPremultiplied); }
// TODO: Virtual/physical size. Less than 4x4 texels #region Compressed Readers internal static void DecompressBC1Block(byte[] source, int sourceStart, byte[] destination, int decompressedStart, int decompressedLineLength, bool isPremultiplied) { DDS_BlockHelpers.DecompressRGBBlock(source, sourceStart, destination, decompressedStart, decompressedLineLength, true, isPremultiplied); }