gdImageColorResolve ((img), (color) >> 16, ((color) >> 8) & 0xFF, \
(color) & 0xFF)
+static MRealizedFont *gd_font_open (MFrame *, MFont *, MFont *,
+ MRealizedFont *);
+static void gd_render (MDrawWindow, int, int, MGlyphString *,
+ MGlyph *, MGlyph *, int, MDrawRegion);
+
+static MFontDriver gd_font_driver =
+ { NULL, gd_font_open, NULL, NULL, NULL, gd_render, NULL };
+
+static MRealizedFont *
+gd_font_open (MFrame *frame, MFont *font, MFont *spec, MRealizedFont *rfont)
+{
+ double size = font->size ? font->size : spec->size;
+ int reg = spec->property[MFONT_REGISTRY];
+ MRealizedFont *new;
+
+ if (rfont)
+ {
+ MRealizedFont *save = NULL;
+
+ for (; rfont; rfont = rfont->next)
+ if (rfont->font == font
+ && (rfont->font->size ? rfont->font->size == size
+ : rfont->spec.size == size)
+ && rfont->spec.property[MFONT_REGISTRY] == reg)
+ {
+ if (! save)
+ save = rfont;
+ if (rfont->driver == &gd_font_driver)
+ return rfont;
+ }
+ rfont = save;
+ }
+ rfont = (mfont__ft_driver.open) (frame, font, spec, rfont);
+ if (! rfont)
+ return NULL;
+ M17N_OBJECT_REF (rfont->info);
+ MSTRUCT_CALLOC (new, MERROR_GD);
+ *new = *rfont;
+ new->driver = &gd_font_driver;
+ new->next = MPLIST_VAL (frame->realized_font_list);
+ MPLIST_VAL (frame->realized_font_list) = new;
+ return new;
+}
static void
gd_render (MDrawWindow win, int x, int y,
int reverse, MDrawRegion region)
{
gdImagePtr img = (gdImagePtr) win;
- MFTInfo *ft_info;
FT_Face ft_face;
MRealizedFace *rface = from->rface;
FT_Int32 load_flags = FT_LOAD_RENDER;
/* It is assured that the all glyphs in the current range use the
same realized face. */
- ft_info = (MFTInfo *) rface->rfont->info;
- ft_face = ft_info->ft_face;
+ ft_face = rface->rfont->fontp;
color = ((int *) rface->info)[reverse ? COLOR_INVERSE : COLOR_NORMAL];
pixel = RESOLVE_COLOR (img, color);
}
}
-static MFontDriver gd_font_driver =
- { NULL, NULL, NULL, NULL, gd_render };
-
-static int
-gd_init ()
-{
- M_rgb = msymbol (" rgb");
- read_rgb_txt ();
- realized_fontset_list = mplist ();
- realized_font_list = mplist ();
- realized_face_list = mplist ();
- scratch_images[0] = scratch_images[1] = NULL;
-
- gd_font_driver.select = mfont__ft_driver.select;
- gd_font_driver.open = mfont__ft_driver.open;
- gd_font_driver.find_metric = mfont__ft_driver.find_metric;
- gd_font_driver.encode_char = mfont__ft_driver.encode_char;
-
- return 0;
-}
-
-static int
-gd_fini ()
-{
- MPlist *plist;
- int i;
-
- MPLIST_DO (plist, realized_fontset_list)
- mfont__free_realized_fontset ((MRealizedFontset *) MPLIST_VAL (plist));
- M17N_OBJECT_UNREF (realized_fontset_list);
-
- MPLIST_DO (plist, realized_face_list)
- {
- MRealizedFace *rface = MPLIST_VAL (plist);
-
- free (rface->info);
- mface__free_realized (rface);
- }
- M17N_OBJECT_UNREF (realized_face_list);
-
- MPLIST_DO (plist, realized_font_list)
- mfont__free_realized ((MRealizedFont *) MPLIST_VAL (plist));
- M17N_OBJECT_UNREF (realized_font_list);
-
- for (i = 0; i < 2; i++)
- if (scratch_images[i])
- gdImageDestroy (scratch_images[i]);
- return 0;
-}
-
-static int
-gd_open (MFrame *frame, MPlist *param)
-{
- MFace *face;
-
- frame->device = NULL;
- frame->device_type = MDEVICE_SUPPORT_OUTPUT;
- frame->font_driver_list = mplist ();
- mplist_add (frame->font_driver_list, Mfreetype, &gd_font_driver);
- frame->realized_font_list = realized_font_list;
- frame->realized_face_list = realized_face_list;
- frame->realized_fontset_list = realized_fontset_list;
- face = mface_copy (mface__default);
- mplist_push (param, Mface, face);
- M17N_OBJECT_UNREF (face);
- return 0;
-}
-
static void
gd_close (MFrame *frame)
{
static MDeviceDriver gd_driver =
{
- 0,
- gd_init,
- gd_fini,
- gd_open,
gd_close,
gd_get_prop,
gd_realize_face,
gd_dump_region,
};
-\f
-/* External API */
+/* Functions to be stored in MDeviceLibraryInterface by dlsym (). */
+
int
-m17n_init_gd ()
+device_init ()
{
- gd_driver.initialized = 0;
- mplist_put (m17n__device_library_list, Mgd, &gd_driver);
+ M_rgb = msymbol (" rgb");
+ read_rgb_txt ();
+ realized_fontset_list = mplist ();
+ realized_font_list = mplist ();
+ realized_face_list = mplist ();
+ scratch_images[0] = scratch_images[1] = NULL;
+
+ gd_font_driver.select = mfont__ft_driver.select;
+ gd_font_driver.find_metric = mfont__ft_driver.find_metric;
+ 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;
+
return 0;
}
-#else /* not HAVE_GD nor HAVE_FREETYPE */
+int
+device_fini ()
+{
+ MPlist *plist;
+ int i;
+
+ MPLIST_DO (plist, realized_fontset_list)
+ mfont__free_realized_fontset ((MRealizedFontset *) MPLIST_VAL (plist));
+ M17N_OBJECT_UNREF (realized_fontset_list);
+
+ MPLIST_DO (plist, realized_face_list)
+ {
+ MRealizedFace *rface = MPLIST_VAL (plist);
+
+ free (rface->info);
+ mface__free_realized (rface);
+ }
+ M17N_OBJECT_UNREF (realized_face_list);
+
+ if (MPLIST_VAL (realized_font_list))
+ mfont__free_realized (MPLIST_VAL (realized_font_list));
+ M17N_OBJECT_UNREF (realized_font_list);
+
+ for (i = 0; i < 2; i++)
+ if (scratch_images[i])
+ gdImageDestroy (scratch_images[i]);
+ return 0;
+}
int
-m17n_init_gd ()
+device_open (MFrame *frame, MPlist *param)
{
- return -1;
+ MFace *face;
+
+ frame->device = NULL;
+ frame->device_type = MDEVICE_SUPPORT_OUTPUT;
+ frame->driver = &gd_driver;
+ frame->font_driver_list = mplist ();
+ mplist_add (frame->font_driver_list, Mfreetype, &gd_font_driver);
+ frame->realized_font_list = realized_font_list;
+ frame->realized_face_list = realized_face_list;
+ frame->realized_fontset_list = realized_fontset_list;
+ face = mface_copy (mface__default);
+ mplist_push (param, Mface, face);
+ M17N_OBJECT_UNREF (face);
+ return 0;
}
#endif /* not HAVE_GD nor HAVE_FREETYPE */