summaryrefslogtreecommitdiffstats
path: root/common/canvas_base.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-03-03 16:43:36 +0100
committerAlexander Larsson <alexl@redhat.com>2010-03-08 19:45:28 +0100
commit18606d99eaf11dbceb79dc24f0a41e85345db300 (patch)
tree2bd69130cc798cdcee43443fb6eae14b94a5b88c /common/canvas_base.c
parentf8217d8b96f35fd297c74df1da6428b56b01149a (diff)
downloadspice-18606d99eaf11dbceb79dc24f0a41e85345db300.tar.gz
spice-18606d99eaf11dbceb79dc24f0a41e85345db300.tar.xz
spice-18606d99eaf11dbceb79dc24f0a41e85345db300.zip
Move canvas_region and group_start/end to canvas_base
Diffstat (limited to 'common/canvas_base.c')
-rw-r--r--common/canvas_base.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/common/canvas_base.c b/common/canvas_base.c
index 2a946076..4bf2be7e 100644
--- a/common/canvas_base.c
+++ b/common/canvas_base.c
@@ -184,6 +184,10 @@ typedef struct CanvasBase {
unsigned long max;
#endif
+ int width;
+ int height;
+ pixman_region32_t canvas_region;
+
#if defined(CAIRO_CANVAS_CACHE) || defined(CAIRO_CANVAS_IMAGE_CACHE)
SpiceImageCache *bits_cache;
#endif
@@ -1578,6 +1582,31 @@ void *spice_canvas_get_usr_data(SpiceCanvas *spice_canvas)
}
#endif
+static void canvas_base_group_start(SpiceCanvas *spice_canvas, QRegion *region)
+{
+ CanvasBase *canvas = (CanvasBase *)spice_canvas;
+ pixman_region32_fini(&canvas->canvas_region);
+
+ /* Make sure we always clip to canvas size */
+ pixman_region32_init_rect(&canvas->canvas_region,
+ 0, 0,
+ canvas->width,
+ canvas->height);
+
+ pixman_region32_intersect(&canvas->canvas_region, &canvas->canvas_region, region);
+}
+
+static void canvas_base_group_end(SpiceCanvas *spice_canvas)
+{
+ CanvasBase *canvas = (CanvasBase *)spice_canvas;
+ pixman_region32_fini(&canvas->canvas_region);
+ pixman_region32_init_rect(&canvas->canvas_region,
+ 0, 0,
+ canvas->width,
+ canvas->height);
+}
+
+
static void unimplemented_op(SpiceCanvas *canvas)
{
PANIC("unimplemented canvas operation");
@@ -1592,9 +1621,13 @@ inline static void canvas_base_init_ops(SpiceCanvasOps *ops)
for (i = 0; i < sizeof(SpiceCanvasOps) / sizeof(void *); i++) {
ops_cast[i] = (void *) unimplemented_op;
}
+
+ ops->group_start = canvas_base_group_start;
+ ops->group_end = canvas_base_group_end;
}
-static int canvas_base_init(CanvasBase *canvas, SpiceCanvasOps *ops, int depth
+static int canvas_base_init(CanvasBase *canvas, SpiceCanvasOps *ops,
+ int width, int height, int depth
#ifdef CAIRO_CANVAS_CACHE
, SpiceImageCache *bits_cache
, SpicePaletteCache *palette_cache
@@ -1643,6 +1676,12 @@ static int canvas_base_init(CanvasBase *canvas, SpiceCanvasOps *ops, int depth
canvas->color_mask = 0xff;
}
+ canvas->width = width;
+ canvas->height = height;
+ pixman_region32_init_rect(&canvas->canvas_region,
+ 0, 0,
+ canvas->width,
+ canvas->height);
#if defined(CAIRO_CANVAS_CACHE) || defined(CAIRO_CANVAS_IMAGE_CACHE)
canvas->bits_cache = bits_cache;