diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-08-29 22:35:04 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-08-29 22:35:04 -0400 |
commit | d3359121ecd48949f26541a95bf5c9957fc37322 (patch) | |
tree | 333605f466be5140d2d98df03ca4e5406f238e24 | |
parent | 46ab19d84e72171ca9c90b2cf39ab272c3b3ad5e (diff) | |
download | pango-d3359121ecd48949f26541a95bf5c9957fc37322.tar.gz |
pango-view: Redo --annotate option
Parse the argument as a comma-separated list
of names. The old numeric arguments still work.
-rw-r--r-- | utils/viewer-pangocairo.c | 82 |
1 files changed, 68 insertions, 14 deletions
diff --git a/utils/viewer-pangocairo.c b/utils/viewer-pangocairo.c index b35f6f3b..98591e5a 100644 --- a/utils/viewer-pangocairo.c +++ b/utils/viewer-pangocairo.c @@ -163,6 +163,29 @@ enum { ANNOTATE_LAST = 2048, }; +static struct { + int value; + const char *name; + const char *short_name; +} annotate_options[] = { + { ANNOTATE_GRAVITY_ROOF, "gravity-roof", "gravity" }, + { ANNOTATE_BLOCK_PROGRESSION, "block-progression", "progression" }, + { ANNOTATE_BASELINES, "baselines", "baselines" }, + { ANNOTATE_LAYOUT_EXTENTS, "layout-extents", "layout" }, + { ANNOTATE_LINE_EXTENTS, "line-extents", "line" }, + { ANNOTATE_RUN_EXTENTS, "run-extents", "run" }, + { ANNOTATE_CLUSTER_EXTENTS, "cluster-extents", "cluster" }, + { ANNOTATE_CHAR_EXTENTS, "char-extents", "char" }, + { ANNOTATE_GLYPH_EXTENTS, "glyph-extents", "glyph" }, + { ANNOTATE_CARET_POSITIONS, "caret-positions", "caret" }, + { ANNOTATE_CARET_SLOPE, "caret-slope", "slope" }, +}; + +static const char *annotate_arg_help = + "Annotate the output. Comma-separated list of\n" + "\t\t\t\t\t\t gravity, progression, baselines, layout, line,\n" + "\t\t\t\t\t\t run, cluster, char, glyph, care, slope\n"; + static void render_callback (PangoLayout *layout, int x, @@ -722,25 +745,56 @@ pangocairo_view_display (gpointer instance, state); } +static gboolean +parse_annotate_arg (const char *option_name, + const char *value, + gpointer data, + GError **error) +{ + guint64 num; + + if (!g_ascii_string_to_unsigned (value, 10, 0, ANNOTATE_LAST - 1, &num, NULL)) + { + char **parts; + int i, j; + + parts = g_strsplit (value, ",", 0); + num = 0; + for (i = 0; parts[i]; i++) + { + for (j = 0; j < G_N_ELEMENTS (annotate_options); j++) + { + if (strcmp (parts[i], annotate_options[j].name) == 0 || + strcmp (parts[i], annotate_options[j].short_name) == 0) + { + num |= annotate_options[j].value; + break; + } + } + + if (j == G_N_ELEMENTS (annotate_options)) + { + g_set_error (error, + G_OPTION_ERROR, G_OPTION_ERROR_FAILED, + "%s is not an allowed value for %s. " + "See --help-cairo", parts[i], option_name); + return FALSE; + } + } + + g_strfreev (parts); + } + + opt_annotate = num; + return TRUE; +} + static GOptionGroup * pangocairo_view_get_option_group (const PangoViewer *klass G_GNUC_UNUSED) { GOptionEntry entries[] = { - {"annotate", 0, 0, G_OPTION_ARG_INT, &opt_annotate, - "Annotate the output\n" - "\t\t\t\t\t\t\t 1 - gravity\n" - "\t\t\t\t\t\t\t 2 - block progression\n" - "\t\t\t\t\t\t\t 4 - baselines\n" - "\t\t\t\t\t\t\t 8 - layout extents\n" - "\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\n" - "\t\t\t\t\t\t\t 256 - glyph extents\n" - "\t\t\t\t\t\t\t 512 - caret positions\n" - "\t\t\t\t\t\t\t 1024 - caret slope\n", - "FLAGS"}, + {"annotate", 0, 0, G_OPTION_ARG_CALLBACK, parse_annotate_arg, annotate_arg_help, "FLAGS"}, {NULL} }; GOptionGroup *group; |