[pango/pango2: 23/135] Add a parshape example




commit 3c4063b3c063760c5639029e79cb2212ee0e56d9
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Jan 18 08:04:24 2022 -0500

    Add a parshape example
    
    Use it like:
    
    parshape INPUT OUTPUT
    
    There's two input files provided.
    One in Latin and one in Hebrew.

 examples/lorem-ipsum-hebrew.txt |   3 +
 examples/lorem-ipsum.txt        |   2 +
 examples/meson.build            |   1 +
 examples/parshape.c             | 122 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 128 insertions(+)
---
diff --git a/examples/lorem-ipsum-hebrew.txt b/examples/lorem-ipsum-hebrew.txt
new file mode 100644
index 00000000..1721d666
--- /dev/null
+++ b/examples/lorem-ipsum-hebrew.txt
@@ -0,0 +1,3 @@
+בניגוד לטענה הרווחת, Lorem Ipsum אינו סתם טקסט רנדומלי. יש לו שורשים וחלקים מתוך הספרות הלטינית הקלאסית מאז 
45 לפני הספירה. מה שהופך אותו לעתיק מעל 2000 שנה. ריצ'רד מקלינטוק, פרופסור לטיני בקולג' של המפדן-סידני 
בורג'יניה, חיפש את אחת המילים המעורפלות ביותר בלטינית - consectetur - מתוך פסקאות של Lorem Ipsum ודרך ציטוטים 
של המילה מתוך הספרות הקלאסית, הוא גילה מקור בלתי ניתן לערעור. Lorem Ipsum מגיע מתוך מקטע 1.10.32 ו- 1.10.33 
של "de Finibus Bonorum et Malorum" (הקיצוניות של הטוב והרע) שנכתב על ידי קיקרו ב-45 לפני הספירה. ספר זה הוא 
מאמר על תאוריית האתיקה, שהיה מאוד מפורסם בתקופת הרנסנס. השורה הראשונ
 ה של "Lorem ipsum dolor sit amet", שמופיעה בטקסטים של Lorem Ipsum, באה משורה במקטע 1.10.32
+
+הפסקאות הסטנדרטיות של Lorem Ipsum שהיו בשימוש מאז המאה ה-16 משוחזרות בתחתית הדף לאלה שמעונייניםץ מקטעים 
1.10.32 ו- 1.10.33 מתוך "de Finibus Bonorum et Malorum" של קיקרו משוחזרים גם כן בצורתן המקורית מלווים בגרסה 
האנגלית משנת 1914, שתורגם על ידי ה. רקהם.
diff --git a/examples/lorem-ipsum.txt b/examples/lorem-ipsum.txt
new file mode 100644
index 00000000..b09bfa07
--- /dev/null
+++ b/examples/lorem-ipsum.txt
@@ -0,0 +1,2 @@
+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 f
 acilisi. Pellentesque at dolor sit amet purus dapibus pulvinar molestie quis neque. Suspendisse feugiat quam 
quis dolor accumsan cursus.
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem 
aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. 
Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni 
dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit 
amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam 
aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit 
laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea 
voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla 
pariatur?
diff --git a/examples/meson.build b/examples/meson.build
index d28127dc..ab32c0f9 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -5,6 +5,7 @@ if pango_cairo_backends.contains('png')
     'cairoshape',
     'cairosimple',
     'cairotwisted',
+    'parshape',
   ]
 endif
 
diff --git a/examples/parshape.c b/examples/parshape.c
new file mode 100644
index 00000000..69881d3c
--- /dev/null
+++ b/examples/parshape.c
@@ -0,0 +1,122 @@
+#include <pango/pango.h>
+#include <pango/pangocairo.h>
+
+int
+main (int argc, char *argv[])
+{
+  const char *filename;
+  PangoContext *context;
+  PangoLineBreaker *breaker;
+  int x, y, width;
+  PangoLines *lines;
+  int inc, m, w, w2;
+  cairo_surface_t *surface;
+  cairo_t *cr;
+  char *text;
+  gsize length;
+  GError *error = NULL;
+
+  if (argc != 3)
+    {
+      g_printerr ("Usage: %s INPUT_FILENAME OUTPUT_FILENAME\n", argv[0]);
+      return 1;
+    }
+
+  if (!g_file_get_contents (argv[1], &text, &length, &error))
+    {
+      g_printerr ("%s\n", error->message);
+      return 1;
+    }
+
+  filename = argv[2];
+
+  context = pango_font_map_create_context (pango_cairo_font_map_get_default ());
+
+  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);
+
+  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);
+
+  lines = pango_lines_new ();
+
+  m = 200;
+  w = 10;
+  w2 = -200;
+  inc = 40;
+
+  y = 40 * PANGO_SCALE;
+  x = (m - w / 2) * PANGO_SCALE;
+  width = w * PANGO_SCALE;
+
+  while (!pango_line_breaker_done (breaker))
+    {
+      PangoLine *line;
+      PangoRectangle ext;
+      gboolean ltr;
+
+      line = pango_line_breaker_next_line (breaker,
+                                           x, width,
+                                           PANGO_WRAP_CHAR,
+                                           PANGO_ELLIPSIZE_NONE);
+
+      pango_line_get_extents (line, NULL, &ext);
+      line = pango_line_justify (line, width);
+      pango_lines_add_line (lines, line, x, y - ext.y);
+
+      ltr = pango_line_breaker_get_direction (breaker) == PANGO_DIRECTION_LTR;
+
+      if (w2 > 0 && ltr && x <= m * PANGO_SCALE)
+        x = (m + w2 / 2) * PANGO_SCALE;
+      else if (w2 > 0 && !ltr && 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;
+
+          if (w2 > 0)
+            width = ((w - w2) / 2) * PANGO_SCALE;
+          else
+            width = w * PANGO_SCALE;
+
+          if (ltr)
+            x = (m - w / 2) * PANGO_SCALE;
+          else
+            x = (m + w / 2) * PANGO_SCALE;
+        }
+    }
+
+  for (int i = 0; i < pango_lines_get_line_count (lines); i++)
+    {
+      PangoLine *line = pango_lines_get_line (lines, i, &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_surface_write_to_png (surface, filename);
+  g_print ("Output written to %s\n", filename);
+
+  g_object_unref (lines);
+  g_object_unref (breaker);
+
+  cairo_surface_destroy (surface);
+  cairo_destroy (cr);
+
+  g_object_unref (context);
+
+  return 0;
+}


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