summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-02-08 12:14:45 +0100
committerAlexander Larsson <alexl@redhat.com>2010-02-23 14:43:20 +0100
commit79d8c5c6a48e3b10d93d67dfd777b626dadafab9 (patch)
tree575bb94804d0d94828808de3346dcad1e6e77929 /common
parent60a189f2503dec00556656988835948016aff389 (diff)
downloadspice-79d8c5c6a48e3b10d93d67dfd777b626dadafab9.tar.gz
spice-79d8c5c6a48e3b10d93d67dfd777b626dadafab9.tar.xz
spice-79d8c5c6a48e3b10d93d67dfd777b626dadafab9.zip
Add pixman_image_t referencing the cairo_canvas bits
This references the same data as the cairo surface and can be used for drawing to the surface using direct pixman calls instead.
Diffstat (limited to 'common')
-rw-r--r--common/cairo_canvas.c7
-rw-r--r--common/canvas_base.c38
2 files changed, 45 insertions, 0 deletions
diff --git a/common/cairo_canvas.c b/common/cairo_canvas.c
index a5d41467..c40693b5 100644
--- a/common/cairo_canvas.c
+++ b/common/cairo_canvas.c
@@ -17,16 +17,19 @@
*/
#include "cairo_canvas.h"
+#define CANVAS_USE_PIXMAN
#include "canvas_base.c"
#include "rop3.h"
#include "rect.h"
#include "region.h"
+#include "pixman_utils.h"
struct CairoCanvas {
CanvasBase base;
cairo_t *cairo;
uint32_t *private_data;
int private_data_size;
+ pixman_image_t *image;
};
static void canvas_set_path(CairoCanvas *canvas, void *addr)
@@ -1581,6 +1584,7 @@ void canvas_destroy(CairoCanvas *canvas)
if (!canvas) {
return;
}
+ pixman_image_unref(canvas->image);
canvas_base_destroy(&canvas->base);
if (canvas->private_data) {
free(canvas->private_data);
@@ -1654,6 +1658,9 @@ CairoCanvas *canvas_create(cairo_t *cairo, int bits
canvas->private_data = NULL;
canvas->private_data_size = 0;
cairo_set_antialias(cairo, CAIRO_ANTIALIAS_NONE);
+
+ canvas->image = pixman_image_from_surface (cairo_get_target (cairo));
+
return canvas;
}
diff --git a/common/canvas_base.c b/common/canvas_base.c
index 356ef9d6..ebb9846b 100644
--- a/common/canvas_base.c
+++ b/common/canvas_base.c
@@ -26,6 +26,7 @@
#include "quic.h"
#include "lz.h"
#include "canvas_base.h"
+#include "pixman_utils.h"
#include "canvas_utils.h"
#include "rect.h"
@@ -214,6 +215,43 @@ typedef struct ATTR_PACKED DataChunk {
#endif
+#ifdef CANVAS_USE_PIXMAN
+
+static pixman_format_code_t
+pixman_format_from_cairo_format (cairo_format_t format)
+{
+ switch (format) {
+ case CAIRO_FORMAT_A1:
+ return PIXMAN_a1;
+ case CAIRO_FORMAT_A8:
+ return PIXMAN_a8;
+ case CAIRO_FORMAT_RGB24:
+ return PIXMAN_x8r8g8b8;
+ case CAIRO_FORMAT_ARGB32:
+ default:
+ return PIXMAN_a8r8g8b8;
+ }
+}
+
+static pixman_image_t *
+pixman_image_from_surface (cairo_surface_t *surface)
+{
+ pixman_image_t *image;
+ cairo_format_t format;
+
+
+ format = cairo_image_surface_get_format (surface);
+
+ image = pixman_image_create_bits (pixman_format_from_cairo_format (format),
+ cairo_image_surface_get_width (surface),
+ cairo_image_surface_get_height (surface),
+ (uint32_t *)cairo_image_surface_get_data (surface),
+ cairo_image_surface_get_stride (surface));
+
+ return image;
+}
+
+#endif
static inline void canvas_localize_palette(CanvasBase *canvas, SpicePalette *palette)
{