ivi-shell multi screen support
[AGL/meta-agl-demo.git] / recipes-graphics / wayland / weston / 0007-RFR-ivi-shell-multi-screen-support-to-calcuration-of.patch
diff --git a/recipes-graphics/wayland/weston/0007-RFR-ivi-shell-multi-screen-support-to-calcuration-of.patch b/recipes-graphics/wayland/weston/0007-RFR-ivi-shell-multi-screen-support-to-calcuration-of.patch
new file mode 100644 (file)
index 0000000..7747115
--- /dev/null
@@ -0,0 +1,103 @@
+From b995f26e62de2ba8965700062ccf98a8f65fffd0 Mon Sep 17 00:00:00 2001
+From: Koji Ohira <kk.ohira.koji@nttd-mse.com>
+Date: Thu, 24 Nov 2016 21:14:38 +0900
+Subject: [PATCH] [RFR] ivi-shell: multi screen support to calcuration of a
+ mask of weston_surface.
+
+A weston_surface is transformed to multi screen coordinate, global
+coordinate by matrix:m now.
+
+Additionally, a mask needs to be calucated, taking account into,
+- multi screen coordination: a destination rectangle of layer in the
+  coordination is easily calcurated by adding weston_output.{x,y} in
+  simple. This is because there is no scaled and rotated transformation.
+- intersect inside of a screen the layer is assigned to. This is because
+  overlapped region of weston surface in another screen shall not be
+  displayed according to ivi use case.
+
+Signed-off-by: Koji Ohira <kk.ohira.koji@nttd-mse.com>
+---
+ ivi-shell/ivi-layout.c | 38 ++++++++++++++++++++++++++++++++------
+ 1 file changed, 32 insertions(+), 6 deletions(-)
+
+diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c
+index 65c2735..008fbe5 100644
+--- a/ivi-shell/ivi-layout.c
++++ b/ivi-shell/ivi-layout.c
+@@ -665,15 +665,24 @@ calc_inverse_matrix_transform(const struct weston_matrix *matrix,
+ /**
+  * This computes the whole transformation matrix:m from surface-local
+- * coordinates to global coordinates. It is assumed that
+- * weston_view::geometry.{x,y} are zero.
++ * coordinates to multi screens coordinate, which is global coordinates.
++ * It is assumed that weston_view::geometry.{x,y} are zero.
+  *
+  * Additionally, this computes the mask on surface-local coordinates as a
+  * ivi_rectangle. This can be set to weston_view_set_mask.
+  *
+  * The mask is computed by following steps
+- * - destination rectangle of layer is inversed to surface-local cooodinates
+- *   by inversed matrix:m.
++ * - destination rectangle of layer is tansformed to multi screen coordinate,
++ *   global coordinates. This is done by adding weston_output.{x,y} in simple
++ *   because there is no scaled and rotated transformation.
++ * - destination rectangle of layer in multi screens coordinate needs to be
++ *   intersected inside of a screen the layer is assigned to. This is because
++ *   overlapped region of weston surface in another screen shall not be
++ *   displayed according to ivi use case.
++ * - destination rectangle of layer
++ *   - in multi screen coordinates,
++ *   - and intersected inside of an assigned screen,
++ *   is inversed to surface-local cooodinates by inversed matrix:m.
+  * - the area is intersected by intersected area between weston_surface and
+  *   source rectangle of ivi_surface.
+  */
+@@ -708,7 +717,17 @@ calc_surface_to_global_matrix_and_mask_to_weston_surface(
+                                                    lp->dest_y,
+                                                    lp->dest_width,
+                                                    lp->dest_height };
++      struct ivi_rectangle screen_dest_rect =    { output->x,
++                                                   output->y,
++                                                   output->width,
++                                                   output->height };
++      struct ivi_rectangle layer_dest_rect_in_global =
++                                                 { lp->dest_x + output->x,
++                                                   lp->dest_y + output->y,
++                                                   lp->dest_width,
++                                                   lp->dest_height };
+       struct ivi_rectangle surface_result;
++      struct ivi_rectangle layer_dest_rect_in_global_intersected;
+       /*
+        * the whole transformation matrix:m from surface-local
+@@ -735,9 +754,16 @@ calc_surface_to_global_matrix_and_mask_to_weston_surface(
+       ivi_rectangle_intersect(&surface_source_rect, &weston_surface_rect,
+                               &surface_result);
++      /*
++       * destination rectangle of layer in multi screens coordinate
++       * is intersected to avoid displaying outside of an assigned screen.
++       */
++      ivi_rectangle_intersect(&layer_dest_rect_in_global, &screen_dest_rect,
++                              &layer_dest_rect_in_global_intersected);
++
+       /* calc masking area of weston_surface from m */
+       calc_inverse_matrix_transform(m,
+-                                    &layer_dest_rect,
++                                    &layer_dest_rect_in_global_intersected,
+                                     &surface_result,
+                                     result);
+ }
+@@ -778,7 +804,7 @@ update_prop(struct ivi_layout_screen  *iviscrn,
+               weston_matrix_init(&ivisurf->transform.matrix);
+               calc_surface_to_global_matrix_and_mask_to_weston_surface(
+-                      ivilayer, ivisurf, &ivisurf->transform.matrix, &r);
++                      iviscrn, ivilayer, ivisurf, &ivisurf->transform.matrix, &r);
+               if (tmpview != NULL) {
+                       weston_view_set_mask(tmpview, r.x, r.y, r.width, r.height);
+-- 
+2.7.4
+