X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=example%2Fmdump.c;h=2159f90ce8375c0d78b75d6ad2a9b7134a518f1c;hb=1c61bd37f25d40cc9b18b4c9d0b3b4f903dbf672;hp=4a21118e6afec053881565746da84a912db00b74;hpb=6782cf04c0c02f11468ddebf9059e0fadbfe5600;p=m17n%2Fm17n-lib.git diff --git a/example/mdump.c b/example/mdump.c index 4a21118..2159f90 100644 --- a/example/mdump.c +++ b/example/mdump.c @@ -1,5 +1,5 @@ /* mdump.c -- Dump text image -*- coding: euc-jp; -*- - Copyright (C) 2003, 2004 + Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 National Institute of Advanced Industrial Science and Technology (AIST) Registration Number H15PRO112 @@ -17,17 +17,17 @@ You should have received a copy of the GNU Lesser General Public License along with the m17n library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 02111-1307, USA. */ /***en - @enpage mdump dump text image + @enpage m17n-dump dump text image - @section mdump-synopsis SYNOPSIS + @section m17n-dump-synopsis SYNOPSIS - mdump [ OPTION ... ] [ FILE ] + m17n-dump [ OPTION ... ] [ FILE ] - @section mdump-description DESCRIPTION + @section m17n-dump-description DESCRIPTION Dump a text as PNG image file. @@ -88,10 +88,36 @@ So, the default behaviour is the same as specifying "cat > %s.png" as FILTER. + If FILTER is just "-", the PNG image is written to stdout. +
  • -a Enable anti-alias drawing. +
  • --family FAMILY + + Prefer a font whose family name is FAMILY. + +
  • --language LANG + + Prefer a font specified for the language LANG. LANG must be a + 2-letter code of ISO 630 (e.g. "en" for English). + +
  • -fg FOREGROUND + + Specify the text color. The supported color names are those of + HTML 4.0 and "#RRGGBB" notation. + +
  • -bg BACKGROUND + + Specify the background color. The supported color names are the + same as FOREGROUND, except that if "transparent" is specified, + make the background transparent. + +
  • -r + + Specify that the orientation of the text is right-to-left. +
  • -q Quiet mode. Don't print any messages. @@ -107,13 +133,13 @@ */ /***ja - @japage mdump ¥Æ¥­¥¹¥È²èÁü¤Î¥À¥ó¥× + @japage m17n-dump ¥Æ¥­¥¹¥È²èÁü¤Î¥À¥ó¥× - @section mdump-synopsis SYNOPSIS + @section m17n-dump-synopsis SYNOPSIS - mdump [ OPTION ... ] [ FILE ] + m17n-dump [ OPTION ... ] [ FILE ] - @section mdump-description DESCRIPTION + @section m17n-dump-description DESCRIPTION ¥Æ¥­¥¹¥È¤ò PNG ²èÁü¤È¤·¤Æ¥À¥ó¥×¤¹¤ë¡£ @@ -167,14 +193,39 @@ FILTER ¤Ï¥·¥§¥ë¥³¥Þ¥ó¥É¹Ô¤ò´Þ¤àʸ»úÎó¤Ç¤¢¤ë¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄê ¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢PNG ²èÁü¤Ï¥Õ¥¡¥¤¥ë¤Ë½ñ¤«¤ì¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢FILTER ¤Ë - ɸ½àÆþÎϤȤ·¤ÆÅϤµ¤ì¤ë¡£ FILTER ¤¬ "s" ¤ò´Þ¤ó¤Ç¤¤¤ì¤Ð¡¢¤½¤ì¤Ï FILE + ɸ½àÆþÎϤȤ·¤ÆÅϤµ¤ì¤ë¡£ FILTER ¤¬ "%s" ¤ò´Þ¤ó¤Ç¤¤¤ì¤Ð¡¢¤½¤ì¤Ï FILE ¤Î¥Ù¡¼¥¹¥Í¡¼¥à¤ËÃÖ¤­´¹¤¨¤é¤ì¤ë¡£¤³¤Î¥×¥í¥°¥é¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¶Éñ¤¤ - ¤È¡¢FILTER ¤Ë "cat > s.png" ¤ò»ØÄꤷ¤¿¾ì¹ç¤Î¿¶Éñ¤ÏƱ°ì¤Ç¤¢¤ë¡£ + ¤È¡¢FILTER ¤Ë "cat > %s.png" ¤ò»ØÄꤷ¤¿¾ì¹ç¤Î¿¶Éñ¤ÏƱ°ì¤Ç¤¢¤ë¡£ + + ¤â¤· FILTER ¤¬Ã±¤Ë "-" ¤Ç¤¢¤ì¤Ð¡¢ PNG ²èÁü¤Ï stdout ¤Ë½ÐÎϤµ¤ì¤ë¡£
  • -a ¥¢¥ó¥Á¥¨¥¤¥ê¥¢¥¹½èÍý¤ò¹Ô¤¦¡£ +
  • --family FAMILY + + ¥Õ¥¡¥ß¥ê¥£Ì¾¤¬ FAMILY ¤Î¥Õ¥©¥ó¥È¤òÍ¥ÀèŪ¤Ë»È¤¦¡£ + +
  • --language LANG + + ¸À¸ì LANG ÍѤ˻ØÄꤵ¤ì¤¿¥Õ¥©¥ó¥È¤òÍ¥ÀèŪ¤Ë»È¤¦¡£LANG ¤Ï ISO 630 ¤Î + £²Ê¸»ú¥³¡¼¥É¡ÊÎ㡧±Ñ¸ì¤Ï "en" ¡Ë¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ + +
  • -fg FOREGROUND + + ¥Æ¥­¥¹¥È¤Î¿§¤ò»ØÄꤹ¤ë¡£HTML 4.0 ¤Î¿§¤Î̾Á°¤ª¤è¤Ó "#RRGGBB" µ­Ë¡¤ò + ¥µ¥Ý¡¼¥È¡£ + +
  • -bg BACKGROUND + + Çطʤ理ò»ØÄꤹ¤ë¡£¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¿§¤Î̾Á°¤Ï FOREGROUND Ʊ¤¸¡£ + ¤¿¤À¤·¡¢¤â¤· "transparent" ¤¬»ØÄꤵ¤ì¤¿¤éÇطʤòÆ©ÌÀ¤Ë¤¹¤ë¡£ + +
  • -r + + Specify that the orientation of the text is right-to-left. +
  • -q °ìÀڤΥá¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Ê¤¤¡£ @@ -195,18 +246,15 @@ #include #include #include +#include #include -#include "config.h" - #if defined (HAVE_FREETYPE) && defined (HAVE_GD) #include #include #include -#define PROGRAM_VERSION "1.1" - /* Enumuration of the supported paper types. */ enum paper_type { @@ -256,7 +304,7 @@ help_exit (char *prog, int exit_code) printf (" dumped into the file \"output.png\".\n"); printf ("The following OPTIONs are available.\n"); printf (" %-13s %s", "-s SIZE", - "Font size in point (default 12).\n"); + "Font size in 1/10 point (default 120).\n"); printf (" %-13s %s", "-d DPI", "Resolution in dots per inch (defualt 300).\n"); printf (" %-13s %s", "-p PAPER", @@ -271,6 +319,16 @@ help_exit (char *prog, int exit_code) "String containing a shell command line to be used as a filter.\n"); printf (" %-13s %s", "-w", "Each line is broken at word boundary.\n"); printf (" %-13s %s", "-a", "Enable anti-alias drawing.\n"); + printf (" %-13s %s", "--family FAMILY", + "Prefer a font whose family is FAMILY.\n"); + printf (" %-13s %s", "--language LANG", + "Prefer a font specified for the langauge LANG.\n"); + printf (" %-13s %s", "-r", + "Specify that the orientation of the text is right-to-left.\n"); + printf (" %-13s %s", "-fg FOREGROUND", + "Specify the text color (HTML 4.0 color names or \"#RRGGBB\").\n"); + printf (" %-13s %s", "-bg BACKGROUND", + "Specify the background color (\"transparent\" for transparent)\n"); printf (" %-13s %s", "-q", "Quiet mode. Don't print any messages.\n"); printf (" %-13s %s", "--version", "Print the version number.\n"); printf (" %-13s %s", "-h, --help", "Print this message.\n"); @@ -327,9 +385,9 @@ find_page_end (MFrame *frame, int height, MText *mt, int pos, while (to < next) { mdraw_glyph_info (frame, mt, to, to, control, &info); - if (y + info.this.height > height) + if (y + info.metrics.height > height) break; - y += info.this.height; + y += info.metrics.height; to = info.line_to; } break; @@ -342,25 +400,6 @@ find_page_end (MFrame *frame, int height, MText *mt, int pos, return to; } - -/* Table to convert a byte of LSBFirst to MSBFirst. */ -char reverse_bit_order[256]; - -/* Initialize the above table. */ - -void -init_reverse_bit_order () -{ - int i; - - for (i = 0; i < 256; i++) - reverse_bit_order[i] - = (((i & 1) << 7) | ((i & 2) << 5) | ((i & 4) << 3) | ((i & 8) << 1) - | ((i & 16) >> 1) | ((i & 32) >> 3) - | ((i & 64) >> 5) | ((i & 128) >> 7)); -} - - /* Dump the image in IMAGE into a file whose name is generated from FILENAME and PAGE_INDEX (if it is not zero). */ @@ -380,14 +419,19 @@ dump_image (gdImagePtr image, char *filename, char *filter, if (filter) { - char *command = alloca (strlen (filename) + strlen (filter) + 1); + if (filter[0] == '-' && filter[1] == '\0') + fp = stdout; + else + { + char *command = alloca (strlen (filename) + strlen (filter) + 1); - sprintf (command, filter, filename); - fp = popen (command, "w"); - if (! fp) - FATAL_ERROR ("Can't run the command \"%s\"\n", command); - if (! quiet_mode) - printf ("Running \"%s\" ... ", command); + sprintf (command, filter, filename); + fp = popen (command, "w"); + if (! fp) + FATAL_ERROR ("Can't run the command \"%s\"\n", command); + if (! quiet_mode) + printf ("Running \"%s\" ... ", command); + } } else { @@ -403,7 +447,8 @@ dump_image (gdImagePtr image, char *filename, char *filter, /* Generate PNG. */ gdImagePng (image, fp); - fclose (fp); + if (fp != stderr) + fclose (fp); if (! quiet_mode) printf (" done (%dx%d)\n", image->sx, image->sy); } @@ -425,10 +470,15 @@ main (int argc, char **argv) char *filter = NULL; int paper_width, paper_height; int anti_alias = 0; + char *family_name = NULL; + char *lang_name = NULL; + char *fg_color = NULL, *bg_color = NULL; + int transparent = 0; + int r2l = 0; int i; int page_index; gdImagePtr image; - int white; + int bg_rgb; MFrame *frame; MText *mt; @@ -436,6 +486,8 @@ main (int argc, char **argv) MDrawMetric rect; char *filename = "output"; int len, from; + char *fontset_name = "generic"; + /* Parse the command line arguments. */ for (i = 1; i < argc; i++) @@ -446,8 +498,8 @@ main (int argc, char **argv) help_exit (argv[0], 0); else if (! strcmp (argv[i], "--version")) { - printf ("mdump (m17n library) %s\n", PROGRAM_VERSION); - printf ("Copyright (C) 2003, 2004 AIST, JAPAN\n"); + printf ("m17n-dump (m17n library) %s\n", M17NLIB_VERSION_NAME); + printf ("Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 AIST, JAPAN\n"); exit (0); } else if (! strcmp (argv[i], "-s") && i + 1< argc) @@ -530,6 +582,18 @@ main (int argc, char **argv) { anti_alias = 1; } + else if (! strcmp (argv[i], "--family")) + { + family_name = argv[++i]; + } + else if (! strcmp (argv[i], "--language")) + { + lang_name = argv[++i]; + } + else if (! strcmp (argv[i], "-r")) + { + r2l = 1; + } else if (argv[i][0] != '-') { fp = fopen (argv[i], "r"); @@ -537,6 +601,32 @@ main (int argc, char **argv) FATAL_ERROR ("Fail to open the file %s!\n", argv[i]); filename = basename (argv[i]); } + else if (! strcmp (argv[i], "--fontset")) + { + fontset_name = argv[++i]; + } + else if (! strcmp (argv[i], "-fg")) + { + if (i + 1 == argc) + { + fprintf (stderr, "Foreground color not specified\n"); + help_exit (argv[0], 1); + } + fg_color = argv[++i]; + } + else if (! strcmp (argv[i], "-bg")) + { + if (i + 1 == argc) + { + fprintf (stderr, "Background color not specified\n"); + help_exit (argv[0], 1); + } + i++; + if (! strcmp (argv[i], "transparent")) + transparent = 1; + else + bg_color = argv[i]; + } else { fprintf (stderr, "Unknown or invalid option: %s\n", argv[i]); @@ -557,6 +647,8 @@ main (int argc, char **argv) FATAL_ERROR ("%s\n", "Fail to decode the input file or stream!"); len = mtext_len (mt); + if (lang_name) + mtext_put_prop (mt, 0, len, Mlanguage, msymbol (lang_name)); if (paper == PAPER_NOLIMIT) paper_width = paper_height = margin = 0; @@ -569,25 +661,37 @@ main (int argc, char **argv) { MPlist *plist = mplist (), *p; - MFontset *fontset = mfontset ("truetype"); + MFontset *fontset = mfontset (fontset_name); MFace *face = mface (); mface_put_prop (face, Mfontset, fontset); mface_put_prop (face, Msize, (void *) (fontsize * dpi / 100)); + if (family_name) + { + char *p; + + for (p = family_name; *p; p++) + if (isupper (*p)) *p = tolower (*p); + mface_put_prop (face, Mfamily, msymbol (family_name)); + } + if (fg_color) + mface_put_prop (face, Mforeground, msymbol (fg_color)); + if (bg_color) + mface_put_prop (face, Mbackground, msymbol (bg_color)); p = mplist_add (plist, Mdevice, msymbol ("gd")); p = mplist_add (p, Mface, face); m17n_object_unref (face); frame = mframe (plist); m17n_object_unref (plist); if (! frame) - FATAL_ERROR ("%s\n", "Can't open a frame (perhaps no font avairable)!"); + FATAL_ERROR ("%s\n", "Can't open a frame (perhaps no font available)!"); } memset (&control, 0, sizeof control); - control.as_image = 1; control.two_dimensional = 1; control.enable_bidi = 1; control.anti_alias = anti_alias; + control.orientation_reversed = r2l; if (cursor_pos >= 0) { control.with_cursor = 1; @@ -599,7 +703,7 @@ main (int argc, char **argv) else control.ignore_formatting_char = 1; if (break_by_word) - control.line_break = line_break; + control.line_break = mdraw_default_line_break; if (paper == PAPER_NOLIMIT) { @@ -618,10 +722,46 @@ main (int argc, char **argv) } } +#if HAVE_GD > 1 + image = gdImageCreateTrueColor (paper_width, paper_height); +#else image = gdImageCreate (paper_width, paper_height); +#endif from = 0; page_index = 1; - white = gdImageColorAllocate (image, 255, 255, 255); + + if (transparent) + { + MFace *face = mframe_get_prop (frame, Mface); + MSymbol fg = mface_get_prop (face, Mforeground); + int rgb_value = 0; + + if (fg) + rgb_value = (int) msymbol_get (fg, msymbol (" rgb")); + if (rgb_value == 0xFFFFFF) + bg_rgb = gdImageColorAllocate (image, 0, 0, 0); + else + bg_rgb = gdImageColorAllocate (image, 255, 255, 255); + gdImageColorTransparent (image, bg_rgb); +#if HAVE_GD > 1 + gdImageAlphaBlending (image, 0); +#endif + } + else + { + MFace *face = mframe_get_prop (frame, Mface); + MSymbol bg = mface_get_prop (face, Mbackground); + if (bg) + { + int rgb_value = (int) msymbol_get (bg, msymbol (" rgb")); + bg_rgb = gdImageColorAllocate (image, rgb_value >> 16, + (rgb_value >> 8) & 255, + rgb_value & 255); + } + else + bg_rgb = gdImageColorAllocate (image, 255, 255, 255); + } + while (from < len) { int to; @@ -633,10 +773,15 @@ main (int argc, char **argv) &control, &rect); gdImageFilledRectangle (image, 0, 0, paper_width - 1, paper_height - 1, - white); - mdraw_text_with_control (frame, image, - margin, margin - rect.y, mt, from, to, - &control); + bg_rgb); + if (! r2l) + mdraw_text_with_control (frame, image, + margin, margin - rect.y, + mt, from, to, &control); + else + mdraw_text_with_control (frame, image, + paper_width - margin, margin - rect.y, + mt, from, to, &control); dump_image (image, filename, filter, ((from > 0 || to < len) ? page_index : 0), quiet_mode);