📄 viewer-render.c
字号:
g_object_unref (layout);}static gbooleanparse_enum (GType type, int *value, const char *name, const char *arg, gpointer data, GError **error){ char *possible_values = NULL; gboolean ret; ret = pango_parse_enum (type, arg, value, FALSE, &possible_values); if (!ret && error) { g_set_error(error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "Argument for %s must be one of %s", name, possible_values); ret = FALSE; } g_free (possible_values); return ret;}static gbooleanparse_align (const char *name, const char *arg, gpointer data, GError **error){ return parse_enum (PANGO_TYPE_ALIGNMENT, &opt_align, name, arg, data, error);}static gbooleanparse_ellipsis (const char *name, const char *arg, gpointer data, GError **error){ return parse_enum (PANGO_TYPE_ELLIPSIZE_MODE, &opt_ellipsize, name, arg, data, error);}static gbooleanparse_gravity (const char *name, const char *arg, gpointer data, GError **error){ return parse_enum (PANGO_TYPE_GRAVITY, &opt_gravity, name, arg, data, error);}static gbooleanparse_gravity_hint (const char *name, const char *arg, gpointer data, GError **error){ return parse_enum (PANGO_TYPE_GRAVITY_HINT, &opt_gravity_hint, name, arg, data, error);}static gbooleanparse_hinting (const char *name, const char *arg, gpointer data, GError **error){ gboolean ret = TRUE; if (strcmp (arg, "none") == 0) opt_hinting = HINT_NONE; else if (strcmp (arg, "auto") == 0) opt_hinting = HINT_AUTO; else if (strcmp (arg, "full") == 0) opt_hinting = HINT_FULL; else { g_set_error(error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "Argument for --hinting must be one of none/auto/full"); ret = FALSE; } return ret;}static gbooleanparse_wrap (const char *name, const char *arg, gpointer data, GError **error){ gboolean ret; if ((ret = parse_enum (PANGO_TYPE_WRAP_MODE, &opt_wrap, name, arg, data, error))) { opt_wrap_set = TRUE; } return ret;}static gchar *backends_to_string (void){ GString *backends = g_string_new (NULL); const PangoViewer **viewer; for (viewer = viewers; *viewer; viewer++) if ((*viewer)->id) { g_string_append (backends, (*viewer)->id); g_string_append_c (backends, '/'); } g_string_truncate (backends, MAX (0, (gint)backends->len - 1)); return g_string_free(backends,FALSE);}static intbackends_get_count (void){ const PangoViewer **viewer; int i = 0; for (viewer = viewers; *viewer; viewer++) if ((*viewer)->id) i++; return i;}static gchar *backend_description (void){ GString *description = g_string_new("Pango backend to use for rendering "); int backends_count = backends_get_count (); if (backends_count > 1) g_string_append_printf(description,"(default: %s)", (*viewers)->id); else if (backends_count == 1) g_string_append_printf(description,"(only available: %s)", (*viewers)->id); else g_string_append_printf(description,"(no backends found!)"); return g_string_free(description,FALSE);}static gbooleanparse_backend (const char *name, const char *arg, gpointer data, GError **error){ gboolean ret = TRUE; const PangoViewer **viewer; for (viewer = viewers; *viewer; viewer++) if (!g_ascii_strcasecmp ((*viewer)->id, arg)) break; if (*viewer) opt_viewer = *viewer; else { gchar *backends = backends_to_string (); g_set_error(error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "Available --backend options are: %s", backends); g_free(backends); ret = FALSE; } return ret;}static gbooleanshow_version(const char *name, const char *arg, gpointer data, GError **error){ g_printf("%s (%s) %s\n", prog_name, PACKAGE_NAME, PACKAGE_VERSION); g_printf("module interface version: %s\n", MODULE_VERSION); if (PANGO_VERSION != pango_version()) g_printf("\nLinked Pango library has a different version: %s\n", pango_version_string ()); exit(0);}voidparse_options (int argc, char *argv[]){ gchar *backend_options = backends_to_string (); GOptionFlags backend_flag = backends_get_count () > 1 ? 0 : G_OPTION_FLAG_HIDDEN; gchar *backend_desc = backend_description (); GOptionEntry entries[] = { {"no-auto-dir", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &opt_auto_dir, "No layout direction according to contents", NULL}, {"backend", 0, backend_flag, G_OPTION_ARG_CALLBACK, &parse_backend, backend_desc, backend_options}, {"no-display", 'q', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &opt_display, "Do not display (just write to file or whatever)", NULL}, {"dpi", 0, 0, G_OPTION_ARG_INT, &opt_dpi, "Set the resolution", "number"}, {"align", 0, 0, G_OPTION_ARG_CALLBACK, &parse_align, "Text alignment", "left/center/right"}, {"ellipsize", 0, 0, G_OPTION_ARG_CALLBACK, &parse_ellipsis, "Ellipsization mode", "start/middle/end"}, {"font", 0, 0, G_OPTION_ARG_STRING, &opt_font, "Set the font description", "description"}, {"gravity", 0, 0, G_OPTION_ARG_CALLBACK, &parse_gravity, "Base gravity: glyph rotation", "south/east/north/west/auto"}, {"gravity-hint", 0, 0, G_OPTION_ARG_CALLBACK, &parse_gravity_hint, "Gravity hint", "natural/strong/line"}, {"header", 0, 0, G_OPTION_ARG_NONE, &opt_header, "Display the options in the output", NULL}, {"height", 0, 0, G_OPTION_ARG_INT, &opt_height, "Height in points (positive) or number of lines (negative) for ellipsizing", "+points/-numlines"}, {"hinting", 0, 0, G_OPTION_ARG_CALLBACK, &parse_hinting, "Hinting style", "none/auto/full"}, {"indent", 0, 0, G_OPTION_ARG_INT, &opt_indent, "Width in points to indent paragraphs", "points"}, {"justify", 0, 0, G_OPTION_ARG_NONE, &opt_justify, "Align paragraph lines to be justified", NULL}, {"language", 0, 0, G_OPTION_ARG_STRING, &opt_language, "Language to use for font selection", "en_US/etc"}, {"margin", 0, 0, G_OPTION_ARG_INT, &opt_margin, "Set the margin on the output in pixels", "pixels"}, {"markup", 0, 0, G_OPTION_ARG_NONE, &opt_markup, "Interpret text as Pango markup", NULL}, {"output", 'o', 0, G_OPTION_ARG_STRING, &opt_output, "Save rendered image to output file", "file"}, {"pangorc", 0, 0, G_OPTION_ARG_STRING, &opt_pangorc, "pangorc file to use (default is ./pangorc)", "file"}, {"rtl", 0, 0, G_OPTION_ARG_NONE, &opt_rtl, "Set base direction to right-to-left", NULL}, {"rotate", 0, 0, G_OPTION_ARG_DOUBLE, &opt_rotate, "Angle at which to rotate results", "degrees"}, {"runs", 'n', 0, G_OPTION_ARG_INT, &opt_runs, "Run Pango layout engine this many times", "integer"}, {"single-par", 0, 0, G_OPTION_ARG_NONE, &opt_single_par, "Enable single-paragraph mode", NULL}, {"text", 't', 0, G_OPTION_ARG_STRING, &opt_text, "Text to display (instead of a file)", "string"}, {"version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, &show_version, "Show version numbers", NULL}, {"waterfall", 0, 0, G_OPTION_ARG_NONE, &opt_waterfall, "Create a waterfall display", NULL}, {"width", 'w', 0, G_OPTION_ARG_INT, &opt_width, "Width in points to which to wrap lines or ellipsize", "points"}, {"wrap", 0, 0, G_OPTION_ARG_CALLBACK, &parse_wrap, "Text wrapping mode (needs a width to be set)", "word/char/word-char"}, {NULL} }; GError *error = NULL; GError *parse_error = NULL; GOptionContext *context; size_t len; prog_name = g_path_get_basename (argv[0]); context = g_option_context_new ("- FILE"); g_option_context_add_main_entries (context, entries, NULL); if (!g_option_context_parse (context, &argc, &argv, &parse_error)) { if (parse_error != NULL) fail("%s", parse_error->message); else fail("Option parse error"); exit(1); } g_option_context_free(context); g_free(backend_options); g_free(backend_desc); if ((opt_text && argc != 1) || (!opt_text && argc != 2)) { if (opt_text && argc != 1) fail ("When specifying --text, no file should be given"); g_printerr ("Usage: %s [OPTION...] FILE\n", prog_name); exit (1); } /* set up the backend */ if (!opt_viewer) { opt_viewer = *viewers; if (!opt_viewer) fail ("No viewer backend found"); } /* Get the text */ if (opt_text) { text = g_strdup (opt_text); len = strlen (text); } else { if (!g_file_get_contents (argv[1], &text, &len, &error)) fail ("%s\n", error->message); } /* Strip one trailing newline */ if (len > 0 && text[len - 1] == '\n') len--; if (len > 0 && text[len - 1] == '\r') len--; text[len] = '\0'; /* Make sure we have valid markup */ if (opt_markup && !pango_parse_markup (text, -1, 0, NULL, NULL, NULL, &error)) fail ("Cannot parse input as markup: %s", error->message); /* Setup PANGO_RC_FILE */ if (!opt_pangorc) if (g_file_test ("./pangorc", G_FILE_TEST_IS_REGULAR)) opt_pangorc = "./pangorc"; if (opt_pangorc) g_setenv ("PANGO_RC_FILE", opt_pangorc, TRUE);}voidfinalize (void){ g_free (text);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -