diff options
author | Alexander Larsson <alexl@redhat.com> | 2010-02-12 16:22:01 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-02-23 22:52:05 +0100 |
commit | 3b2f1fcb22e8cf8bdec7a79a308cb8a0cb120eb1 (patch) | |
tree | efdb72f50f29c8ec98c17760fc1a69641a5e2324 /common | |
parent | 974c662ae4f3375ea4162556ac644f1431af2f9f (diff) | |
download | spice-3b2f1fcb22e8cf8bdec7a79a308cb8a0cb120eb1.tar.gz spice-3b2f1fcb22e8cf8bdec7a79a308cb8a0cb120eb1.tar.xz spice-3b2f1fcb22e8cf8bdec7a79a308cb8a0cb120eb1.zip |
Convert draw_blackness/whiteness/invers to using pixman
Diffstat (limited to 'common')
-rw-r--r-- | common/cairo_canvas.c | 77 |
1 files changed, 61 insertions, 16 deletions
diff --git a/common/cairo_canvas.c b/common/cairo_canvas.c index 065bfa23..320014ed 100644 --- a/common/cairo_canvas.c +++ b/common/cairo_canvas.c @@ -2053,30 +2053,75 @@ static inline void canvas_fill_common(CairoCanvas *canvas, SpiceRect *bbox, Spic void canvas_draw_blackness(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceBlackness *blackness) { - cairo_t *cairo = canvas->cairo; - cairo_save(cairo); - cairo_set_source_rgb(cairo, 0, 0, 0); - canvas_fill_common(canvas, bbox, clip, &blackness->mask); - cairo_restore(cairo); + pixman_region32_t dest_region; + + pixman_region32_init_rect(&dest_region, + bbox->left, bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top); + + + canvas_clip_pixman(canvas, &dest_region, clip); + canvas_mask_pixman(canvas, &dest_region, &blackness->mask, + bbox->left, bbox->top); + + if (pixman_region32_n_rects(&dest_region) == 0) { + pixman_region32_fini (&dest_region); + return; + } + + fill_solid_rects(canvas, &dest_region, 0x000000); + + pixman_region32_fini(&dest_region); } void canvas_draw_whiteness(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceWhiteness *whiteness) { - cairo_t *cairo = canvas->cairo; - cairo_save(cairo); - cairo_set_source_rgb(cairo, 1, 1, 1); - canvas_fill_common(canvas, bbox, clip, &whiteness->mask); - cairo_restore(cairo); + pixman_region32_t dest_region; + + pixman_region32_init_rect(&dest_region, + bbox->left, bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top); + + + canvas_clip_pixman(canvas, &dest_region, clip); + canvas_mask_pixman(canvas, &dest_region, &whiteness->mask, + bbox->left, bbox->top); + + if (pixman_region32_n_rects(&dest_region) == 0) { + pixman_region32_fini(&dest_region); + return; + } + + fill_solid_rects(canvas, &dest_region, 0xffffffff); + + pixman_region32_fini(&dest_region); } void canvas_draw_invers(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceInvers *invers) { - cairo_t *cairo = canvas->cairo; - cairo_save(cairo); - cairo_set_source_rgb(cairo, 1, 1, 1); - cairo_set_operator(cairo, CAIRO_OPERATOR_RASTER_XOR); - canvas_fill_common(canvas, bbox, clip, &invers->mask); - cairo_restore(cairo); + pixman_region32_t dest_region; + + pixman_region32_init_rect(&dest_region, + bbox->left, bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top); + + + canvas_clip_pixman(canvas, &dest_region, clip); + canvas_mask_pixman(canvas, &dest_region, &invers->mask, + bbox->left, bbox->top); + + if (pixman_region32_n_rects(&dest_region) == 0) { + pixman_region32_fini(&dest_region); + return; + } + + fill_solid_rects_rop(canvas, &dest_region, 0x00000000, + SPICE_ROP_INVERT); + + pixman_region32_fini(&dest_region); } void canvas_draw_rop3(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceRop3 *rop3) |