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

📄 gdkfont-win32.c

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