Graphics::Surface *Menu::createThumbnail(Graphics::Surface *big) { assert(big->format.bytesPerPixel == 4); Graphics::Surface *small = new Graphics::Surface(); small->create(GameState::kThumbnailWidth, GameState::kThumbnailHeight, Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24)); uint bigHeight = big->h - Renderer::kTopBorderHeight - Renderer::kBottomBorderHeight; uint bigYOffset = Renderer::kBottomBorderHeight; uint32 *dst = (uint32 *)small->pixels; for (uint i = 0; i < small->h; i++) { for (uint j = 0; j < small->w; j++) { uint32 srcX = big->w * j / small->w; uint32 srcY = bigYOffset + bigHeight - bigHeight * i / small->h; uint32 *src = (uint32 *)big->getBasePtr(srcX, srcY - 1); // Copy RGBA pixel *dst++ = *src; } } // The thumbnail is stored on disk in BGRA small->convertToInPlace(Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24)); return small; }
void PicButtonWidget::drawWidget() { if (_showButton) g_gui.theme()->drawButton(Common::Rect(_x, _y, _x + _w, _y + _h), "", _state, getFlags()); Graphics::Surface *gfx; if (_state == ThemeEngine::kStateHighlight) gfx = &_gfx[kPicButtonHighlight]; else if (_state == ThemeEngine::kStateDisabled) gfx = &_gfx[kPicButtonStateDisabled]; else if (_state == ThemeEngine::kStatePressed) gfx = &_gfx[kPicButtonStatePressed]; else gfx = &_gfx[kPicButtonStateEnabled]; if (!gfx->getPixels()) gfx = &_gfx[kPicButtonStateEnabled]; if (gfx->getPixels()) { // Check whether the set up surface needs to be converted to the GUI // color format. const Graphics::PixelFormat &requiredFormat = g_gui.theme()->getPixelFormat(); if (gfx->format != requiredFormat) { gfx->convertToInPlace(requiredFormat); } const int x = _x + (_w - gfx->w) / 2; const int y = _y + (_h - gfx->h) / 2; g_gui.theme()->drawSurface(Common::Rect(x, y, x + gfx->w, y + gfx->h), *gfx, _transparency); } }
void RenderManager::readImageToSurface(const Common::String &fileName, Graphics::Surface &destination) { Common::File file; if (!file.open(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; Graphics::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); }