diff options
author | Alexander Larsson <alexl@redhat.com> | 2010-02-10 12:09:52 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-02-23 22:52:05 +0100 |
commit | 7fe1df4e140eec348137fa5934e33d3b968eede7 (patch) | |
tree | 2247534b6dd772086ccc6823549a05e24791a381 /common | |
parent | eff0aa029833a914cce7b047a48d9aa19b825c0a (diff) | |
download | spice-7fe1df4e140eec348137fa5934e33d3b968eede7.tar.gz spice-7fe1df4e140eec348137fa5934e33d3b968eede7.tar.xz spice-7fe1df4e140eec348137fa5934e33d3b968eede7.zip |
Convert cairo canvas draw_copy() to using pixman
This is just identical to draw_blend().
Diffstat (limited to 'common')
-rw-r--r-- | common/cairo_canvas.c | 80 |
1 files changed, 60 insertions, 20 deletions
diff --git a/common/cairo_canvas.c b/common/cairo_canvas.c index f871c537..34f6fa4f 100644 --- a/common/cairo_canvas.c +++ b/common/cairo_canvas.c @@ -1416,31 +1416,71 @@ static cairo_pattern_t *canvas_src_image_to_pat(CairoCanvas *canvas, SPICE_ADDRE void canvas_draw_copy(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceCopy *copy) { - cairo_t *cairo = canvas->cairo; - cairo_pattern_t *pattern; - cairo_pattern_t *mask; + pixman_region32_t dest_region; + SpiceROP rop; - cairo_save(cairo); - canvas_clip(canvas, clip); + pixman_region32_init_rect(&dest_region, + bbox->left, bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top); - pattern = canvas_src_image_to_pat(canvas, copy->src_bitmap, ©->src_area, bbox, - copy->rop_decriptor & SPICE_ROPD_INVERS_SRC, copy->scale_mode); - cairo_set_source(cairo, pattern); - cairo_pattern_destroy(pattern); - cairo_set_operator(cairo, CAIRO_OPERATOR_RASTER_COPY); - if ((mask = canvas_get_mask_pattern(canvas, ©->mask, bbox->left, bbox->top))) { - cairo_rectangle(cairo, bbox->left, bbox->top, bbox->right - bbox->left, - bbox->bottom - bbox->top); - cairo_clip(cairo); - cairo_mask(cairo, mask); - cairo_pattern_destroy(mask); + canvas_clip_pixman(canvas, &dest_region, clip); + canvas_mask_pixman(canvas, &dest_region, ©->mask, + bbox->left, bbox->top); + + rop = ropd_descriptor_to_rop(copy->rop_decriptor, + ROP_INPUT_SRC, + ROP_INPUT_DEST); + + if (rop == SPICE_ROP_NOOP || pixman_region32_n_rects(&dest_region) == 0) { + canvas_touch_image(&canvas->base, copy->src_bitmap); + pixman_region32_fini(&dest_region); + return; + } + + if (rect_is_same_size(bbox, ©->src_area)) { + if (rop == SPICE_ROP_COPY) { + blit_image(canvas, &dest_region, + copy->src_bitmap, + bbox->left - copy->src_area.left, + bbox->top - copy->src_area.top); + } else { + blit_image_rop(canvas, &dest_region, + copy->src_bitmap, + bbox->left - copy->src_area.left, + bbox->top - copy->src_area.top, + rop); + } } else { - cairo_rectangle(cairo, bbox->left, bbox->top, bbox->right - bbox->left, - bbox->bottom - bbox->top); - cairo_fill(cairo); + if (rop == SPICE_ROP_COPY) { + scale_image(canvas, &dest_region, + copy->src_bitmap, + copy->src_area.left, + copy->src_area.top, + copy->src_area.right - copy->src_area.left, + copy->src_area.bottom - copy->src_area.top, + bbox->left, + bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top, + copy->scale_mode); + } else { + scale_image_rop(canvas, &dest_region, + copy->src_bitmap, + copy->src_area.left, + copy->src_area.top, + copy->src_area.right - copy->src_area.left, + copy->src_area.bottom - copy->src_area.top, + bbox->left, + bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top, + copy->scale_mode, + rop); + } } - cairo_restore(cairo); + pixman_region32_fini(&dest_region); } #ifdef WIN32 |