Unified
Split
Showing
with
1 addition
and 120 deletions.
- +0 −29 engines/zvision/graphics/cursors/cursor.cpp
- +0 −1 engines/zvision/graphics/cursors/cursor.h
- +1 −90 engines/zvision/graphics/render_manager.cpp
| @@ -36,35 +36,6 @@ ZorkCursor::ZorkCursor() | ||
| _hotspotY(0) { | ||
| } | ||
|
|
||
| ZorkCursor::ZorkCursor(const Common::String &fileName) | ||
| : _width(0), | ||
| _height(0), | ||
| _hotspotX(0), | ||
| _hotspotY(0) { | ||
| Common::File file; | ||
| if (!file.open(fileName)) | ||
| return; | ||
|
|
||
| uint32 magic = file.readUint32BE(); | ||
| if (magic != MKTAG('Z', 'C', 'R', '1')) { | ||
| warning("%s is not a Zork Cursor file", fileName.c_str()); | ||
| return; | ||
| } | ||
|
|
||
| _hotspotX = file.readUint16LE(); | ||
| _hotspotY = file.readUint16LE(); | ||
| _width = file.readUint16LE(); | ||
| _height = file.readUint16LE(); | ||
|
|
||
| uint dataSize = _width * _height * sizeof(uint16); | ||
| _surface.create(_width, _height, Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0)); | ||
| uint32 bytesRead = file.read(_surface.getPixels(), dataSize); | ||
| assert(bytesRead == dataSize); | ||
|
|
||
| // Convert to RGB 565 | ||
| _surface.convertToInPlace(Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0)); | ||
| } | ||
|
|
||
| ZorkCursor::ZorkCursor(ZVision *engine, const Common::String &fileName) | ||
| : _width(0), | ||
| _height(0), | ||
| @@ -39,7 +39,6 @@ namespace ZVision { | ||
| class ZorkCursor { | ||
| public: | ||
| ZorkCursor(); | ||
| ZorkCursor(const Common::String &fileName); | ||
| ZorkCursor(ZVision *engine, const Common::String &fileName); | ||
| ZorkCursor(const ZorkCursor &other); | ||
| ~ZorkCursor(); | ||
| @@ -162,97 +162,8 @@ void RenderManager::renderImageToBackground(const Common::String &fileName, int1 | ||
| } | ||
|
|
||
| void RenderManager::readImageToSurface(const Common::String &fileName, Graphics::Surface &destination) { | ||
| Common::File file; | ||
|
|
||
| if (!_engine->getSearchManager()->openFile(file, fileName)) { | ||
| warning("Could not open file %s", fileName.c_str()); | ||
| return; | ||
| } | ||
|
|
||
| // Read the magic number | ||
| // Some files are true TGA, while others are TGZ | ||
| uint32 fileType = file.readUint32BE(); | ||
|
|
||
| uint32 imageWidth; | ||
| uint32 imageHeight; | ||
| Image::TGADecoder tga; | ||
| uint16 *buffer; | ||
| bool isTransposed = _renderTable.getRenderState() == RenderTable::PANORAMA; | ||
| // All ZVision images are in RGB 555 | ||
| Graphics::PixelFormat pixelFormat555 = Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0); | ||
| destination.format = pixelFormat555; | ||
|
|
||
| bool isTGZ; | ||
|
|
||
| // Check for TGZ files | ||
| if (fileType == MKTAG('T', 'G', 'Z', '\0')) { | ||
| isTGZ = true; | ||
|
|
||
| // TGZ files have a header and then Bitmap data that is compressed with LZSS | ||
| uint32 decompressedSize = file.readSint32LE(); | ||
| imageWidth = file.readSint32LE(); | ||
| imageHeight = file.readSint32LE(); | ||
|
|
||
| LzssReadStream lzssStream(&file); | ||
| buffer = (uint16 *)(new uint16[decompressedSize]); | ||
| lzssStream.read(buffer, decompressedSize); | ||
| } else { | ||
| isTGZ = false; | ||
|
|
||
| // Reset the cursor | ||
| file.seek(0); | ||
|
|
||
| // Decode | ||
| if (!tga.loadStream(file)) { | ||
| warning("Error while reading TGA image"); | ||
| return; | ||
| } | ||
|
|
||
| Graphics::Surface tgaSurface = *(tga.getSurface()); | ||
| imageWidth = tgaSurface.w; | ||
| imageHeight = tgaSurface.h; | ||
|
|
||
| buffer = (uint16 *)tgaSurface.getPixels(); | ||
| } | ||
|
|
||
| // Flip the width and height if transposed | ||
| if (isTransposed) { | ||
| uint16 temp = imageHeight; | ||
| imageHeight = imageWidth; | ||
| imageWidth = temp; | ||
| } | ||
|
|
||
| // If the destination internal buffer is the same size as what we're copying into it, | ||
| // there is no need to free() and re-create | ||
| if (imageWidth != destination.w || imageHeight != destination.h) { | ||
| destination.create(imageWidth, imageHeight, pixelFormat555); | ||
| } | ||
|
|
||
| // If transposed, 'un-transpose' the data while copying it to the destination | ||
| // Otherwise, just do a simple copy | ||
| if (isTransposed) { | ||
| uint16 *dest = (uint16 *)destination.getPixels(); | ||
|
|
||
| for (uint32 y = 0; y < imageHeight; ++y) { | ||
| uint32 columnIndex = y * imageWidth; | ||
|
|
||
| for (uint32 x = 0; x < imageWidth; ++x) { | ||
| dest[columnIndex + x] = buffer[x * imageHeight + y]; | ||
| } | ||
| } | ||
| } else { | ||
| memcpy(destination.getPixels(), buffer, imageWidth * imageHeight * _pixelFormat.bytesPerPixel); | ||
| } | ||
|
|
||
| // Cleanup | ||
| if (isTGZ) { | ||
| delete[] buffer; | ||
| } else { | ||
| tga.destroy(); | ||
| } | ||
|
|
||
| // Convert in place to RGB 565 from RGB 555 | ||
| destination.convertToInPlace(_pixelFormat); | ||
| readImageToSurface(fileName, destination, isTransposed); | ||
| } | ||
|
|
||
| void RenderManager::readImageToSurface(const Common::String &fileName, Graphics::Surface &destination, bool transposed) { | ||