diff options
author | Alexander Larsson <alexl@redhat.com> | 2019-03-22 12:42:12 +0100 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2019-03-26 17:07:47 +0100 |
commit | b097f0a7d81511764f79ed227237332b97f1bbde (patch) | |
tree | 07a00b14c15803b1f0f974a5bcdca27769620e4a | |
parent | 1b5b1bfd0e3b1725a5bdf8a8b1d9fadcca31b6c6 (diff) | |
download | gtk+-b097f0a7d81511764f79ed227237332b97f1bbde.tar.gz |
Broadway: Add node for debug nodes
This can be helpful when debugging broadway.
-rw-r--r-- | gdk/broadway/broadway-protocol.h | 2 | ||||
-rw-r--r-- | gdk/broadway/broadway.js | 59 | ||||
-rw-r--r-- | gdk/broadway/broadwayd.c | 7 | ||||
-rw-r--r-- | 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: |