From: Pekka Paalanen <[email protected]> Move code from draw_view() into a new function draw_view_translated(). This new function is correct only if view_transformation_is_translation().
The test for view->alpha is moved into draw_view_translated() too, so we don't need to pass the pixman_op from draw_view(). The non-translation path is already using PIXMAN_OP_OVER, so it does not care about the alpha. v2: Fixed commit message. Signed-off-by: Pekka Paalanen <[email protected]> Reviewed-By: Derek Foreman <[email protected]> --- src/pixman-renderer.c | 85 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 34 deletions(-) diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c index ddbce51..6acc167 100644 --- a/src/pixman-renderer.c +++ b/src/pixman-renderer.c @@ -281,6 +281,54 @@ repaint_region(struct weston_view *ev, struct weston_output *output, } static void +draw_view_translated(struct weston_view *view, struct weston_output *output, + pixman_region32_t *repaint_global) +{ + struct weston_surface *surface = view->surface; + /* non-opaque region in surface coordinates: */ + pixman_region32_t surface_blend; + /* region to be painted in output coordinates: */ + pixman_region32_t repaint_output; + + pixman_region32_init(&repaint_output); + + /* Blended region is whole surface minus opaque region, + * unless surface alpha forces us to blend all. + */ + pixman_region32_init_rect(&surface_blend, 0, 0, + surface->width, surface->height); + + if (!(view->alpha < 1.0)) { + pixman_region32_subtract(&surface_blend, &surface_blend, + &surface->opaque); + + if (pixman_region32_not_empty(&surface->opaque)) { + region_intersect_only_translation(&repaint_output, + repaint_global, + &surface->opaque, + view); + region_global_to_output(output, &repaint_output); + + repaint_region(view, output, &repaint_output, + PIXMAN_OP_SRC); + } + } + + if (pixman_region32_not_empty(&surface_blend)) { + region_intersect_only_translation(&repaint_output, + repaint_global, + &surface_blend, view); + region_global_to_output(output, &repaint_output); + + repaint_region(view, output, &repaint_output, + PIXMAN_OP_OVER); + } + + pixman_region32_fini(&surface_blend); + pixman_region32_fini(&repaint_output); +} + +static void draw_view(struct weston_view *ev, struct weston_output *output, pixman_region32_t *damage) /* in global coordinates */ { @@ -288,9 +336,6 @@ draw_view(struct weston_view *ev, struct weston_output *output, struct pixman_surface_state *ps = get_surface_state(ev->surface); /* repaint bounding region in global coordinates: */ pixman_region32_t repaint; - /* non-opaque region in surface coordinates: */ - pixman_region32_t surface_blend; - pixman_region32_t repaint_output; /* No buffer attached */ if (!ps->image) @@ -310,41 +355,13 @@ draw_view(struct weston_view *ev, struct weston_output *output, } /* TODO: Implement repaint_region_complex() using pixman_composite_trapezoids() */ - if (ev->alpha != 1.0 || !view_transformation_is_translation(ev)) { + if (view_transformation_is_translation(ev)) { + draw_view_translated(ev, output, &repaint); + } else { region_global_to_output(output, &repaint); repaint_region(ev, output, &repaint, PIXMAN_OP_OVER); - } else { - pixman_region32_init(&repaint_output); - - /* blended region is whole surface minus opaque region: */ - pixman_region32_init_rect(&surface_blend, 0, 0, - ev->surface->width, ev->surface->height); - pixman_region32_subtract(&surface_blend, &surface_blend, &ev->surface->opaque); - - if (pixman_region32_not_empty(&ev->surface->opaque)) { - region_intersect_only_translation(&repaint_output, - &repaint, - &ev->surface->opaque, - ev); - region_global_to_output(output, &repaint_output); - repaint_region(ev, output, &repaint_output, - PIXMAN_OP_SRC); - } - - if (pixman_region32_not_empty(&surface_blend)) { - region_intersect_only_translation(&repaint_output, - &repaint, - &surface_blend, - ev); - region_global_to_output(output, &repaint_output); - repaint_region(ev, output, &repaint_output, - PIXMAN_OP_OVER); - } - pixman_region32_fini(&surface_blend); - pixman_region32_fini(&repaint_output); } - out: pixman_region32_fini(&repaint); } -- 2.0.5 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
