diff options
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/conversion.cpp | 152 | ||||
-rw-r--r-- | graphics/conversion.h | 76 | ||||
-rw-r--r-- | graphics/dither.cpp | 1 | ||||
-rw-r--r-- | graphics/dither.h | 13 | ||||
-rw-r--r-- | graphics/jpeg.cpp | 638 | ||||
-rw-r--r-- | graphics/jpeg.h | 118 | ||||
-rw-r--r-- | graphics/module.mk | 2 | ||||
-rw-r--r-- | graphics/scaler/thumbnail_intern.cpp | 20 | ||||
-rw-r--r-- | graphics/sjis.cpp | 5 | ||||
-rw-r--r-- | graphics/video/coktelvideo/coktelvideo.cpp | 5 |
10 files changed, 26 insertions, 1004 deletions
diff --git a/graphics/conversion.cpp b/graphics/conversion.cpp deleted file mode 100644 index 1863814c1d..0000000000 --- a/graphics/conversion.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - */ - -#include "graphics/conversion.h" - -namespace Graphics { - -// TODO: YUV to RGB conversion function - -// Function to blit a rect from one color format to another -bool crossBlit(byte *dst, const byte *src, int dstpitch, int srcpitch, - int w, int h, const Graphics::PixelFormat &dstFmt, const Graphics::PixelFormat &srcFmt) { - // Error out if conversion is impossible - if ((srcFmt.bytesPerPixel == 1) || (dstFmt.bytesPerPixel == 1) - || (!srcFmt.bytesPerPixel) || (!dstFmt.bytesPerPixel) - || (srcFmt.bytesPerPixel > dstFmt.bytesPerPixel)) - return false; - - // Don't perform unnecessary conversion - if (srcFmt == dstFmt) { - if (dst == src) - return true; - if (dstpitch == srcpitch && ((w * dstFmt.bytesPerPixel) == dstpitch)) { - memcpy(dst,src,dstpitch * h); - return true; - } else { - for (int i = 0; i < h; i++) { - memcpy(dst,src,w * dstFmt.bytesPerPixel); - dst += dstpitch; - src += srcpitch; - } - return true; - } - } - - // Faster, but larger, to provide optimized handling for each case. - int srcDelta, dstDelta; - srcDelta = (srcpitch - w * srcFmt.bytesPerPixel); - dstDelta = (dstpitch - w * dstFmt.bytesPerPixel); - - // TODO: optimized cases for dstDelta of 0 - uint8 r, g, b, a; - if (dstFmt.bytesPerPixel == 2) { - uint16 color; - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++, src += 2, dst += 2) { - color = *(uint16 *) src; - srcFmt.colorToARGB(color, a, r, g, b); - color = dstFmt.ARGBToColor(a, r, g, b); - *(uint16 *) dst = color; - } - src += srcDelta; - dst += dstDelta; - } - } else if (dstFmt.bytesPerPixel == 3) { - uint32 color; - uint8 *col = (uint8 *) &color; -#ifdef SCUMM_BIG_ENDIAN - col++; -#endif - if (srcFmt.bytesPerPixel == 2) { - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++, src += 2, dst += 3) { - color = *(uint16 *) src; - srcFmt.colorToARGB(color, a, r, g, b); - color = dstFmt.ARGBToColor(a, r, g, b); - memcpy(dst, col, 3); - } - src += srcDelta; - dst += dstDelta; - } - } else { - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++, src += 3, dst += 3) { - uint8 r, g, b, a; - memcpy(col, src, 3); - srcFmt.colorToARGB(color, a, r, g, b); - color = dstFmt.ARGBToColor(a, r, g, b); - memcpy(dst, col, 3); - } - src += srcDelta; - dst += dstDelta; - } - } - } else if (dstFmt.bytesPerPixel == 4) { - uint32 color; - if (srcFmt.bytesPerPixel == 2) { - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++, src += 2, dst += 4) { - color = *(uint16 *) src; - srcFmt.colorToARGB(color, a, r, g, b); - color = dstFmt.ARGBToColor(a, r, g, b); - *(uint32 *) dst = color; - } - src += srcDelta; - dst += dstDelta; - } - } else if (srcFmt.bytesPerPixel == 3) { - uint8 *col = (uint8 *)&color; -#ifdef SCUMM_BIG_ENDIAN - col++; -#endif - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++, src += 2, dst += 4) { - memcpy(col, src, 3); - srcFmt.colorToARGB(color, a, r, g, b); - color = dstFmt.ARGBToColor(a, r, g, b); - *(uint32 *) dst = color; - } - src += srcDelta; - dst += dstDelta; - } - } else { - for (int y = 0; y < h; y++) { - for (int x = 0; x < w; x++, src += 4, dst += 4) { - color = *(uint32 *) src; - srcFmt.colorToARGB(color, a, r, g, b); - color = dstFmt.ARGBToColor(a, r, g, b); - *(uint32 *) dst = color; - } - src += srcDelta; - dst += dstDelta; - } - } - } else { - return false; - } - return true; -} - -} // end of namespace Graphics diff --git a/graphics/conversion.h b/graphics/conversion.h deleted file mode 100644 index b0314046b9..0000000000 --- a/graphics/conversion.h +++ /dev/null @@ -1,76 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef GRAPHICS_CONVERSION_H -#define GRAPHICS_CONVERSION_H - -#include "common/util.h" -#include "graphics/pixelformat.h" - -namespace Graphics { - -/** Converting a color from YUV to RGB colorspace. */ -inline static void YUV2RGB(byte y, byte u, byte v, byte &r, byte &g, byte &b) { - r = CLIP<int>(y + ((1357 * (v - 128)) >> 10), 0, 255); - g = CLIP<int>(y - (( 691 * (v - 128)) >> 10) - ((333 * (u - 128)) >> 10), 0, 255); - b = CLIP<int>(y + ((1715 * (u - 128)) >> 10), 0, 255); -} - -/** Converting a color from RGB to YUV colorspace. */ -inline static void RGB2YUV(byte r, byte g, byte b, byte &y, byte &u, byte &v) { - y = CLIP<int>( ((r * 306) >> 10) + ((g * 601) >> 10) + ((b * 117) >> 10) , 0, 255); - u = CLIP<int>(-((r * 172) >> 10) - ((g * 340) >> 10) + ((b * 512) >> 10) + 128, 0, 255); - v = CLIP<int>( ((r * 512) >> 10) - ((g * 429) >> 10) - ((b * 83) >> 10) + 128, 0, 255); -} - -// TODO: generic YUV to RGB blit - -/** - * Blits a rectangle from one graphical format to another. - * - * @param dstbuf the buffer which will recieve the converted graphics data - * @param srcbuf the buffer containing the original graphics data - * @param dstpitch width in bytes of one full line of the dest buffer - * @param srcpitch width in bytes of one full line of the source buffer - * @param w the width of the graphics data - * @param h the height of the graphics data - * @param dstFmt the desired pixel format - * @param srcFmt the original pixel format - * @return true if conversion completes successfully, - * false if there is an error. - * - * @note This implementation currently arbitrarily requires that the - * destination's format have at least as high a bytedepth as - * the source's. - * @note This can convert a rectangle in place, if the source and - * destination format have the same bytedepth. - * - */ -bool crossBlit(byte *dst, const byte *src, int dstpitch, int srcpitch, - int w, int h, Graphics::PixelFormat dstFmt, Graphics::PixelFormat srcFmt); - -} // end of namespace Graphics - -#endif // GRAPHICS_CONVERSION_H diff --git a/graphics/dither.cpp b/graphics/dither.cpp index e671de265e..7a92441571 100644 --- a/graphics/dither.cpp +++ b/graphics/dither.cpp @@ -23,7 +23,6 @@ */ #include "common/endian.h" -#include "graphics/conversion.h" #include "graphics/dither.h" namespace Graphics { diff --git a/graphics/dither.h b/graphics/dither.h index 18f98ce4e0..e6d606cdd4 100644 --- a/graphics/dither.h +++ b/graphics/dither.h @@ -43,6 +43,19 @@ public: kPaletteYUV //!< Palette in YUV colorspace }; + /** Converting a color from YUV to RGB colorspace. */ + inline static void YUV2RGB(byte y, byte u, byte v, byte &r, byte &g, byte &b) { + r = CLIP<int>(y + ((1357 * (v - 128)) >> 10), 0, 255); + g = CLIP<int>(y - (( 691 * (v - 128)) >> 10) - ((333 * (u - 128)) >> 10), 0, 255); + b = CLIP<int>(y + ((1715 * (u - 128)) >> 10), 0, 255); + } + /** Converting a color from RGB to YUV colorspace. */ + inline static void RGB2YUV(byte r, byte g, byte b, byte &y, byte &u, byte &v) { + y = CLIP<int>( ((r * 306) >> 10) + ((g * 601) >> 10) + ((b * 117) >> 10) , 0, 255); + u = CLIP<int>(-((r * 172) >> 10) - ((g * 340) >> 10) + ((b * 512) >> 10) + 128, 0, 255); + v = CLIP<int>( ((r * 512) >> 10) - ((g * 429) >> 10) - ((b * 83) >> 10) + 128, 0, 255); + } + /** Create a lookup table of a given depth and palette format. * * @param depth How many bits of each color component to consider. diff --git a/graphics/jpeg.cpp b/graphics/jpeg.cpp deleted file mode 100644 index 0ad2cf7699..0000000000 --- a/graphics/jpeg.cpp +++ /dev/null @@ -1,638 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "graphics/jpeg.h" - -#include "common/endian.h" -#include "common/util.h" - -namespace Graphics { - -// Order used to traverse the quantization tables -uint8 JPEG::_zigZagOrder[64] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63 -}; - -JPEG::JPEG() : - _str(NULL), _w(0), _h(0), _numComp(0), _components(NULL), _numScanComp(0), - _scanComp(NULL), _currentComp(NULL) { - - // Initialize the quantization tables - for (int i = 0; i < JPEG_MAX_QUANT_TABLES; i++) - _quant[i] = NULL; - - // Initialize the Huffman tables - for (int i = 0; i < 2 * JPEG_MAX_HUFF_TABLES; i++) { - _huff[i].count = 0; - _huff[i].values = NULL; - _huff[i].sizes = NULL; - _huff[i].codes = NULL; - } -} - -JPEG::~JPEG() { - reset(); -} - -void JPEG::reset() { - // Reset member variables - _str = NULL; - _w = _h = 0; - - // Free the components - for (int c = 0; c < _numComp; c++) - _components[c].surface.free(); - delete[] _components; _components = NULL; - _numComp = 0; - - // Free the scan components - delete[] _scanComp; _scanComp = NULL; - _numScanComp = 0; - _currentComp = NULL; - - // Free the quantization tables - for (int i = 0; i < JPEG_MAX_QUANT_TABLES; i++) { - delete[] _quant[i]; - _quant[i] = NULL; - } - - // Free the Huffman tables - for (int i = 0; i < 2 * JPEG_MAX_HUFF_TABLES; i++) { - _huff[i].count = 0; - delete[] _huff[i].values; _huff[i].values = NULL; - delete[] _huff[i].sizes; _huff[i].sizes = NULL; - delete[] _huff[i].codes; _huff[i].codes = NULL; - } -} - -bool JPEG::read(Common::SeekableReadStream *str) { - // Reset member variables and tables from previous reads - reset(); - - // Save the input stream - _str = str; - - bool ok = true; - bool done = false; - while (!_str->eos() && ok && !done) { - // Read the marker - uint16 marker = _str->readByte(); - if (marker != 0xFF) { - error("JPEG: Invalid marker[0]: 0x%02X", marker); - ok = false; - break; - } - - while (marker == 0xFF) - marker = _str->readByte(); - - // Process the marker data - switch (marker) { - case 0xC0: // Start Of Frame - ok = readSOF0(); - break; - case 0xC4: // Define Huffman Tables - ok = readDHT(); - break; - case 0xD8: // Start Of Image - break; - case 0xD9: // End Of Image - done = true; - break; - case 0xDA: // Start Of Scan - ok = readSOS(); - break; - case 0xDB: // Define Quantization Tables - ok = readDQT(); - break; - case 0xE0: // JFIF/JFXX segment - ok = readJFIF(); - break; - case 0xFE: // Comment - _str->seek(_str->readUint16BE() - 2, SEEK_CUR); - break; - default: { // Unknown marker - uint16 size = _str->readUint16BE(); - warning("JPEG: Unknown marker %02X, skipping %d bytes", marker, size - 2); - _str->seek(size - 2, SEEK_CUR); - } - } - } - return ok; -} - -bool JPEG::readJFIF() { - /* uint16 length = */ _str->readUint16BE(); - uint32 tag = _str->readUint32BE(); - if (tag != MKID_BE('JFIF')) - return false; - _str->readByte(); // NULL - /* byte majorVersion = */ _str->readByte(); - /* byte minorVersion = */ _str->readByte(); - /* byte densityUnits = */ _str->readByte(); - /* uint16 xDensity = */ _str->readUint16BE(); - /* uint16 yDensity = */ _str->readUint16BE(); - byte thumbW = _str->readByte(); - byte thumbH = _str->readByte(); - _str->seek(thumbW * thumbH * 3, SEEK_CUR); // Ignore thumbnail - return true; -} - -// Marker 0xC0 (Start Of Frame, Baseline DCT) -bool JPEG::readSOF0() { - debug(5, "JPEG: readSOF0"); - uint16 size = _str->readUint16BE(); - - // Read the sample precision - uint8 precision = _str->readByte(); - if (precision != 8) { - warning("JPEG: Just 8 bit precision supported at the moment"); - return false; - } - - // Image size - _h = _str->readUint16BE(); - _w = _str->readUint16BE(); - - // Number of components - _numComp = _str->readByte(); - if (size != 8 + 3 * _numComp) { - warning("JPEG: Invalid number of components"); - return false; - } - - // Allocate the new components - delete[] _components; - _components = new Component[_numComp]; - - // Read the components details - for (int c = 0; c < _numComp; c++) { - _components[c].id = _str->readByte(); - _components[c].factorH = _str->readByte(); - _components[c].factorV = _components[c].factorH & 0xF; - _components[c].factorH >>= 4; - _components[c].quantTableSelector = _str->readByte(); - } - - return true; -} - -// Marker 0xC4 (Define Huffman Tables) -bool JPEG::readDHT() { - debug(5, "JPEG: readDHT"); - uint16 size = _str->readUint16BE() - 2; - uint32 pos = _str->pos(); - - while ((uint32)_str->pos() < (size + pos)) { - // Read the table type and id - uint8 tableId = _str->readByte(); - uint8 tableType = tableId >> 4; // type 0: DC, 1: AC - tableId &= 0xF; - uint8 tableNum = (tableId << 1) + tableType; - - // Free the Huffman table - delete[] _huff[tableNum].values; _huff[tableNum].values = NULL; - delete[] _huff[tableNum].sizes; _huff[tableNum].sizes = NULL; - delete[] _huff[tableNum].codes; _huff[tableNum].codes = NULL; - - // Read the number of values for each length - uint8 numValues[16]; - _huff[tableNum].count = 0; - for (int len = 0; len < 16; len++) { - numValues[len] = _str->readByte(); - _huff[tableNum].count += numValues[len]; - } - - // Allocate memory for the current table - _huff[tableNum].values = new uint8[_huff[tableNum].count]; - _huff[tableNum].sizes = new uint8[_huff[tableNum].count]; - _huff[tableNum].codes = new uint16[_huff[tableNum].count]; - - // Read the table contents - int cur = 0; - for (int len = 0; len < 16; len++) { - for (int i = 0; i < numValues[len]; i++) { - _huff[tableNum].values[cur] = _str->readByte(); - _huff[tableNum].sizes[cur] = len + 1; - cur++; - } - } - - // Fill the table of Huffman codes - cur = 0; - uint16 curCode = 0; - uint8 curCodeSize = _huff[tableNum].sizes[0]; - while (cur < _huff[tableNum].count) { - // Increase the code size to fit the request - while (_huff[tableNum].sizes[cur] != curCodeSize) { - curCode <<= 1; - curCodeSize++; - } - - // Assign the current code - _huff[tableNum].codes[cur] = curCode; - curCode++; - cur++; - } - } - - return true; -} - -// Marker 0xDA (Start Of Scan) -bool JPEG::readSOS() { - debug(5, "JPEG: readSOS"); - uint16 size = _str->readUint16BE(); - - // Number of scan components - _numScanComp = _str->readByte(); - if (size != 6 + 2 * _numScanComp) { - warning("JPEG: Invalid number of components"); - return false; - } - - // Allocate the new scan components - delete[] _scanComp; - _scanComp = new Component *[_numScanComp]; - - // Reset the maximum sampling factors - _maxFactorV = 0; - _maxFactorH = 0; - - // Component-specification parameters - for (int c = 0; c < _numScanComp; c++) { - // Read the desired component id - uint8 id = _str->readByte(); - - // Search the component with the specified id - bool found = false; - for (int i = 0; !found && i < _numComp; i++) { - if (_components[i].id == id) { - // We found the desired component - found = true; - - // Assign the found component to the c'th scan component - _scanComp[c] = &_components[i]; - } - } - - if (!found) { - warning("JPEG: Invalid component"); - return false; - } - - // Read the entropy table selectors - _scanComp[c]->DCentropyTableSelector = _str->readByte(); - _scanComp[c]->ACentropyTableSelector = _scanComp[c]->DCentropyTableSelector & 0xF; - _scanComp[c]->DCentropyTableSelector >>= 4; - - // Calculate the maximum sampling factors - if (_scanComp[c]->factorV > _maxFactorV) - _maxFactorV = _scanComp[c]->factorV; - - if (_scanComp[c]->factorH > _maxFactorH) - _maxFactorH = _scanComp[c]->factorH; - - // Initialize the DC predictor - _scanComp[c]->DCpredictor = 0; - } - - // Initialize the scan surfaces - for (int c = 0; c < _numScanComp; c++) - _scanComp[c]->surface.create(_w, _h, 1); - - // Start of spectral selection - if (_str->readByte() != 0) { - warning("JPEG: Progressive scanning not supported"); - return false; - } - - // End of spectral selection - if (_str->readByte() != 63) { - warning("JPEG: Progressive scanning not supported"); - return false; - } - - // Successive approximation parameters - if (_str->readByte() != 0) { - warning("JPEG: Progressive scanning not supported"); - return false; - } - - // Entropy coded sequence starts, initialize Huffman decoder - _bitsNumber = 0; - - // Read all the scan MCUs - uint16 xMCU = _w / (_maxFactorH * 8); - uint16 yMCU = _h / (_maxFactorV * 8); - - // Check for non- multiple-of-8 dimensions - if (_w % 8 != 0) - xMCU++; - if (_h % 8 != 0) - yMCU++; - - bool ok = true; - for (int y = 0; ok && (y < yMCU); y++) - for (int x = 0; ok && (x < xMCU); x++) - ok = readMCU(x, y); - - return ok; -} - -// Marker 0xDB (Define Quantization Tables) -bool JPEG::readDQT() { - debug(5, "JPEG: readDQT"); - uint16 size = _str->readUint16BE() - 2; - uint32 pos = _str->pos(); - - while ((uint32)_str->pos() < (pos + size)) { - // Read the table precision and id - uint8 tableId = _str->readByte(); - bool highPrecision = (tableId & 0xF0) != 0; - - // Validate the table id - tableId &= 0xF; - if (tableId > JPEG_MAX_QUANT_TABLES) { - warning("JPEG: Invalid number of components"); - return false; - } - - // Create the new table if necessary - if (!_quant[tableId]) - _quant[tableId] = new uint16[64]; - - // Read the table (stored in Zig-Zag order) - for (int i = 0; i < 64; i++) - _quant[tableId][i] = highPrecision ? _str->readUint16BE() : _str->readByte(); - } - - return true; -} - -bool JPEG::readMCU(uint16 xMCU, uint16 yMCU) { - bool ok = true; - for (int c = 0; ok && (c < _numComp); c++) { - // Set the current component - _currentComp = _scanComp[c]; - - // Read the data units of the current component - for (int y = 0; ok && (y < _scanComp[c]->factorV); y++) - for (int x = 0; ok && (x < _scanComp[c]->factorH); x++) - ok = readDataUnit(xMCU * _scanComp[c]->factorH + x, yMCU * _scanComp[c]->factorV + y); - } - - return ok; -} - -float JPEG::idct(int x, int y, int weight, int fx, int fy) { - float vx = cos((2 * x + 1) * fx * PI / 16); - float vy = cos((2 * y + 1) * fy * PI / 16); - float ret = (float)weight * vx * vy; - - if (fx == 0) - ret /= sqrt(2.0f); - - if (fy == 0) - ret /= sqrt(2.0f); - - return ret; -} - -bool JPEG::readDataUnit(uint16 x, uint16 y) { - // Prepare an empty data array - int16 readData[64]; - for (int i = 1; i < 64; i++) - readData[i] = 0; - - // Read the DC component - readData[0] = _currentComp->DCpredictor + readDC(); - _currentComp->DCpredictor = readData[0]; - - // Read the AC components (stored in Zig-Zag) - readAC(readData); - - // Calculate the DCT coefficients from the input sequence - int16 DCT[64]; - for (int i = 0; i < 64; i++) { - // Dequantize - int16 val = readData[i]; - int16 quant = _quant[_currentComp->quantTableSelector][i]; - val *= quant; - - // Store the normalized coefficients, undoing the Zig-Zag - DCT[_zigZagOrder[i]] = val; - } - - // Shortcut the IDCT for DC component - float result[64]; - for (int i = 0; i < 64; i++) - result[i] = DCT[0] / 2; - - // Apply the IDCT (PAG31) - for (int i = 1; i < 64; i++) { - if (DCT[i]) - for (int _y = 0; _y < 8; _y++) - for (int _x = 0; _x < 8; _x++) - result[_y * 8 + _x] += idct(_x, _y, DCT[i], i % 8, i / 8); - } - - // Level shift to make the values unsigned - // Divide by 4 is final part of IDCT - for (int i = 0; i < 64; i++) { - result[i] = result[i] / 4 + 128; - - if (result[i] < 0) - result[i] = 0; - - if (result[i] > 255) - result[i] = 255; - } - - // Paint the component surface - uint8 scalingV = _maxFactorV / _currentComp->factorV; - uint8 scalingH = _maxFactorH / _currentComp->factorH; - - // Convert coordinates from MCU blocks to pixels - x <<= 3; - y <<= 3; - - // Handle non- multiple-of-8 dimensions - byte xLim = 8; - byte yLim = 8; - if (x*scalingH + 8 > _w) - xLim -= (x*scalingH + 8 - _w); - if (y*scalingV + 8 > _h) - yLim -= (y*scalingV + 8 - _h); - - for (int j = 0; j < yLim; j++) { - for (int sV = 0; sV < scalingV; sV++) { - // Get the beginning of the block line - byte *ptr = (byte *)_currentComp->surface.getBasePtr(x * scalingH, (y + j) * scalingV + sV); - - for (int i = 0; i < xLim; i++) { - for (uint8 sH = 0; sH < scalingH; sH++) { - *ptr = (byte)(result[j * 8 + i]); - ptr++; - } - } - } - } - - return true; -} - -int16 JPEG::readDC() { - // DC is type 0 - uint8 tableNum = _currentComp->DCentropyTableSelector << 1; - - // Get the number of bits to read - uint8 numBits = readHuff(tableNum); - - // Read the requested bits - return readSignedBits(numBits); -} - -void JPEG::readAC(int16 *out) { - // AC is type 1 - uint8 tableNum = (_currentComp->ACentropyTableSelector << 1) + 1; - - // Start reading AC element 1 - uint8 cur = 1; - while (cur < 64) { - uint8 s = readHuff(tableNum); - uint8 r = s >> 4; - s &= 0xF; - - if (s == 0) { - if (r == 15) { - // Skip 16 values - cur += 16; - } else { - // EOB: end of block - cur = 64; - } - } else { - // Skip r values - cur += r; - - // Read the next value - out[cur] = readSignedBits(s); - cur++; - } - } -} - -int16 JPEG::readSignedBits(uint8 numBits) { - uint16 ret = 0; - if (numBits > 16) error("requested %d bits", numBits); //XXX - - // MSB=0 for negatives, 1 for positives - for (int i = 0; i < numBits; i++) - ret = (ret << 1) + readBit(); - - // Extend sign bits (PAG109) - if (!(ret >> (numBits - 1))) - { - uint16 tmp = ((uint16)-1 << numBits) + 1; - ret = ret + tmp; - } - return ret; -} - -// TODO: optimize? -uint8 JPEG::readHuff(uint8 table) { - bool foundCode = false; - uint8 val = 0; - - uint8 cur = 0; - uint8 codeSize = 1; - uint16 code = readBit(); - while (!foundCode) { - // Prepare a code of the current size - while (codeSize < _huff[table].sizes[cur]) { - code = (code << 1) + readBit(); - codeSize++; - } - - // Compare the codes of the current size - while (!foundCode && (codeSize == _huff[table].sizes[cur])) { - if (code == _huff[table].codes[cur]) { - // Found the code - val = _huff[table].values[cur]; - foundCode = true; - } else { - // Continue reading - cur++; - } - } - } - - return val; -} - -uint8 JPEG::readBit() { - // Read a whole byte if necessary - if (_bitsNumber == 0) { - _bitsData = _str->readByte(); - _bitsNumber = 8; - - // Detect markers - if (_bitsData == 0xFF) { - uint8 byte2 = _str->readByte(); - - // A stuffed 0 validates the previous byte - if (byte2 != 0) { - if (byte2 == 0xDC) { - // DNL marker: Define Number of Lines - // TODO: terminate scan - printf("DNL marker detected: terminate scan\n"); - } else { - printf("Error: marker 0x%02X read in entropy data\n", byte2); - } - } - } - } - _bitsNumber--; - - return (_bitsData & (1 << _bitsNumber)) ? 1 : 0; -} - -Surface *JPEG::getComponent(uint c) { - for (int i = 0; i < _numComp; i++) - if (_components[i].id == c) // We found the desired component - return &_components[i].surface; - - return NULL; -} - -} // End of Graphics namespace diff --git a/graphics/jpeg.h b/graphics/jpeg.h deleted file mode 100644 index f4743a5e83..0000000000 --- a/graphics/jpeg.h +++ /dev/null @@ -1,118 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef GRAPHICS_JPEG_H -#define GRAPHICS_JPEG_H - -#include "common/stream.h" -#include "graphics/surface.h" - -namespace Graphics { - -#define JPEG_MAX_QUANT_TABLES 4 -#define JPEG_MAX_HUFF_TABLES 2 - -class JPEG { -public: - JPEG(); - ~JPEG(); - - bool read(Common::SeekableReadStream *str); - Surface *getComponent(uint c); - -private: - void reset(); - - Common::SeekableReadStream *_str; - uint16 _w, _h; - - // Image components - uint8 _numComp; - struct Component { - // Global values - uint8 id; - uint8 factorH; - uint8 factorV; - uint8 quantTableSelector; - - // Scan specific values - uint8 DCentropyTableSelector; - uint8 ACentropyTableSelector; - int16 DCpredictor; - - // Result image for this component - Surface surface; - } *_components; - - // Scan components - uint8 _numScanComp; - Component **_scanComp; - Component *_currentComp; - - // Maximum sampling factors, used to calculate the interleaving of the MCU - uint8 _maxFactorV; - uint8 _maxFactorH; - - // Zig-Zag order - static uint8 _zigZagOrder[64]; - - // Quantization tables - uint16 *_quant[JPEG_MAX_QUANT_TABLES]; - - // Huffman tables - struct HuffmanTable { - uint8 count; - uint8 *values; - uint8 *sizes; - uint16 *codes; - } _huff[2 * JPEG_MAX_HUFF_TABLES]; - - // Marker read functions - bool readJFIF(); - bool readSOF0(); - bool readDHT(); - bool readSOS(); - bool readDQT(); - - // Helper functions - bool readMCU(uint16 xMCU, uint16 yMCU); - bool readDataUnit(uint16 x, uint16 y); - int16 readDC(); - void readAC(int16 *out); - int16 readSignedBits(uint8 numBits); - - // Huffman decoding - uint8 readHuff(uint8 table); - uint8 readBit(); - uint8 _bitsData; - uint8 _bitsNumber; - - // Discrete Cosine Transformation - float idct(int x, int y, int weight, int fx, int fy); -}; - -} // End of Graphics namespace - -#endif // GRAPHICS_JPEG_H diff --git a/graphics/module.mk b/graphics/module.mk index ed14051243..46ed564e1e 100644 --- a/graphics/module.mk +++ b/graphics/module.mk @@ -1,7 +1,6 @@ MODULE := graphics MODULE_OBJS := \ - conversion.o \ cursorman.o \ dither.o \ font.o \ @@ -12,7 +11,6 @@ MODULE_OBJS := \ fonts/scummfont.o \ iff.o \ imagedec.o \ - jpeg.o \ primitives.o \ scaler.o \ scaler/thumbnail_intern.o \ diff --git a/graphics/scaler/thumbnail_intern.cpp b/graphics/scaler/thumbnail_intern.cpp index a542fe2268..fabe07b031 100644 --- a/graphics/scaler/thumbnail_intern.cpp +++ b/graphics/scaler/thumbnail_intern.cpp @@ -23,7 +23,6 @@ * */ -#include "common/endian.h" #include "common/scummsys.h" #include "common/system.h" @@ -99,8 +98,7 @@ static bool grabScreen565(Graphics::Surface *surf) { if (!screen) return false; - assert(screen->bytesPerPixel == 1 || screen->bytesPerPixel == 2); - assert(screen->pixels != 0); + assert(screen->bytesPerPixel == 1 && screen->pixels != 0); byte palette[256 * 4]; g_system->grabPalette(&palette[0], 0, 256); @@ -109,17 +107,11 @@ static bool grabScreen565(Graphics::Surface *surf) { for (uint y = 0; y < screen->h; ++y) { for (uint x = 0; x < screen->w; ++x) { - byte r, g, b; - if (screen->bytesPerPixel == 2) { - uint16 col = READ_UINT16(screen->getBasePtr(x, y)); - r = ((col >> 10) & 0x1F) << 3; - g = ((col >> 5) & 0x1F) << 3; - b = ((col >> 0) & 0x1F) << 3; - } else { - r = palette[((uint8*)screen->pixels)[y * screen->pitch + x] * 4]; - g = palette[((uint8*)screen->pixels)[y * screen->pitch + x] * 4 + 1]; - b = palette[((uint8*)screen->pixels)[y * screen->pitch + x] * 4 + 2]; - } + byte r, g, b; + r = palette[((uint8*)screen->pixels)[y * screen->pitch + x] * 4]; + g = palette[((uint8*)screen->pixels)[y * screen->pitch + x] * 4 + 1]; + b = palette[((uint8*)screen->pixels)[y * screen->pitch + x] * 4 + 2]; + ((uint16*)surf->pixels)[y * surf->w + x] = Graphics::RGBToColor<Graphics::ColorMasks<565> >(r, g, b); } } diff --git a/graphics/sjis.cpp b/graphics/sjis.cpp index 405d8622c2..9f5def8f10 100644 --- a/graphics/sjis.cpp +++ b/graphics/sjis.cpp @@ -280,6 +280,11 @@ const uint16 *FontSjisSVM::getCharData(uint16 c) const { if (index >= 0x3F) --index; + // Another check if the passed character was an + // correctly encoded SJIS character. + if (index < 0 || index >= 0xBC || base < 0) + return 0; + return _fontData + (base * 0xBC + index) * 16; } diff --git a/graphics/video/coktelvideo/coktelvideo.cpp b/graphics/video/coktelvideo/coktelvideo.cpp index 063ad190e6..39aeca07bd 100644 --- a/graphics/video/coktelvideo/coktelvideo.cpp +++ b/graphics/video/coktelvideo/coktelvideo.cpp @@ -26,7 +26,6 @@ #include "common/endian.h" #include "common/system.h" -#include "graphics/conversion.h" #include "graphics/dither.h" #include "graphics/video/coktelvideo/coktelvideo.h" #include "graphics/video/coktelvideo/indeo3.h" @@ -1916,7 +1915,7 @@ void Vmd::blit16(byte *dest, byte *src, int16 srcPitch, int16 width, int16 heigh byte b = ((data & 0x001F) >> 0); byte dY, dU, dV; - Graphics::RGB2YUV(r << 3, g << 3, b << 3, dY, dU, dV); + Graphics::PaletteLUT::RGB2YUV(r << 3, g << 3, b << 3, dY, dU, dV); byte p = dither->dither(dY, dU, dV, j); @@ -1950,7 +1949,7 @@ void Vmd::blit24(byte *dest, byte *src, int16 srcPitch, int16 width, int16 heigh byte b = s[0]; byte dY, dU, dV; - Graphics::RGB2YUV(r, g, b, dY, dU, dV); + Graphics::PaletteLUT::RGB2YUV(r, g, b, dY, dU, dV); byte p = dither->dither(dY, dU, dV, j); |