/** * gtk_psfont_get_char_size: * @psfont: a #GtkPSFont * @font: a #GdkFont * @latin_font: a #GdkFont * @wc: a #GdkWchar * @width: font width * @ascent: font ascent * @descent: font descent * * Get font character size. */ void gtk_psfont_get_char_size(GtkPSFont *psfont, GdkFont *font, GdkFont *latin_font, GdkWChar wc, gint *width, gint *ascent, gint *descent) { GdkFont *dfont; gint w, a, d, w0; if (psfont->i18n_latinfamily && psfont->vertical && (0 > wc || wc > 0x7f)) { /* vertical-writing CJK postscript fonts. */ w = (font->ascent + font->descent); w0 = gdk_char_width_wc(font, wc); d = w0 * font->descent / w; a = w0 - d; } else { if (psfont->i18n_latinfamily && 0 <= wc && wc <= 0x7f) dfont = latin_font; else dfont = font; w = gdk_char_width_wc(dfont, wc); a = dfont->ascent; d = dfont->descent; } if (width != NULL) *width = w; if (ascent != NULL) *ascent = a; if (descent != NULL) *descent = d; }
/* subfunction of gtk_plot_gdk_draw_string(). */ static gint drawstring(GtkPlotPC *pc, GdkBitmap *dest, GdkGC *gc, GdkColor *black, GdkColor *white, gint dx, gint dy, GtkPSFont *psfont, GdkFont *font, GdkFont *latin_font, GdkWChar wc) { GdkBitmap *tmp; GdkFont *dfont; GdkImage *image; gint w, h, a, d, x, y, d2; guint32 pixel; if (psfont->i18n_latinfamily && psfont->vertical && (0 > wc || wc > 0x7f)) { /* vertical-writing CJK postscript fonts. */ dfont = font; w = gdk_char_width_wc(dfont, wc); a = dfont->ascent; d = dfont->descent; h = a + d; d2 = w * d / h; tmp = gdk_pixmap_new(GTK_PLOT_GDK(pc)->window, w, h, 1); gdk_gc_set_foreground(gc, white); gdk_draw_rectangle(tmp, gc, TRUE, 0, 0, -1, -1); gdk_gc_set_foreground(gc, black); gdk_draw_text_wc(tmp, dfont, gc, 0, a, &wc, 1); image = gdk_image_get(tmp, 0, 0, w, h); for (y = 0; y < h; y++) { for (x = 0; x < w; x++) { pixel = gdk_image_get_pixel(image, x, y); if (pixel == black->pixel) gdk_draw_point(dest, gc, dx + y, dy + d2 - x); } } gdk_image_destroy(image); gdk_pixmap_unref(tmp); return h; } else { /* horizontal writing */ if (psfont->i18n_latinfamily && 0 <= wc && wc <= 0x7f) dfont = latin_font; else dfont = font; gdk_draw_text_wc(dest, dfont, gc, dx, dy, &wc, 1); w = gdk_char_width_wc(dfont, wc); return w; } }