[mutter] boxes: Swap 90 and 270 degree transforms in meta_rectangle_transform()



commit 2ade26ebf8d368d2134cd932ee736b34c9721eae
Author: Robert Mader <robert mader posteo de>
Date:   Tue Jun 14 17:23:46 2022 +0200

    boxes: Swap 90 and 270 degree transforms in meta_rectangle_transform()
    
    `meta_rectangle_transform()` is used in the stack to *compensate* for a
    `MetaMonitorTransform` applied to a output, not to apply it again.
    Change the function accordingly.
    
    Context:
    Experimenting with direct scanout on offscreen-rotated outputs revealed
    that the 90/270 degree cases were actually interchanged.
    Further digging revealed that we use `meta_rectangle_transform()` with
    those values swapped in every single case, papering over the issue.
    
    Either a unintuitive and unexplained `meta_monitor_transform_invert()`
    was added, in which case "flipped" values would be wrong, or, in case
    of Wayland buffer transforms, the values were swapped by interpreting
    the Wayland enums accordingly, see commit 8d9bbe10.
    
    Swapping the 90/270 degree values in `meta_rectangle_transform()`:
    1. fixes hardware cursor positioning with flipped output transforms
    2. fixes rendering issues with offscreen-rotated flipped output transforms
    3. allows us to drop unexplained `meta_monitor_transform_invert()`s in
    follow-up commits
    4. allows us to make `META_MONITOR_TRANSFORM` and `WL_OUTPUT_TRANSFORM`
    enums match again (reverting 8d9bbe10, as already done)
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2459>

 src/core/boxes.c | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)
---
diff --git a/src/core/boxes.c b/src/core/boxes.c
index fabc69753d..92e0a01e93 100644
--- a/src/core/boxes.c
+++ b/src/core/boxes.c
@@ -2068,6 +2068,19 @@ meta_rectangle_scale_double (const MetaRectangle  *rect,
   meta_rectangle_from_graphene_rect (&tmp, rounding_strategy, dest);
 }
 
+/**
+ * meta_rectangle_transform:
+ * @rect: the #MetaRectangle to be transformed
+ * @transform: the #MetaMonitorTransform
+ * @width: the width of the target space
+ * @height: the height of the target space
+ * @dest: the transformed #MetaRectangle
+ *
+ * This function transforms the values in @rect in order to compensate for
+ * @transform applied to a #MetaMonitor, making them match the viewport. Note
+ * that compensating implies that for a clockwise rotation of the #MetaMonitor
+ * an anti-clockwise rotation has to be applied to @rect.
+ */
 void
 meta_rectangle_transform (const MetaRectangle  *rect,
                           MetaMonitorTransform  transform,
@@ -2082,8 +2095,8 @@ meta_rectangle_transform (const MetaRectangle  *rect,
       break;
     case META_MONITOR_TRANSFORM_90:
       *dest = (MetaRectangle) {
-        .x = width - (rect->y + rect->height),
-        .y = rect->x,
+        .x = rect->y,
+        .y = height - (rect->x + rect->width),
         .width = rect->height,
         .height = rect->width,
       };
@@ -2098,8 +2111,8 @@ meta_rectangle_transform (const MetaRectangle  *rect,
       break;
     case META_MONITOR_TRANSFORM_270:
       *dest = (MetaRectangle) {
-        .x = rect->y,
-        .y = height - (rect->x + rect->width),
+        .x = width - (rect->y + rect->height),
+        .y = rect->x,
         .width = rect->height,
         .height = rect->width,
       };
@@ -2114,8 +2127,8 @@ meta_rectangle_transform (const MetaRectangle  *rect,
       break;
     case META_MONITOR_TRANSFORM_FLIPPED_90:
       *dest = (MetaRectangle) {
-        .x = width - (rect->y + rect->height),
-        .y = height - (rect->x + rect->width),
+        .x = rect->y,
+        .y = rect->x,
         .width = rect->height,
         .height = rect->width,
       };
@@ -2130,8 +2143,8 @@ meta_rectangle_transform (const MetaRectangle  *rect,
       break;
     case META_MONITOR_TRANSFORM_FLIPPED_270:
       *dest = (MetaRectangle) {
-        .x = rect->y,
-        .y = rect->x,
+        .x = width - (rect->y + rect->height),
+        .y = height - (rect->x + rect->width),
         .width = rect->height,
         .height = rect->width,
       };


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]