⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdkfont-win32.c

📁 linux下电话本所依赖的一些图形库
💻 C
📖 第 1 页 / 共 4 页
字号:
	  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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -