aboutsummaryrefslogtreecommitdiff
path: root/graphics/pixelformat.h
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pixelformat.h')
-rw-r--r--graphics/pixelformat.h84
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