summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-01-24 01:25:17 -0500
committerMatthias Clasen <mclasen@redhat.com>2022-01-24 10:58:17 -0500
commitdfaa73d42584bd76d6cad45954746116eb553db9 (patch)
tree91ea160792e46efe86aefbf0f162c615734c8890
parent2970621f1d7f9d91a8af361d98ecd8827472c535 (diff)
downloadpango-dfaa73d42584bd76d6cad45954746116eb553db9.tar.gz
Add a text flow example
This formats text in two columns. Use it like: columns INPUT OUTPUT
-rw-r--r--examples/columns.c134
-rw-r--r--examples/meson.build1
2 files changed, 135 insertions, 0 deletions
diff --git a/examples/columns.c b/examples/columns.c
new file mode 100644
index 00000000..063127b6
--- /dev/null
+++ b/examples/columns.c
@@ -0,0 +1,134 @@
+#include <pango/pango.h>
+#include <pango/pangocairo.h>
+
+int
+main (int argc, char *argv[])
+{
+ const char *filename;
+ PangoContext *context;
+ PangoLineBreaker *breaker;
+ int margin;
+ int x, y, width, height;
+ int x0, y0;
+ int col;
+ PangoLines *lines;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+ char *text;
+ gsize length;
+ PangoAttrList *attrs;
+ 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, 600, 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));
+
+ attrs = pango_attr_list_new ();
+
+ pango_line_breaker_add_text (breaker, text, -1, attrs);
+
+ pango_attr_list_unref (attrs);
+
+ lines = pango_lines_new ();
+
+ /* We do 2 columns, followed by 3 columns, to demonstrate changing
+ * line width.
+ */
+ margin = 20;
+ x = x0 = margin * PANGO_SCALE;
+ y = y0 = margin * PANGO_SCALE;
+ width = (300 - 2 * margin) * PANGO_SCALE;
+ height = (300 - margin) * PANGO_SCALE;
+ col = 0;
+
+ while (!pango_line_breaker_done (breaker))
+ {
+ PangoLayoutLine *line;
+ PangoRectangle ext;
+
+retry:
+ line = pango_line_breaker_next_line (breaker,
+ x, width,
+ PANGO_WRAP_CHAR,
+ PANGO_ELLIPSIZE_NONE);
+
+ if (!pango_layout_line_ends_paragraph (line))
+ line = pango_layout_line_justify (line, width);
+
+ pango_layout_line_get_trimmed_extents (line, PANGO_LEADING_TRIM_NONE, &ext);
+
+ if (y + ext.height > height)
+ {
+ gboolean width_changed = FALSE;
+
+ if (col == 0)
+ x0 += 300 * PANGO_SCALE;
+ else if (col == 1)
+ {
+ x0 = margin * PANGO_SCALE;
+ y0 = (300 + margin) * PANGO_SCALE;
+ width = (200 - 2 * margin) * PANGO_SCALE;
+ height = (600 - 2 * margin) * PANGO_SCALE;
+
+ width_changed = TRUE;
+ }
+ else
+ x0 += 200 * PANGO_SCALE;
+
+ x = x0;
+ y = y0;
+
+ col++;
+
+ if (width_changed &&
+ pango_line_breaker_undo_line (breaker, line))
+ {
+ g_object_unref (line);
+ goto retry;
+ }
+ }
+
+ pango_lines_add_line (lines, line, x, y - ext.y);
+
+ y += ext.height;
+ }
+
+ pango_cairo_show_lines (cr, lines);
+
+ 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);
+
+ g_free (text);
+
+ return 0;
+}
diff --git a/examples/meson.build b/examples/meson.build
index 231d9826..d5f6886a 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -6,6 +6,7 @@ if pango_cairo_backends.contains('png')
'cairosimple',
'cairotwisted',
'parshape',
+ 'columns',
]
endif