*** empty log message ***
[m17n/m17n-lib.git] / example / mdump.c
index 855a75c..38f167f 100644 (file)
    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.
 
     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> -r
+
+    Specify that the orientation of the text is right-to-left.
+
     <li> -q
 
     Quiet mode.  Don't print any messages.
     </ul>
 */
 /***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 ²èÁü¤È¤·¤Æ¥À¥ó¥×¤¹¤ë¡£ 
 
 
     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"
@@ -248,7 +279,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",
@@ -263,6 +294,12 @@ 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", "-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");
@@ -319,9 +356,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;
@@ -334,25 +371,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).  */
 
@@ -417,6 +435,9 @@ 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;
+  int r2l = 0;
   int i;
   int page_index;
   gdImagePtr image;
@@ -438,7 +459,7 @@ 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 ("m17n-dump (m17n library) %s\n", PROGRAM_VERSION);
          printf ("Copyright (C) 2003, 2004 AIST, JAPAN\n");
          exit (0);
        }
@@ -522,6 +543,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");
@@ -549,6 +582,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;
@@ -566,20 +601,29 @@ 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 = anti_alias;
+  control.orientation_reversed = r2l;
   if (cursor_pos >= 0)
     {
       control.with_cursor = 1;
@@ -626,9 +670,14 @@ main (int argc, char **argv)
 
       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);
+      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);