diff options
Diffstat (limited to 'graphics/pixelformat.h')
-rw-r--r-- | graphics/pixelformat.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/graphics/pixelformat.h b/graphics/pixelformat.h index f59650e5cc..a1883291b9 100644 --- a/graphics/pixelformat.h +++ b/graphics/pixelformat.h @@ -27,6 +27,7 @@ #define GRAPHICS_PIXELFORMAT_H #include "common/scummsys.h" +#include "common/list.h" namespace Graphics { @@ -50,6 +51,77 @@ struct PixelFormat { 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 PixelFormat() { + bytesPerPixel = + rLoss = gLoss = bLoss = aLoss = + rShift = gShift = bShift = aShift = 0; + } + + inline PixelFormat(int BytesPerPixel, + int RLoss, int GLoss, int BLoss, int ALoss, + int RShift, int GShift, int BShift, int AShift) { + bytesPerPixel = BytesPerPixel; + rLoss = RLoss, gLoss = GLoss, bLoss = BLoss, aLoss = ALoss; + rShift = RShift, gShift = GShift, bShift = BShift, aShift = AShift; + } + + // "Factory" methods for convenience + static inline PixelFormat createFormatCLUT8() { + return PixelFormat(1, 8, 8, 8, 8, 0, 0, 0, 0); + } + // 2 Bytes-per-pixel modes + static inline PixelFormat createFormatRGB555() { + return PixelFormat(2, 3, 3, 3, 8, 10, 5, 0, 0); + } + static inline PixelFormat createFormatBGR555() { + return PixelFormat(2, 3, 3, 3, 8, 0, 5, 10, 0); + } + static inline PixelFormat createFormatXRGB1555() { + // Special case, alpha bit is always high in this mode. + return PixelFormat(2, 3, 3, 3, 7, 10, 5, 0, 15); + } + static inline PixelFormat createFormatXBGR1555() { + // Special case, alpha bit is always high in this mode. + return PixelFormat(2, 3, 3, 3, 7, 0, 5, 10, 15); + } + static inline PixelFormat createFormatRGB565() { + return PixelFormat(2, 3, 2, 3, 8, 11, 5, 0, 0); + } + static inline PixelFormat createFormatBGR565() { + return PixelFormat(2, 3, 2, 3, 8, 0, 5, 11, 0); + } + static inline PixelFormat createFormatRGBA4444() { + return PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0); + } + static inline PixelFormat createFormatARGB4444() { + return PixelFormat(2, 4, 4, 4, 4, 8, 4, 0, 12); + } + static inline PixelFormat createFormatABGR4444() { + return PixelFormat(2, 4, 4, 4, 4, 0, 4, 8, 12); + } + static inline PixelFormat createFormatBGRA4444() { + return PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0); + } + // 3 to 4 byte per pixel modes + static inline PixelFormat createFormatRGB888() { + return PixelFormat(3, 0, 0, 0, 8, 16, 8, 0, 0); + } + static inline PixelFormat createFormatBGR888() { + return PixelFormat(3, 0, 0, 0, 8, 0, 8, 16, 0); + } + static inline PixelFormat createFormatRGBA8888() { + return PixelFormat(4, 0, 0, 0, 0, 24, 16, 8, 0); + } + static inline PixelFormat createFormatARGB8888() { + return PixelFormat(4, 0, 0, 0, 0, 16 ,8, 0, 24); + } + static inline PixelFormat createFormatABGR8888() { + return PixelFormat(4, 0, 0, 0, 0, 0, 8, 16, 24); + } + static inline PixelFormat createFormatBGRA8888() { + return PixelFormat(4, 0, 0, 0, 0, 8, 16, 24, 0); + } + 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)); @@ -129,6 +201,18 @@ struct PixelFormat { } }; +inline PixelFormat findCompatibleFormat(Common::List<PixelFormat> backend, Common::List<PixelFormat> frontend) { +#ifdef ENABLE_RGB_COLOR + for (Common::List<PixelFormat>::iterator i = backend.begin(); i != backend.end(); ++i) { + for (Common::List<PixelFormat>::iterator j = frontend.begin(); j != frontend.end(); ++j) { + if (*i == *j) + return *i; + } + } +#endif + return PixelFormat::createFormatCLUT8(); +} + } // end of namespace Graphics #endif |