diff options
Diffstat (limited to 'client/red_pixmap.h')
-rw-r--r-- | client/red_pixmap.h | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/client/red_pixmap.h b/client/red_pixmap.h index 1b469bdf..c81c2f77 100644 --- a/client/red_pixmap.h +++ b/client/red_pixmap.h @@ -20,17 +20,62 @@ #define _H_RED_PIXMAP #include "red_drawable.h" +#include "utils.h" +#include <pixman_utils.h> class RedPixmap: public RedDrawable { public: enum Format { ARGB32, RGB32, + RGB16_555, + RGB16_565, A1, }; - RedPixmap(int width, int height, Format format, bool top_bottom, - rgb32_t* pallete); + static int format_to_bpp(Format format) { + if (format == RedPixmap::A1) { + return 1; + } else if (format == RGB16_555 || format == RGB16_565) { + return 16; + } else { + return 32; + } + } + + static pixman_format_code_t format_to_pixman(Format format) { + switch (format) { + case RedPixmap::ARGB32: + return PIXMAN_a8r8g8b8; + case RedPixmap::RGB32: + return PIXMAN_x8r8g8b8; + case RedPixmap::RGB16_555: + return PIXMAN_x1r5g5b5; + case RedPixmap::RGB16_565: + return PIXMAN_r5g6b5; + case RedPixmap::A1: + return PIXMAN_a1; + default: + THROW("unsupported format %d", format); + } + } + + static Format format_from_surface(uint32_t format) { + switch (format) { + case SPICE_SURFACE_FMT_16_555: + return RedPixmap::RGB16_555; + case SPICE_SURFACE_FMT_16_565: + return RedPixmap::RGB16_565; + case SPICE_SURFACE_FMT_32_xRGB: + return RedPixmap::RGB32; + case SPICE_SURFACE_FMT_32_ARGB: + return RedPixmap::ARGB32; + default: + THROW("Unsupported RedPixman format"); + } + } + + RedPixmap(int width, int height, Format format, bool top_bottom); virtual ~RedPixmap(); virtual SpicePoint get_size() { SpicePoint pt = {_width, _height}; return pt;} |