[pango/line-breaker: 15/16] test-render: adapt




commit 1e1e6f14bef1886d3a9f59d478da42636823f83c
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Jan 16 10:26:55 2022 -0500

    test-render: adapt

 tests/test-renderer.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 98 insertions(+), 8 deletions(-)
---
diff --git a/tests/test-renderer.c b/tests/test-renderer.c
index bf1a2c98..411fad16 100644
--- a/tests/test-renderer.c
+++ b/tests/test-renderer.c
@@ -23,6 +23,8 @@ main (int argc, char *argv[])
       "Nulla facilisi. Pellentesque at dolor sit amet purus dapibus pulvinar molestie quis neque. "
       "Suspendisse feugiat quam quis dolor accumsan cursus.";
 
+  text = "ABC\nDEF GHI";
+
   context = pango_font_map_create_context (pango_cairo_font_map_get_default ());
 
   surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 400, 600);
@@ -53,6 +55,7 @@ main (int argc, char *argv[])
 
       pango_simple_layout_set_text (layout, text, -1);
       pango_simple_layout_set_width (layout, 200 * PANGO_SCALE);
+      pango_simple_layout_set_alignment (layout, PANGO_ALIGNMENT_RIGHT);
 
       pango_cairo_show_lines (cr, pango_simple_layout_get_lines (layout));
 
@@ -61,15 +64,19 @@ main (int argc, char *argv[])
   else if (argc > 1 && strcmp (argv[1], "--line-breaker") == 0)
     {
       PangoLineBreaker *breaker;
+      PangoAttrList *attrs;
       int x, y, width;
       PangoLines *lines;
       int inc, m, w, w2;
+      int num;
 
+      attrs = pango_attr_list_new ();
+      pango_attr_list_insert (attrs, pango_attr_size_new (40 * PANGO_SCALE));
       breaker = pango_line_breaker_new (context);
 
       g_print ("Using %s\n", G_OBJECT_TYPE_NAME (breaker));
 
-      pango_line_breaker_add_text (breaker, text, -1, NULL);
+      pango_line_breaker_add_text (breaker, text, -1, attrs);
 
       lines = pango_lines_new ();
 
@@ -78,7 +85,7 @@ main (int argc, char *argv[])
       w2 = -200;
       inc = 40;
 
-      y = 10 * PANGO_SCALE;
+      y = 40 * PANGO_SCALE;
       x = (m - w / 2) * PANGO_SCALE;
       width = w * PANGO_SCALE;
 
@@ -88,15 +95,16 @@ main (int argc, char *argv[])
           PangoRectangle ext;
           gboolean ltr;
 
+          x = 20 * PANGO_SCALE; width = 200 * PANGO_SCALE;
           line = pango_line_breaker_next_line (breaker,
                                                x, width,
                                                PANGO_WRAP_CHAR,
-                                               PANGO_ELLIPSIZE_NONE,
-                                               PANGO_ALIGNMENT_JUSTIFY);
-          pango_lines_add_line (lines, line, x, y);
-
+                                               PANGO_ELLIPSIZE_NONE);
           pango_line_get_extents (line, &ext);
+          line = pango_line_justify (line, width);
+          pango_lines_add_line (lines, line, x, y - ext.y);
 
+          y += ext.height;
           ltr = pango_line_breaker_get_direction (breaker) == PANGO_DIRECTION_LTR;
 
           if (w2 > 0 && ltr && x <= m * PANGO_SCALE)
@@ -105,7 +113,7 @@ main (int argc, char *argv[])
             x = (m - w2 / 2) * PANGO_SCALE;
           else
             {
-              y += ext.height;
+          //    y += ext.height;
 
               w += inc;
               w2 += inc;
@@ -124,6 +132,7 @@ main (int argc, char *argv[])
             }
         }
 
+#if 0
       for (int i = 0; i < pango_lines_get_n_lines (lines); i++)
         {
           PangoLine *line;
@@ -132,8 +141,89 @@ main (int argc, char *argv[])
           pango_lines_get_line (lines, i, &line, &x, &y);
 
           pango_line_get_extents (line, &ext);
-          cairo_move_to (cr, (x + ext.x) / (double)PANGO_SCALE, (y - ext.y) / (double)PANGO_SCALE);
+          cairo_rectangle (cr,
+                           (double)(x + ext.x) / PANGO_SCALE,
+                           (double)(y + ext.y) / PANGO_SCALE,
+                           (double)ext.width / PANGO_SCALE,
+                           (double)ext.height / PANGO_SCALE);
+          cairo_stroke (cr);
+        }
+#endif
+
+      num = 0;
+      for (int i = 0; i < pango_lines_get_n_lines (lines); i++)
+        {
+          PangoLine *line;
+          const PangoLogAttr *attrs;
+          int start_offset, n_attrs;
+          const char *text;
+          int start_index, length;
+
+          pango_lines_get_line (lines, i, &line, &x, &y);
+
+          cairo_save (cr);
+          cairo_move_to (cr, x / (double)PANGO_SCALE, y / (double)PANGO_SCALE);
           pango_cairo_show_line (cr, line);
+          cairo_restore (cr);
+
+          cairo_save (cr);
+
+          attrs = pango_line_get_log_attrs (line, &start_offset, &n_attrs);
+          text = pango_line_get_text (line, &start_index, &length);
+
+          for (GSList *l = pango_line_get_runs (line); l; l = l->next)
+            {
+              PangoGlyphItem *run = l->data;
+              PangoRectangle rect;
+              const char *start, *p;
+              gboolean trailing;
+              int offset;
+              int xx;
+
+              pango_glyph_item_get_extents (run, &rect, FALSE);
+
+              start = text + run->item->offset;
+              offset = g_utf8_strlen (text, start - text);
+
+              trailing = FALSE;
+              p = start;
+              for (int i = 0; i <= run->item->num_chars; i++)
+                {
+                  if (attrs[offset + i].is_cursor_position)
+                    {
+                      pango_glyph_string_index_to_x_full (run->glyphs,
+                                                          text + run->item->offset,
+                                                          run->item->length,
+                                                          &run->item->analysis,
+                                                          (PangoLogAttr *)attrs + offset,
+                                                          p - start,
+                                                          trailing,
+                                                          &xx);
+                      xx += rect.x;
+
+                      cairo_set_source_rgba (cr, 1.0, 0.0, 1.0, 0.5);
+                      cairo_arc (cr, (x + xx) / (double)PANGO_SCALE, y / (double)PANGO_SCALE, 3.0, 0, 
2*G_PI);
+                      cairo_close_path (cr);
+                      cairo_fill (cr);
+
+                      char *s = g_strdup_printf ("%d", num);
+                      cairo_set_source_rgb (cr, 0, 0, 0);
+                      cairo_move_to (cr, (x + xx) / PANGO_SCALE - 5, y / PANGO_SCALE + 15);
+                      cairo_show_text (cr, s);
+                      g_free (s);
+                   }
+
+                  if (i < run->item->num_chars)
+                    {
+                      num++;
+                      p = g_utf8_next_char (p);
+                    }
+                  else
+                    trailing = TRUE;
+                }
+            }
+
+          cairo_restore (cr);
         }
 
       g_object_unref (lines);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]