summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2019-03-22 12:42:12 +0100
committerAlexander Larsson <alexl@redhat.com>2019-03-26 17:07:47 +0100
commitb097f0a7d81511764f79ed227237332b97f1bbde (patch)
tree07a00b14c15803b1f0f974a5bcdca27769620e4a
parent1b5b1bfd0e3b1725a5bdf8a8b1d9fadcca31b6c6 (diff)
downloadgtk+-b097f0a7d81511764f79ed227237332b97f1bbde.tar.gz
Broadway: Add node for debug nodes
This can be helpful when debugging broadway.
-rw-r--r--gdk/broadway/broadway-protocol.h2
-rw-r--r--gdk/broadway/broadway.js59
-rw-r--r--gdk/broadway/broadwayd.c7
-rw-r--r--gsk/gskbroadwayrenderer.c40
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: