[PATCH weston 6/8] pixman-renderer: move code to draw_view_translated()

Pekka Paalanen ppaalanen at gmail.com
Fri Mar 6 03:04:01 PST 2015


From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

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 <pekka.paalanen at collabora.co.uk>
---
 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



More information about the wayland-devel mailing list