summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-08-25 16:23:28 +0000
committerMatthias Clasen <mclasen@redhat.com>2021-08-25 16:23:28 +0000
commit4b2a307f2f7a68fe5ebacbf30218ca3417287228 (patch)
treef6d26729d2a2af716fef58895cd6020d1437fee3
parent3aee7615e9a123ae750e49e9864bdaa4b267cdbb (diff)
parent5fd03a1b09f723d34a0208606dd070e274484641 (diff)
downloadpango-4b2a307f2f7a68fe5ebacbf30218ca3417287228.tar.gz
Merge branch 'matthiasc/for-main' into 'main'
pango-viewer: Visualize caret positions See merge request GNOME/pango!437
-rw-r--r--utils/viewer-pangocairo.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/utils/viewer-pangocairo.c b/utils/viewer-pangocairo.c
index 77201666..1c0494de 100644
--- a/utils/viewer-pangocairo.c
+++ b/utils/viewer-pangocairo.c
@@ -157,7 +157,8 @@ enum {
ANNOTATE_RUN_EXTENTS = 32,
ANNOTATE_CLUSTER_EXTENTS = 64,
ANNOTATE_CHAR_EXTENTS = 128,
- ANNOTATE_LAST = 256,
+ ANNOTATE_CARET_POSITIONS = 256,
+ ANNOTATE_LAST = 512,
};
static void
@@ -405,6 +406,53 @@ render_callback (PangoLayout *layout,
pango_layout_iter_free (iter);
cairo_restore (cr);
}
+
+ if (annotate & ANNOTATE_CARET_POSITIONS)
+ {
+ /* draw the caret positions in purple */
+ cairo_save (cr);
+ cairo_set_source_rgba (cr, 1.0, 0.0, 1.0, 0.5);
+
+ iter = pango_layout_get_iter (layout);
+ do
+ {
+ PangoRectangle rect;
+ PangoLayoutRun *run;
+ const char *text, *start, *end, *p;
+
+ pango_layout_iter_get_run_extents (iter, NULL, &rect);
+ run = pango_layout_iter_get_run_readonly (iter);
+
+ if (!run)
+ continue;
+
+ text = pango_layout_get_text (layout);
+ start =text + run->item->offset;
+ end = start + run->item->length;
+ for (p = start; p < end; p = g_utf8_next_char (p))
+ {
+ int x, y;
+
+ pango_glyph_string_index_to_x (run->glyphs,
+ text + run->item->offset,
+ run->item->length,
+ &run->item->analysis,
+ p - start,
+ FALSE,
+ &x);
+ x += rect.x;
+ y = pango_layout_iter_get_baseline (iter);
+
+ cairo_arc (cr, x / PANGO_SCALE, y / PANGO_SCALE, 3.0, 0, 2*G_PI);
+ cairo_close_path (cr);
+ cairo_fill (cr);
+ }
+ }
+ while (pango_layout_iter_next_run (iter));
+ pango_layout_iter_free (iter);
+
+ cairo_restore (cr);
+ }
}
cairo_move_to (cr, 0, 0);
@@ -559,7 +607,9 @@ pangocairo_view_get_option_group (const PangoViewer *klass G_GNUC_UNUSED)
"\t\t\t\t\t\t\t 16 - line extents\n"
"\t\t\t\t\t\t\t 32 - run extents\n"
"\t\t\t\t\t\t\t 64 - cluster extents\n"
- "\t\t\t\t\t\t\t 128 - char extents", "FLAGS"},
+ "\t\t\t\t\t\t\t 128 - char extents\n"
+ "\t\t\t\t\t\t\t 256 - caret positions",
+ "FLAGS"},
{NULL}
};
GOptionGroup *group;