/** Load a specific layer palette image and perform some sanity checks. */ ImageDecoder *PLTFile::getLayerPalette(uint32 layer, uint8 row) { assert(layer < kLayerMAX); // TODO: We may want to cache these somehow... ImageDecoder *palette = loadImage(kPalettes[layer]); try { if (palette->getFormat() != kPixelFormatBGRA) throw Common::Exception("Invalid format (%d)", palette->getFormat()); if (palette->getMipMapCount() < 1) throw Common::Exception("No mip maps"); const ImageDecoder::MipMap &mipMap = palette->getMipMap(0); if (mipMap.width != 256) throw Common::Exception("Invalid width (%d)", mipMap.width); if (row >= mipMap.height) throw Common::Exception("Invalid height (%d >= %d)", row, mipMap.height); } catch (...) { delete palette; throw; } return palette; }
ImageDecoder *Texture::loadImage(Common::SeekableReadStream *imageStream, ::Aurora::FileType type, TXI *txi) { // Check for a cube map, but only those that don't use a file for each side const bool isCubeMap = txi && txi->getFeatures().cube && (txi->getFeatures().fileRange == 0); ImageDecoder *image = 0; try { // Loading the different image formats if (type == ::Aurora::kFileTypeTGA) image = new TGA(*imageStream, isCubeMap); else if (type == ::Aurora::kFileTypeDDS) image = new DDS(*imageStream); else if (type == ::Aurora::kFileTypeTPC) image = new TPC(*imageStream); else if (type == ::Aurora::kFileTypeTXB) image = new TXB(*imageStream); else if (type == ::Aurora::kFileTypeSBM) image = new SBM(*imageStream); else if (type == ::Aurora::kFileTypeXEOSITEX) image = new XEOSITEX(*imageStream); else throw Common::Exception("Unsupported image resource type %d", (int) type); if (image->getMipMapCount() < 1) throw Common::Exception("Texture has no images"); // Decompress if (GfxMan.needManualDeS3TC()) image->decompress(); } catch (...) { delete image; delete imageStream; throw; } delete imageStream; return image; }
ImageDecoder *Texture::loadImage(Common::SeekableReadStream *imageStream, ::Aurora::FileType type) { ImageDecoder *image = 0; try { // Loading the different image formats if (type == ::Aurora::kFileTypeTGA) image = new TGA(*imageStream); else if (type == ::Aurora::kFileTypeDDS) image = new DDS(*imageStream); else if (type == ::Aurora::kFileTypeTPC) image = new TPC(*imageStream); else if (type == ::Aurora::kFileTypeTXB) image = new TXB(*imageStream); else if (type == ::Aurora::kFileTypeSBM) image = new SBM(*imageStream); else if (type == ::Aurora::kFileTypeXEOSITEX) image = new XEOSITEX(*imageStream); else throw Common::Exception("Unsupported image resource type %d", (int) type); if (image->getMipMapCount() < 1) throw Common::Exception("Texture has no images"); // Decompress if (GfxMan.needManualDeS3TC()) image->decompress(); } catch (...) { delete image; delete imageStream; throw; } delete imageStream; return image; }