From c425ed626c19ac5c2401cb8765033dd3e9d558b8 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 22 Sep 2010 14:36:40 +0200 Subject: Handle surface images in DrawOpaque --- common/canvas_base.c | 61 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 19 deletions(-) (limited to 'common') diff --git a/common/canvas_base.c b/common/canvas_base.c index acf9ae55..c2763bcc 100644 --- a/common/canvas_base.c +++ b/common/canvas_base.c @@ -2414,6 +2414,7 @@ static void canvas_draw_opaque(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spice CanvasBase *canvas = (CanvasBase *)spice_canvas; pixman_image_t *src_image; pixman_region32_t dest_region; + SpiceCanvas *surface_canvas; SpiceROP rop; pixman_region32_init_rect(&dest_region, @@ -2436,30 +2437,52 @@ static void canvas_draw_opaque(SpiceCanvas *spice_canvas, SpiceRect *bbox, Spice return; } - src_image = canvas_get_image(canvas, opaque->src_bitmap, FALSE); - - if (rect_is_same_size(bbox, &opaque->src_area)) { - spice_canvas->ops->blit_image(spice_canvas, &dest_region, - src_image, - bbox->left - opaque->src_area.left, - bbox->top - opaque->src_area.top); + surface_canvas = canvas_get_surface(canvas, opaque->src_bitmap); + if (surface_canvas) { + if (rect_is_same_size(bbox, &opaque->src_area)) { + spice_canvas->ops->blit_image_from_surface(spice_canvas, &dest_region, + surface_canvas, + bbox->left - opaque->src_area.left, + bbox->top - opaque->src_area.top); + } else { + spice_canvas->ops->scale_image_from_surface(spice_canvas, &dest_region, + surface_canvas, + opaque->src_area.left, + opaque->src_area.top, + opaque->src_area.right - opaque->src_area.left, + opaque->src_area.bottom - opaque->src_area.top, + bbox->left, + bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top, + opaque->scale_mode); + } } else { - spice_canvas->ops->scale_image(spice_canvas, &dest_region, - src_image, - opaque->src_area.left, - opaque->src_area.top, - opaque->src_area.right - opaque->src_area.left, - opaque->src_area.bottom - opaque->src_area.top, - bbox->left, - bbox->top, - bbox->right - bbox->left, - bbox->bottom - bbox->top, - opaque->scale_mode); + src_image = canvas_get_image(canvas, opaque->src_bitmap, FALSE); + + if (rect_is_same_size(bbox, &opaque->src_area)) { + spice_canvas->ops->blit_image(spice_canvas, &dest_region, + src_image, + bbox->left - opaque->src_area.left, + bbox->top - opaque->src_area.top); + } else { + spice_canvas->ops->scale_image(spice_canvas, &dest_region, + src_image, + opaque->src_area.left, + opaque->src_area.top, + opaque->src_area.right - opaque->src_area.left, + opaque->src_area.bottom - opaque->src_area.top, + bbox->left, + bbox->top, + bbox->right - bbox->left, + bbox->bottom - bbox->top, + opaque->scale_mode); + } + pixman_image_unref(src_image); } draw_brush(spice_canvas, &dest_region, &opaque->brush, rop); - pixman_image_unref(src_image); pixman_region32_fini(&dest_region); } -- cgit