(redraw_cursor): Refer to cursor.logical_width instead
[m17n/m17n-lib.git] / example / mdump.c
index 67a2b12..381b898 100644 (file)
 
     <li> -p PAPER
 
-    PAPER is the paper size: a4, a4r, a5, a5r, b5, b5r, letter, or
-    WxH.  In the last case, W and H are the width and height in
-    millimeter.  If this option is specified, PAPER limits the image
-    size.  If FILE is too large for a single page, multiple files with
-    the names "BASE.01.png", "BASE.02.png", etc. are created.
+    PAPER is the paper size: a4, a4r, a5, a5r, b5, b5r, letter, WxH,
+    or W.  In the case of WxH, W and H are the width and height in
+    millimeter.  In the case of W, W is the width in millimeter.  If
+    this option is specified, PAPER limits the image size.  If FILE is
+    too large for a single page, multiple files with the names
+    "BASE.01.png", "BASE.02.png", etc. are created.
 
     <li> -m MARGIN
 
     So, the default behaviour is the same as specifying "cat >
     %s.png" as FILTER.
 
+    <li> -a
+
+    Enable anti-alias drawing.
+
+    <li> --family FAMILY
+
+    Prefer a font whose family name is FAMILY.
+
+    <li> --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).
+
     <li> -q
 
     Quiet mode.  Don't print any messages.
 
     <li> -p PAPER
 
-    PAPER ¤Ï¤Ú¡¼¥Ñ¥µ¥¤¥º : a4, a4r, a5, a5r, b5, b5r, letter, ¤Þ¤¿¤Ï 
-    WxH. WxH ¤Î¾ì¹ç¡¢ W ¤È H ¤ÏÉý¤È¹â¤µ¤ò¥ß¥ê¥á¡¼¥¿Ã±°Ì¤Ç¼¨¤·¤¿¤â¤Î¡£ 
-    ¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢ PAPER ¤¬²èÁü¥µ¥¤¥º¤òÀ©¸Â¤¹ 
-    ¤ë¡£FILE ¤¬ 1 ¥Ú¡¼¥¸¤ËǼ¤Þ¤é¤Ê¤¤¤Û¤ÉÂ礭¤¤¾ì¹ç¤Ï¡¢"BASE.01.png",
-    "BASE.02.png" Åù¤Î̾Á°¤Î¤Ä¤¤¤¿Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¤¬ºî¤é¤ì¤ë¡£
+    PAPER ¤Ï¤Ú¡¼¥Ñ¥µ¥¤¥º : a4, a4r, a5, a5r, b5, b5r, letter, WxH ¤Þ¤¿
+    ¤Ï W¡£ WxH ¤Î¾ì¹ç¡¢ W ¤È H ¤ÏÉý¤È¹â¤µ¤ò¥ß¥ê¥á¡¼¥¿Ã±°Ì¤Ç¼¨¤·¤¿¤â¤Î¡£
+    W ¤Î¾ì¹ç¡¢ W ¤ÏÉý¤ò¥ß¥ê¥á¡¼¥¿Ã±°Ì¤Ç¼¨¤·¤¿¤â¤Î¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄê
+    ¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï¡¢ PAPER ¤¬²èÁü¥µ¥¤¥º¤òÀ©¸Â¤¹ ¤ë¡£FILE ¤¬ 1 ¥Ú¡¼¥¸
+    ¤ËǼ¤Þ¤é¤Ê¤¤¤Û¤ÉÂ礭¤¤¾ì¹ç¤Ï¡¢"BASE.01.png", "BASE.02.png" Åù¤Î̾Á°
+    ¤Î¤Ä¤¤¤¿Ê£¿ô¤Î¥Õ¥¡¥¤¥ë¤¬ºî¤é¤ì¤ë¡£
 
     <li> -m MARGIN
 
 
     FILTER ¤Ï¥·¥§¥ë¥³¥Þ¥ó¥É¹Ô¤ò´Þ¤àʸ»úÎó¤Ç¤¢¤ë¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤¬»ØÄê
     ¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢PNG ²èÁü¤Ï¥Õ¥¡¥¤¥ë¤Ë½ñ¤«¤ì¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢FILTER ¤Ë 
-    É¸½àÆþÎϤȤ·¤ÆÅϤµ¤ì¤ë¡£ FILTER ¤¬ "s" ¤ò´Þ¤ó¤Ç¤¤¤ì¤Ð¡¢¤½¤ì¤Ï FILE 
+    É¸½àÆþÎϤȤ·¤ÆÅϤµ¤ì¤ë¡£ FILTER ¤¬ "%s" ¤ò´Þ¤ó¤Ç¤¤¤ì¤Ð¡¢¤½¤ì¤Ï FILE 
     ¤Î¥Ù¡¼¥¹¥Í¡¼¥à¤ËÃÖ¤­´¹¤¨¤é¤ì¤ë¡£¤³¤Î¥×¥í¥°¥é¥à¤Î¥Ç¥Õ¥©¥ë¥È¤Î¿¶Éñ¤¤
-    ¤È¡¢FILTER ¤Ë "cat > s.png" ¤ò»ØÄꤷ¤¿¾ì¹ç¤Î¿¶Éñ¤ÏƱ°ì¤Ç¤¢¤ë¡£
+    ¤È¡¢FILTER ¤Ë "cat > %s.png" ¤ò»ØÄꤷ¤¿¾ì¹ç¤Î¿¶Éñ¤ÏƱ°ì¤Ç¤¢¤ë¡£
+
+    <li> -a
+
+    ¥¢¥ó¥Á¥¨¥¤¥ê¥¢¥¹½èÍý¤ò¹Ô¤¦¡£
+
+    <li> --family FAMILY
+
+    ¥Õ¥¡¥ß¥ê¥£Ì¾¤¬ FAMILY ¤Î¥Õ¥©¥ó¥È¤òÍ¥ÀèŪ¤Ë»È¤¦¡£
+
+    <li> --language LANG
+
+    ¸À¸ì LANG ÍѤ˻ØÄꤵ¤ì¤¿¥Õ¥©¥ó¥È¤òÍ¥ÀèŪ¤Ë»È¤¦¡£LANG ¤Ï ISO 630 ¤Î
+    £²Ê¸»ú¥³¡¼¥É¡ÊÎ㡧±Ñ¸ì¤Ï "en" ¡Ë¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
 
     <li> -q
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 #include <libgen.h>
 
+#include "config.h"
+
+#if defined (HAVE_FREETYPE) && defined (HAVE_GD)
 #include <gd.h>
 
 #include <m17n-gui.h>
 #include <m17n-misc.h>
 
-#define VERSION "1.0"
+#define PROGRAM_VERSION "1.1"
 
 /* Enumuration of the supported paper types.  */
 enum paper_type
@@ -247,7 +279,7 @@ help_exit (char *prog, int exit_code)
   printf ("  %-13s %s", "-d DPI",
          "Resolution in dots per inch (defualt 300).\n");
   printf ("  %-13s %s", "-p PAPER",
-         "Paper size; a4, a4r, a5, a5r, b5, b5r, letter, or WxH.\n");
+         "Paper size; a4, a4r, a5, a5r, b5, b5r, letter, W, or WxH.\n");
   printf ("  %-13s %s", "-m MARGIN",
          "Marginal space in millimeter (default 20).\n");
   printf ("  %-13s %s", "-c POS",
@@ -257,6 +289,11 @@ help_exit (char *prog, int exit_code)
   printf ("  %-13s %s", "-f FILTER",
          "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", "-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");
@@ -409,8 +446,11 @@ main (int argc, char **argv)
   int quiet_mode = 0;
   int break_by_word = 0;
   char *filter = NULL;
-  int i;
   int paper_width, paper_height;
+  int anti_alias = 0;
+  char *family_name = NULL;
+  char *lang_name = NULL;
+  int i;
   int page_index;
   gdImagePtr image;
   int white;
@@ -431,7 +471,7 @@ main (int argc, char **argv)
        help_exit (argv[0], 0);
       else if (! strcmp (argv[i], "--version"))
        {
-         printf ("mdump (m17n library) %s\n", VERSION);
+         printf ("mdump (m17n library) %s\n", PROGRAM_VERSION);
          printf ("Copyright (C) 2003, 2004 AIST, JAPAN\n");
          exit (0);
        }
@@ -467,6 +507,13 @@ main (int argc, char **argv)
              paper_size[paper].width = w;
              paper_size[paper].height = h;
            }
+         else if (sscanf (argv[i], "%d", &w) == 1
+                  && w > 0)
+           {
+             paper = PAPER_USER;
+             paper_size[paper].width = w;
+             paper_size[paper].height = 0;
+           }
          else
            FATAL_ERROR ("Invalid paper type: %s\n", argv[i]);
        }
@@ -504,6 +551,18 @@ main (int argc, char **argv)
        {
          quiet_mode = 1;
        }
+      else if (! strcmp (argv[i], "-a"))
+       {
+         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 (argv[i][0] != '-')
        {
          fp = fopen (argv[i], "r");
@@ -531,6 +590,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;
@@ -548,20 +609,28 @@ main (int argc, char **argv)
 
     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));
+      }
+
     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 = 1;
+  control.anti_alias = anti_alias;
   if (cursor_pos >= 0)
     {
       control.with_cursor = 1;
@@ -583,7 +652,14 @@ main (int argc, char **argv)
       paper_height = rect.height;
     }
   else
-    control.max_line_width = paper_width - margin * 2;
+    {
+      control.max_line_width = paper_width - margin * 2;
+      if (paper_height == 0)
+       {
+         mdraw_text_extents (frame, mt, 0, len, &control, NULL, NULL, &rect);
+         paper_height = rect.height + margin * 2;
+       }
+    }
 
   image = gdImageCreate (paper_width, paper_height);
   from = 0;
@@ -593,7 +669,7 @@ main (int argc, char **argv)
     {
       int to;
 
-      if (paper == PAPER_NOLIMIT)
+      if (paper == PAPER_NOLIMIT || paper_size[paper].height == 0)
        to = len;
       else
        to = find_page_end (frame, paper_height - margin * 2, mt, from,
@@ -618,4 +694,15 @@ main (int argc, char **argv)
   gdImageDestroy (image);
   exit (0);
 }
+
+#else  /* not HAVE_FREETYPE nor HAVE_GD */
+
+int
+main (int argc, char **argv)
+{
+  fprintf (stderr, "Can't run without Freetype and GD library!\n");
+  exit (1);
+}
+
+#endif  /* not HAVE_FREETYPE nor HAVE_GD */
 #endif /* not FOR_DOXYGEN */