/* m17n-gd.c -- implementation of the GUI API on GD Library.
- Copyright (C) 2004
+ Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
National Institute of Advanced Industrial Science and Technology (AIST)
Registration Number H15PRO112
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. */
#if !defined (FOR_DOXYGEN) || defined (DOXYGEN_INTERNAL_MODULE)
static void
read_rgb_txt ()
{
- FILE *fp = fopen ("/usr/lib/X11/rgb.txt", "r");
- int r, g, b;
+ FILE *fp;
+ int r, g, b, i;
+
+ /* 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);
- if (! fp)
- fp = fopen ("/usr/X11R6/lib/X11/rgb.txt", "r");
- if (! fp)
- return;
+ {
+ char *rgb_path[]
+ = {"/usr/lib/X11/rgb.txt", "/usr/X11R6/lib/X11/rgb.txt",
+ "/etc/X11/rgb.txt" };
+
+ fp = NULL;
+ for (i = 0; i < (sizeof rgb_path) / (sizeof rgb_path[0]); i++)
+ if ((fp = fopen ("/usr/lib/X11/rgb.txt", "r")))
+ break;
+ if (! fp)
+ return;
+ }
while (1)
{
char buf[256];
buf[0] = c;
fgets (buf + 1, 255, fp);
len = strlen (buf);
+ for (i = 0; i < len; i++)
+ buf[i] = tolower (buf[i]);
if (buf[len - 1] == '\n')
buf[len - 1] = '\0';
b |= (r << 16) | (g << 8);
int color, pixel;
int r, g, b;
- pixel = RESOLVE_COLOR (img, color);
-
if (from == to)
return;
#endif
}
- for (; from < to; x += from++->width)
+ for (; from < to; x += from++->g.xadv)
{
unsigned char *bmp;
int xoff, yoff;
int width, pitch;
- FT_Load_Glyph (ft_face, (FT_UInt) from->code, load_flags);
- yoff = y - ft_face->glyph->bitmap_top + from->yoff;
+ FT_Load_Glyph (ft_face, (FT_UInt) from->g.code, load_flags);
+ yoff = y - ft_face->glyph->bitmap_top + from->g.yoff;
bmp = ft_face->glyph->bitmap.buffer;
width = ft_face->glyph->bitmap.width;
pitch = ft_face->glyph->bitmap.pitch;
for (i = 0; i < ft_face->glyph->bitmap.rows;
i++, bmp += ft_face->glyph->bitmap.pitch, yoff++)
{
- xoff = x + ft_face->glyph->bitmap_left + from->xoff;
+ xoff = x + ft_face->glyph->bitmap_left + from->g.xoff;
for (j = 0; j < width; j++, xoff++)
if (bmp[j] > 0)
{
int pixel1 = pixel;
-#ifndef gdAlphaTransparent
-#define gdAlphaTransparent 127
-#endif
+#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)
+ {
+ int r1, g1, b1, color1;
+
+ pixel1 = gdImageGetPixel (img, xoff, yoff);
+ r1 = gdImageRed (img, pixel1);
+ g1 = gdImageGreen (img, pixel1);
+ b1 = gdImageBlue (img, pixel1);
+ color1 = ((((r * f + r1 * (7 - f)) / 7) << 16)
+ | (((g * f + g1 * (7 - f)) / 7) << 8)
+ | ((b * f + b1 * (7 - f)) / 7));
+ pixel1 = RESOLVE_COLOR (img, color1);
+ }
+#endif
gdImageSetPixel (img, xoff, yoff, pixel1);
}
}
for (i = 0; i < ft_face->glyph->bitmap.rows;
i++, bmp += ft_face->glyph->bitmap.pitch, yoff++)
{
- xoff = x + ft_face->glyph->bitmap_left + from->xoff;
+ xoff = x + ft_face->glyph->bitmap_left + from->g.xoff;
for (j = 0; j < width; j++, xoff++)
if (bmp[j / 8] & (1 << (7 - (j % 8))))
gdImageSetPixel (img, xoff, yoff, pixel);
y -= gstring->ascent - 1;
height = gstring->ascent + gstring->descent - 2;
if (! region)
- for (; from < to; x += from++->width)
- gdImageRectangle (img, x, y, x + from->width - 2, y + height - 1, color);
+ for (; from < to; x += from++->g.xadv)
+ gdImageRectangle (img, x, y, x + from->g.xadv - 2, y + height - 1, color);
else
{
gdImagePtr cpy;
MGlyph *g;
int width, x1;
- for (g = from, width = 0; g < to; width += g++->width);
+ for (g = from, width = 0; g < to; width += g++->g.xadv);
cpy = get_scrach_image (img, width, height);
MPLIST_DO (plist, region_list)
{
gdImageCopy (cpy, img, rect->x - x, rect->y - y, rect->x, rect->y,
rect->x + rect->width, rect->y + rect->height);
}
- for (x1 = 0; from < to; x1 += from++->width)
- gdImageRectangle (cpy, x1, 0, x1 + from->width - 2, height - 1, color);
+ for (x1 = 0; from < to; x1 += from++->g.xadv)
+ gdImageRectangle (cpy, x1, 0, x1 + from->g.xadv - 2, height - 1, color);
MPLIST_DO (plist, region_list)
{
MDrawMetric *rect = MPLIST_VAL (plist);
gdImagePtr cpy;
if (g->type == GLYPH_BOX)
- width = g->width;
+ width = g->g.xadv;
cpy = get_scrach_image (img, width, height);
MPLIST_DO (plist, region_list)
{
int x0, x1;
if (g->left_padding)
- x0 = x + box->outer_hmargin, x1 = x + g->width - 1;
+ x0 = x + box->outer_hmargin, x1 = x + g->g.xadv - 1;
else
- x0 = x, x1 = x + g->width - box->outer_hmargin - 1;
+ x0 = x, x1 = x + g->g.xadv - box->outer_hmargin - 1;
/* Draw the top side. */
color = RESOLVE_COLOR (img, colors[COLOR_BOX_TOP]);
MDrawMetric rect;
gd_region_to_rect (region, &rect);
- fprintf (stderr, "(%d %d %d %d)\n", rect.x, rect.y, rect.width, rect.height);
+ fprintf (mdebug__output, "(%d %d %d %d)\n",
+ rect.x, rect.y, rect.width, rect.height);
}
static MDeviceDriver gd_driver =
gd_font_driver.has_char = mfont__ft_driver.has_char;
gd_font_driver.encode_char = mfont__ft_driver.encode_char;
gd_font_driver.list = mfont__ft_driver.list;
+ gd_font_driver.check_otf = mfont__ft_driver.check_otf;
+ gd_font_driver.drive_otf = mfont__ft_driver.drive_otf;
return 0;
}
frame->realized_face_list = realized_face_list;
frame->realized_fontset_list = realized_fontset_list;
face = mface_copy (mface__default);
+ mface_put_prop (face, Mfoundry, Mnil);
+ mface_put_prop (face, Mfamily, Mnil);
mplist_push (param, Mface, face);
M17N_OBJECT_UNREF (face);
return 0;