From abc06ca18e69c336d701707933b4dc490dd86e94 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 22 Jan 2009 04:35:10 +0000 Subject: Moved Graphics::PixelFormat into its own header file; turned RGBToColor etc. into methods, and added an operator== svn-id: r35993 --- backends/platform/sdl/graphics.cpp | 12 ++-- backends/vkeybd/virtual-keyboard-parser.cpp | 4 +- common/system.h | 2 +- engines/sword1/animation.cpp | 2 +- engines/sword2/animation.cpp | 6 +- graphics/colormasks.h | 59 +++---------------- graphics/imagedec.cpp | 2 +- graphics/pixelformat.h | 89 +++++++++++++++++++++++++++++ graphics/thumbnail.cpp | 3 +- graphics/video/mpeg_player.cpp | 6 +- gui/ThemeEngine.cpp | 4 +- gui/widget.cpp | 2 +- 12 files changed, 120 insertions(+), 71 deletions(-) create mode 100644 graphics/pixelformat.h diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp index cda14a24ad..2a4e166ab2 100644 --- a/backends/platform/sdl/graphics.cpp +++ b/backends/platform/sdl/graphics.cpp @@ -410,12 +410,6 @@ bool OSystem_SDL::loadGFXMode() { // Create the surface used for the graphics in 16 bit before scaling, and also the overlay // - // Distinguish 555 and 565 mode - if (_hwscreen->format->Rmask == 0x7C00) - InitScalers(555); - else - InitScalers(565); - // Need some extra bytes around when using 2xSaI _tmpscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, _videoMode.screenWidth + 3, _videoMode.screenHeight + 3, 16, @@ -479,6 +473,12 @@ bool OSystem_SDL::loadGFXMode() { _km.delay_time = 25; _km.last_time = 0; + // Distinguish 555 and 565 mode + if (_hwscreen->format->Rmask == 0x7C00) + InitScalers(555); + else + InitScalers(565); + return true; } diff --git a/backends/vkeybd/virtual-keyboard-parser.cpp b/backends/vkeybd/virtual-keyboard-parser.cpp index e643161333..330b9a5d6a 100644 --- a/backends/vkeybd/virtual-keyboard-parser.cpp +++ b/backends/vkeybd/virtual-keyboard-parser.cpp @@ -273,7 +273,7 @@ bool VirtualKeyboardParser::parserCallback_layout(ParserNode *node) { g = 0; b = 255; } - _mode->transparentColor = Graphics::RGBToColor(r, g, b, format); + _mode->transparentColor = format.RGBToColor(r, g, b); if (node->values.contains("display_font_color")) { if (!parseIntegerKey(node->values["display_font_color"].c_str(), 3, &r, &g, &b)) @@ -281,7 +281,7 @@ bool VirtualKeyboardParser::parserCallback_layout(ParserNode *node) { } else { r = g = b = 0; // default to black } - _mode->displayFontColor = Graphics::RGBToColor(r, g, b, format); + _mode->displayFontColor = format.RGBToColor(r, g, b); _layoutParsed = true; diff --git a/common/system.h b/common/system.h index f7849a9d17..155ec81b8a 100644 --- a/common/system.h +++ b/common/system.h @@ -31,7 +31,7 @@ #include "common/noncopyable.h" #include "common/rect.h" -#include "graphics/colormasks.h" +#include "graphics/pixelformat.h" namespace Audio { class Mixer; diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index e08aeb6fa3..8219dbce12 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -544,7 +544,7 @@ bool MoviePlayerMPEG::initOverlays(uint32 id) { _introPal = (OverlayColor *)malloc(256 * sizeof(OverlayColor)); Graphics::PixelFormat format = _system->getOverlayFormat(); for (uint16 cnt = 0; cnt < 256; cnt++) - _introPal[cnt] = Graphics::RGBToColor(pal[cnt * 3 + 0], pal[cnt * 3 + 1], pal[cnt * 3 + 2], format); + _introPal[cnt] = format.RGBToColor(pal[cnt * 3 + 0], pal[cnt * 3 + 1], pal[cnt * 3 + 2]); } return true; diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index c195ba5b50..9375896f81 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -670,8 +670,8 @@ void AnimationState::drawTextObject(SpriteInfo *s, byte *src) { OverlayColor *dst = _overlay + textY * moviePitch + textX; Graphics::PixelFormat format = _sys->getOverlayFormat(); - OverlayColor pen = Graphics::RGBToColor(255, 255, 255, format); - OverlayColor border = Graphics::RGBToColor(0, 0, 0, format); + OverlayColor pen = format.RGBToColor(255, 255, 255); + OverlayColor border = format.RGBToColor(0, 0, 0); // TODO: Use the AdvMame scalers for the text? Pre-scale it? @@ -719,7 +719,7 @@ void AnimationState::clearFrame() { memset(_vm->_screen->getScreen(), 0, _movieWidth * _movieHeight); #else Graphics::PixelFormat format = _sys->getOverlayFormat(); - OverlayColor black = Graphics::RGBToColor(0, 0, 0, format); + OverlayColor black = format.RGBToColor(0, 0, 0); for (int i = 0; i < _movieScale * _movieWidth * _movieScale * _movieHeight; i++) _overlay[i] = black; diff --git a/graphics/colormasks.h b/graphics/colormasks.h index af72dbdf8c..6afc8cdd77 100644 --- a/graphics/colormasks.h +++ b/graphics/colormasks.h @@ -26,6 +26,8 @@ #ifndef GRAPHICS_COLORMASKS_H #define GRAPHICS_COLORMASKS_H +#include "graphics/pixelformat.h" + namespace Graphics { template @@ -81,7 +83,7 @@ struct ColorMasks<565> { kGreenBits = 6, kBlueBits = 5, - kAlphaShift = kRedBits+kGreenBits+kBlueBits, + kAlphaShift = 0, kRedShift = kGreenBits+kBlueBits, kGreenShift = kBlueBits, kBlueShift = 0, @@ -112,7 +114,7 @@ struct ColorMasks<555> { kGreenBits = 5, kBlueBits = 5, - kAlphaShift = kRedBits+kGreenBits+kBlueBits, + kAlphaShift = 0, kRedShift = kGreenBits+kBlueBits, kGreenShift = kBlueBits, kBlueShift = 0, @@ -184,7 +186,7 @@ struct ColorMasks<888> { kGreenBits = 8, kBlueBits = 8, - kAlphaShift = kRedBits+kGreenBits+kBlueBits, + kAlphaShift = 0, kRedShift = kGreenBits+kBlueBits, kGreenShift = kBlueBits, kBlueShift = 0, @@ -253,27 +255,12 @@ void colorToARGB(uint32 color, uint8 &a, uint8 &r, uint8 &g, uint8 &b) { b = ((color & T::kBlueMask) >> T::kBlueShift) << (8 - T::kBlueBits); } -/** - * A pixel format description. - * - * Like ColorMasks it includes the given values to create colors from RGB - * values and to retrieve RGB values from colors. - * - * Unlike ColorMasks it is not dependend on knowing the exact pixel format - * on compile time. - * - * A minor difference between ColorMasks and PixelFormat is that ColorMasks - * stores the bit count per channel in 'kFooBits', while PixelFormat stores - * the loss compared to 8 bits per channel in '#Loss'. It also doesn't - * contain mask values. - */ -struct PixelFormat { - byte bytesPerPixel; /**< Number of bytes used in the pixel format. */ - byte rLoss, gLoss, bLoss, aLoss; /**< Precision loss of each color component. */ - byte rShift, gShift, bShift, aShift; /**< Binary left shift of each color component in the pixel value. */ -}; +/** + * Convert a 'bitFormat' as defined by one of the ColorMasks + * into a PixelFormat. + */ template PixelFormat createPixelFormat() { PixelFormat format; @@ -293,34 +280,6 @@ PixelFormat createPixelFormat() { return format; } -inline uint32 RGBToColor(uint8 r, uint8 g, uint8 b, const PixelFormat &fmt) { - return - ((0xFF >> fmt.aLoss) << fmt.aShift) | - (( r >> fmt.rLoss) << fmt.rShift) | - (( g >> fmt.gLoss) << fmt.gShift) | - (( b >> fmt.bLoss) << fmt.bShift); -} - -inline uint32 ARGBToColor(uint8 a, uint8 r, uint8 g, uint8 b, const PixelFormat &fmt) { - return - ((a >> fmt.aLoss) << fmt.aShift) | - ((r >> fmt.rLoss) << fmt.rShift) | - ((g >> fmt.gLoss) << fmt.gShift) | - ((b >> fmt.bLoss) << fmt.bShift); -} - -inline void colorToRGB(uint32 color, uint8 &r, uint8 &g, uint8 &b, const PixelFormat &fmt) { - r = ((color >> fmt.rShift) << fmt.rLoss) & 0xFF; - g = ((color >> fmt.gShift) << fmt.gLoss) & 0xFF; - b = ((color >> fmt.bShift) << fmt.bLoss) & 0xFF; -} - -inline void colorToARGB(uint32 color, uint8 &a, uint8 &r, uint8 &g, uint8 &b, const PixelFormat &fmt) { - a = ((color >> fmt.aShift) << fmt.aLoss) & 0xFF; - r = ((color >> fmt.rShift) << fmt.rLoss) & 0xFF; - g = ((color >> fmt.gShift) << fmt.gLoss) & 0xFF; - b = ((color >> fmt.bShift) << fmt.bLoss) & 0xFF; -} } // end of namespace Graphics diff --git a/graphics/imagedec.cpp b/graphics/imagedec.cpp index 93a895ae03..267a331deb 100644 --- a/graphics/imagedec.cpp +++ b/graphics/imagedec.cpp @@ -127,7 +127,7 @@ Surface *BMPDecoder::decodeImage(Common::SeekableReadStream &stream) { b = stream.readByte(); g = stream.readByte(); r = stream.readByte(); - *curPixel = RGBToColor(r, g, b, overlayFormat); + *curPixel = overlayFormat.RGBToColor(r, g, b); ++curPixel; } stream.seek(pitchAdd, SEEK_CUR); diff --git a/graphics/pixelformat.h b/graphics/pixelformat.h new file mode 100644 index 0000000000..bfec28fabd --- /dev/null +++ b/graphics/pixelformat.h @@ -0,0 +1,89 @@ +/* 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_PIXELFORMAT_H +#define GRAPHICS_PIXELFORMAT_H + +namespace Graphics { + + +/** + * A pixel format description. + * + * Like ColorMasks it includes the given values to create colors from RGB + * values and to retrieve RGB values from colors. + * + * Unlike ColorMasks it is not dependend on knowing the exact pixel format + * on compile time. + * + * A minor difference between ColorMasks and PixelFormat is that ColorMasks + * stores the bit count per channel in 'kFooBits', while PixelFormat stores + * the loss compared to 8 bits per channel in '#Loss'. It also doesn't + * contain mask values. + */ +struct PixelFormat { + byte bytesPerPixel; /**< Number of bytes used in the pixel format. */ + + byte rLoss, gLoss, bLoss, aLoss; /**< Precision loss of each color component. */ + byte rShift, gShift, bShift, aShift; /**< Binary left shift of each color component in the pixel value. */ + + inline bool operator==(const PixelFormat &fmt) const { + // TODO: If aLoss==8, then the value of aShift is irrelevant, and should be ignored. + return 0 == memcmp(this, &fmt, sizeof(PixelFormat)); + } + + inline uint32 RGBToColor(uint8 r, uint8 g, uint8 b) const { + return + ((0xFF >> aLoss) << aShift) | + (( r >> rLoss) << rShift) | + (( g >> gLoss) << gShift) | + (( b >> bLoss) << bShift); + } + + inline uint32 ARGBToColor(uint8 a, uint8 r, uint8 g, uint8 b) const { + return + ((a >> aLoss) << aShift) | + ((r >> rLoss) << rShift) | + ((g >> gLoss) << gShift) | + ((b >> bLoss) << bShift); + } + + inline void colorToRGB(uint32 color, uint8 &r, uint8 &g, uint8 &b) const { + r = ((color >> rShift) << rLoss) & 0xFF; + g = ((color >> gShift) << gLoss) & 0xFF; + b = ((color >> bShift) << bLoss) & 0xFF; + } + + inline void colorToARGB(uint32 color, uint8 &a, uint8 &r, uint8 &g, uint8 &b) const { + a = ((color >> aShift) << aLoss) & 0xFF; + r = ((color >> rShift) << rLoss) & 0xFF; + g = ((color >> gShift) << gLoss) & 0xFF; + b = ((color >> bShift) << bLoss) & 0xFF; + } +}; + +} // end of namespace Graphics + +#endif diff --git a/graphics/thumbnail.cpp b/graphics/thumbnail.cpp index 1d88dc5147..de8c2eb2d9 100644 --- a/graphics/thumbnail.cpp +++ b/graphics/thumbnail.cpp @@ -24,6 +24,7 @@ #include "graphics/thumbnail.h" #include "graphics/scaler.h" +#include "graphics/colormasks.h" #include "common/endian.h" #include "common/system.h" @@ -115,7 +116,7 @@ bool loadThumbnail(Common::SeekableReadStream &in, Graphics::Surface &to) { colorToRGB >(in.readUint16BE(), r, g, b); // converting to current OSystem Color - *pixels++ = Graphics::RGBToColor(r, g, b, format); + *pixels++ = format.RGBToColor(r, g, b); } } diff --git a/graphics/video/mpeg_player.cpp b/graphics/video/mpeg_player.cpp index 964f4cd94d..8c017e5bb5 100644 --- a/graphics/video/mpeg_player.cpp +++ b/graphics/video/mpeg_player.cpp @@ -391,9 +391,9 @@ void BaseAnimationState::buildLookup() { // Set up entries 0-255 in rgb-to-pixel value tables. Graphics::PixelFormat format = _sys->getOverlayFormat(); for (i = 0; i < 256; i++) { - r_2_pix_alloc[i + 256] = Graphics::RGBToColor(i, 0, 0, format); - g_2_pix_alloc[i + 256] = Graphics::RGBToColor(0, i, 0, format); - b_2_pix_alloc[i + 256] = Graphics::RGBToColor(0, 0, i, format); + r_2_pix_alloc[i + 256] = format.RGBToColor(i, 0, 0); + g_2_pix_alloc[i + 256] = format.RGBToColor(0, i, 0); + b_2_pix_alloc[i + 256] = format.RGBToColor(0, 0, i); } // Spread out the values we have to the rest of the array so that we do diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp index d993e5c52b..dcddce90bd 100644 --- a/gui/ThemeEngine.cpp +++ b/gui/ThemeEngine.cpp @@ -1041,7 +1041,7 @@ void ThemeEngine::drawChar(const Common::Rect &r, byte ch, const Graphics::Font charArea.clip(_screen.w, _screen.h); Graphics::PixelFormat format = _system->getOverlayFormat(); - uint32 color = Graphics::RGBToColor(_texts[kTextDataDefault]->_color.r, _texts[kTextDataDefault]->_color.g, _texts[kTextDataDefault]->_color.b, format); + uint32 color = format.RGBToColor(_texts[kTextDataDefault]->_color.r, _texts[kTextDataDefault]->_color.g, _texts[kTextDataDefault]->_color.b); restoreBackground(charArea); font->drawChar(&_screen, ch, charArea.left, charArea.top, color); @@ -1150,7 +1150,7 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int for (uint y = 0; y < _cursorHeight; ++y) { for (uint x = 0; x < _cursorWidth; ++x) { byte r, g, b; - Graphics::colorToRGB(src[x], r, g, b, format); + format.colorToRGB(src[x], r, g, b); const int col = (r << 16) | (g << 8) | b; // Skip transparency (the transparent color actually is 0xFF00FF, diff --git a/gui/widget.cpp b/gui/widget.cpp index 7d6a8c939d..412e50f79c 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -399,7 +399,7 @@ void GraphicsWidget::setGfx(int w, int h, int r, int g, int b) { OverlayColor *dst = (OverlayColor*)_gfx.pixels; Graphics::PixelFormat overlayFormat = g_system->getOverlayFormat(); - OverlayColor fillCol = Graphics::RGBToColor(r, g, b, overlayFormat); + OverlayColor fillCol = overlayFormat.RGBToColor(r, g, b); while (h--) { for (int i = 0; i < w; ++i) { *dst++ = fillCol; -- cgit v1.2.3