compositor: clip the opaque region with the scissor area

The opaque region is used to determine where the views underneath the current
view must be drawn. If the opaque is not clipped, then the area that is part of
the opaque region but not part of the scissor area is not drawn at all.

Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
diff --git a/libweston/compositor.c b/libweston/compositor.c
index 39ab480..d288b23 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -1467,6 +1467,9 @@
 	if (view->alpha == 1.0) {
 		pixman_region32_copy(&view->transform.opaque,
 				     &view->surface->opaque);
+		pixman_region32_intersect(&view->transform.opaque,
+					  &view->transform.opaque,
+					  &view->geometry.scissor);
 		pixman_region32_translate(&view->transform.opaque,
 					  view->geometry.x,
 					  view->geometry.y);
@@ -1504,15 +1507,6 @@
 		return -1;
 	}
 
-	if (view->alpha == 1.0 &&
-	    matrix->type == WESTON_MATRIX_TRANSFORM_TRANSLATE) {
-		pixman_region32_copy(&view->transform.opaque,
-				     &view->surface->opaque);
-		pixman_region32_translate(&view->transform.opaque,
-					  matrix->d[12],
-					  matrix->d[13]);
-	}
-
 	pixman_region32_init_rect(&surfregion, 0, 0,
 				  view->surface->width, view->surface->height);
 
@@ -1523,6 +1517,18 @@
 	view_compute_bbox(view, surfbox, &view->transform.boundingbox);
 	pixman_region32_fini(&surfregion);
 
+	if (view->alpha == 1.0 &&
+	    matrix->type == WESTON_MATRIX_TRANSFORM_TRANSLATE) {
+		pixman_region32_copy(&view->transform.opaque,
+				     &view->surface->opaque);
+		pixman_region32_intersect(&view->transform.opaque,
+					  &view->transform.opaque,
+					  &view->geometry.scissor);
+		pixman_region32_translate(&view->transform.opaque,
+					  matrix->d[12],
+					  matrix->d[13]);
+	}
+
 	return 0;
 }