summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-02-17 16:09:27 +0100
committerAlexander Larsson <alexl@redhat.com>2010-02-23 22:52:06 +0100
commitd430a6c79b8ca4d0823172bb668ca460e9513306 (patch)
tree8ed5a022f6f62393f9ef8061356a6e5a50f7a129 /common
parentceff9ca6428d5cb3768d87c9cd9bcba19831d344 (diff)
downloadspice-d430a6c79b8ca4d0823172bb668ca460e9513306.tar.gz
spice-d430a6c79b8ca4d0823172bb668ca460e9513306.tar.xz
spice-d430a6c79b8ca4d0823172bb668ca460e9513306.zip
Convert cairo canvas group_start/end to pixman
Diffstat (limited to 'common')
-rw-r--r--common/cairo_canvas.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/common/cairo_canvas.c b/common/cairo_canvas.c
index 25fb079b..c73bfbda 100644
--- a/common/cairo_canvas.c
+++ b/common/cairo_canvas.c
@@ -2139,26 +2139,30 @@ void canvas_read_bits(CairoCanvas *canvas, uint8_t *dest, int dest_stride, const
void canvas_group_start(CairoCanvas *canvas, int n_clip_rects, SpiceRect *clip_rects)
{
- cairo_t *cairo = canvas->cairo;
+ pixman_region32_t dest_region;
- cairo_save(cairo);
+ pixman_region32_fini(&canvas->canvas_region);
+ spice_pixman_region32_init_rects(&canvas->canvas_region,
+ clip_rects, n_clip_rects);
- if (n_clip_rects) {
- SpiceRect *end = clip_rects + n_clip_rects;
- for (; clip_rects < end; clip_rects++) {
- cairo_rectangle(cairo,
- clip_rects->left,
- clip_rects->top,
- clip_rects->right - clip_rects->left,
- clip_rects->bottom - clip_rects->top);
- }
- cairo_clip(cairo);
- }
+ pixman_region32_init_rect(&dest_region,
+ 0, 0,
+ pixman_image_get_width(canvas->image),
+ pixman_image_get_height(canvas->image));
+
+ /* Make sure we always clip to canvas size */
+ pixman_region32_intersect(&canvas->canvas_region, &canvas->canvas_region, &dest_region);
+
+ pixman_region32_fini(&dest_region);
}
void canvas_group_end(CairoCanvas *canvas)
{
- cairo_restore(canvas->cairo);
+ pixman_region32_fini(&canvas->canvas_region);
+ pixman_region32_init_rect(&canvas->canvas_region,
+ 0, 0,
+ pixman_image_get_width(canvas->image),
+ pixman_image_get_height(canvas->image));
}
void canvas_clear(CairoCanvas *canvas)