summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2010-02-12 16:22:01 +0100
committerAlexander Larsson <alexl@redhat.com>2010-02-23 22:52:05 +0100
commit3b2f1fcb22e8cf8bdec7a79a308cb8a0cb120eb1 (patch)
treeefdb72f50f29c8ec98c17760fc1a69641a5e2324
parent974c662ae4f3375ea4162556ac644f1431af2f9f (diff)
downloadspice-3b2f1fcb22e8cf8bdec7a79a308cb8a0cb120eb1.tar.gz
spice-3b2f1fcb22e8cf8bdec7a79a308cb8a0cb120eb1.tar.xz
spice-3b2f1fcb22e8cf8bdec7a79a308cb8a0cb120eb1.zip
Convert draw_blackness/whiteness/invers to using pixman
-rw-r--r--common/cairo_canvas.c77
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)