From 79d8c5c6a48e3b10d93d67dfd777b626dadafab9 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 8 Feb 2010 12:14:45 +0100 Subject: 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. --- common/cairo_canvas.c | 7 +++++++ common/canvas_base.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) (limited to 'common') 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) { -- cgit