diff options
author | Dov Grobgeld <dov@src.gnome.org> | 2002-01-17 22:01:34 +0000 |
---|---|---|
committer | Dov Grobgeld <dov@src.gnome.org> | 2002-01-17 22:01:34 +0000 |
commit | b9a76caed99a31d11a9582c7bffc27f0ca1774a8 (patch) | |
tree | 2babc6ac46b94237b61373bc195291c5da747b2c /examples | |
parent | 3de085b6ad7548fd1de150f872a62b4dea370c68 (diff) | |
download | pango-b9a76caed99a31d11a9582c7bffc27f0ca1774a8.tar.gz |
An example of using the ft2 module
Diffstat (limited to 'examples')
-rw-r--r-- | examples/pangoft2topgm.c | 273 | ||||
-rw-r--r-- | examples/renderdemo.c | 273 |
2 files changed, 546 insertions, 0 deletions
diff --git a/examples/pangoft2topgm.c b/examples/pangoft2topgm.c new file mode 100644 index 00000000..fe849060 --- /dev/null +++ b/examples/pangoft2topgm.c @@ -0,0 +1,273 @@ +/* Pango + * pangoft2topgm.c: Example program to view a UTF-8 encoding file + * using Pango to render result. + * + * Copyright (C) 1999 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. + */ + +#define BUFSIZE 1024 +#define MALLOCSIZE 1024 + +#include <pango/pango.h> +#include <pango/pangoft2.h> + +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +char *prog_name = NULL; +typedef struct _Paragraph Paragraph; + +/* Structure representing a paragraph + */ +struct _Paragraph { + char *text; + int length; + int height; /* Height, in pixels */ + PangoLayout *layout; +}; + +GList *paragraphs; + +static PangoFontDescription *font_description; +static Paragraph *highlight_para; +static int highlight_offset; + +PangoContext *context; + +/* Read an entire file into a string + */ +static char * +read_file (char *name) +{ + GString *inbuf; + FILE *file; + char *text; + char buffer[BUFSIZE]; + + file = fopen (name, "r"); + if (!file) + { + fprintf (stderr, "%s: Cannot open %s\n", g_get_prgname (), name); + return NULL; + } + + inbuf = g_string_new (NULL); + while (1) + { + char *bp = fgets (buffer, BUFSIZE-1, file); + if (ferror (file)) + { + fprintf(stderr, "%s: Error reading %s\n", g_get_prgname (), name); + g_string_free (inbuf, TRUE); + return NULL; + } + else if (bp == NULL) + break; + + g_string_append (inbuf, buffer); + } + + fclose (file); + + text = inbuf->str; + g_string_free (inbuf, FALSE); + + return text; +} + +/* Take a UTF8 string and break it into paragraphs on \n characters + */ +static GList * +split_paragraphs (char *text) +{ + char *p = text; + char *next; + gunichar wc; + GList *result = NULL; + char *last_para = text; + + while (*p) + { + wc = g_utf8_get_char (p); + next = g_utf8_next_char (p); + if (wc == (gunichar)-1) + { + fprintf (stderr, "%s: Invalid character in input\n", g_get_prgname ()); + wc = 0; + } + if (!*p || !wc || wc == '\n') + { + Paragraph *para = g_new (Paragraph, 1); + para->text = last_para; + para->length = p - last_para; + para->layout = pango_layout_new (context); + pango_layout_set_text (para->layout, para->text, para->length); + para->height = 0; + + last_para = next; + + result = g_list_prepend (result, para); + } + if (!wc) /* incomplete character at end */ + break; + p = next; + } + + return g_list_reverse (result); +} + +int main(int argc, char *argv[]) +{ + int dpi_x = 100, dpi_y = 100; + char *init_family = "sans"; + int init_scale = 24; + PangoDirection init_dir = PANGO_DIRECTION_LTR; + char *text; + int y_start = 0, x_start = 0; + int paint_width = 500; + int paint_height = 500; + int argp; + + g_type_init(); + + /* Parse command line */ + argp=1; + while(argp < argc && argv[argp][0] == '-') + { + char *opt = argv[argp++]; + if (strcmp(opt, "--help") == 0) + { + char *prog_name = g_get_prgname(); + printf("%s - An example viewer for the pango ft2 extension\n" + "\n" + "Syntax:\n" + " %s [--family f] [--scale s] file\n" + "\n" + "Options:\n" + " --family f Set the initial family. Default is '%s'.\n" + " --scale s Set the initial scale. Default is %d\n", + " --rtl Set base dir to RTL. Default is LTR.\n", + " --width Width of drawing window. Default is 500.\n", + prog_name, prog_name, init_family, init_scale); + exit(0); + } + if (strcmp(opt, "--family") == 0) + { + init_family = argv[argp++]; + continue; + } + if (strcmp(opt, "--scale") == 0) + { + init_scale = atoi(argv[argp++]); + continue; + } + if (strcmp(opt, "--rtl") == 0) + { + init_dir = PANGO_DIRECTION_RTL; + continue; + } + if (strcmp(opt, "--width") == 0) + { + paint_width = atoi(argv[argp++]); + continue; + } + fprintf(stderr, "Unknown option %s!\n", opt); + exit(1); + } + + if (argp + 1 != argc) + { + fprintf (stderr, "Usage: %s [options] FILE\n", g_get_prgname()); + exit(1); + } + + /* Create the list of paragraphs from the supplied file + */ + text = read_file (argv[argp++]); + if (!text) + exit(1); + + context = pango_ft2_get_context (dpi_x, dpi_y); + + paragraphs = split_paragraphs (text); + + pango_context_set_language (context, pango_language_from_string ("en_US")); + pango_context_set_base_dir (context, init_dir); + + font_description = pango_font_description_new (); + pango_font_description_set_family (font_description, g_strdup (init_family)); + pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL); + pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL); + pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL); + pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL); + pango_font_description_set_size (font_description, init_scale * PANGO_SCALE); + + pango_context_set_font_description (context, font_description); + + /* Write first paragraph as a pgm file */ + { + Paragraph *para = paragraphs->data; + int height = 0; + PangoDirection base_dir = pango_context_get_base_dir (context); + PangoRectangle logical_rect; + + pango_layout_set_alignment (para->layout, + base_dir == PANGO_DIRECTION_LTR ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT); + pango_layout_set_width (para->layout, paint_width * PANGO_SCALE); + + pango_layout_get_extents (para->layout, NULL, &logical_rect); + para->height = PANGO_PIXELS (logical_rect.height); + + + if (height + para->height >= y_start) + { + FT_Bitmap bitmap; + guchar *buf = g_malloc (paint_width * para->height); + + memset (buf, 0x00, paint_width * para->height); + bitmap.rows = para->height; + bitmap.width = paint_width; + bitmap.pitch = bitmap.width; + bitmap.buffer = buf; + bitmap.num_grays = 256; + bitmap.pixel_mode = ft_pixel_mode_grays; + + pango_ft2_render_layout (&bitmap, para->layout, + x_start, 0); + + /* Invert bitmap to get black text on white background */ + { + int pix_idx; + for (pix_idx=0; pix_idx<paint_width * para->height; pix_idx++) + { + buf[pix_idx] = 255-buf[pix_idx]; + } + } + + /* Write it as pgm to output */ + printf("P5\n" + "%d %d\n" + "255\n", bitmap.width, bitmap.rows); + fwrite(bitmap.buffer, 1, bitmap.width * bitmap.rows, stdout); + g_free (buf); + } + } +} diff --git a/examples/renderdemo.c b/examples/renderdemo.c new file mode 100644 index 00000000..fe849060 --- /dev/null +++ b/examples/renderdemo.c @@ -0,0 +1,273 @@ +/* Pango + * pangoft2topgm.c: Example program to view a UTF-8 encoding file + * using Pango to render result. + * + * Copyright (C) 1999 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. + */ + +#define BUFSIZE 1024 +#define MALLOCSIZE 1024 + +#include <pango/pango.h> +#include <pango/pangoft2.h> + +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +char *prog_name = NULL; +typedef struct _Paragraph Paragraph; + +/* Structure representing a paragraph + */ +struct _Paragraph { + char *text; + int length; + int height; /* Height, in pixels */ + PangoLayout *layout; +}; + +GList *paragraphs; + +static PangoFontDescription *font_description; +static Paragraph *highlight_para; +static int highlight_offset; + +PangoContext *context; + +/* Read an entire file into a string + */ +static char * +read_file (char *name) +{ + GString *inbuf; + FILE *file; + char *text; + char buffer[BUFSIZE]; + + file = fopen (name, "r"); + if (!file) + { + fprintf (stderr, "%s: Cannot open %s\n", g_get_prgname (), name); + return NULL; + } + + inbuf = g_string_new (NULL); + while (1) + { + char *bp = fgets (buffer, BUFSIZE-1, file); + if (ferror (file)) + { + fprintf(stderr, "%s: Error reading %s\n", g_get_prgname (), name); + g_string_free (inbuf, TRUE); + return NULL; + } + else if (bp == NULL) + break; + + g_string_append (inbuf, buffer); + } + + fclose (file); + + text = inbuf->str; + g_string_free (inbuf, FALSE); + + return text; +} + +/* Take a UTF8 string and break it into paragraphs on \n characters + */ +static GList * +split_paragraphs (char *text) +{ + char *p = text; + char *next; + gunichar wc; + GList *result = NULL; + char *last_para = text; + + while (*p) + { + wc = g_utf8_get_char (p); + next = g_utf8_next_char (p); + if (wc == (gunichar)-1) + { + fprintf (stderr, "%s: Invalid character in input\n", g_get_prgname ()); + wc = 0; + } + if (!*p || !wc || wc == '\n') + { + Paragraph *para = g_new (Paragraph, 1); + para->text = last_para; + para->length = p - last_para; + para->layout = pango_layout_new (context); + pango_layout_set_text (para->layout, para->text, para->length); + para->height = 0; + + last_para = next; + + result = g_list_prepend (result, para); + } + if (!wc) /* incomplete character at end */ + break; + p = next; + } + + return g_list_reverse (result); +} + +int main(int argc, char *argv[]) +{ + int dpi_x = 100, dpi_y = 100; + char *init_family = "sans"; + int init_scale = 24; + PangoDirection init_dir = PANGO_DIRECTION_LTR; + char *text; + int y_start = 0, x_start = 0; + int paint_width = 500; + int paint_height = 500; + int argp; + + g_type_init(); + + /* Parse command line */ + argp=1; + while(argp < argc && argv[argp][0] == '-') + { + char *opt = argv[argp++]; + if (strcmp(opt, "--help") == 0) + { + char *prog_name = g_get_prgname(); + printf("%s - An example viewer for the pango ft2 extension\n" + "\n" + "Syntax:\n" + " %s [--family f] [--scale s] file\n" + "\n" + "Options:\n" + " --family f Set the initial family. Default is '%s'.\n" + " --scale s Set the initial scale. Default is %d\n", + " --rtl Set base dir to RTL. Default is LTR.\n", + " --width Width of drawing window. Default is 500.\n", + prog_name, prog_name, init_family, init_scale); + exit(0); + } + if (strcmp(opt, "--family") == 0) + { + init_family = argv[argp++]; + continue; + } + if (strcmp(opt, "--scale") == 0) + { + init_scale = atoi(argv[argp++]); + continue; + } + if (strcmp(opt, "--rtl") == 0) + { + init_dir = PANGO_DIRECTION_RTL; + continue; + } + if (strcmp(opt, "--width") == 0) + { + paint_width = atoi(argv[argp++]); + continue; + } + fprintf(stderr, "Unknown option %s!\n", opt); + exit(1); + } + + if (argp + 1 != argc) + { + fprintf (stderr, "Usage: %s [options] FILE\n", g_get_prgname()); + exit(1); + } + + /* Create the list of paragraphs from the supplied file + */ + text = read_file (argv[argp++]); + if (!text) + exit(1); + + context = pango_ft2_get_context (dpi_x, dpi_y); + + paragraphs = split_paragraphs (text); + + pango_context_set_language (context, pango_language_from_string ("en_US")); + pango_context_set_base_dir (context, init_dir); + + font_description = pango_font_description_new (); + pango_font_description_set_family (font_description, g_strdup (init_family)); + pango_font_description_set_style (font_description, PANGO_STYLE_NORMAL); + pango_font_description_set_variant (font_description, PANGO_VARIANT_NORMAL); + pango_font_description_set_weight (font_description, PANGO_WEIGHT_NORMAL); + pango_font_description_set_stretch (font_description, PANGO_STRETCH_NORMAL); + pango_font_description_set_size (font_description, init_scale * PANGO_SCALE); + + pango_context_set_font_description (context, font_description); + + /* Write first paragraph as a pgm file */ + { + Paragraph *para = paragraphs->data; + int height = 0; + PangoDirection base_dir = pango_context_get_base_dir (context); + PangoRectangle logical_rect; + + pango_layout_set_alignment (para->layout, + base_dir == PANGO_DIRECTION_LTR ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT); + pango_layout_set_width (para->layout, paint_width * PANGO_SCALE); + + pango_layout_get_extents (para->layout, NULL, &logical_rect); + para->height = PANGO_PIXELS (logical_rect.height); + + + if (height + para->height >= y_start) + { + FT_Bitmap bitmap; + guchar *buf = g_malloc (paint_width * para->height); + + memset (buf, 0x00, paint_width * para->height); + bitmap.rows = para->height; + bitmap.width = paint_width; + bitmap.pitch = bitmap.width; + bitmap.buffer = buf; + bitmap.num_grays = 256; + bitmap.pixel_mode = ft_pixel_mode_grays; + + pango_ft2_render_layout (&bitmap, para->layout, + x_start, 0); + + /* Invert bitmap to get black text on white background */ + { + int pix_idx; + for (pix_idx=0; pix_idx<paint_width * para->height; pix_idx++) + { + buf[pix_idx] = 255-buf[pix_idx]; + } + } + + /* Write it as pgm to output */ + printf("P5\n" + "%d %d\n" + "255\n", bitmap.width, bitmap.rows); + fwrite(bitmap.buffer, 1, bitmap.width * bitmap.rows, stdout); + g_free (buf); + } + } +} |