diff options
-rw-r--r-- | backends/platform/sdl/graphics.cpp | 12 | ||||
-rw-r--r-- | backends/platform/sdl/sdl.h | 2 | ||||
-rw-r--r-- | common/system.cpp | 4 | ||||
-rw-r--r-- | common/system.h | 8 | ||||
-rw-r--r-- | graphics/colormasks.h | 74 | ||||
-rw-r--r-- | graphics/scaler.cpp | 4 | ||||
-rw-r--r-- | graphics/scaler/intern.h | 12 | ||||
-rw-r--r-- | graphics/scaler/thumbnail_intern.cpp | 4 |
8 files changed, 108 insertions, 12 deletions
diff --git a/backends/platform/sdl/graphics.cpp b/backends/platform/sdl/graphics.cpp index 96b74ecba7..1dde92af72 100644 --- a/backends/platform/sdl/graphics.cpp +++ b/backends/platform/sdl/graphics.cpp @@ -396,6 +396,18 @@ void OSystem_SDL::loadGFXMode() { if (_overlayscreen == NULL) error("allocating _overlayscreen failed"); + _overlayFormat.bytesPerPixel = _overlayscreen->format->BytesPerPixel; + + _overlayFormat.rLoss = _overlayscreen->format->Rloss; + _overlayFormat.gLoss = _overlayscreen->format->Gloss; + _overlayFormat.bLoss = _overlayscreen->format->Bloss; + _overlayFormat.aLoss = _overlayscreen->format->Aloss; + + _overlayFormat.rShift = _overlayscreen->format->Rshift; + _overlayFormat.gShift = _overlayscreen->format->Gshift; + _overlayFormat.bShift = _overlayscreen->format->Bshift; + _overlayFormat.aShift = _overlayscreen->format->Ashift; + _tmpscreen2 = SDL_CreateRGBSurface(SDL_SWSURFACE, _overlayWidth + 3, _overlayHeight + 3, 16, _hwscreen->format->Rmask, diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h index 602cf8d24d..8c89af05a7 100644 --- a/backends/platform/sdl/sdl.h +++ b/backends/platform/sdl/sdl.h @@ -176,6 +176,7 @@ public: void deleteMutex(MutexRef mutex); // Overlay + virtual Graphics::PixelFormat getOverlayFormat() const { return _overlayFormat; } virtual void showOverlay(); virtual void hideOverlay(); virtual void clearOverlay(); @@ -246,6 +247,7 @@ protected: SDL_Surface *_overlayscreen; int _overlayWidth, _overlayHeight; bool _overlayVisible; + Graphics::PixelFormat _overlayFormat; // Audio int _samplesPerSec; diff --git a/common/system.cpp b/common/system.cpp index a07ffba6d6..dc692b2e9e 100644 --- a/common/system.cpp +++ b/common/system.cpp @@ -62,11 +62,11 @@ bool OSystem::setGraphicsMode(const char *name) { } OverlayColor OSystem::RGBToColor(uint8 r, uint8 g, uint8 b) { - return ::RGBToColor<ColorMasks<565> >(r, g, b); + return Graphics::RGBToColor<Graphics::ColorMasks<565> >(r, g, b); } void OSystem::colorToRGB(OverlayColor color, uint8 &r, uint8 &g, uint8 &b) { - ::colorToRGB<ColorMasks<565> >(color, r, g, b); + Graphics::colorToRGB<Graphics::ColorMasks<565> >(color, r, g, b); } OverlayColor OSystem::ARGBToColor(uint8 a, uint8 r, uint8 g, uint8 b) { diff --git a/common/system.h b/common/system.h index dc543814e4..08ca6c5f0d 100644 --- a/common/system.h +++ b/common/system.h @@ -31,6 +31,8 @@ #include "common/noncopyable.h" #include "common/rect.h" +#include "graphics/colormasks.h" + namespace Audio { class Mixer; } @@ -571,6 +573,12 @@ public: virtual void hideOverlay() = 0; /** + * Returns the pixel format description of the overlay. + * @see Graphics::PixelFormat + */ + virtual Graphics::PixelFormat getOverlayFormat() const = 0; + + /** * Reset the overlay. * * After calling this method while the overlay mode is active, the user diff --git a/graphics/colormasks.h b/graphics/colormasks.h index 5b9f0517a9..e8048f6d64 100644 --- a/graphics/colormasks.h +++ b/graphics/colormasks.h @@ -26,6 +26,8 @@ #ifndef GRAPHICS_COLORMASKS_H #define GRAPHICS_COLORMASKS_H +namespace Graphics { + template<int bitFormat> struct ColorMasks { }; @@ -251,4 +253,76 @@ 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'. + */ +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. */ + + uint32 rMask, gMask, bMask, aMask; /**< Binary mask used to retrieve individual color values. */ +}; + +template<class Mask> +PixelFormat createPixelFormatFromMask() { + PixelFormat format; + + format.bytesPerPixel = Mask::kBytesPerPixel; + + format.rLoss = 8 - Mask::kRedBits; + format.gLoss = 8 - Mask::kGreenBits; + format.bLoss = 8 - Mask::kBlueBits; + format.aLoss = 8 - Mask::kAlphaBits; + + format.rShift = Mask::kRedShift; + format.gShift = Mask::kGreenShift; + format.bShift = Mask::kBlueShift; + format.aShift = Mask::kAlphaShift; + + 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 + #endif diff --git a/graphics/scaler.cpp b/graphics/scaler.cpp index ec20a722e6..395ea31e75 100644 --- a/graphics/scaler.cpp +++ b/graphics/scaler.cpp @@ -105,9 +105,9 @@ void InitScalers(uint32 BitFormat) { gBitFormat = BitFormat; #ifndef DISABLE_HQ_SCALERS if (gBitFormat == 555) - InitLUT<ColorMasks<555> >(); + InitLUT<Graphics::ColorMasks<555> >(); if (gBitFormat == 565) - InitLUT<ColorMasks<565> >(); + InitLUT<Graphics::ColorMasks<565> >(); #endif } diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h index ff515530dd..6fc0d6919b 100644 --- a/graphics/scaler/intern.h +++ b/graphics/scaler/intern.h @@ -30,12 +30,12 @@ #include "graphics/colormasks.h" -#define highBits ColorMasks<bitFormat>::highBits -#define lowBits ColorMasks<bitFormat>::lowBits -#define qhighBits ColorMasks<bitFormat>::qhighBits -#define qlowBits ColorMasks<bitFormat>::qlowBits -#define redblueMask ColorMasks<bitFormat>::kRedBlueMask -#define greenMask ColorMasks<bitFormat>::kGreenMask +#define highBits Graphics::ColorMasks<bitFormat>::highBits +#define lowBits Graphics::ColorMasks<bitFormat>::lowBits +#define qhighBits Graphics::ColorMasks<bitFormat>::qhighBits +#define qlowBits Graphics::ColorMasks<bitFormat>::qlowBits +#define redblueMask Graphics::ColorMasks<bitFormat>::kRedBlueMask +#define greenMask Graphics::ColorMasks<bitFormat>::kGreenMask /** diff --git a/graphics/scaler/thumbnail_intern.cpp b/graphics/scaler/thumbnail_intern.cpp index bdfa0ff5f6..52547f47f1 100644 --- a/graphics/scaler/thumbnail_intern.cpp +++ b/graphics/scaler/thumbnail_intern.cpp @@ -118,7 +118,7 @@ static bool grabScreen565(Graphics::Surface *surf) { 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] = RGBToColor<ColorMasks<565> >(r, g, b); + ((uint16*)surf->pixels)[y * surf->w + x] = Graphics::RGBToColor<Graphics::ColorMasks<565> >(r, g, b); } } @@ -209,7 +209,7 @@ bool createThumbnail(Graphics::Surface *surf, const uint8 *pixels, int w, int h, g = palette[pixels[y * w + x] * 3 + 1]; b = palette[pixels[y * w + x] * 3 + 2]; - ((uint16 *)screen.pixels)[y * screen.w + x] = RGBToColor<ColorMasks<565> >(r, g, b); + ((uint16 *)screen.pixels)[y * screen.w + x] = Graphics::RGBToColor<Graphics::ColorMasks<565> >(r, g, b); } } |