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

Reply via email to