summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-01-18 08:04:24 -0500
committerMatthias Clasen <mclasen@redhat.com>2022-01-24 10:58:17 -0500
commit2970621f1d7f9d91a8af361d98ecd8827472c535 (patch)
treefdbd3c375308c3f6d29258c05c335b9251a1abd1
parente1a1a40069ce59e63f2baead4f8bfe25f745b5d5 (diff)
downloadpango-2970621f1d7f9d91a8af361d98ecd8827472c535.tar.gz
Add a parshape example
Use it like: parshape INPUT OUTPUT There's two input files provided. One in Latin and one in Hebrew.
-rw-r--r--examples/lorem-ipsum-hebrew.txt3
-rw-r--r--examples/lorem-ipsum.txt2
-rw-r--r--examples/meson.build1
-rw-r--r--examples/parshape.c122
4 files changed, 128 insertions, 0 deletions
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 facilisi. 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 0ec3860e..231d9826 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;
+}