diff options
author | Alexander Larsson <alexl@redhat.com> | 2010-09-22 14:36:40 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2010-09-22 14:36:40 +0200 |
commit | c425ed626c19ac5c2401cb8765033dd3e9d558b8 (patch) | |
tree | 39b0683e2e795acacaad4ea5252957531d07981f /common/canvas_base.c | |
parent | 587584a4e468dfe46649df9864d12f51a80d34a6 (diff) | |
download | spice-c425ed626c19ac5c2401cb8765033dd3e9d558b8.tar.gz spice-c425ed626c19ac5c2401cb8765033dd3e9d558b8.tar.xz spice-c425ed626c19ac5c2401cb8765033dd3e9d558b8.zip |
Handle surface images in DrawOpaque
Diffstat (limited to 'common/canvas_base.c')
-rw-r--r-- | common/canvas_base.c | 61 |
1 files changed, 42 insertions, 19 deletions
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); } |