[gtk/wip/alexl/broadway5: 24/35] Broadway: Add node for debug nodes



commit b097f0a7d81511764f79ed227237332b97f1bbde
Author: Alexander Larsson <alexl redhat com>
Date:   Fri Mar 22 12:42:12 2019 +0100

    Broadway: Add node for debug nodes
    
    This can be helpful when debugging broadway.

 gdk/broadway/broadway-protocol.h |  2 ++
 gdk/broadway/broadway.js         | 59 ++++++++++++++++++++++++++++++++++++++++
 gdk/broadway/broadwayd.c         |  7 ++++-
 gsk/gskbroadwayrenderer.c        | 40 +++++++++++++++++++++++----
 4 files changed, 102 insertions(+), 6 deletions(-)
---
diff --git a/gdk/broadway/broadway-protocol.h b/gdk/broadway/broadway-protocol.h
index b397195521..5c2d923a10 100644
--- a/gdk/broadway/broadway-protocol.h
+++ b/gdk/broadway/broadway-protocol.h
@@ -23,6 +23,7 @@ typedef enum { /* Sync changes with broadway.js */
   BROADWAY_NODE_KEEP_ALL = 11,
   BROADWAY_NODE_KEEP_THIS = 12,
   BROADWAY_NODE_TRANSLATE = 13,
+  BROADWAY_NODE_DEBUG = 14,
 } BroadwayNodeType;
 
 static const char *broadway_node_type_names[] G_GNUC_UNUSED =  {
@@ -40,6 +41,7 @@ static const char *broadway_node_type_names[] G_GNUC_UNUSED =  {
   "KEEP_ALL",
   "KEEP_THIS",
   "TRANSLATE",
+  "DEBUG",
 };
 
 typedef enum {
diff --git a/gdk/broadway/broadway.js b/gdk/broadway/broadway.js
index d7a6a0d446..b2441076a7 100644
--- a/gdk/broadway/broadway.js
+++ b/gdk/broadway/broadway.js
@@ -387,6 +387,55 @@ SwapNodes.prototype.decode_color_stops = function() {
     return stops;
 }
 
+function utf8_to_string(array) {
+    var out, i, len, c;
+    var char2, char3;
+
+    out = "";
+    len = array.length;
+    i = 0;
+    while(i < len) {
+    c = array[i++];
+    switch(c >> 4)
+        {
+        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+            // 0xxxxxxx
+            out += String.fromCharCode(c);
+            break;
+        case 12: case 13:
+            // 110x xxxx   10xx xxxx
+            char2 = array[i++];
+            out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
+            break;
+        case 14:
+            // 1110 xxxx  10xx xxxx  10xx xxxx
+            char2 = array[i++];
+            char3 = array[i++];
+            out += String.fromCharCode(((c & 0x0F) << 12) |
+                                       ((char2 & 0x3F) << 6) |
+                                       ((char3 & 0x3F) << 0));
+            break;
+        }
+    }
+
+    return out;
+}
+
+SwapNodes.prototype.decode_string = function() {
+    var len = this.decode_uint32();
+    var utf8 = new Array();
+    var b;
+    for (var i = 0; i < len; i++) {
+        if (i % 4 == 0) {
+            b = this.decode_uint32();
+        }
+        utf8[i] = b & 0xff;
+        b = b >> 8;
+    }
+
+    return utf8_to_string (utf8);
+}
+
 function args() {
     var argsLength = arguments.length;
     var strings = [];
@@ -645,6 +694,16 @@ SwapNodes.prototype.insertNode = function(parent, posInParent, oldNode)
         }
         break;
 
+    case 14:  // DEBUG
+        {
+            var str = this.decode_string();
+            var div = document.createElement('div');
+            div.setAttribute('debug', str);
+            this.insertNode(div, -1, oldChildren[0]);
+            newNode = div;
+        }
+        break;
+
    /* Generic nodes */
 
     case 1: // CONTAINER
diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c
index 13d5675633..e691f3ce90 100644
--- a/gdk/broadway/broadwayd.c
+++ b/gdk/broadway/broadwayd.c
@@ -238,7 +238,7 @@ decode_nodes (BroadwayClient *client,
 {
   BroadwayNode *node;
   guint32 type;
-  guint32 i, n_stops, n_shadows;
+  guint32 i, n_stops, n_shadows, n_chars;
   guint32 size, n_children;
   gint32 texture_offset;
   guint32 hash;
@@ -296,6 +296,11 @@ decode_nodes (BroadwayClient *client,
     size = NODE_SIZE_FLOAT;
     n_children = 1;
     break;
+  case BROADWAY_NODE_DEBUG:
+    n_chars = data[*pos];
+    size = 1 + (n_chars + 3) / 4;
+    n_children = 1;
+    break;
   default:
     g_assert_not_reached ();
   }
diff --git a/gsk/gskbroadwayrenderer.c b/gsk/gskbroadwayrenderer.c
index c90ccbeab5..552c9beafb 100644
--- a/gsk/gskbroadwayrenderer.c
+++ b/gsk/gskbroadwayrenderer.c
@@ -147,6 +147,31 @@ add_color_stop (GArray *nodes, const GskColorStop *stop)
   add_rgba (nodes, &stop->color);
 }
 
+static void
+add_string (GArray *nodes, const char *str)
+{
+  guint32 len = strlen(str);
+  guint32 v, c;
+
+  add_uint32 (nodes, len);
+
+  v = 0;
+  c = 0;
+  while (*str != 0)
+    {
+      v |= (*str++) << 8*c++;
+      if (c == 4)
+        {
+          add_uint32 (nodes, v);
+          v = 0;
+          c = 0;
+        }
+    }
+
+  if (c != 0)
+    add_uint32 (nodes, v);
+}
+
 static gboolean
 float_is_int32 (float f)
 {
@@ -664,6 +689,16 @@ gsk_broadway_renderer_add_node (GskRenderer *renderer,
       }
       return;
 
+    case GSK_DEBUG_NODE:
+      {
+        const char *message = gsk_debug_node_get_message (node);
+        add_uint32 (nodes, BROADWAY_NODE_DEBUG);
+        add_string (nodes, message);
+        gsk_broadway_renderer_add_node (renderer, nodes, node_textures,
+                                        gsk_debug_node_get_child (node), offset_x, offset_y);
+      }
+      return;
+
       /* Generic nodes */
 
     case GSK_CONTAINER_NODE:
@@ -679,11 +714,6 @@ gsk_broadway_renderer_add_node (GskRenderer *renderer,
       }
       return;
 
-    case GSK_DEBUG_NODE:
-      gsk_broadway_renderer_add_node (renderer, nodes, node_textures,
-                                      gsk_debug_node_get_child (node), offset_x, offset_y);
-      return;
-
     case GSK_COLOR_MATRIX_NODE:
     case GSK_TEXT_NODE:
     case GSK_REPEATING_LINEAR_GRADIENT_NODE:


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