summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2004-07-10 22:11:49 +0000
committerOwen Taylor <otaylor@src.gnome.org>2004-07-10 22:11:49 +0000
commitbfafb05de97e187fbbb85c83f4c7b59203a62439 (patch)
tree4485cb0ce5e8364caea44b9e4d967905769f07b1 /examples
parentbd2b21c9f509b3e2f518980b05d56f3d0dd4f2a7 (diff)
downloadpango-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.
Diffstat (limited to 'examples')
-rw-r--r--examples/Makefile.am8
-rw-r--r--examples/pangoft2topgm.c378
-rw-r--r--examples/renderdemo.c276
-rw-r--r--examples/renderdemo.h55
4 files changed, 145 insertions, 572 deletions
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;