aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/platform/sdl/graphics.cpp12
-rw-r--r--backends/vkeybd/virtual-keyboard-parser.cpp4
-rw-r--r--common/system.h2
-rw-r--r--engines/sword1/animation.cpp2
-rw-r--r--engines/sword2/animation.cpp6
-rw-r--r--graphics/colormasks.h59
-rw-r--r--graphics/imagedec.cpp2
-rw-r--r--graphics/pixelformat.h89
-rw-r--r--graphics/thumbnail.cpp3
-rw-r--r--graphics/video/mpeg_player.cpp6
-rw-r--r--gui/ThemeEngine.cpp4
-rw-r--r--gui/widget.cpp2
12 files changed, 120 insertions, 71 deletions
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<int bitFormat>
@@ -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<int bitFormat>
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<ColorMasks<565> >(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;