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 functional change in this is that if view->alpha is not 1.0, we do not bother computing and painting the non-opaque and opaque regions separately. Both need to be blended anyway, so just paint it all in one op=OVER call. Signed-off-by: Pekka Paalanen <[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 2da6a2b..fc7613c 100644 --- a/src/pixman-renderer.c +++ b/src/pixman-renderer.c @@ -402,6 +402,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, NULL, + 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, NULL, + 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 */ { @@ -409,9 +457,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) @@ -431,41 +476,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, NULL, 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, NULL, - 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, NULL, - 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
