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

📄 pangofc-fontmap.c

📁 GTK+-2.0源码之pango-1.15.6.tar.gz
💻 C
📖 第 1 页 / 共 4 页
字号:
		   const PangoFontDescription *desc){  int size = pango_font_description_get_size (desc);  if (pango_font_description_get_size_is_absolute (desc))    return size;  else    {      double dpi = pango_fc_font_map_get_resolution (fcfontmap, context);      return (int)(0.5 + size * dpi / 72.);    }}static PangoFcPatternSet *pango_fc_font_map_get_patterns (PangoFontMap               *fontmap,				PangoContext               *context,				const PangoFontDescription *desc,				PangoLanguage              *language){  PangoFcFontMap *fcfontmap = (PangoFcFontMap *)fontmap;  PangoFcFontMapPrivate *priv = fcfontmap->priv;  FcPattern *pattern, *font_pattern;  FcResult res;  int f;  PangoFcPatternSet *patterns;  FcFontSet *font_patterns;  FontsetHashKey key;  if (!language && context)    language = pango_context_get_language (context);  key.fontmap = fcfontmap;  get_context_matrix (context, &key.matrix);  key.language = language;  key.desc = pango_font_description_copy_static (desc);  pango_font_description_unset_fields (key.desc, PANGO_FONT_MASK_SIZE);  key.size = get_unscaled_size (fcfontmap, context, desc);  if (PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap)->context_key_get)    key.context_key = (gpointer)PANGO_FC_FONT_MAP_GET_CLASS (fcfontmap)->context_key_get (fcfontmap, context);  else    key.context_key = NULL;  patterns = g_hash_table_lookup (priv->fontset_hash, &key);  if (patterns == NULL)    {      double scale_factor = pango_matrix_get_font_scale_factor (&key.matrix);      double scaled_size = key.size * scale_factor / PANGO_SCALE;      pattern = pango_fc_make_pattern (desc, language,				       scaled_size,				       pango_fc_font_map_get_resolution (fcfontmap, context));      pango_fc_default_substitute (fcfontmap, context, pattern);      font_patterns = FcFontSort (NULL, pattern, FcTrue, NULL, &res);      if (!font_patterns)	{	  g_printerr ("No fonts found; this probably means that the fontconfig\n"		      "library is not correctly configured. You may need to\n"		      "edit the fonts.conf configuration file. More information\n"		      "about fontconfig can be found in the fontconfig(3) manual\n"		      "page and on http://fontconfig.org\n");	  /* There is no point in proceeding; we'll just get a segfault later	   * on, and a bunch more possibly confusing error messages in between.	   */	  /* return NULL; */	  exit (1);	}      patterns = g_slice_new (PangoFcPatternSet);      patterns->patterns = g_new (FcPattern *, font_patterns->nfont);      patterns->n_patterns = 0;      patterns->fontset = NULL;      patterns->cache_link = NULL;      for (f = 0; f < font_patterns->nfont; f++)	{	  font_pattern = FcFontRenderPrepare (NULL, pattern,					      font_patterns->fonts[f]);	  if (font_pattern)	    {#ifdef FC_PATTERN	      /* The FC_PATTERN element, which points back to our the original	       * pattern defeats our hash tables.	       */	      FcPatternDel (font_pattern, FC_PATTERN);#endif /* FC_PATTERN */	      patterns->patterns[patterns->n_patterns++] = uniquify_pattern (fcfontmap, font_pattern);	    }	}      FcPatternDestroy (pattern);      FcFontSetSortDestroy (font_patterns);      patterns->key = fontset_hash_key_copy (&key);      g_hash_table_insert (priv->fontset_hash,			   patterns->key,			   patterns);    }  if ((!patterns->cache_link ||       patterns->cache_link != priv->fontset_cache->head))    pango_fc_font_map_cache_fontset (fcfontmap, patterns);  pango_font_description_free (key.desc);  return patterns;}static gbooleanget_first_font (PangoFontset  *fontset,		PangoFont     *font,		gpointer       data){  *(PangoFont **)data = font;  return TRUE;}static PangoFont *pango_fc_font_map_load_font (PangoFontMap               *fontmap,			     PangoContext               *context,			     const PangoFontDescription *description){  PangoLanguage *language;  PangoFontset *fontset;  PangoFont *font = NULL;  if (context)    language = pango_context_get_language (context);  else    language = NULL;  fontset = pango_font_map_load_fontset (fontmap, context, description, language);  if (fontset)    {      pango_fontset_foreach (fontset, get_first_font, &font);      if (font)	g_object_ref (font);      g_object_unref (fontset);    }  return font;}static voidpango_fc_pattern_set_free (PangoFcPatternSet *patterns){  int i;  if (patterns->fontset)    g_object_unref (patterns->fontset);  for (i = 0; i < patterns->n_patterns; i++)    FcPatternDestroy (patterns->patterns[i]);  g_free (patterns->patterns);  g_slice_free (PangoFcPatternSet, patterns);}static voidpango_fc_font_map_cache_fontset (PangoFcFontMap    *fcfontmap,				 PangoFcPatternSet *patterns){  PangoFcFontMapPrivate *priv = fcfontmap->priv;  GQueue *cache = priv->fontset_cache;  if (patterns->cache_link)    {      /* Already in cache, move to head       */      if (patterns->cache_link == cache->tail)	cache->tail = patterns->cache_link->prev;      cache->head = g_list_remove_link (cache->head, patterns->cache_link);      cache->length--;    }  else    {      /* Add to cache initially       */      if (cache->length == FONTSET_CACHE_SIZE)	{	  PangoFcPatternSet *tmp_patterns = g_queue_pop_tail (cache);	  tmp_patterns->cache_link = NULL;	  g_hash_table_remove (priv->fontset_hash, tmp_patterns->key);	}      patterns->cache_link = g_list_prepend (NULL, patterns);    }  g_queue_push_head_link (cache, patterns->cache_link);}static PangoFontset *pango_fc_font_map_load_fontset (PangoFontMap                 *fontmap,				PangoContext                 *context,				const PangoFontDescription   *desc,				PangoLanguage                *language){  PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, desc, language);  PangoFontset *result;  int i;  if (!patterns)    return NULL;  if (!patterns->fontset)    {      PangoFontsetSimple *simple;      simple = pango_fontset_simple_new (language);      result = PANGO_FONTSET (simple);      for (i = 0; i < patterns->n_patterns; i++)	{	  PangoFont *font;	  font = pango_fc_font_map_new_font (fontmap, context, desc,					     patterns->patterns[i]);	  if (font)	    pango_fontset_simple_append (simple, font);	}      patterns->fontset = PANGO_FONTSET (simple);    }  result = g_object_ref (patterns->fontset);  return result;}static voiduncache_patterns (PangoFcPatternSet *patterns,		  PangoFcFontMap    *fcfontmap){  PangoFcFontMapPrivate *priv = fcfontmap->priv;  g_hash_table_remove (priv->fontset_hash, patterns->key);}static voidpango_fc_font_map_clear_fontset_cache (PangoFcFontMap *fcfontmap){  PangoFcFontMapPrivate *priv = fcfontmap->priv;  GQueue *cache = priv->fontset_cache;  g_list_foreach (cache->head, (GFunc)uncache_patterns, fcfontmap);  g_list_free (cache->head);  cache->head = NULL;  cache->tail = NULL;  cache->length = 0;}/** * pango_fc_font_map_cache_clear: * @fcfontmap: a #PangoFcFontmap * * Clear all cached information and fontsets for this font map; * this should be called whenever there is a change in the * output of the default_substitute() virtual function. * * This function is intended to be used only by backend implementations * deriving from #PangoFcFontmap. * * Since: 1.4 **/voidpango_fc_font_map_cache_clear (PangoFcFontMap *fcfontmap){  fcfontmap->priv->dpi = -1;  pango_fc_font_map_clear_fontset_cache (fcfontmap);}static voidpango_fc_font_map_set_coverage (PangoFcFontMap            *fcfontmap,				PangoFcCoverageKey        *key,				PangoCoverage             *coverage){  PangoFcFontMapPrivate *priv = fcfontmap->priv;  PangoFcCoverageKey *key_dup;  key_dup = g_malloc (sizeof (PangoFcCoverageKey) + strlen (key->filename) + 1);  key_dup->id = key->id;  key_dup->filename = (char *) (key_dup + 1);  strcpy (key_dup->filename, key->filename);  g_hash_table_insert (priv->coverage_hash,		       key_dup, pango_coverage_ref (coverage));}PangoCoverage *_pango_fc_font_map_get_coverage (PangoFcFontMap *fcfontmap,				 PangoFcFont    *fcfont){  PangoFcFontMapPrivate *priv = fcfontmap->priv;  PangoFcCoverageKey key;  PangoCoverage *coverage;  FcCharSet *charset;  /*   * Assume that coverage information is identified by   * a filename/index pair; there shouldn't be any reason   * this isn't true, but it's not specified anywhere   */  if (FcPatternGetString (fcfont->font_pattern, FC_FILE, 0, (FcChar8 **) &key.filename) != FcResultMatch)    return NULL;  if (FcPatternGetInteger (fcfont->font_pattern, FC_INDEX, 0, &key.id) != FcResultMatch)    return NULL;  coverage = g_hash_table_lookup (priv->coverage_hash, &key);  if (coverage)    return pango_coverage_ref (coverage);  /*   * Pull the coverage out of the pattern, this   * doesn't require loading the font   */  if (FcPatternGetCharSet (fcfont->font_pattern, FC_CHARSET, 0, &charset) != FcResultMatch)    return NULL;  coverage = _pango_fc_font_map_fc_to_coverage (charset);  pango_fc_font_map_set_coverage (fcfontmap, &key, coverage);  return coverage;}/** * _pango_fc_font_map_fc_to_coverage: * @charset: #FcCharSet to convert to a #PangoCoverage object. * * Convert the given #FcCharSet into a new #PangoCoverage object.  The * caller is responsible for freeing the newly created object. * * Since: 1.6 **/PangoCoverage  *_pango_fc_font_map_fc_to_coverage (FcCharSet *charset){  PangoCoverage *coverage;  FcChar32  ucs4, pos;  FcChar32  map[FC_CHARSET_MAP_SIZE];  int i;  /*   * Convert an Fc CharSet into a pango coverage structure.  Sure   * would be nice to just use the Fc structure in place...   */  coverage = pango_coverage_new ();  for (ucs4 = FcCharSetFirstPage (charset, map, &pos);       ucs4 != FC_CHARSET_DONE;       ucs4 = FcCharSetNextPage (charset, map, &pos))    {      for (i = 0; i < FC_CHARSET_MAP_SIZE; i++)	{	  FcChar32  bits = map[i];	  FcChar32  base = ucs4 + i * 32;	  int b = 0;	  bits = map[i];	  while (bits)	    {	      if (bits & 1)		pango_coverage_set (coverage, base + b, PANGO_COVERAGE_EXACT);	      bits >>= 1;	      b++;	    }	}    }  /* Awful hack so Hangul Tone marks get rendered with the same   * font and in the same run as other Hangul characters. If a font   * covers the first composed Hangul glyph, then it is declared to cover   * the Hangul tone marks. This hack probably needs to be formalized   * by choosing fonts for scripts rather than individual code points.   */  if (pango_coverage_get (coverage, 0xac00) == PANGO_COVERAGE_EXACT)    {      pango_coverage_set (coverage, 0x302e, PANGO_COVERAGE_EXACT);      pango_coverage_set (coverage, 0x302f, PANGO_COVERAGE_EXACT);    }  return coverage;}/** * pango_fc_font_map_create_context: * @fcfontmap: a #PangoFcFontMap * * Creates a new context for this fontmap. This function is intended * only for backend implementations deriving from #PangoFcFontmap; * it is possible that a backend will store additional information * needed for correct operation on the #PangoContext after calling * this function. * * Return value: a new #PangoContext * * Since: 1.4 **/PangoContext *pango_fc_font_map_create_context (PangoFcFontMap *fcfontmap){  PangoContext *context = pango_context_new ();  pango_context_set_font_map (context, PANGO_FONT_MAP (fcfontmap));  return context;}static voidcleanup_font (gpointer        key,	      PangoFcFont    *fcfont){  _pango_fc_font_shutdown (fcfont);  g_object_unref (fcfont->fontmap);  fcfont->fontmap = NULL;}/** * pango_fc_font_map_shutdown: * @fcfontmap: a #PangoFcFontmap * * Clears all cached information for the fontmap and marks * all fonts open for the fontmap as dead. (See the shutdown() * virtual function of #PangoFcFont.) This function might be used * by a backend when the underlying windowing system for the font * map exits. This function is only intended to be called from * only for backend implementations deriving from #PangoFcFontmap. * * Since: 1.4 **/voidpango_fc_font_map_shutdown (PangoFcFontMap *fcfontmap){  PangoFcFontMapPrivate *priv = fcfontmap->priv;  pango_fc_font_map_cache_clear (fcfontmap);  g_hash_table_destroy (priv->fontset_hash);  priv->fontset_hash = NULL;  g_hash_table_foreach (priv->font_hash, (GHFunc)cleanup_font, NULL);  g_hash_table_destroy (priv->font_hash);  priv->font_hash = NULL;  priv->closed = TRUE;}static PangoWeightpango_fc_convert_weight_to_pango (int fc_weight){#ifdef FC_WEIGHT_ULTRABOLD  /* fontconfig 2.1 only had light/medium/demibold/bold/black */  if (fc_weight < (FC_WEIGHT_ULTRALIGHT + FC_WEIGHT_LIGHT) / 2)    return PANGO_WEIGHT_ULTRALIGHT;  else if (fc_weight < (FC_WEIGHT_LIGHT + FC_WEIGHT_REGULAR) / 2)    return PANGO_WEIGHT_LIGHT;  else if (fc_weight < (FC_WEIGHT_REGULAR + FC_WEIGHT_DEMIBOLD) / 2)    return PANGO_WEIGHT_NORMAL;  /* We group the 500/MEDIUM weight with normal to reduce confusion   *   * else if (fc_weight < (FC_WEIGHT_MEDIUM + FC_WEIGHT_DEMIBOLD) / 2)   *  return 500;   */  else if (fc_weight < (FC_WEIGHT_DEMIBOLD + FC_WEIGHT_BOLD) / 2)    return PANGO_WEIGHT_SEMIBOLD;  else if (fc_weight < (FC_WEIGHT_BOLD + FC_WEIGHT_ULTRABOLD) / 2)    return PANGO_WEIGHT_BOLD;  else if (fc_weight < (FC_WEIGHT_ULTRABOLD + FC_WEIGHT_BLACK) / 2)    return PANGO_WEIGHT_ULTRABOLD;  else    return PANGO_WEIGHT_HEAVY;#else  /* fontconfig < 2.2 */  if (fc_weight < (FC_WEIGHT_LIGHT + FC_WEIGHT_MEDIUM) / 2)    return PANGO_WEIGHT_LIGHT;  else if (fc_weight < (FC_WEIGHT_MEDIUM + FC_WEIGHT_DEMIBOLD) / 2)    return PANGO_WEIGHT_NORMAL;  else if (fc_weight < (FC_WEIGHT_DEMIBOLD + FC_WEIGHT_BOLD) / 2)    return PANGO_WEIGHT_SEMIBOLD;  else if (fc_weight < (FC_WEIGHT_BOLD + FC_WEIGHT_BLACK) / 2)    return PANGO_WEIGHT_BOLD;  else    return PANGO_WEIGHT_ULTRABOLD;#endif}static PangoStylepango_fc_convert_slant_to_pango (int fc_style){  switch (fc_style)    {    case FC_SLANT_ROMAN:      return PANGO_STYLE_NORMAL;    case FC_SLANT_ITALIC:      return PANGO_STYLE_ITALIC;    case FC_SLANT_OBLIQUE:      return PANGO_STYLE_OBLIQUE;    default:      return PANGO_STYLE_NORMAL;    }}

⌨️ 快捷键说明

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