?? gdkfont-win32.c
字號(hào):
else if (g_strcasecmp (lfp->lfFaceName, "times") == 0) strcpy (lfp->lfFaceName, "times new roman"); } else if (tries == 1) { if (g_strcasecmp (lfp->lfFaceName, "courier") == 0) { strcpy (lfp->lfFaceName, ""); lfp->lfPitchAndFamily |= FF_MODERN; } else if (g_strcasecmp (lfp->lfFaceName, "times new roman") == 0) { strcpy (lfp->lfFaceName, ""); lfp->lfPitchAndFamily |= FF_ROMAN; } else if (g_strcasecmp (lfp->lfFaceName, "helvetica") == 0 || g_strcasecmp (lfp->lfFaceName, "lucida") == 0) { strcpy (lfp->lfFaceName, ""); lfp->lfPitchAndFamily |= FF_SWISS; } else { strcpy (lfp->lfFaceName, ""); lfp->lfPitchAndFamily = (lfp->lfPitchAndFamily & 0x0F) | FF_DONTCARE; } } else break; tries++; } if (!hfont) return NULL; singlefont = g_new (GdkWin32SingleFont, 1); singlefont->hfont = hfont; GetObject (singlefont->hfont, sizeof (logfont), &logfont); oldfont = SelectObject (_gdk_display_hdc, singlefont->hfont); memset (&singlefont->fs, 0, sizeof (singlefont->fs)); singlefont->charset = GetTextCharsetInfo (_gdk_display_hdc, &singlefont->fs, 0); GetTextFace (_gdk_display_hdc, sizeof (face), face); SelectObject (_gdk_display_hdc, oldfont); if (TranslateCharsetInfo ((DWORD *) singlefont->charset, &csi, TCI_SRCCHARSET) && singlefont->charset != MAC_CHARSET) singlefont->codepage = csi.ciACP; else singlefont->codepage = 0; GDK_NOTE (MISC, (g_print ("... = %p %s cs %s cp%d\n", singlefont->hfont, face, charset_name (singlefont->charset), singlefont->codepage), g_print ("... Unicode subranges:"), print_unicode_subranges (&singlefont->fs))); if (check_unicode_subranges (singlefont->charset, &singlefont->fs)) GDK_NOTE (MISC, (g_print ("... Guesstimated Unicode subranges:"), print_unicode_subranges (&singlefont->fs))); return singlefont;}static GdkWin32SingleFont *gdk_font_load_internal (const gchar *font_name){ LOGFONT logfont; char *fn; int numfields, n1, n2; char foundry[32], family[100], weight[32], slant[32], set_width[32], spacing[32], registry[32], encoding[32]; char pixel_size[10], point_size[10], res_x[10], res_y[10], avg_width[10]; int c; char *p; int logpixelsy; g_return_val_if_fail (font_name != NULL, NULL); GDK_NOTE (MISC, g_print ("gdk_font_load_internal: %s\n", font_name)); numfields = sscanf (font_name, "-%30[^-]-%100[^-]-%30[^-]-%30[^-]-%30[^-]-%n", foundry, family, weight, slant, set_width, &n1); if (numfields == 0) { /* Probably a plain Windows font name */ logfont.lfHeight = 0; logfont.lfWidth = 0; logfont.lfEscapement = 0; logfont.lfOrientation = 0; logfont.lfWeight = FW_DONTCARE; logfont.lfItalic = FALSE; logfont.lfUnderline = FALSE; logfont.lfStrikeOut = FALSE; logfont.lfCharSet = ANSI_CHARSET; logfont.lfOutPrecision = OUT_TT_ONLY_PRECIS; logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logfont.lfQuality = PROOF_QUALITY; logfont.lfPitchAndFamily = DEFAULT_PITCH; fn = g_filename_from_utf8 (font_name, -1, NULL, NULL, NULL); strcpy (logfont.lfFaceName, fn); g_free (fn); } else if (numfields != 5) { g_warning ("gdk_font_load: font name %s illegal", font_name); return NULL; } else { /* It must be a XLFD name */ /* Check for hex escapes in the font family, * put in there by logfont_to_xlfd. Convert them in-place. */ p = family; while (*p) { if (*p == '%' && isxdigit (p[1]) && isxdigit (p[2])) { sscanf (p+1, "%2x", &c); *p = c; strcpy (p+1, p+3); } p++; } /* Skip add_style which often is empty in the requested font name */ while (font_name[n1] && font_name[n1] != '-') n1++; numfields++; numfields += sscanf (font_name + n1, "-%8[^-]-%8[^-]-%8[^-]-%8[^-]-%30[^-]-%8[^-]-%30[^-]-%30[^-]%n", pixel_size, point_size, res_x, res_y, spacing, avg_width, registry, encoding, &n2); if (numfields != 14 || font_name[n1 + n2] != '\0') { g_warning ("gdk_font_load: font name %s illegal", font_name); return NULL; } logpixelsy = GetDeviceCaps (_gdk_display_hdc, LOGPIXELSY); if (strcmp (pixel_size, "*") == 0) if (strcmp (point_size, "*") == 0) logfont.lfHeight = 0; else logfont.lfHeight = -(int) (((double) atoi (point_size))/720.*logpixelsy); else logfont.lfHeight = -atoi (pixel_size); logfont.lfWidth = 0; logfont.lfEscapement = 0; logfont.lfOrientation = 0; if (g_strcasecmp (weight, "thin") == 0) logfont.lfWeight = FW_THIN; else if (g_strcasecmp (weight, "extralight") == 0) logfont.lfWeight = FW_EXTRALIGHT; else if (g_strcasecmp (weight, "ultralight") == 0)#ifdef FW_ULTRALIGHT logfont.lfWeight = FW_ULTRALIGHT;#else logfont.lfWeight = FW_EXTRALIGHT; /* In fact, FW_ULTRALIGHT really is * defined as FW_EXTRALIGHT anyway. */#endif else if (g_strcasecmp (weight, "light") == 0) logfont.lfWeight = FW_LIGHT; else if (g_strcasecmp (weight, "normal") == 0) logfont.lfWeight = FW_NORMAL; else if (g_strcasecmp (weight, "regular") == 0) logfont.lfWeight = FW_REGULAR; else if (g_strcasecmp (weight, "medium") == 0) logfont.lfWeight = FW_MEDIUM; else if (g_strcasecmp (weight, "semibold") == 0) logfont.lfWeight = FW_SEMIBOLD; else if (g_strcasecmp (weight, "demibold") == 0)#ifdef FW_DEMIBOLD logfont.lfWeight = FW_DEMIBOLD;#else logfont.lfWeight = FW_SEMIBOLD; /* As above */#endif else if (g_strcasecmp (weight, "bold") == 0) logfont.lfWeight = FW_BOLD; else if (g_strcasecmp (weight, "extrabold") == 0) logfont.lfWeight = FW_EXTRABOLD; else if (g_strcasecmp (weight, "ultrabold") == 0)#ifdef FW_ULTRABOLD logfont.lfWeight = FW_ULTRABOLD;#else logfont.lfWeight = FW_EXTRABOLD; /* As above */#endif else if (g_strcasecmp (weight, "heavy") == 0) logfont.lfWeight = FW_HEAVY; else if (g_strcasecmp (weight, "black") == 0)#ifdef FW_BLACK logfont.lfWeight = FW_BLACK;#else logfont.lfWeight = FW_HEAVY; /* As above */#endif else logfont.lfWeight = FW_DONTCARE; if (g_strcasecmp (slant, "italic") == 0 || g_strcasecmp (slant, "oblique") == 0 || g_strcasecmp (slant, "i") == 0 || g_strcasecmp (slant, "o") == 0) logfont.lfItalic = TRUE; else logfont.lfItalic = FALSE; logfont.lfUnderline = FALSE; logfont.lfStrikeOut = FALSE; if (g_strcasecmp (registry, "iso8859") == 0) if (strcmp (encoding, "1") == 0) logfont.lfCharSet = ANSI_CHARSET; else if (strcmp (encoding, "2") == 0) logfont.lfCharSet = EASTEUROPE_CHARSET; else if (strcmp (encoding, "7") == 0) logfont.lfCharSet = GREEK_CHARSET; else if (strcmp (encoding, "8") == 0) logfont.lfCharSet = HEBREW_CHARSET; else if (strcmp (encoding, "9") == 0) logfont.lfCharSet = TURKISH_CHARSET; else logfont.lfCharSet = ANSI_CHARSET; /* XXX ??? */ else if (g_strcasecmp (registry, "jisx0208.1983") == 0) logfont.lfCharSet = SHIFTJIS_CHARSET; else if (g_strcasecmp (registry, "ksc5601.1987") == 0) logfont.lfCharSet = HANGEUL_CHARSET; else if (g_strcasecmp (registry, "gb2312.1980") == 0) logfont.lfCharSet = GB2312_CHARSET; else if (g_strcasecmp (registry, "big5") == 0) logfont.lfCharSet = CHINESEBIG5_CHARSET; else if (g_strcasecmp (registry, "windows") == 0 || g_strcasecmp (registry, "microsoft") == 0) if (g_strcasecmp (encoding, "symbol") == 0) logfont.lfCharSet = SYMBOL_CHARSET; else if (g_strcasecmp (encoding, "shiftjis") == 0) logfont.lfCharSet = SHIFTJIS_CHARSET; else if (g_strcasecmp (encoding, "gb2312") == 0) logfont.lfCharSet = GB2312_CHARSET; else if (g_strcasecmp (encoding, "hangeul") == 0) logfont.lfCharSet = HANGEUL_CHARSET; else if (g_strcasecmp (encoding, "big5") == 0) logfont.lfCharSet = CHINESEBIG5_CHARSET; else if (g_strcasecmp (encoding, "johab") == 0) logfont.lfCharSet = JOHAB_CHARSET; else if (g_strcasecmp (encoding, "hebrew") == 0) logfont.lfCharSet = HEBREW_CHARSET; else if (g_strcasecmp (encoding, "arabic") == 0) logfont.lfCharSet = ARABIC_CHARSET; else if (g_strcasecmp (encoding, "greek") == 0) logfont.lfCharSet = GREEK_CHARSET; else if (g_strcasecmp (encoding, "turkish") == 0) logfont.lfCharSet = TURKISH_CHARSET; else if (g_strcasecmp (encoding, "easteurope") == 0) logfont.lfCharSet = EASTEUROPE_CHARSET; else if (g_strcasecmp (encoding, "russian") == 0) logfont.lfCharSet = RUSSIAN_CHARSET; else if (g_strcasecmp (encoding, "mac") == 0) logfont.lfCharSet = MAC_CHARSET; else if (g_strcasecmp (encoding, "baltic") == 0) logfont.lfCharSet = BALTIC_CHARSET; else if (g_strcasecmp (encoding, "cp1251") == 0) logfont.lfCharSet = RUSSIAN_CHARSET; else logfont.lfCharSet = ANSI_CHARSET; /* XXX ??? */ else logfont.lfCharSet = ANSI_CHARSET; /* XXX ??? */ logfont.lfOutPrecision = OUT_TT_PRECIS; logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logfont.lfQuality = PROOF_QUALITY; if (g_strcasecmp (spacing, "m") == 0) logfont.lfPitchAndFamily = FIXED_PITCH; else if (g_strcasecmp (spacing, "p") == 0) logfont.lfPitchAndFamily = VARIABLE_PITCH; else logfont.lfPitchAndFamily = DEFAULT_PITCH; fn = g_filename_from_utf8 (family, -1, NULL, NULL, NULL); strcpy (logfont.lfFaceName, fn); g_free (fn); } return gdk_font_load_logfont (&logfont);}static GdkFont *gdk_font_from_one_singlefont (GdkWin32SingleFont *singlefont){ GdkFont *font; GdkFontPrivateWin32 *private; HGDIOBJ oldfont; TEXTMETRIC textmetric; private = g_new (GdkFontPrivateWin32, 1); font = (GdkFont*) private; private->base.ref_count = 1; private->names = NULL; private->fonts = g_slist_append (NULL, singlefont); /* Pretend all fonts are fontsets... Gtktext and gtkentry work better * that way, they use wide chars, which is necessary for non-ASCII * chars to work. (Yes, even Latin-1, as we use Unicode internally.) */ font->type = GDK_FONT_FONTSET; oldfont = SelectObject (_gdk_display_hdc, singlefont->hfont); GetTextMetrics (_gdk_display_hdc, &textmetric); SelectObject (_gdk_display_hdc, oldfont); font->ascent = textmetric.tmAscent; font->descent = textmetric.tmDescent; GDK_NOTE (MISC, g_print ("... asc %d desc %d\n", font->ascent, font->descent)); return font;}GdkFont*gdk_font_load_for_display (GdkDisplay *display, const gchar *font_name){ GdkFont *font; GdkFontPrivateWin32 *private; GdkWin32SingleFont *singlefont; HGDIOBJ oldfont; TEXTMETRIC textmetric; g_return_val_if_fail (font_name != NULL, NULL); g_return_val_if_fail (display == gdk_display_get_default (), NULL); font = gdk_font_hash_lookup (GDK_FONT_FONTSET, font_name); if (font) return font; private = g_new (GdkFontPrivateWin32, 1); font = (GdkFont*) private; singlefont = gdk_font_load_internal (font_name); private->base.ref_count = 1; private->names = NULL; private->fonts = g_slist_append (NULL, singlefont); /* Pretend all fonts are fontsets... Gtktext and gtkentry work better * that way, they use wide chars, which is necessary for non-ASCII * chars to work. (Yes, even Latin-1, as we use Unicode internally.) */ font->type = GDK_FONT_FONTSET; oldfont = SelectObject (_gdk_display_hdc, singlefont->hfont); GetTextMetrics (_gdk_display_hdc, &textmetric); SelectObject (_gdk_display_hdc, oldfont); font->ascent = textmetric.tmAscent; font->descent = textmetric.tmDescent; GDK_NOTE (MISC, g_print ("... asc %d desc %d\n", font->ascent, font->descent)); gdk_font_hash_insert (GDK_FONT_FONTSET, font, font_name); return gdk_font_from_one_singlefont (gdk_font_load_internal (font_name));}GdkFont*gdk_font_from_description_for_display (GdkDisplay *display, PangoFontDescription *font_desc){ PangoFontMap *font_map; PangoFont *font; GdkFont *result = NULL; g_return_val_if_fail (font_desc != NULL, NULL); g_return_val_if_fail (display == gdk_display_get_default (), NULL); font_map = pango_win32_font_map_for_display (); font = pango_font_map_load_font (font_map, gdk_pango_context_get (), font_desc); if (font) { LOGFONT *lfp = pango_win32_font_logfont (font); result = gdk_font_from_one_singlefont (gdk_font_load_logfont (lfp)); g_free (lfp); g_object_unref (font); } return result;}GdkFont*gdk_fontset_load (const gchar *fontset_name){ GdkFont *font; GdkFontPrivateWin32 *private; GdkWin32SingleFont *singlefont; HGDIOBJ oldfont; TEXTMETRIC textmetric; gchar *fs; gchar *b, *p, *s; g_return_val_if_fail (fontset_name != NULL, NULL); font = gdk_font_hash_lookup (GDK_FONT_FONTSET, fontset_name); if (font) return font; s = fs = g_strdup (fontset_name); while (*s && isspace (*s)) s++; g_return_val_if_fail (*s, NULL);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -