/* gdk_draw_text * * Modified by Li-Da Lho to draw 16 bits and Multibyte strings * * Interface changed: add "GdkFont *font" to specify font or fontset explicitely */ void gdk_draw_text (GdkDrawable *drawable, GdkFont *font, GdkGC *gc, gint x, gint y, const gchar *text, gint text_length) { GR_FONT_INFO fid; g_return_if_fail (drawable != NULL); g_return_if_fail (font != NULL); g_return_if_fail (gc != NULL); g_return_if_fail (text!= NULL); gi_gc_attch_window(GDK_GC_XGC(gc), GDK_DRAWABLE_XID(drawable)); //printf("fontid is %d at %d\n", ((GdkFontPrivate*)font)->fid, GDK_GC_XGC(gc)); //GrGetFontInfo(((GdkFontPrivate*)font)->fid, &fid); //GrSetGCUseBackground(GDK_GC_XGC(gc), FALSE); int r,g,b; gi_pixel_to_color(&gdk_screen_info,GDK_GC_XGC(gc)->values.foreground,&r, &g,&b); gi_ufont_set_text_attr(GDK_GC_XGC(gc),GDK_FONT_XFONT(font),FALSE,GI_RGB(r,g,b),0); //dpp, fixme gi_ufont_draw(GDK_GC_XGC(gc),GDK_FONT_XFONT(font),text, x,y,text_length); //GrSetGCFont(GDK_GC_XGC(gc), ((GdkFontPrivate*)font)->fid); /* [00/08/30] @@@ NANOGTK: begin modification @@@ */ //GrText(GDK_DRAWABLE_XID(drawable), GDK_GC_XGC (gc), x, y, text, text_length); /* [00/08/30] @@@ NANOGTK: end modification @@@ */ }
void gdk_draw_text_wc (GdkDrawable *drawable, GdkFont *font, GdkGC *gc, gint x, gint y, const GdkWChar *text, gint text_length) { g_return_if_fail (drawable != NULL); g_return_if_fail (font != NULL); g_return_if_fail (gc != NULL); g_return_if_fail (text!= NULL); //GrSetGCUseBackground(GDK_GC_XGC(gc), FALSE); //fixme GDK_GC_XGC(gc)->values.font = GDK_FONT_XFONT(font); //GrSetGCFont(GDK_GC_XGC(gc), ((GdkFontPrivate*)font)->fid); /* [00/08/30] @@@ NANOGTK: begin modification @@@ */ //GrText (GDK_DRAWABLE_XID(drawable), GDK_GC_XGC (gc), // x, y, text, text_length, GR_TFUC32|GR_TFBASELINE); { gchar* mstr; GdkWChar* str; gint i; str = g_new(GdkWChar, text_length + 1); for (i = 0; i < text_length; i++) { str[i] = text[i]; } str[i] = 0; mstr = gdk_wcstombs(str); gi_gc_attch_window(GDK_GC_XGC(gc), GDK_DRAWABLE_XID(drawable)); //GrText (GDK_DRAWABLE_XID(drawable), GDK_GC_XGC (gc), // x, y, mstr, strlen(mstr)); int r,g,b; gi_pixel_to_color(&gdk_screen_info,GDK_GC_XGC(gc)->values.foreground,&r, &g,&b); gi_ufont_set_text_attr(GDK_GC_XGC(gc),GDK_FONT_XFONT(font),FALSE,GI_RGB(r,g,b),0); // gi_ufont_draw(GDK_GC_XGC(gc),GDK_FONT_XFONT(font),mstr, x,y,strlen(mstr)); g_free(str); g_free(mstr); } /* [00/08/30] @@@ NANOGTK: end modification @@@ */ }
static void gdk_x11_draw_text_wc (GdkDrawable *drawable, GdkFont *font, GdkGC *gc, gint x, gint y, const GdkWChar *text, gint text_length) { GdkDrawableImplX11 *impl; Display *xdisplay; impl = GDK_DRAWABLE_IMPL_X11 (drawable); xdisplay = GDK_SCREEN_XDISPLAY (impl->screen); if (font->type == GDK_FONT_FONT) { XFontStruct *xfont = (XFontStruct *) GDK_FONT_XFONT (font); gchar *text_8bit; gint i; XSetFont(xdisplay, GDK_GC_GET_XGC (gc), xfont->fid); text_8bit = g_new (gchar, text_length); for (i=0; i<text_length; i++) text_8bit[i] = text[i]; XDrawString (xdisplay, impl->xid, GDK_GC_GET_XGC (gc), x, y, text_8bit, text_length); g_free (text_8bit); } else if (font->type == GDK_FONT_FONTSET) { if (sizeof(GdkWChar) == sizeof(wchar_t)) { XwcDrawString (xdisplay, impl->xid, (XFontSet) GDK_FONT_XFONT (font), GDK_GC_GET_XGC (gc), x, y, (wchar_t *)text, text_length); } else { wchar_t *text_wchar; gint i; text_wchar = g_new (wchar_t, text_length); for (i=0; i<text_length; i++) text_wchar[i] = text[i]; XwcDrawString (xdisplay, impl->xid, (XFontSet) GDK_FONT_XFONT (font), GDK_GC_GET_XGC (gc), x, y, text_wchar, text_length); g_free (text_wchar); } } else
JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GdkFontMetrics_initState (JNIEnv *env, jobject obj, jstring fname, jint size) { jintArray array; jint *metrics; const char *cfname; char *xlfd; GdkFont *font; XFontStruct *xfont; cfname = (*env)->GetStringUTFChars (env, fname, NULL); xlfd = g_strdup_printf (cfname, (size * 10)); (*env)->ReleaseStringUTFChars (env, fname, cfname); array = (*env)->NewIntArray (env, NUM_METRICS); metrics = (*env)->GetIntArrayElements (env, array, NULL); gdk_threads_enter (); font = gdk_font_load (xlfd); xfont = GDK_FONT_XFONT (font); metrics[ASCENT] = font->ascent; metrics[MAX_ASCENT] = xfont->max_bounds.ascent; metrics[DESCENT] = font->descent; metrics[MAX_DESCENT] = xfont->max_bounds.descent; metrics[MAX_ADVANCE] = xfont->max_bounds.width; gdk_threads_leave (); g_free (xlfd); (*env)->ReleaseIntArrayElements (env, array, metrics, 0); NSA_SET_PTR (env, obj, font); return array; }
/* ============================================================================== 指定したGdk_Fontにおける, 描画範囲(の最大)を得る ============================================================================== */ void VnXFont::GetFontRect(Gdk_Font& font, VnRect& rect) { XFontSetExtents* ext; ext = XExtentsOfFontSet((XFontSet) GDK_FONT_XFONT(font.gdkobj())); rect.x = ext->max_ink_extent.x; rect.y = ext->max_ink_extent.y; rect.width = ext->max_ink_extent.width; rect.height = ext->max_ink_extent.height; }
/* gdk_x11_draw_text * * Modified by Li-Da Lho to draw 16 bits and Multibyte strings * * Interface changed: add "GdkFont *font" to specify font or fontset explicitely */ static void gdk_x11_draw_text (GdkDrawable *drawable, GdkFont *font, GdkGC *gc, gint x, gint y, const gchar *text, gint text_length) { GdkDrawableImplX11 *impl; Display *xdisplay; impl = GDK_DRAWABLE_IMPL_X11 (drawable); xdisplay = GDK_SCREEN_XDISPLAY (impl->screen); if (font->type == GDK_FONT_FONT) { XFontStruct *xfont = (XFontStruct *) GDK_FONT_XFONT (font); XSetFont(xdisplay, GDK_GC_GET_XGC (gc), xfont->fid); if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) { XDrawString (xdisplay, impl->xid, GDK_GC_GET_XGC (gc), x, y, text, text_length); } else { XDrawString16 (xdisplay, impl->xid, GDK_GC_GET_XGC (gc), x, y, (XChar2b *) text, text_length / 2); } } else if (font->type == GDK_FONT_FONTSET) { XFontSet fontset = (XFontSet) GDK_FONT_XFONT (font); XmbDrawString (xdisplay, impl->xid, fontset, GDK_GC_GET_XGC (gc), x, y, text, text_length); } else g_error("undefined font type\n"); }
void my_gdk_draw_text(GdkDrawable *drawable, GdkFont *font, GdkGC *gc, gint x, gint y, const gchar *text, gint text_length) { #ifdef MOZ_WIDGET_GTK GdkWindowPrivate *drawable_private; GdkFontPrivate *font_private; GdkGCPrivate *gc_private; #endif /* MOZ_WIDGET_GTK */ g_return_if_fail (drawable != NULL); g_return_if_fail (font != NULL); g_return_if_fail (gc != NULL); g_return_if_fail (text != NULL); #ifdef MOZ_WIDGET_GTK drawable_private = (GdkWindowPrivate*) drawable; if (drawable_private->destroyed) return; gc_private = (GdkGCPrivate*) gc; font_private = (GdkFontPrivate*) font; #endif /* MOZ_WIDGET_GTK */ #ifdef MOZ_WIDGET_GTK2 if (GDK_IS_WINDOW(drawable) && GDK_WINDOW_OBJECT(drawable)->destroyed) return; #endif /* MOZ_WIDGET_GTK2 */ if (font->type == GDK_FONT_FONT) { #ifdef MOZ_WIDGET_GTK XFontStruct *xfont = (XFontStruct *) font_private->xfont; #endif /* MOZ_WIDGET_GTK */ #ifdef MOZ_WIDGET_GTK2 XFontStruct *xfont = (XFontStruct *) GDK_FONT_XFONT(font); #endif /* MOZ_WIDGET_GTK2 */ // gdk does this... we don't need it.. // XSetFont(drawable_private->xdisplay, gc_private->xgc, xfont->fid); // We clamp the sizes down to 32768 which is the maximum width of // a window. Even if a font was 1 pixel high and started at the // left, the maximum size of a draw request could only be 32k. if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) { #ifdef MOZ_WIDGET_GTK XDrawString (drawable_private->xdisplay, drawable_private->xwindow, gc_private->xgc, x, y, text, MIN(text_length, 32768)); #endif /* MOZ_WIDGET_GTK */ #ifdef MOZ_WIDGET_GTK2 XDrawString (GDK_WINDOW_XDISPLAY(drawable), GDK_DRAWABLE_XID(drawable), GDK_GC_XGC(gc), x, y, text, MIN(text_length, 32768)); #endif /* MOZ_WIDGET_GTK2 */ } else { #ifdef MOZ_WIDGET_GTK XDrawString16 (drawable_private->xdisplay, drawable_private->xwindow, gc_private->xgc, x, y, (XChar2b *) text, MIN((text_length / 2), 32768)); #endif /* MOZ_WIDGET_GTK */ #ifdef MOZ_WIDGET_GTK2 XDrawString16 (GDK_WINDOW_XDISPLAY(drawable), GDK_DRAWABLE_XID(drawable), GDK_GC_XGC(gc), x, y, (XChar2b *) text, MIN((text_length / 2), 32768)); #endif /* MOZ_WIDGET_GTK2 */ } } else if (font->type == GDK_FONT_FONTSET) { #ifdef MOZ_WIDGET_GTK XFontSet fontset = (XFontSet) font_private->xfont; XmbDrawString (drawable_private->xdisplay, drawable_private->xwindow, fontset, gc_private->xgc, x, y, text, text_length); #endif /* MOZ_WIDGET_GTK */ #ifdef MOZ_WIDGET_GTK2 XFontSet fontset = (XFontSet) GDK_FONT_XFONT(font); XmbDrawString (GDK_WINDOW_XDISPLAY(drawable), GDK_DRAWABLE_XID(drawable), fontset, GDK_GC_XGC(gc), x, y, text, text_length); #endif /* MOZ_WIDGET_GTK2 */ } else g_error("undefined font type\n"); }
static int gtk_initialize_font_instance (struct Lisp_Font_Instance *f, Lisp_Object name, Lisp_Object device, Error_behavior errb) { GdkFont *gf; XFontStruct *xf; const char *extname; TO_EXTERNAL_FORMAT (LISP_STRING, f->name, C_STRING_ALLOCA, extname, Qctext); gf = gdk_font_load (extname); if (!gf) { maybe_signal_simple_error ("couldn't load font", f->name, Qfont, errb); return 0; } xf = GDK_FONT_XFONT (gf); /* Don't allocate the data until we're sure that we will succeed, or the finalize method may get f****d. */ f->data = xnew (struct gtk_font_instance_data); FONT_INSTANCE_GTK_TRUENAME (f) = Qnil; FONT_INSTANCE_GTK_FONT (f) = gf; f->ascent = gf->ascent; f->descent = gf->descent; f->height = gf->ascent + gf->descent; /* Now lets figure out the width of the font */ { /* following change suggested by Ted Phelps <*****@*****.**> */ unsigned int def_char = 'n'; /*xf->default_char;*/ unsigned int byte1, byte2; once_more: byte1 = def_char >> 8; byte2 = def_char & 0xFF; if (xf->per_char) { /* Old versions of the R5 font server have garbage (>63k) as def_char. 'n' might not be a valid character. */ if (byte1 < xf->min_byte1 || byte1 > xf->max_byte1 || byte2 < xf->min_char_or_byte2 || byte2 > xf->max_char_or_byte2) f->width = 0; else f->width = xf->per_char[(byte1 - xf->min_byte1) * (xf->max_char_or_byte2 - xf->min_char_or_byte2 + 1) + (byte2 - xf->min_char_or_byte2)].width; } else f->width = xf->max_bounds.width; /* Some fonts have a default char whose width is 0. This is no good. If that's the case, first try 'n' as the default char, and if n has 0 width too (unlikely) then just use the max width. */ if (f->width == 0) { if (def_char == xf->default_char) f->width = xf->max_bounds.width; else { def_char = xf->default_char; goto once_more; } } } /* If all characters don't exist then there could potentially be 0-width characters lurking out there. Not setting this flag trips an optimization that would make them appear to have width to redisplay. This is bad. So we set it if not all characters have the same width or if not all characters are defined. */ /* #### This sucks. There is a measurable performance increase when using proportional width fonts if this flag is not set. Unfortunately so many of the f*****g X fonts are not fully defined that we could almost just get rid of this damn flag and make it an assertion. */ f->proportional_p = (xf->min_bounds.width != xf->max_bounds.width || (/* x_handle_non_fully_specified_fonts */ 0 && !xf->all_chars_exist)); #if 0 f->width = gdk_char_width (gf, 'n'); f->proportional_p = (gdk_char_width (gf, '|') != gdk_char_width (gf, 'W')) ? 1 : 0; #endif return 1; }