diff options
author | Owen Taylor <otaylor@redhat.com> | 2004-07-10 22:11:49 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2004-07-10 22:11:49 +0000 |
commit | bfafb05de97e187fbbb85c83f4c7b59203a62439 (patch) | |
tree | 4485cb0ce5e8364caea44b9e4d967905769f07b1 | |
parent | bd2b21c9f509b3e2f518980b05d56f3d0dd4f2a7 (diff) | |
download | pango-bfafb05de97e187fbbb85c83f4c7b59203a62439.tar.gz |
Split most of the guts of pangoft2topgm.c into separate source files to
Sat Jul 10 18:06:21 2004 Owen Taylor <otaylor@redhat.com>
* examples/renderdemo.[ch] examples/Makefile.am
examples/pangoft2topgm.c: Split most of the guts
of pangoft2topgm.c into separate source files
to allow creation of new rendering demos for
different backends.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ChangeLog.pre-1-10 | 8 | ||||
-rw-r--r-- | ChangeLog.pre-1-6 | 8 | ||||
-rw-r--r-- | ChangeLog.pre-1-8 | 8 | ||||
-rw-r--r-- | examples/Makefile.am | 8 | ||||
-rw-r--r-- | examples/pangoft2topgm.c | 378 | ||||
-rw-r--r-- | examples/renderdemo.c | 276 | ||||
-rw-r--r-- | examples/renderdemo.h | 55 |
8 files changed, 177 insertions, 572 deletions
@@ -1,3 +1,11 @@ +Sat Jul 10 18:06:21 2004 Owen Taylor <otaylor@redhat.com> + + * examples/renderdemo.[ch] examples/Makefile.am + examples/pangoft2topgm.c: Split most of the guts + of pangoft2topgm.c into separate source files + to allow creation of new rendering demos for + different backends. + Sat Jul 10 18:03:58 2004 Owen Taylor <otaylor@redhat.com> * pango/pangofc-fontmap.c (pango_fc_font_map_new_font): diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10 index b941f7ad..efac9f13 100644 --- a/ChangeLog.pre-1-10 +++ b/ChangeLog.pre-1-10 @@ -1,3 +1,11 @@ +Sat Jul 10 18:06:21 2004 Owen Taylor <otaylor@redhat.com> + + * examples/renderdemo.[ch] examples/Makefile.am + examples/pangoft2topgm.c: Split most of the guts + of pangoft2topgm.c into separate source files + to allow creation of new rendering demos for + different backends. + Sat Jul 10 18:03:58 2004 Owen Taylor <otaylor@redhat.com> * pango/pangofc-fontmap.c (pango_fc_font_map_new_font): diff --git a/ChangeLog.pre-1-6 b/ChangeLog.pre-1-6 index b941f7ad..efac9f13 100644 --- a/ChangeLog.pre-1-6 +++ b/ChangeLog.pre-1-6 @@ -1,3 +1,11 @@ +Sat Jul 10 18:06:21 2004 Owen Taylor <otaylor@redhat.com> + + * examples/renderdemo.[ch] examples/Makefile.am + examples/pangoft2topgm.c: Split most of the guts + of pangoft2topgm.c into separate source files + to allow creation of new rendering demos for + different backends. + Sat Jul 10 18:03:58 2004 Owen Taylor <otaylor@redhat.com> * pango/pangofc-fontmap.c (pango_fc_font_map_new_font): diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8 index b941f7ad..efac9f13 100644 --- a/ChangeLog.pre-1-8 +++ b/ChangeLog.pre-1-8 @@ -1,3 +1,11 @@ +Sat Jul 10 18:06:21 2004 Owen Taylor <otaylor@redhat.com> + + * examples/renderdemo.[ch] examples/Makefile.am + examples/pangoft2topgm.c: Split most of the guts + of pangoft2topgm.c into separate source files + to allow creation of new rendering demos for + different backends. + Sat Jul 10 18:03:58 2004 Owen Taylor <otaylor@redhat.com> * pango/pangofc-fontmap.c (pango_fc_font_map_new_font): diff --git a/examples/Makefile.am b/examples/Makefile.am index f13b957d..e5834148 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -16,13 +16,17 @@ INCLUDES = \ CLEANFILES = pango.modules ################################################### +noinst_PROGRAMS = + ################################################### if HAVE_FREETYPE -ft2_programs = pangoft2topgm +noinst_PROGRAMS += pangoft2topgm endif pangoft2topgm_SOURCES = \ pangoft2topgm.c \ + renderdemo.c \ + renderdemo.h \ argcontext.c \ argcontext.h pangoft2topgm_LDADD = \ @@ -31,8 +35,6 @@ pangoft2topgm_LDADD = \ $(FREETYPE_LIBS) ################################################### -noinst_PROGRAMS = $(ft2_programs) - if CROSS_COMPILING else all-local: pango.modules diff --git a/examples/pangoft2topgm.c b/examples/pangoft2topgm.c index 106f9c8a..52370383 100644 --- a/examples/pangoft2topgm.c +++ b/examples/pangoft2topgm.c @@ -21,388 +21,38 @@ * Boston, MA 02111-1307, USA. */ -#define BUFSIZE 1024 -#define MALLOCSIZE 1024 -#define DEFAULT_FONT_FAMILY "Sans" -#define DEFAULT_FONT_SIZE 18 - #include <errno.h> -#include <math.h> -#include <stdarg.h> #include <stdlib.h> #include <stdio.h> #include <string.h> -#include "argcontext.h" +#include "renderdemo.h" -#include <pango/pango.h> #include <pango/pangoft2.h> -#define _MAKE_FONT_NAME(family, size) family " " #size -#define MAKE_FONT_NAME(family, size) _MAKE_FONT_NAME(family, size) - -static char *prog_name; -static PangoContext *context; - static char *tmpfile_name; -static char *outfile_name; - -static gboolean opt_display = FALSE; -static int opt_dpi = 96; -static char *opt_font = MAKE_FONT_NAME (DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE); -static gboolean opt_header = FALSE; -static char *opt_output = NULL; -static int opt_margin = 10; -static int opt_markup = FALSE; -static gboolean opt_rtl = FALSE; -static int opt_rotate = 0; -static gboolean opt_auto_dir = TRUE; -static char *opt_text = NULL; -static gboolean opt_waterfall = FALSE; -static int opt_width = -1; -static int opt_indent = 0; - -static void fail (const char *format, ...) G_GNUC_PRINTF (1, 2); - -static void -fail (const char *format, ...) -{ - const char *msg; - - va_list vap; - va_start (vap, format); - msg = g_strdup_vprintf (format, vap); - g_printerr ("%s: %s\n", prog_name, msg); - - if (outfile_name && !opt_output) - remove (outfile_name); - - exit (1); -} - -PangoFontDescription * -get_font_description (void) -{ - PangoFontDescription *font_description = pango_font_description_from_string (opt_font); - - if ((pango_font_description_get_set_fields (font_description) & PANGO_FONT_MASK_FAMILY) == 0) - pango_font_description_set_family (font_description, DEFAULT_FONT_FAMILY); - - if ((pango_font_description_get_set_fields (font_description) & PANGO_FONT_MASK_SIZE) == 0) - pango_font_description_set_size (font_description, DEFAULT_FONT_SIZE * PANGO_SCALE); - - return font_description; -} - -static PangoLayout * -make_layout(PangoContext *context, - const char *text, - double size) -{ - static PangoFontDescription *font_description; - PangoDirection base_dir; - PangoLayout *layout; - - layout = pango_layout_new (context); - if (opt_markup) - pango_layout_set_markup (layout, text, -1); - else - pango_layout_set_text (layout, text, -1); - - pango_layout_set_auto_dir (layout, opt_auto_dir); - - font_description = get_font_description (); - if (size > 0) - pango_font_description_set_size (font_description, size * PANGO_SCALE); - - if (opt_width > 0) - pango_layout_set_width (layout, (opt_width * opt_dpi * PANGO_SCALE + 32) / 72); - - if (opt_indent != 0) - pango_layout_set_indent (layout, (opt_indent * opt_dpi * PANGO_SCALE + 32) / 72); - - base_dir = pango_context_get_base_dir (context); - pango_layout_set_alignment (layout, - base_dir == PANGO_DIRECTION_LTR ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT); - - pango_layout_set_font_description (layout, font_description); - - pango_font_description_free (font_description); - - return layout; -} - -static gchar * -get_options_string (void) -{ - PangoFontDescription *font_description = get_font_description (); - gchar *font_name; - gchar *result; - - if (opt_waterfall) - pango_font_description_unset_fields (font_description, PANGO_FONT_MASK_SIZE); - - font_name = pango_font_description_to_string (font_description); - result = g_strdup_printf ("%s: dpi=%d", font_name, opt_dpi); - pango_font_description_free (font_description); - g_free (font_name); - - return result; -} - -static void -transform_point (PangoMatrix *matrix, - double x_in, - double y_in, - double *x_out, - double *y_out) -{ - *x_out = x_in * matrix->xx + y_in * matrix->xy + matrix->x0; - *y_out = x_in * matrix->yx + y_in * matrix->yy + matrix->y0; -} - -static void -output_body (PangoContext *context, - const char *text, - FT_Bitmap *bitmap, - PangoMatrix *matrix, - int *width, - int *height) -{ - PangoLayout *layout; - PangoRectangle logical_rect; - int size, start_size, end_size, increment; - int dy; - - if (opt_waterfall) - { - start_size = 8; - end_size = 48; - increment = 4; - } - else - { - start_size = end_size = -1; - increment = 1; - } - - *width = 0; - *height = 0; - dy = 0; - - for (size = start_size; size <= end_size; size += increment) - { - pango_context_set_matrix (context, matrix); - - layout = make_layout (context, text, size); - pango_layout_get_extents (layout, NULL, &logical_rect); - - *width = MAX (*width, PANGO_PIXELS (logical_rect.width)); - *height += PANGO_PIXELS (logical_rect.height); - - if (bitmap) - pango_ft2_render_layout (bitmap, layout, 0, dy); - - dy += PANGO_PIXELS (logical_rect.height); - - g_object_unref (layout); - } -} - -static void -do_output (PangoContext *context, - const char *text, - FT_Bitmap *bitmap, - int *width, - int *height) -{ - PangoLayout *layout; - PangoRectangle logical_rect; - PangoMatrix matrix = PANGO_MATRIX_INIT; - int rotated_width, rotated_height; - int x = opt_margin; - int y = opt_margin; - double p1x, p1y; - double p2x, p2y; - double p3x, p3y; - double p4x, p4y; - double minx, miny; - double maxx, maxy; - - *width = 0; - *height = 0; - - if (opt_header) - { - char *options_string = get_options_string (); - layout = make_layout (context, options_string, 10); - pango_layout_get_extents (layout, NULL, &logical_rect); - - *width = MAX (*width, PANGO_PIXELS (logical_rect.width)); - *height += PANGO_PIXELS (logical_rect.height); - - if (bitmap) - pango_ft2_render_layout (bitmap, layout, x, y); - - y += PANGO_PIXELS (logical_rect.height); - - g_object_unref (layout); - g_free (options_string); - } - - output_body (context, text, NULL, NULL, &rotated_width, &rotated_height); - - pango_matrix_rotate (&matrix, opt_rotate); - - transform_point (&matrix, 0, 0, &p1x, &p1y); - transform_point (&matrix, rotated_width, 0, &p2x, &p2y); - transform_point (&matrix, rotated_width, rotated_height, &p3x, &p3y); - transform_point (&matrix, 0, rotated_height, &p4x, &p4y); - - minx = MIN (MIN (p1x, p2x), MIN (p3x, p4x)); - miny = MIN (MIN (p1y, p2y), MIN (p3y, p4y)); - - maxx = MAX (MAX (p1x, p2x), MAX (p3x, p4x)); - maxy = MAX (MAX (p1y, p2y), MAX (p3y, p4y)); - - matrix.x0 = x - minx; - matrix.y0 = y - miny; - - if (bitmap) - output_body (context, text, bitmap, &matrix, &rotated_width, &rotated_height); - - *width = MAX (*width, maxx - minx); - *height += maxy - miny; - - *width += 2 * opt_margin; - *height += 2 * opt_margin; -} static void -show_help (ArgContext *context, - const char *name, - const char *arg, - gpointer data) +ft2_render (PangoLayout *layout, + int x, + int y, + gpointer data) { - g_print ("%s - An example viewer for the pango ft2 extension\n" - "\n" - "Syntax:\n" - " %s [options] FILE\n" - "\n" - "Options:\n", - prog_name, prog_name); - arg_context_print_help (context); - exit (0); + pango_ft2_render_layout (data, layout, x, y); } -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { + PangoContext *context; FILE *outfile; - char *text; - size_t len; - char *p; PangoFontMap *fontmap; GError *error = NULL; - ArgContext *arg_context; gboolean do_convert = FALSE; - - static const ArgDesc args[] = { - { "no-auto-dir","Don't set layout direction according to contents", - ARG_NOBOOL, &opt_auto_dir }, - { "display", "Show output using ImageMagick", - ARG_BOOL, &opt_display }, - { "dpi", "Set the dpi'", - ARG_INT, &opt_dpi }, - { "font", "Set the font name", - ARG_STRING, &opt_font }, - { "header", "Display the options in the output", - ARG_BOOL, &opt_header }, - { "help", "Show this output", - ARG_CALLBACK, NULL, show_help, }, - { "margin", "Set the margin on the output in pixels", - ARG_INT, &opt_margin }, - { "markup", "Interpret contents as Pango markup", - ARG_BOOL, &opt_markup }, - { "output", "Name of output file", - ARG_STRING, &opt_output }, - { "rtl", "Set base dir to RTL", - ARG_BOOL, &opt_rtl }, - { "rotate", "Angle at which to rotate results", - ARG_INT, &opt_rotate }, - { "text", "Text to display (instead of a file)", - ARG_STRING, &opt_text }, - { "waterfall", "Create a waterfall display", - ARG_BOOL, &opt_waterfall }, - { "width", "Width in points to which to wrap output", - ARG_INT, &opt_width }, - { "indent", "Width in points to indent paragraphs", - ARG_INT, &opt_indent }, - { NULL } - }; - prog_name = g_path_get_basename (argv[0]); - g_type_init(); - if (g_file_test ("./pangorc", G_FILE_TEST_EXISTS)) - putenv ("PANGO_RC_FILE=./pangorc"); - - arg_context = arg_context_new (NULL); - arg_context_add_table (arg_context, args); - - if (!arg_context_parse (arg_context, &argc, &argv, &error)) - fail ("%s", error->message); - - if ((opt_text && argc != 1) || - (!opt_text && argc != 2)) - { - if (opt_text && argc == 2) - fail ("When specifying --text, no file should be given"); - - g_printerr ("Usage: %s [options] FILE\n", prog_name); - exit (1); - } - - if (!opt_display && !opt_output) - { - g_printerr ("%s: --output not specified, assuming --display\n", prog_name); - opt_display = TRUE; - } - - /* 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); - if (!g_utf8_validate (text, len, NULL)) - fail ("Text is not valid UTF-8"); - } - - /* Strip trailing whitespace - */ - p = text + len; - while (p > text) - { - gunichar ch; - p = g_utf8_prev_char (p); - ch = g_utf8_get_char (p); - if (!g_unichar_isspace (ch)) - break; - else - *p = '\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); + parse_options (argc, argv); if (opt_output) { @@ -434,10 +84,6 @@ int main(int argc, char *argv[]) pango_ft2_font_map_set_resolution (PANGO_FT2_FONT_MAP (fontmap), opt_dpi, opt_dpi); context = pango_ft2_font_map_create_context (PANGO_FT2_FONT_MAP (fontmap)); - pango_context_set_language (context, pango_language_from_string ("en_US")); - pango_context_set_base_dir (context, - opt_rtl ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR); - /* Write contents as pgm file */ { FT_Bitmap bitmap; @@ -445,7 +91,7 @@ int main(int argc, char *argv[]) int row; int width, height; - do_output (context, text, NULL, &width, &height); + do_output (context, NULL, NULL, &width, &height); bitmap.width = width; bitmap.pitch = (bitmap.width + 3) & ~3; @@ -455,7 +101,7 @@ int main(int argc, char *argv[]) bitmap.pixel_mode = ft_pixel_mode_grays; memset (buf, 0x00, bitmap.pitch * bitmap.rows); - do_output (context, text, &bitmap, &width, &height); + do_output (context, ft2_render, &bitmap, &width, &height); /* Invert bitmap to get black text on white background */ { diff --git a/examples/renderdemo.c b/examples/renderdemo.c index 106f9c8a..cc18b725 100644 --- a/examples/renderdemo.c +++ b/examples/renderdemo.c @@ -1,8 +1,6 @@ -/* Pango - * pangoft2topgm.c: Example program to view a UTF-8 encoding file - * using Pango to render result. +/* renderdemo.c: Common code for rendering demos * - * Copyright (C) 1999 Red Hat Software + * Copyright (C) 1999, 2004 Red Hat Software * Copyright (C) 2001 Sun Microsystems * * This library is free software; you can redistribute it and/or @@ -21,8 +19,6 @@ * Boston, MA 02111-1307, USA. */ -#define BUFSIZE 1024 -#define MALLOCSIZE 1024 #define DEFAULT_FONT_FAMILY "Sans" #define DEFAULT_FONT_SIZE 18 @@ -36,35 +32,33 @@ #include "argcontext.h" #include <pango/pango.h> -#include <pango/pangoft2.h> + +#include "renderdemo.h" #define _MAKE_FONT_NAME(family, size) family " " #size #define MAKE_FONT_NAME(family, size) _MAKE_FONT_NAME(family, size) -static char *prog_name; -static PangoContext *context; - -static char *tmpfile_name; -static char *outfile_name; - -static gboolean opt_display = FALSE; -static int opt_dpi = 96; -static char *opt_font = MAKE_FONT_NAME (DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE); -static gboolean opt_header = FALSE; -static char *opt_output = NULL; -static int opt_margin = 10; -static int opt_markup = FALSE; -static gboolean opt_rtl = FALSE; -static int opt_rotate = 0; -static gboolean opt_auto_dir = TRUE; -static char *opt_text = NULL; -static gboolean opt_waterfall = FALSE; -static int opt_width = -1; -static int opt_indent = 0; - -static void fail (const char *format, ...) G_GNUC_PRINTF (1, 2); - -static void +char *prog_name; + +gboolean opt_display = FALSE; +int opt_dpi = 96; +char *opt_font = MAKE_FONT_NAME (DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE); +gboolean opt_header = FALSE; +char *opt_output = NULL; +int opt_margin = 10; +int opt_markup = FALSE; +gboolean opt_rtl = FALSE; +int opt_rotate = 0; +gboolean opt_auto_dir = TRUE; +char *opt_text = NULL; +gboolean opt_waterfall = FALSE; +int opt_width = -1; +int opt_indent = 0; + +/* Text (or markup) to render */ +char *text; + +void fail (const char *format, ...) { const char *msg; @@ -73,9 +67,6 @@ fail (const char *format, ...) va_start (vap, format); msg = g_strdup_vprintf (format, vap); g_printerr ("%s: %s\n", prog_name, msg); - - if (outfile_name && !opt_output) - remove (outfile_name); exit (1); } @@ -132,7 +123,7 @@ make_layout(PangoContext *context, return layout; } -static gchar * +gchar * get_options_string (void) { PangoFontDescription *font_description = get_font_description (); @@ -162,12 +153,13 @@ transform_point (PangoMatrix *matrix, } static void -output_body (PangoContext *context, - const char *text, - FT_Bitmap *bitmap, - PangoMatrix *matrix, - int *width, - int *height) +output_body (PangoContext *context, + const char *text, + RenderCallback render_cb, + gpointer render_data, + PangoMatrix *matrix, + int *width, + int *height) { PangoLayout *layout; PangoRectangle logical_rect; @@ -200,8 +192,8 @@ output_body (PangoContext *context, *width = MAX (*width, PANGO_PIXELS (logical_rect.width)); *height += PANGO_PIXELS (logical_rect.height); - if (bitmap) - pango_ft2_render_layout (bitmap, layout, 0, dy); + if (render_cb) + (*render_cb) (layout, 0, dy, render_data); dy += PANGO_PIXELS (logical_rect.height); @@ -209,12 +201,12 @@ output_body (PangoContext *context, } } -static void -do_output (PangoContext *context, - const char *text, - FT_Bitmap *bitmap, - int *width, - int *height) +void +do_output (PangoContext *context, + RenderCallback render_cb, + gpointer render_data, + int *width_out, + int *height_out) { PangoLayout *layout; PangoRectangle logical_rect; @@ -228,21 +220,26 @@ do_output (PangoContext *context, double p4x, p4y; double minx, miny; double maxx, maxy; + int width, height; - *width = 0; - *height = 0; + width = 0; + height = 0; + pango_context_set_language (context, pango_language_from_string ("en_US")); + pango_context_set_base_dir (context, + opt_rtl ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR); + if (opt_header) { char *options_string = get_options_string (); layout = make_layout (context, options_string, 10); pango_layout_get_extents (layout, NULL, &logical_rect); - *width = MAX (*width, PANGO_PIXELS (logical_rect.width)); - *height += PANGO_PIXELS (logical_rect.height); + width = MAX (width, PANGO_PIXELS (logical_rect.width)); + height += PANGO_PIXELS (logical_rect.height); - if (bitmap) - pango_ft2_render_layout (bitmap, layout, x, y); + if (render_cb) + (*render_cb) (layout, x, y, render_data); y += PANGO_PIXELS (logical_rect.height); @@ -250,7 +247,7 @@ do_output (PangoContext *context, g_free (options_string); } - output_body (context, text, NULL, NULL, &rotated_width, &rotated_height); + output_body (context, text, NULL, NULL, NULL, &rotated_width, &rotated_height); pango_matrix_rotate (&matrix, opt_rotate); @@ -268,14 +265,19 @@ do_output (PangoContext *context, matrix.x0 = x - minx; matrix.y0 = y - miny; - if (bitmap) - output_body (context, text, bitmap, &matrix, &rotated_width, &rotated_height); + if (render_cb) + output_body (context, text, render_cb, render_data, &matrix, &rotated_width, &rotated_height); + + width = MAX (width, maxx - minx); + height += maxy - miny; - *width = MAX (*width, maxx - minx); - *height += maxy - miny; + width += 2 * opt_margin; + height += 2 * opt_margin; - *width += 2 * opt_margin; - *height += 2 * opt_margin; + if (width_out) + *width_out = width; + if (height_out) + *height_out = height; } static void @@ -284,7 +286,7 @@ show_help (ArgContext *context, const char *arg, gpointer data) { - g_print ("%s - An example viewer for the pango ft2 extension\n" + g_print ("%s - An example viewer for Pango\n" "\n" "Syntax:\n" " %s [options] FILE\n" @@ -295,17 +297,9 @@ show_help (ArgContext *context, exit (0); } -int main(int argc, char *argv[]) +void +parse_options (int argc, char *argv[]) { - FILE *outfile; - char *text; - size_t len; - char *p; - PangoFontMap *fontmap; - GError *error = NULL; - ArgContext *arg_context; - gboolean do_convert = FALSE; - static const ArgDesc args[] = { { "no-auto-dir","Don't set layout direction according to contents", ARG_NOBOOL, &opt_auto_dir }, @@ -340,12 +334,12 @@ int main(int argc, char *argv[]) { NULL } }; - prog_name = g_path_get_basename (argv[0]); - - g_type_init(); + ArgContext *arg_context; + GError *error = NULL; + size_t len; + char *p; - if (g_file_test ("./pangorc", G_FILE_TEST_EXISTS)) - putenv ("PANGO_RC_FILE=./pangorc"); + prog_name = g_path_get_basename (argv[0]); arg_context = arg_context_new (NULL); arg_context_add_table (arg_context, args); @@ -362,7 +356,7 @@ int main(int argc, char *argv[]) g_printerr ("Usage: %s [options] FILE\n", prog_name); exit (1); } - + if (!opt_display && !opt_output) { g_printerr ("%s: --output not specified, assuming --display\n", prog_name); @@ -403,128 +397,4 @@ int main(int argc, char *argv[]) if (opt_markup && !pango_parse_markup (text, -1, 0, NULL, NULL, NULL, &error)) fail ("Cannot parse input as markup: %s", error->message); - - if (opt_output) - { - if (!(g_str_has_suffix (opt_output, ".pgm") || - g_str_has_suffix (opt_output, ".PGM"))) - do_convert = TRUE; - } - - if (opt_output && !do_convert) - { - outfile = fopen (opt_output, "wb"); - - if (!outfile) - fail ("Cannot open output file %s: %s\n", - opt_output, g_strerror (errno)); - } - else /* --display */ - { - /* This may need to be G_OS_UNIX guarded for fdopen */ - int fd = g_file_open_tmp ("pangoft2pgmXXXXXX", &tmpfile_name, &error); - if (fd == 1) - fail ("Cannot open temporary file: %s\n", error->message); - outfile = fdopen (fd, "wb"); - if (!outfile) - fail ("Cannot open temporary file: %s\n", g_strerror (errno)); - } - - fontmap = pango_ft2_font_map_new (); - pango_ft2_font_map_set_resolution (PANGO_FT2_FONT_MAP (fontmap), opt_dpi, opt_dpi); - context = pango_ft2_font_map_create_context (PANGO_FT2_FONT_MAP (fontmap)); - - pango_context_set_language (context, pango_language_from_string ("en_US")); - pango_context_set_base_dir (context, - opt_rtl ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR); - - /* Write contents as pgm file */ - { - FT_Bitmap bitmap; - guchar *buf; - int row; - int width, height; - - do_output (context, text, NULL, &width, &height); - - bitmap.width = width; - bitmap.pitch = (bitmap.width + 3) & ~3; - bitmap.rows = height; - buf = bitmap.buffer = g_malloc (bitmap.pitch * bitmap.rows); - bitmap.num_grays = 256; - bitmap.pixel_mode = ft_pixel_mode_grays; - memset (buf, 0x00, bitmap.pitch * bitmap.rows); - - do_output (context, text, &bitmap, &width, &height); - - /* Invert bitmap to get black text on white background */ - { - int pix_idx; - for (pix_idx=0; pix_idx<bitmap.pitch * bitmap.rows; pix_idx++) - { - buf[pix_idx] = 255-buf[pix_idx]; - } - } - - /* Write it as pgm to output */ - fprintf(outfile, - "P5\n" - "%d %d\n" - "255\n", bitmap.width, bitmap.rows); - for (row = 0; row < bitmap.rows; row++) - fwrite(bitmap.buffer + row * bitmap.pitch, - 1, bitmap.width, - outfile); - g_free (buf); - if (fclose(outfile) == EOF) - fail ("Error writing output file: %s\n", g_strerror (errno)); - - /* Convert to a different format, if necessary */ - if (do_convert) - { - int exit_status; - - gchar *command = g_strdup_printf ("convert %s %s", - tmpfile_name, - opt_output); - if (!g_spawn_command_line_sync (command, NULL, NULL, &exit_status, &error)) - fail ("When running ImageMagick 'convert' command: %s\n", - error->message); - - if (tmpfile_name) - { - remove (tmpfile_name); - tmpfile_name = NULL; - } - - if (exit_status) - exit (1); - } - - if (opt_display) - { - int exit_status; - gchar *title = get_options_string (); - gchar *title_quoted = g_shell_quote (title); - - gchar *command = g_strdup_printf ("display -title %s %s", - title_quoted, - opt_output ? opt_output: tmpfile_name); - if (!g_spawn_command_line_sync (command, NULL, NULL, &exit_status, &error)) - fail ("When running ImageMagick 'display' command: %s\n", - error->message); - - g_free (command); - g_free (title); - g_free (title_quoted); - - if (tmpfile_name) - remove (tmpfile_name); - - if (exit_status) - exit (1); - } - } - - return 0; } diff --git a/examples/renderdemo.h b/examples/renderdemo.h new file mode 100644 index 00000000..191efe2c --- /dev/null +++ b/examples/renderdemo.h @@ -0,0 +1,55 @@ +/* renderdemo.c: Common code for rendering demos + * + * Copyright (C) 1999, 2004 Red Hat Software + * Copyright (C) 2001 Sun Microsystems + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <pango/pango-layout.h> + +typedef void (*RenderCallback) (PangoLayout *layout, + int x, + int y, + gpointer data); + +void fail (const char *format, ...) G_GNUC_PRINTF (1, 2); + +void parse_options (int argc, + char *argv[]); +void do_output (PangoContext *context, + RenderCallback render_cb, + gpointer render_data, + int *width, + int *height); +gchar *get_options_string (void); + +extern char *prog_name; + +extern gboolean opt_display; +extern int opt_dpi; +extern char *opt_font; +extern gboolean opt_header; +extern char *opt_output; +extern int opt_margin; +extern int opt_markup; +extern gboolean opt_rtl; +extern int opt_rotate; +extern gboolean opt_auto_dir; +extern char *opt_text; +extern gboolean opt_waterfall; +extern int opt_width; +extern int opt_indent; |