void ImageDecoder::decompress(MipMap &out, const MipMap &in, PixelFormatRaw format) { if ((format != kPixelFormatDXT1) && (format != kPixelFormatDXT3) && (format != kPixelFormatDXT5)) throw Common::Exception("Unknown compressed format %d", format); /* The DXT algorithms work on 4x4 pixel blocks. Textures smaller than one * block will be padded, but larger textures need to be correctly aligned. */ if (!hasValidDimensions(format, in.width, in.height)) throw Common::Exception("Invalid dimensions (%dx%d) for format %d", in.width, in.height, format); out.width = in.width; out.height = in.height; out.size = out.width * out.height * 4; out.data.reset(new byte[out.size]); Common::ScopedPtr<Common::MemoryReadStream> stream(new Common::MemoryReadStream(in.data.get(), in.size)); if (format == kPixelFormatDXT1) decompressDXT1(out.data.get(), *stream, out.width, out.height, out.width * 4); else if (format == kPixelFormatDXT3) decompressDXT3(out.data.get(), *stream, out.width, out.height, out.width * 4); else if (format == kPixelFormatDXT5) decompressDXT5(out.data.get(), *stream, out.width, out.height, out.width * 4); }
void ImageDecoder::decompress(MipMap &out, const MipMap &in, PixelFormatRaw format) { if ((format != kPixelFormatDXT1) && (format != kPixelFormatDXT3) && (format != kPixelFormatDXT5)) throw Common::Exception("Unknown compressed format %d", format); out.width = in.width; out.height = in.height; out.size = out.width * out.height * 4; out.data = new byte[out.size]; Common::MemoryReadStream *stream = new Common::MemoryReadStream(in.data, in.size); if (format == kPixelFormatDXT1) decompressDXT1(out.data, *stream, out.width, out.height, out.width * 4); else if (format == kPixelFormatDXT3) decompressDXT3(out.data, *stream, out.width, out.height, out.width * 4); else if (format == kPixelFormatDXT5) decompressDXT5(out.data, *stream, out.width, out.height, out.width * 4); delete stream; }