pixman-renderer: move code to draw_view_translated()
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Thu, 5 Mar 2015 10:57:35 +0000 (12:57 +0200)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Wed, 11 Mar 2015 11:38:28 +0000 (13:38 +0200)
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 <pekka.paalanen@collabora.co.uk>
Reviewed-By: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/pixman-renderer.c

index 692bbdeed0fffd3b568c46680d3f9e0634981bb7..48cd37b63de13e09f151c2bbc7b5ab9d6eb685f1 100644 (file)
@@ -283,6 +283,54 @@ repaint_region(struct weston_view *ev, struct weston_output *output,
        pixman_image_set_clip_region32 (po->shadow_image, NULL);
 }
 
+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 */
@@ -291,9 +339,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)
@@ -313,41 +358,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);
 }