summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-04-21 17:45:07 +0200
committerAlexander Larsson <alexl@redhat.com>2010-04-23 16:36:35 +0200
commit619c37af17406f77c7cb76f3b72bbfc268383d91 (patch)
treeeb570d9ced1d4e6e3be80ff6d2ef3d4ee45fbb11
parent6dc52f1389b6b1c6ce2589ff183982d65c8c1581 (diff)
downloadspice-619c37af17406f77c7cb76f3b72bbfc268383d91.tar.gz
spice-619c37af17406f77c7cb76f3b72bbfc268383d91.tar.xz
spice-619c37af17406f77c7cb76f3b72bbfc268383d91.zip
common: Add lookaside storage for pixman image format
Ideally we should just read this from the pixman image, but there is no API to do so in stable pixman, so we store it.
-rw-r--r--common/canvas_utils.c33
-rw-r--r--common/canvas_utils.h6
2 files changed, 38 insertions, 1 deletions
diff --git a/common/canvas_utils.c b/common/canvas_utils.c
index 6ffd8565..1e97e872 100644
--- a/common/canvas_utils.c
+++ b/common/canvas_utils.c
@@ -82,6 +82,29 @@ pixman_image_add_data(pixman_image_t *image)
return data;
}
+void
+spice_pixman_image_set_format(pixman_image_t *image,
+ pixman_format_code_t format)
+{
+ PixmanData *data;
+
+ data = pixman_image_add_data(image);
+ data->format = format;
+}
+
+pixman_format_code_t
+spice_pixman_image_get_format(pixman_image_t *image)
+{
+ PixmanData *data;
+
+ data = (PixmanData *)pixman_image_get_destroy_data(image);
+ if (data != NULL &&
+ data->format != 0)
+ return data->format;
+
+ CANVAS_ERROR("Unknown pixman image type");
+}
+
static inline pixman_image_t *__surface_create_stride(pixman_format_code_t format, int width, int height,
int stride)
{
@@ -106,6 +129,7 @@ static inline pixman_image_t *__surface_create_stride(pixman_format_code_t forma
pixman_data = pixman_image_add_data(surface);
pixman_data->data = data;
+ pixman_data->format = format;
return surface;
}
@@ -190,6 +214,7 @@ pixman_image_t * surface_create(pixman_format_code_t format, int width, int heig
CANVAS_ERROR("create surface failed, out of memory");
}
pixman_data = pixman_image_add_data(surface);
+ pixman_data->format = format;
pixman_data->bitmap = bitmap;
pixman_data->mutex = mutex;
gdi_handlers++;
@@ -197,7 +222,13 @@ pixman_image_t * surface_create(pixman_format_code_t format, int width, int heig
} else {
#endif
if (top_down) {
- return pixman_image_create_bits(format, width, height, NULL, 0);
+ pixman_image_t *surface;
+ PixmanData *data;
+
+ surface = pixman_image_create_bits(format, width, height, NULL, 0);
+ data = pixman_image_add_data(surface);
+ data->format = format;
+ return surface;
} else {
// NOTE: we assume here that the lz decoders always decode to RGB32.
int stride = 0;
diff --git a/common/canvas_utils.h b/common/canvas_utils.h
index 1c78ffac..b81a6f91 100644
--- a/common/canvas_utils.h
+++ b/common/canvas_utils.h
@@ -30,8 +30,14 @@ typedef struct PixmanData {
HANDLE mutex;
#endif
uint8_t *data;
+ pixman_format_code_t format;
} PixmanData;
+void spice_pixman_image_set_format(pixman_image_t *image,
+ pixman_format_code_t format);
+pixman_format_code_t spice_pixman_image_get_format(pixman_image_t *image);
+
+
#ifdef WIN32
pixman_image_t *surface_create(HDC dc, pixman_format_code_t format,
int width, int height, int top_down);