[pango/line-breaker: 14/18] parshape example




commit 7cd9e2eaea812a9f384483f31b85f02f68e36595
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Jan 15 00:56:56 2022 -0500

    parshape example

 tests/test-renderer.c | 64 ++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 46 insertions(+), 18 deletions(-)
---
diff --git a/tests/test-renderer.c b/tests/test-renderer.c
index 59a6e531..8cc38739 100644
--- a/tests/test-renderer.c
+++ b/tests/test-renderer.c
@@ -9,25 +9,28 @@ main (int argc, char *argv[])
   cairo_surface_t *surface;
   cairo_t *cr;
   const char *text =
-      "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n"
-      "Nullam fringilla, est ut feugiat ultrices, elit lacus ultricies nibh, id commodo tortor nisi id 
elit.\n"
-      "Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.\n"
-      "Morbi vel elit erat. Maecenas dignissim, dui et pharetra rutrum, tellus lectus rutrum mi, a convallis 
libero nisi quis tellus.\n"
-      "Nulla facilisi. Nullam eleifend lobortis nisl, in porttitor tellus malesuada vitae.\n"
-      "Aenean lacus tellus, pellentesque quis molestie quis, fringilla in arcu.\n"
-      "Duis elementum, tellus sed tristique semper, metus metus accumsan augue, et porttitor augue orci a 
libero.\n"
-      "Ut sed justo ac felis placerat laoreet sed id sem. Proin mattis tincidunt odio vitae tristique.\n"
-      "Morbi massa libero, congue vitae scelerisque vel, ultricies vel nisl.\n"
-      "Vestibulum in tortor diam, quis aliquet quam. Praesent ut justo neque, tempus rutrum est.\n"
-      "Duis eu lectus quam. Vivamus eget metus a mauris molestie venenatis pulvinar eleifend nisi.\n"
-      "Nulla facilisi. Pellentesque at dolor sit amet purus dapibus pulvinar molestie quis neque.\n"
+      "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
+      "Nullam fringilla, est ut feugiat ultrices, elit lacus ultricies nibh, id commodo tortor nisi id elit. 
"
+      "Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. "
+      "Morbi vel elit erat. Maecenas dignissim, dui et pharetra rutrum, tellus lectus rutrum mi, a convallis 
libero nisi quis tellus. "
+      "Nulla facilisi. Nullam eleifend lobortis nisl, in porttitor tellus malesuada vitae. "
+      "Aenean lacus tellus, pellentesque quis molestie quis, fringilla in arcu. "
+      "Duis elementum, tellus sed tristique semper, metus metus accumsan augue, et porttitor augue orci a 
libero. "
+      "Ut sed justo ac felis placerat laoreet sed id sem. Proin mattis tincidunt odio vitae tristique. "
+      "Morbi massa libero, congue vitae scelerisque vel, ultricies vel nisl. "
+      "Vestibulum in tortor diam, quis aliquet quam. Praesent ut justo neque, tempus rutrum est. "
+      "Duis eu lectus quam. Vivamus eget metus a mauris molestie venenatis pulvinar eleifend nisi. "
+      "Nulla facilisi. Pellentesque at dolor sit amet purus dapibus pulvinar molestie quis neque. "
       "Suspendisse feugiat quam quis dolor accumsan cursus.";
 
   //text = "ABC\nDEF\nGHI";
   context = pango_font_map_create_context (pango_cairo_font_map_get_default ());
 
-  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 400, 400);
+  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 400, 600);
   cr = cairo_create (surface);
+  cairo_set_source_rgb (cr, 1, 1, 1);
+  cairo_paint (cr);
+  cairo_set_source_rgb (cr, 0, 0, 0);
 
   if (argc > 1 && strcmp (argv[1], "--layout") == 0)
     {
@@ -61,6 +64,7 @@ main (int argc, char *argv[])
       PangoLineBreaker *breaker;
       int x, y, width;
       PangoLines *lines;
+      int inc, m, w, w2;
 
       breaker = pango_line_breaker_new (context);
 
@@ -70,8 +74,14 @@ main (int argc, char *argv[])
 
       lines = pango_lines_new ();
 
-      x = y = 0;
-      width = 200 * PANGO_SCALE;
+      m = 200;
+      w = 10;
+      w2 = -200;
+      inc = 40;
+
+      y = 10 * PANGO_SCALE;
+      x = (m - w / 2) * PANGO_SCALE;
+      width = w * PANGO_SCALE;
 
       while (!pango_line_breaker_done (breaker))
         {
@@ -80,12 +90,30 @@ main (int argc, char *argv[])
 
           line = pango_line_breaker_next_line (breaker,
                                                x, width,
-                                               PANGO_WRAP_WORD,
+                                               PANGO_WRAP_CHAR,
                                                PANGO_ELLIPSIZE_NONE,
-                                               PANGO_ALIGNMENT_LEFT);
+                                               PANGO_ALIGNMENT_JUSTIFY);
           pango_lines_add_line (lines, line, x, y);
+
           pango_line_get_extents (line, &ext);
-          y += ext.height;
+
+          if (w2 > 0 && x < m * PANGO_SCALE)
+            x = (m + w2 / 2) * PANGO_SCALE;
+          else
+            {
+              y += ext.height;
+
+              w += inc;
+              w2 += inc;
+              if (w + inc >= 340 || w + inc < 0)
+                inc = - inc;
+
+              x = (m - w / 2) * PANGO_SCALE;
+              if (w2 > 0)
+                width = ((w - w2) / 2) * PANGO_SCALE;
+              else
+                width = w * PANGO_SCALE;
+            }
         }
 
       for (int i = 0; i < pango_lines_get_n_lines (lines); i++)


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