summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-12-02 19:51:14 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-12-02 20:24:53 -0500
commit73f27640b5292dd758e3daf5c88180b8e54e2804 (patch)
tree7670d8787860c0abae1945bb181753a954cfb1ad /pango
parent2c0aa8b8d3ac2811479976d6477166592b862458 (diff)
downloadpango-73f27640b5292dd758e3daf5c88180b8e54e2804.tar.gz
Add pango_font_deserialize
This will make the font serialization useful in GTK, where we serialize fonts in node files.
Diffstat (limited to 'pango')
-rw-r--r--pango/pango-font.h5
-rw-r--r--pango/serializer.c84
2 files changed, 89 insertions, 0 deletions
diff --git a/pango/pango-font.h b/pango/pango-font.h
index bfe4bc31..f4e619a1 100644
--- a/pango/pango-font.h
+++ b/pango/pango-font.h
@@ -637,6 +637,11 @@ PangoLanguage ** pango_font_get_languages (PangoFont *font);
PANGO_AVAILABLE_IN_1_50
GBytes * pango_font_serialize (PangoFont *font);
+PANGO_AVAILABLE_IN_1_50
+PangoFont * pango_font_deserialize (PangoContext *context,
+ GBytes *bytes,
+ GError **error);
+
/**
* PANGO_GLYPH_EMPTY:
*
diff --git a/pango/serializer.c b/pango/serializer.c
index a5c751fd..86e6b004 100644
--- a/pango/serializer.c
+++ b/pango/serializer.c
@@ -1320,6 +1320,51 @@ json_parser_fill_layout (GtkJsonParser *parser,
gtk_json_parser_end (parser);
}
+enum {
+ FONT_DESCRIPTION,
+ FONT_CHECKSUM,
+ FONT_VARIATIONS,
+ FONT_FEATURES,
+ FONT_MATRIX
+};
+
+static const char *font_members[] = {
+ "description",
+ "checksum",
+ "variations",
+ "features",
+ "matrix",
+ NULL
+};
+
+static PangoFont *
+json_parser_load_font (GtkJsonParser *parser,
+ PangoContext *context,
+ GError **error)
+{
+ PangoFont *font = NULL;
+
+ gtk_json_parser_start_object (parser);
+
+ switch (gtk_json_parser_select_member (parser, font_members))
+ {
+ case FONT_DESCRIPTION:
+ {
+ PangoFontDescription *desc = parser_get_font_description (parser);
+ font = pango_context_load_font (context, desc);
+ pango_font_description_free (desc);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ gtk_json_parser_end (parser);
+
+ return font;
+}
+
/* }}} */
/* {{{ Public API */
@@ -1421,6 +1466,10 @@ pango_layout_write_to_file (PangoLayout *layout,
*
* For a discussion of the supported format, see that function.
*
+ * Note: to verify that the returned layout is identical to
+ * the one that was serialized, you can compare @bytes to the
+ * result of serializing the layout again.
+ *
* Returns: (nullable) (transfer full): a new `PangoLayout`
*
* Since: 1.50
@@ -1491,6 +1540,41 @@ pango_font_serialize (PangoFont *font)
return g_bytes_new_take (data, size);
}
+/**
+ * pango_font_deserialize:
+ * @context: a `PangoContext`
+ * @bytes: the bytes containing the data
+ * @error: return location for an error
+ *
+ * Loads data previously created via [method@Pango.Font.serialize].
+ *
+ * For a discussion of the supported format, see that function.
+ *
+ * Note: to verify that the returned font is identical to
+ * the one that was serialized, you can compare @bytes to the
+ * result of serializing the font again.
+ *
+ * Returns: (nullable) (transfer full): a new `PangoFont`
+ *
+ * Since: 1.50
+ */
+PangoFont *
+pango_font_deserialize (PangoContext *context,
+ GBytes *bytes,
+ GError **error)
+{
+ PangoFont *font;
+ GtkJsonParser *parser;
+
+ g_return_val_if_fail (PANGO_IS_CONTEXT (context), NULL);
+
+ parser = gtk_json_parser_new_for_bytes (bytes);
+ font = json_parser_load_font (parser, context, error);
+ gtk_json_parser_free (parser);
+
+ return font;
+}
+
/* }}} */
/* vim:set foldmethod=marker expandtab: */