From 985c02ee7da43fb66b61d6e3c5530e78bd2d8286 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 3 Nov 2008 13:44:59 +0000 Subject: Committed my patch #2216641 "GRAPHICS: PixelFormat introduction". svn-id: r34875 --- graphics/colormasks.h | 74 ++++++++++++++++++++++++++++++++++++ graphics/scaler.cpp | 4 +- graphics/scaler/intern.h | 12 +++--- graphics/scaler/thumbnail_intern.cpp | 4 +- 4 files changed, 84 insertions(+), 10 deletions(-) (limited to 'graphics') 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 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 +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 >(); + InitLUT >(); if (gBitFormat == 565) - InitLUT >(); + InitLUT >(); #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::highBits -#define lowBits ColorMasks::lowBits -#define qhighBits ColorMasks::qhighBits -#define qlowBits ColorMasks::qlowBits -#define redblueMask ColorMasks::kRedBlueMask -#define greenMask ColorMasks::kGreenMask +#define highBits Graphics::ColorMasks::highBits +#define lowBits Graphics::ColorMasks::lowBits +#define qhighBits Graphics::ColorMasks::qhighBits +#define qlowBits Graphics::ColorMasks::qlowBits +#define redblueMask Graphics::ColorMasks::kRedBlueMask +#define greenMask Graphics::ColorMasks::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 >(r, g, b); + ((uint16*)surf->pixels)[y * surf->w + x] = Graphics::RGBToColor >(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 >(r, g, b); + ((uint16 *)screen.pixels)[y * screen.w + x] = Graphics::RGBToColor >(r, g, b); } } -- cgit v1.2.3