[gtk/matthiasc/for-master: 2/3] gsk: Export the glyph serialization privately
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master: 2/3] gsk: Export the glyph serialization privately
- Date: Mon, 21 Dec 2020 18:13:14 +0000 (UTC)
commit 9cec9e4ce2bf4608bb23dfece62297b5f426fa6c
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Dec 21 13:11:08 2020 -0500
gsk: Export the glyph serialization privately
We want to use the same serialization in the inspector,
so export this function.
gsk/gskrendernodeparser.c | 136 ++++++++++++++++++++++++++-------------------
gsk/gskrendernodeprivate.h | 3 +
2 files changed, 82 insertions(+), 57 deletions(-)
---
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c
index 45b500dc42..90183482f2 100644
--- a/gsk/gskrendernodeparser.c
+++ b/gsk/gskrendernodeparser.c
@@ -2310,6 +2310,84 @@ base64_encode_with_linebreaks (const guchar *data,
return out;
}
+void
+gsk_text_node_serialize_glyphs (GskRenderNode *node,
+ GString *p)
+{
+ const guint n_glyphs = gsk_text_node_get_num_glyphs (node);
+ const PangoGlyphInfo *glyphs = gsk_text_node_get_glyphs (node, NULL);
+ PangoFont *font = gsk_text_node_get_font (node);
+ GString *str;
+ guint i, j;
+ PangoGlyphString *ascii;
+
+ ascii = create_ascii_glyphs (font);
+ str = g_string_new ("");
+
+ for (i = 0; i < n_glyphs; i++)
+ {
+ if (ascii)
+ {
+ for (j = 0; j < ascii->num_glyphs; j++)
+ {
+ if (glyphs[i].glyph == ascii->glyphs[j].glyph &&
+ glyphs[i].geometry.width == ascii->glyphs[j].geometry.width &&
+ glyphs[i].geometry.x_offset == 0 &&
+ glyphs[i].geometry.y_offset == 0 &&
+ glyphs[i].attr.is_cluster_start)
+ {
+ g_string_append_c (str, j + MIN_ASCII_GLYPH);
+ break;
+ }
+ else if (glyphs[i].glyph == ascii->glyphs[j].glyph)
+ {
+ if (glyphs[i].geometry.width != ascii->glyphs[j].geometry.width)
+ g_print ("not ascii because of width (%d != %d)\n",
+ glyphs[i].geometry.width,
+ ascii->glyphs[j].geometry.width);
+ if (glyphs[i].geometry.x_offset != 0 ||
+ glyphs[i].geometry.y_offset != 0)
+ g_print ("not ascii because of offset\n");
+ if (!glyphs[i].attr.is_cluster_start)
+ g_print ("not ascii because of cluster\n");
+ }
+ }
+ if (j != ascii->num_glyphs)
+ continue;
+ }
+
+ if (str->len)
+ {
+ g_string_append_printf (p, "\"%s\", ", str->str);
+ g_string_set_size (str, 0);
+ }
+
+ g_string_append_printf (p, "%u %g",
+ glyphs[i].glyph,
+ (double) glyphs[i].geometry.width / PANGO_SCALE);
+ if (!glyphs[i].attr.is_cluster_start ||
+ glyphs[i].geometry.x_offset != 0 ||
+ glyphs[i].geometry.y_offset != 0)
+ {
+ g_string_append_printf (p, " %g %g",
+ (double) glyphs[i].geometry.x_offset / PANGO_SCALE,
+ (double) glyphs[i].geometry.y_offset / PANGO_SCALE);
+ if (!glyphs[i].attr.is_cluster_start)
+ g_string_append (p, " same-cluster");
+ }
+
+ if (i + 1 < n_glyphs)
+ g_string_append (p, ", ");
+ }
+
+ if (str->len)
+ g_string_append_printf (p, "\"%s\"", str->str);
+
+ g_string_free (str, TRUE);
+ if (ascii)
+ pango_glyph_string_free (ascii);
+}
+
static void
render_node_print (Printer *p,
GskRenderNode *node)
@@ -2637,16 +2715,11 @@ render_node_print (Printer *p,
case GSK_TEXT_NODE:
{
- const guint n_glyphs = gsk_text_node_get_num_glyphs (node);
- const PangoGlyphInfo *glyphs = gsk_text_node_get_glyphs (node, NULL);
const graphene_point_t *offset = gsk_text_node_get_offset (node);
const GdkRGBA *color = gsk_text_node_get_color (node);
PangoFont *font = gsk_text_node_get_font (node);
PangoFontDescription *desc;
char *font_name;
- GString *str;
- guint i, j;
- PangoGlyphString *ascii = create_ascii_glyphs (font);
start_node (p, "text");
@@ -2656,61 +2729,14 @@ render_node_print (Printer *p,
_indent (p);
desc = pango_font_describe (font);
font_name = pango_font_description_to_string (desc);
- if (ascii == NULL)
- g_print ("\"%s\" has no ascii table\n", font_name);
g_string_append_printf (p->str, "font: \"%s\";\n", font_name);
g_free (font_name);
pango_font_description_free (desc);
_indent (p);
- str = g_string_new (NULL);
g_string_append (p->str, "glyphs: ");
- for (i = 0; i < n_glyphs; i++)
- {
- if (ascii)
- {
- for (j = 0; j < ascii->num_glyphs; j++)
- {
- if (glyphs[i].glyph == ascii->glyphs[j].glyph &&
- glyphs[i].geometry.width == ascii->glyphs[j].geometry.width &&
- glyphs[i].geometry.x_offset == 0 &&
- glyphs[i].geometry.y_offset == 0 &&
- glyphs[i].attr.is_cluster_start)
- {
- g_string_append_c (str, j + MIN_ASCII_GLYPH);
- break;
- }
- }
- if (j != ascii->num_glyphs)
- continue;
- }
- if (str->len)
- {
- g_string_append_printf (p->str, "\"%s\", ", str->str);
- g_string_set_size (str, 0);
- }
-
- g_string_append_printf (p->str, "%u %g",
- glyphs[i].glyph,
- (double) glyphs[i].geometry.width / PANGO_SCALE);
- if (!glyphs[i].attr.is_cluster_start ||
- glyphs[i].geometry.x_offset != 0 ||
- glyphs[i].geometry.y_offset != 0)
- {
- g_string_append_printf (p->str, " %g %g",
- (double) glyphs[i].geometry.x_offset / PANGO_SCALE,
- (double) glyphs[i].geometry.y_offset / PANGO_SCALE);
- if (!glyphs[i].attr.is_cluster_start)
- g_string_append (p->str, " same-cluster");
- }
-
- if (i + 1 < n_glyphs)
- g_string_append (p->str, ", ");
- }
-
- if (str->len)
- g_string_append_printf (p->str, "\"%s\"", str->str);
+ gsk_text_node_serialize_glyphs (node, p->str);
g_string_append_c (p->str, ';');
g_string_append_c (p->str, '\n');
@@ -2719,10 +2745,6 @@ render_node_print (Printer *p,
append_point_param (p, "offset", offset);
end_node (p);
-
- g_string_free (str, TRUE);
- if (ascii)
- pango_glyph_string_free (ascii);
}
break;
diff --git a/gsk/gskrendernodeprivate.h b/gsk/gskrendernodeprivate.h
index 7e11a14b8f..295422cc6a 100644
--- a/gsk/gskrendernodeprivate.h
+++ b/gsk/gskrendernodeprivate.h
@@ -96,6 +96,9 @@ void gsk_render_node_diff_impossible (GskRenderNode
bool gsk_border_node_get_uniform (GskRenderNode *self);
+void gsk_text_node_serialize_glyphs (GskRenderNode *self,
+ GString *str);
+
G_END_DECLS
#endif /* __GSK_RENDER_NODE_PRIVATE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]