?? gdkfont-win32.c
字號:
private = g_new (GdkFontPrivateWin32, 1); font = (GdkFont*) private; private->base.ref_count = 1; private->names = NULL; private->fonts = NULL; font->type = GDK_FONT_FONTSET; font->ascent = 0; font->descent = 0; while (TRUE) { if ((p = strchr (s, ',')) != NULL) b = p; else b = s + strlen (s); while (isspace (b[-1])) b--; *b = '\0'; singlefont = gdk_font_load_internal (s); if (singlefont) { private->fonts = g_slist_append (private->fonts, singlefont); oldfont = SelectObject (_gdk_display_hdc, singlefont->hfont); GetTextMetrics (_gdk_display_hdc, &textmetric); SelectObject (_gdk_display_hdc, oldfont); font->ascent = MAX (font->ascent, textmetric.tmAscent); font->descent = MAX (font->descent, textmetric.tmDescent); } if (p) { s = p + 1; while (*s && isspace (*s)) s++; } else break; if (!*s) break; } g_free (fs); gdk_font_hash_insert (GDK_FONT_FONTSET, font, fontset_name); return font;}GdkFont*gdk_fontset_load_for_display (GdkDisplay *display, const gchar *fontset_name){ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); return gdk_fontset_load (fontset_name);}void_gdk_font_destroy (GdkFont *font){ GdkFontPrivateWin32 *private = (GdkFontPrivateWin32 *) font; GdkWin32SingleFont *singlefont; GSList *list; singlefont = (GdkWin32SingleFont *) private->fonts->data; GDK_NOTE (MISC, g_print ("_gdk_font_destroy %p\n", singlefont->hfont)); gdk_font_hash_remove (font->type, font); switch (font->type) { case GDK_FONT_FONT: DeleteObject (singlefont->hfont); break; case GDK_FONT_FONTSET: list = private->fonts; while (list) { singlefont = (GdkWin32SingleFont *) list->data; DeleteObject (singlefont->hfont); list = list->next; } g_slist_free (private->fonts); break; } g_free (font);}gint_gdk_font_strlen (GdkFont *font, const gchar *str){ g_return_val_if_fail (font != NULL, -1); g_return_val_if_fail (str != NULL, -1); return strlen (str);}gintgdk_font_id (const GdkFont *font){ const GdkFontPrivateWin32 *private; g_return_val_if_fail (font != NULL, 0); private = (const GdkFontPrivateWin32 *) font; if (font->type == GDK_FONT_FONT) return (gint) ((GdkWin32SingleFont *) private->fonts->data)->hfont; else return 0;}gbooleangdk_font_equal (const GdkFont *fonta, const GdkFont *fontb){ const GdkFontPrivateWin32 *privatea; const GdkFontPrivateWin32 *privateb; g_return_val_if_fail (fonta != NULL, FALSE); g_return_val_if_fail (fontb != NULL, FALSE); privatea = (const GdkFontPrivateWin32 *) fonta; privateb = (const GdkFontPrivateWin32 *) fontb; if (fonta->type == GDK_FONT_FONT && fontb->type == GDK_FONT_FONT) return (((GdkWin32SingleFont *) privatea->fonts->data)->hfont == ((GdkWin32SingleFont *) privateb->fonts->data)->hfont); else if (fonta->type == GDK_FONT_FONTSET && fontb->type == GDK_FONT_FONTSET) { GSList *lista = privatea->fonts; GSList *listb = privateb->fonts; while (lista && listb) { if (((GdkWin32SingleFont *) lista->data)->hfont != ((GdkWin32SingleFont *) listb->data)->hfont) return FALSE; lista = lista->next; listb = listb->next; } if (lista || listb) return FALSE; else return TRUE; } else return FALSE;}/* Return the Unicode Subset bitfield number for a Unicode character */static intunicode_classify (wchar_t wc){ int min = 0; int max = G_N_ELEMENTS (utab) - 1; int mid; while (max >= min) { mid = (min + max) / 2; if (utab[mid].high < wc) min = mid + 1; else if (wc < utab[mid].low) max = mid - 1; else if (utab[mid].low <= wc && wc <= utab[mid].high) return utab[mid].bit; else break; } /* Fallback... returning -1 might cause problems. Returning * U_BASIC_LATIN won't help handling strange characters, but won't * do harm either. */ return U_BASIC_LATIN;}void_gdk_wchar_text_handle (GdkFont *font, const wchar_t *wcstr, int wclen, void (*handler)(GdkWin32SingleFont *, const wchar_t *, int, void *), void *arg){ GdkFontPrivateWin32 *private; GdkWin32SingleFont *singlefont; GSList *list; int block; const wchar_t *start, *end, *wcp; wcp = wcstr; end = wcp + wclen; private = (GdkFontPrivateWin32 *) font; g_assert (private->base.ref_count > 0); GDK_NOTE (MISC, g_print ("_gdk_wchar_text_handle: ")); while (wcp < end) { /* Split Unicode string into pieces of the same class */ start = wcp; block = unicode_classify (*wcp); while (wcp + 1 < end && unicode_classify (wcp[1]) == block) wcp++; /* Find a font in the fontset that can handle this class */ list = private->fonts; while (list) { singlefont = (GdkWin32SingleFont *) list->data; if (singlefont->fs.fsUsb[block/32] & (1 << (block % 32))) break; list = list->next; } if (!list) singlefont = NULL; GDK_NOTE (MISC, g_print ("%d:%d:%d:%p ", start-wcstr, wcp-wcstr, block, (singlefont ? singlefont->hfont : 0))); /* Call the callback function */ (*handler) (singlefont, start, wcp+1 - start, arg); wcp++; } GDK_NOTE (MISC, g_print ("\n"));}typedef struct{ SIZE total;} gdk_text_size_arg;static voidgdk_text_size_handler (GdkWin32SingleFont *singlefont, const wchar_t *wcstr, int wclen, void *argp){ SIZE this_size; HGDIOBJ oldfont; gdk_text_size_arg *arg = (gdk_text_size_arg *) argp; if (!singlefont) return; if ((oldfont = SelectObject (_gdk_display_hdc, singlefont->hfont)) == NULL) { WIN32_GDI_FAILED ("SelectObject"); return; } GetTextExtentPoint32W (_gdk_display_hdc, wcstr, wclen, &this_size); SelectObject (_gdk_display_hdc, oldfont); arg->total.cx += this_size.cx; arg->total.cy = MAX (arg->total.cy, this_size.cy);}gintgdk_text_width (GdkFont *font, const gchar *text, gint text_length){ gint width = -1; gdk_text_extents (font, text, text_length, NULL, NULL, &width, NULL, NULL); return width;}gintgdk_text_width_wc (GdkFont *font, const GdkWChar *text, gint text_length){ gint width = -1; gdk_text_extents_wc (font, text, text_length, NULL, NULL, &width, NULL, NULL); return width;}voidgdk_text_extents (GdkFont *font, const gchar *text, gint text_length, gint *lbearing, gint *rbearing, gint *width, gint *ascent, gint *descent){ gdk_text_size_arg arg; glong wlen; wchar_t *wcstr, wc; g_return_if_fail (font != NULL); g_return_if_fail (text != NULL); if (text_length == 0) { if (lbearing) *lbearing = 0; if (rbearing) *rbearing = 0; if (width) *width = 0; if (ascent) *ascent = 0; if (descent) *descent = 0; return; } g_assert (font->type == GDK_FONT_FONT || font->type == GDK_FONT_FONTSET); arg.total.cx = arg.total.cy = 0; if (text_length == 1) { wc = (guchar) text[0]; _gdk_wchar_text_handle (font, &wc, 1, gdk_text_size_handler, &arg); } else { wcstr = g_utf8_to_utf16 (text, text_length, NULL, &wlen, NULL); _gdk_wchar_text_handle (font, wcstr, wlen, gdk_text_size_handler, &arg); g_free (wcstr); } /* XXX This is quite bogus */ if (lbearing) *lbearing = 0; if (rbearing) *rbearing = arg.total.cx; /* What should be the difference between width and rbearing? */ if (width) *width = arg.total.cx; if (ascent) *ascent = arg.total.cy + 1; if (descent) *descent = font->descent + 1;}voidgdk_text_extents_wc (GdkFont *font, const GdkWChar *text, gint text_length, gint *lbearing, gint *rbearing, gint *width, gint *ascent, gint *descent){ gdk_text_size_arg arg; wchar_t *wcstr; gint i; g_return_if_fail (font != NULL); g_return_if_fail (text != NULL); if (text_length == 0) { if (lbearing) *lbearing = 0; if (rbearing) *rbearing = 0; if (width) *width = 0; if (ascent) *ascent = 0; if (descent) *descent = 0; return; } g_assert (font->type == GDK_FONT_FONT || font->type == GDK_FONT_FONTSET); if (sizeof (wchar_t) != sizeof (GdkWChar)) { wcstr = g_new (wchar_t, text_length); for (i = 0; i < text_length; i++) wcstr[i] = text[i]; } else wcstr = (wchar_t *) text; arg.total.cx = arg.total.cy = 0; _gdk_wchar_text_handle (font, wcstr, text_length, gdk_text_size_handler, &arg); if (sizeof (wchar_t) != sizeof (GdkWChar)) g_free (wcstr); /* XXX This is quite bogus */ if (lbearing) *lbearing = 0; if (rbearing) *rbearing = arg.total.cx; if (width) *width = arg.total.cx; if (ascent) *ascent = arg.total.cy + 1; if (descent) *descent = font->descent + 1;}GdkDisplay* gdk_font_get_display (GdkFont* font){ return _gdk_display;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -