summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-08-30 02:43:31 +0000
committerMatthias Clasen <mclasen@redhat.com>2021-08-30 02:43:31 +0000
commitdfcb602b49175ecc0d8d9c76b0da134e67693a9a (patch)
tree333605f466be5140d2d98df03ca4e5406f238e24
parent46ab19d84e72171ca9c90b2cf39ab272c3b3ad5e (diff)
parentd3359121ecd48949f26541a95bf5c9957fc37322 (diff)
downloadpango-dfcb602b49175ecc0d8d9c76b0da134e67693a9a.tar.gz
Merge branch 'matthiasc/for-main' into 'main'
pango-view: Redo --annotate option See merge request GNOME/pango!459
-rw-r--r--utils/viewer-pangocairo.c82
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;