[pango/line-breaker: 15/16] test-render: adapt
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/line-breaker: 15/16] test-render: adapt
- Date: Tue, 18 Jan 2022 04:02:21 +0000 (UTC)
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]