[mutter/gbsneto/content: 5/10] shaped-texture: Draw pipeline relative to alloc



commit 12206b953bbb359d537f5d5dcbfeb312fcbfeeb9
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Dec 27 14:16:50 2018 -0200

    shaped-texture: Draw pipeline relative to alloc
    
    By implementing ClutterContent, it is expected that
    MetaShapedTexture can draw on any actor. However,
    right now this is not possible, since it assumes
    that the drawing coordinates and sizes of the actor
    are synchronized with its own reported width and
    height.
    
    It mistakenly draws, for example, when setting an
    actor's content to it. There is no way to trigger
    this wrong behavior right now, but it will become
    a problem in the future where we can collect the
    paint nodes of MetaShapedTexture as part of other
    ClutterContent implementations.
    
    Use the allocation box passed by the actor to draw
    the pipelines of MetaShapedTexture.
    
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/409

 src/compositor/meta-shaped-texture.c | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)
---
diff --git a/src/compositor/meta-shaped-texture.c b/src/compositor/meta-shaped-texture.c
index 667d43d56..308d9361a 100644
--- a/src/compositor/meta-shaped-texture.c
+++ b/src/compositor/meta-shaped-texture.c
@@ -447,17 +447,27 @@ paint_clipped_rectangle_node (MetaShapedTexture     *stex,
                               ClutterActorBox       *alloc)
 {
   g_autoptr (ClutterPaintNode) node = NULL;
+  float ratio_h, ratio_v;
+  float x1, y1, x2, y2;
   float coords[8];
   float alloc_width;
   float alloc_height;
 
+  ratio_h = clutter_actor_box_get_width (alloc) / (float) stex->dst_width;
+  ratio_v = clutter_actor_box_get_height (alloc) / (float) stex->dst_height;
+
+  x1 = alloc->x1 + rect->x * ratio_h;
+  y1 = alloc->y1 + rect->y * ratio_v;
+  x2 = alloc->x1 + (rect->x + rect->width) * ratio_h;
+  y2 = alloc->y1 + (rect->y + rect->height) * ratio_v;
+
   alloc_width = alloc->x2 - alloc->x1;
   alloc_height = alloc->y2 - alloc->y1;
 
-  coords[0] = rect->x / alloc_width;
-  coords[1] = rect->y / alloc_height;
-  coords[2] = (rect->x + rect->width) / alloc_width;
-  coords[3] = (rect->y + rect->height) / alloc_height;
+  coords[0] = rect->x / alloc_width * ratio_h;
+  coords[1] = rect->y / alloc_height * ratio_v;
+  coords[2] = (rect->x + rect->width) / alloc_width * ratio_h;
+  coords[3] = (rect->y + rect->height) / alloc_height * ratio_v;
 
   coords[4] = coords[0];
   coords[5] = coords[1];
@@ -470,10 +480,10 @@ paint_clipped_rectangle_node (MetaShapedTexture     *stex,
 
   clutter_paint_node_add_multitexture_rectangle (node,
                                                  &(ClutterActorBox) {
-                                                   .x1 = rect->x,
-                                                   .x2 = rect->x + rect->width,
-                                                   .y1 = rect->y,
-                                                   .y2 = rect->y + rect->height,
+                                                   .x1 = x1,
+                                                   .y1 = y1,
+                                                   .x2 = x2,
+                                                   .y2 = y2,
                                                  },
                                                  coords, 8);
 }


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