[pango/line-breaker: 12/18] wip: Serialize PangoLine




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]