[pango/line-breaker: 12/18] wip: Serialize PangoLine
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/line-breaker: 12/18] wip: Serialize PangoLine
- Date: Sat, 15 Jan 2022 15:37:30 +0000 (UTC)
commit 3224dc39a5e12a8c735f33098a983298c2994f89
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jan 14 22:13:01 2022 -0500
wip: Serialize PangoLine
pango/serializer.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++---
tests/testserialize.c | 40 ++++++++++++++++++++++++++++
2 files changed, 108 insertions(+), 4 deletions(-)
---
diff --git a/pango/serializer.c b/pango/serializer.c
index 2dab93b4..cc3bcde3 100644
--- a/pango/serializer.c
+++ b/pango/serializer.c
@@ -26,6 +26,7 @@
#include <pango/pango-context-private.h>
#include <pango/pango-enum-types.h>
#include <pango/pango-font-private.h>
+#include <pango/pango-line-private.h>
#include <hb-ot.h>
#include "pango/json/gtkjsonparserprivate.h"
@@ -634,7 +635,7 @@ add_font (GtkJsonPrinter *printer,
static void
add_run (GtkJsonPrinter *printer,
- PangoLayout *layout,
+ const char *text,
PangoLayoutRun *run)
{
char *str;
@@ -644,7 +645,7 @@ add_run (GtkJsonPrinter *printer,
gtk_json_printer_add_integer (printer, "offset", run->item->offset);
gtk_json_printer_add_integer (printer, "length", run->item->length);
- str = g_strndup (layout->text + run->item->offset, run->item->length);
+ str = g_strndup (text + run->item->offset, run->item->length);
gtk_json_printer_add_string (printer, "text", str);
g_free (str);
@@ -721,7 +722,7 @@ add_line (GtkJsonPrinter *printer,
for (GSList *l = line->runs; l; l = l->next)
{
PangoLayoutRun *run = l->data;
- add_run (printer, line->layout, run);
+ add_run (printer, line->layout->text, run);
}
gtk_json_printer_end (printer);
@@ -827,6 +828,45 @@ layout_to_json (GtkJsonPrinter *printer,
gtk_json_printer_end (printer);
}
+static void
+line_to_json (GtkJsonPrinter *printer,
+ PangoLine *line)
+{
+ gtk_json_printer_start_object (printer, NULL);
+
+ gtk_json_printer_add_integer (printer, "start-index", line->start_index);
+ gtk_json_printer_add_integer (printer, "length", line->length);
+ gtk_json_printer_add_boolean (printer, "paragraph-start", line->starts_paragraph);
+ gtk_json_printer_add_boolean (printer, "paragraph-end", line->ends_paragraph);
+ gtk_json_printer_add_string (printer, "direction", direction_names[line->direction]);
+ gtk_json_printer_add_boolean (printer, "wrapped", line->wrapped);
+ gtk_json_printer_add_boolean (printer, "ellipsized", line->ellipsized);
+ gtk_json_printer_add_boolean (printer, "hyphenated", line->hyphenated);
+
+ gtk_json_printer_start_array (printer, "runs");
+ for (GSList *l = line->runs; l; l = l->next)
+ {
+ PangoLayoutRun *run = l->data;
+ add_run (printer, line->data->text, run);
+ }
+ gtk_json_printer_end (printer);
+
+ gtk_json_printer_end (printer);
+}
+
+static void
+lines_to_json (GtkJsonPrinter *printer,
+ PangoLine **lines,
+ unsigned int n_lines)
+{
+ gtk_json_printer_start_array (printer, NULL);
+
+ for (int i = 0; i < n_lines; i++)
+ line_to_json (printer, lines[i]);
+
+ gtk_json_printer_end (printer);
+}
+
static void
gstring_write (GtkJsonPrinter *printer,
const char *s,
@@ -1749,7 +1789,7 @@ pango_font_serialize (PangoFont *font)
gsize size;
g_return_val_if_fail (PANGO_IS_FONT (font), NULL);
-
+
str = g_string_new ("");
printer = gtk_json_printer_new (gstring_write, str, NULL);
@@ -1798,6 +1838,30 @@ pango_font_deserialize (PangoContext *context,
return font;
}
+GBytes *
+pango_lines_serialize (PangoLine **lines,
+ unsigned int n_lines)
+{
+ GString *str;
+ GtkJsonPrinter *printer;
+ char *data;
+ gsize size;
+
+ str = g_string_new ("");
+
+ printer = gtk_json_printer_new (gstring_write, str, NULL);
+ gtk_json_printer_set_flags (printer, GTK_JSON_PRINTER_PRETTY);
+ lines_to_json (printer, lines, n_lines);
+ gtk_json_printer_free (printer);
+
+ g_string_append_c (str, '\n');
+
+ size = str->len;
+ data = g_string_free (str, FALSE);
+
+ return g_bytes_new_take (data, size);
+}
+
/* }}} */
/* vim:set foldmethod=marker expandtab: */
diff --git a/tests/testserialize.c b/tests/testserialize.c
index e480da31..757d5b9e 100644
--- a/tests/testserialize.c
+++ b/tests/testserialize.c
@@ -465,6 +465,45 @@ install_fonts (void)
g_free (dir);
}
+static void
+test_serialize_linebreaker (void)
+{
+ PangoContext *context;
+ PangoLineBreaker *breaker;
+ const char *text =
+ "This is a long paragraph that should get "
+ "broken over at least two lines, if not more.";
+ int x, y, width;
+ GPtrArray *lines;
+ GBytes *bytes;
+
+ context = pango_font_map_create_context (pango_cairo_font_map_get_default ());
+
+ breaker = pango_line_breaker_new (context);
+
+ pango_line_breaker_add_text (breaker, text, -1, NULL);
+
+ lines = g_ptr_array_new_with_free_func (g_object_unref);
+
+ x = y = 0;
+ width = 200;
+ while (!pango_line_breaker_done (breaker))
+ {
+ PangoLine *line = pango_line_breaker_next_line (breaker, x, width,
+ PANGO_WRAP_WORD,
+ PANGO_ELLIPSIZE_NONE,
+ PANGO_ALIGNMENT_LEFT);
+ g_ptr_array_add (lines, line);
+ }
+
+ bytes = pango_lines_serialize ((PangoLine **)lines->pdata, lines->len);
+ g_print ("%s\n", (char *)g_bytes_get_data (bytes, NULL));
+
+ g_ptr_array_unref (lines);
+
+ g_object_unref (context);
+}
+
int
main (int argc, char *argv[])
{
@@ -479,6 +518,7 @@ main (int argc, char *argv[])
g_test_add_func ("/serialize/layout/valid", test_serialize_layout_valid);
g_test_add_func ("/serialize/layout/context", test_serialize_layout_context);
g_test_add_func ("/serialize/layout/invalid", test_serialize_layout_invalid);
+ g_test_add_func ("/serialize/linebreaker", test_serialize_linebreaker);
return g_test_run ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]