GTK+-2.0源码之pango-1.15.6.tar.gz

源代码在线查看: pango-fontmap.c

软件大小: 1942 K
上传用户: wanghao891207
关键词: pango GTK 2.0 tar
下载地址: 免注册下载 普通下载 VIP

相关代码

				/* Pango				 * pango-fontmap.c: Font handling				 *				 * Copyright (C) 2000 Red Hat Software				 *				 * This library is free software; you can redistribute it and/or				 * modify it under the terms of the GNU Library General Public				 * License as published by the Free Software Foundation; either				 * version 2 of the License, or (at your option) any later version.				 *				 * This library is distributed in the hope that it will be useful,				 * but WITHOUT ANY WARRANTY; without even the implied warranty of				 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU				 * Library General Public License for more details.				 *				 * You should have received a copy of the GNU Library General Public				 * License along with this library; if not, write to the				 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,				 * Boston, MA 02111-1307, USA.				 */								#include 				#include "pango-fontmap.h"				#include "pango-impl-utils.h"				#include 								static PangoFontset *pango_font_map_real_load_fontset (PangoFontMap               *fontmap,										       PangoContext               *context,										       const PangoFontDescription *desc,										       PangoLanguage              *language);												G_DEFINE_TYPE (PangoFontMap, pango_font_map, G_TYPE_OBJECT)								static void				pango_font_map_class_init (PangoFontMapClass *class)				{				  class->load_fontset = pango_font_map_real_load_fontset;				}								static void				pango_font_map_init (PangoFontMap *fontmap)				{				}								/**				 * pango_font_map_load_font:				 * @fontmap: a #PangoFontMap				 * @context: the #PangoContext the font will be used with				 * @desc: a #PangoFontDescription describing the font to load				 *				 * Load the font in the fontmap that is the closest match for @desc.				 *				 * Returns the font loaded, or %NULL if no font matched.				 **/				PangoFont *				pango_font_map_load_font  (PangoFontMap               *fontmap,							   PangoContext               *context,							   const PangoFontDescription *desc)				{				  g_return_val_if_fail (fontmap != NULL, NULL);				  g_return_val_if_fail (pango_font_description_get_family (desc) != NULL, NULL);								  return PANGO_FONT_MAP_GET_CLASS (fontmap)->load_font (fontmap, context, desc);				}								/**				 * pango_font_map_list_families:				 * @fontmap: a #PangoFontMap				 * @families: location to store a pointer to an array of #PangoFontFamily *.				 *            This array should be freed with g_free().				 * @n_families: location to store the number of elements in @families				 *				 * List all families for a fontmap.				 **/				void				pango_font_map_list_families (PangoFontMap      *fontmap,							      PangoFontFamily ***families,							      int               *n_families)				{				  g_return_if_fail (fontmap != NULL);								  PANGO_FONT_MAP_GET_CLASS (fontmap)->list_families (fontmap, families, n_families);				}								/**				 * pango_font_map_load_fontset:				 * @fontmap: a #PangoFontMap				 * @context: the #PangoContext the font will be used with				 * @desc: a #PangoFontDescription describing the font to load				 * @language: a #PangoLanguage the fonts will be used for				 *				 * Load a set of fonts in the fontmap that can be used to render				 * a font matching @desc.				 *				 * Returns the fontset, or %NULL if no font matched.				 **/				PangoFontset *				pango_font_map_load_fontset (PangoFontMap                 *fontmap,							     PangoContext                 *context,							     const PangoFontDescription   *desc,							     PangoLanguage                *language)				{				  g_return_val_if_fail (fontmap != NULL, NULL);				  g_return_val_if_fail (pango_font_description_get_family (desc) != NULL, NULL);								  return PANGO_FONT_MAP_GET_CLASS (fontmap)->load_fontset (fontmap, context, desc, language);				}								static void				pango_font_map_fontset_add_fonts (PangoFontMap          *fontmap,								  PangoContext          *context,								  PangoFontsetSimple    *fonts,								  PangoFontDescription  *desc,								  const char            *family)				{				  char **aliases;				  int n_aliases;				  int j;				  PangoFont *font;								  pango_lookup_aliases (family,							&aliases,							&n_aliases);								  if (n_aliases)				    {				      for (j = 0; j < n_aliases; j++)					{					  pango_font_description_set_family_static (desc, aliases[j]);					  font = pango_font_map_load_font (fontmap, context, desc);					  if (font)					    pango_fontset_simple_append (fonts, font);					}				    }				  else				    {				      pango_font_description_set_family_static (desc, family);				      font = pango_font_map_load_font (fontmap, context, desc);				      if (font)					pango_fontset_simple_append (fonts, font);				    }				}								static PangoFontset *				pango_font_map_real_load_fontset (PangoFontMap               *fontmap,								  PangoContext               *context,								  const PangoFontDescription *desc,								  PangoLanguage              *language)				{				  PangoFontDescription *tmp_desc = pango_font_description_copy_static (desc);				  char **families;				  int i;				  PangoFontsetSimple *fonts;				  static GHashTable *warned_fonts = NULL;								  families = g_strsplit (pango_font_description_get_family (desc), ",", -1);								  fonts = pango_fontset_simple_new (language);								  for (i = 0; families[i]; i++)				    pango_font_map_fontset_add_fonts (fontmap,								      context,								      fonts,								      tmp_desc,								      families[i]);								  g_strfreev (families);								  /* The font description was completely unloadable, try with				   * family == "Sans"				   */				  if (pango_fontset_simple_size (fonts) == 0)				    {				      char *ctmp1, *ctmp2;								      pango_font_description_set_family_static (tmp_desc,										pango_font_description_get_family (desc));								      ctmp1 = pango_font_description_to_string (desc);				      pango_font_description_set_family_static (tmp_desc, "Sans");								      if (!warned_fonts || !g_hash_table_lookup (warned_fonts, ctmp1))					{					  if (!warned_fonts)					    warned_fonts = g_hash_table_new (g_str_hash, g_str_equal);									  g_hash_table_insert (warned_fonts, g_strdup (ctmp1), GINT_TO_POINTER (1));									  ctmp2 = pango_font_description_to_string (tmp_desc);					  g_warning ("couldn't load font \"%s\", falling back to \"%s\", "						     "expect ugly output.", ctmp1, ctmp2);					  g_free (ctmp2);					}				      g_free (ctmp1);								      pango_font_map_fontset_add_fonts (fontmap,									context,									fonts,									tmp_desc,									"Sans");				    }								  /* We couldn't try with Sans and the specified style. Try Sans Normal				   */				  if (pango_fontset_simple_size (fonts) == 0)				    {				      char *ctmp1, *ctmp2;								      pango_font_description_set_family_static (tmp_desc, "Sans");				      ctmp1 = pango_font_description_to_string (tmp_desc);				      pango_font_description_set_style (tmp_desc, PANGO_STYLE_NORMAL);				      pango_font_description_set_weight (tmp_desc, PANGO_WEIGHT_NORMAL);				      pango_font_description_set_variant (tmp_desc, PANGO_VARIANT_NORMAL);				      pango_font_description_set_stretch (tmp_desc, PANGO_STRETCH_NORMAL);								      if (!warned_fonts || !g_hash_table_lookup (warned_fonts, ctmp1))					{					  g_hash_table_insert (warned_fonts, g_strdup (ctmp1), GINT_TO_POINTER (1));									  ctmp2 = pango_font_description_to_string (tmp_desc);									  g_warning ("couldn't load font \"%s\", falling back to \"%s\", "						     "expect ugly output.", ctmp1, ctmp2);					  g_free (ctmp2);					}								      g_free (ctmp1);								      pango_font_map_fontset_add_fonts (fontmap,									context,									fonts,									tmp_desc,									"Sans");				    }								  pango_font_description_free (tmp_desc);								  /* Everything failed, we are screwed, there is no way to continue,				   * but lets just not crash here.				   */				  if (pango_fontset_simple_size (fonts) == 0)				      g_warning ("All font fallbacks failed!!!!");								  return PANGO_FONTSET (fonts);				}								/**				 * pango_font_map_get_shape_engine_type:				 * @fontmap: a #PangoFontMap				 *				 * Returns the render ID for shape engines for this fontmap.				 * See the render_type field of				 * #PangoEngineInfo.				  *				 * Return value: the ID string for shape engines for				 *  this fontmap. Owned by Pango, should not be modified				 *  or freed.				 *				 * Since: 1.4				 **/				G_CONST_RETURN char *				pango_font_map_get_shape_engine_type (PangoFontMap *fontmap)				{				  g_return_val_if_fail (PANGO_IS_FONT_MAP (fontmap), NULL);								  return PANGO_FONT_MAP_GET_CLASS (fontmap)->shape_engine_type;				}											

相关资源