summaryrefslogtreecommitdiffstats
path: root/client/red_pixmap.h
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-04-19 16:19:43 +0200
committerAlexander Larsson <alexl@redhat.com>2010-04-23 16:36:35 +0200
commit98d91203c5d2f6f7249f38941466857b6a566f5d (patch)
treecdc2b54152f0be3d668ed49b903a35886fcc1c99 /client/red_pixmap.h
parent619c37af17406f77c7cb76f3b72bbfc268383d91 (diff)
downloadspice-98d91203c5d2f6f7249f38941466857b6a566f5d.tar.gz
spice-98d91203c5d2f6f7249f38941466857b6a566f5d.tar.xz
spice-98d91203c5d2f6f7249f38941466857b6a566f5d.zip
Make client canvas and pixmaps handle more formats and simplify
We now support 16bit format pixmaps as well as the old ones. Including both 555 and 565 modes. We drop the palette argument for pixmap construction as it was only used for black/white anyway. Canvas creation is simplified so that there is no separate set_mode state. Canvases are already created in the right mode and never change.
Diffstat (limited to 'client/red_pixmap.h')
-rw-r--r--client/red_pixmap.h49
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;}