summaryrefslogtreecommitdiffstats
path: root/recipes-graphics/wayland/weston/0007-RFR-ivi-shell-multi-screen-support-to-calcuration-of.patch
blob: 7747115aca3f659f1376afc3a353410da5605921 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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