Update copyright.
[m17n/m17n-lib.git] / src / m17n-gd.c
index 58debdb..d2cdcda 100644 (file)
@@ -1,5 +1,5 @@
 /* m17n-gd.c -- implementation of the GUI API on GD Library.
-   Copyright (C) 2004
+   Copyright (C) 2004, 2005, 2006
      National Institute of Advanced Industrial Science and Technology (AIST)
      Registration Number H15PRO112
 
@@ -67,9 +67,28 @@ static MSymbol M_rgb;
 static void
 read_rgb_txt ()
 {
-  FILE *fp = fopen ("/usr/lib/X11/rgb.txt", "r");
+  FILE *fp;
   int r, g, b;
 
+  /* At first, support HTML 4.0 color names. */
+  msymbol_put (msymbol ("black"), M_rgb, (void *) 0x000000);
+  msymbol_put (msymbol ("silver"), M_rgb, (void *) 0xC0C0C0);
+  msymbol_put (msymbol ("gray"), M_rgb, (void *) 0x808080);
+  msymbol_put (msymbol ("white"), M_rgb, (void *) 0xFFFFFF);
+  msymbol_put (msymbol ("maroon"), M_rgb, (void *) 0x800000);
+  msymbol_put (msymbol ("red"), M_rgb, (void *) 0xFF0000);
+  msymbol_put (msymbol ("purple"), M_rgb, (void *) 0x800080);
+  msymbol_put (msymbol ("fuchsia"), M_rgb, (void *) 0xFF00FF);
+  msymbol_put (msymbol ("green"), M_rgb, (void *) 0x008000);
+  msymbol_put (msymbol ("lime"), M_rgb, (void *) 0x00FF00);
+  msymbol_put (msymbol ("olive"), M_rgb, (void *) 0x808000);
+  msymbol_put (msymbol ("yellow"), M_rgb, (void *) 0xFFFF00);
+  msymbol_put (msymbol ("navy"), M_rgb, (void *) 0x000080);
+  msymbol_put (msymbol ("blue"), M_rgb, (void *) 0x0000FF);
+  msymbol_put (msymbol ("teal"), M_rgb, (void *) 0x008080);
+  msymbol_put (msymbol ("aqua"), M_rgb, (void *) 0x00FFFF);
+
+  fp = fopen ("/usr/lib/X11/rgb.txt", "r");
   if (! fp)
     fp = fopen ("/usr/X11R6/lib/X11/rgb.txt", "r");
   if (! fp)
@@ -324,10 +343,16 @@ gd_render (MDrawWindow win, int x, int y,
          {
            xoff = x + ft_face->glyph->bitmap_left + from->xoff;
            for (j = 0; j < width; j++, xoff++)
-             if (bmp[j])
+             if (bmp[j] > 0)
                {
-                 int f = bmp[j] >> 5;
                  int pixel1 = pixel;
+#if HAVE_GD > 1
+                 int alpha = gdAlphaTransparent * (255 - bmp[j]) / 255;
+
+                 if (alpha > 0)
+                   pixel1 = gdImageColorResolveAlpha (img, r, g, b, alpha);
+#else
+                 int f = bmp[j] >> 5;
 
                  if (f < 7)
                    {
@@ -342,6 +367,7 @@ gd_render (MDrawWindow win, int x, int y,
                                | ((b * f + b1 * (7 - f)) / 7));
                      pixel1 = RESOLVE_COLOR (img, color1);
                    }
+#endif
                  gdImageSetPixel (img, xoff, yoff, pixel1);
                }
          }
@@ -822,6 +848,9 @@ device_open (MFrame *frame, MPlist *param)
 
   frame->device = NULL;
   frame->device_type = MDEVICE_SUPPORT_OUTPUT;
+  frame->dpi = (int) mplist_get (param, Mresolution);
+  if (frame->dpi == 0)
+    frame->dpi = 100;
   frame->driver = &gd_driver;
   frame->font_driver_list = mplist ();
   mplist_add (frame->font_driver_list, Mfreetype, &gd_font_driver);
@@ -834,6 +863,10 @@ device_open (MFrame *frame, MPlist *param)
   return 0;
 }
 
+#else  /* not HAVE_GD nor HAVE_FREETYPE */
+
+int device_open () { return -1; }
+
 #endif /* not HAVE_GD nor HAVE_FREETYPE */
 
 /*** @} */