Esempio n. 1
0
FcStrSet *fcinfo_languages(const FcPattern *filter)
{
  FcObjectSet *objectset;
  FcFontSet *fontset;
  FcLangSet *union_langset;
  FcStrSet *result;
  int f;

  FcInit();
  objectset = FcObjectSetBuild(FC_LANG, NULL);
  fontset = FcFontList(NULL, (FcPattern *)filter, objectset);
  FcObjectSetDestroy(objectset);

  union_langset = FcLangSetCreate();
  for (f = 0; f < fontset->nfont; f++)
  {
    FcLangSet *langset;
    FcStrList *strlist;
    FcChar8 *lang;

    if (FcPatternGetLangSet(fontset->fonts[f], FC_LANG, 0, &langset)
        != FcResultMatch)
      continue;
    if (! langset)
      continue;

    strlist = FcStrListCreate(FcLangSetGetLangs(langset));
    while ((lang = FcStrListNext(strlist)))
      if (FcLangSetHasLang(union_langset, lang))
       FcLangSetAdd(union_langset, FcStrCopy(lang));
  }

  result = FcLangSetGetLangs(union_langset);
  
  FcFontSetDestroy(fontset);
  FcLangSetDestroy(union_langset);
  return result;
}
void
font_config_magic_class::
add_entry(FcPattern *p)
{
  FcMagicValue<FcChar8*> family_name, file_name, foundary_name, font_style;
  FcMagicValue<int> font_index, font_weight, font_slant;
  FcMagicValue<FcLangSet*> lang;
  
  FcGetMagicValue(p, FC_FILE, file_name);
  if(file_name.m_exists)
    {
      FontEntry entry_key;
      WRATHFontConfig::FontSpecification entry;
      
      GetPairFromFcMagicValue(entry_key.m_filename, file_name);
      
      FcGetMagicValue(p, FC_INDEX, font_index);
      GetPairFromFcMagicValue(entry_key.m_face_index, font_index);
      
      entry.font()=WRATHFontDatabase::fetch_font_entry(entry_key.m_filename, entry_key.m_face_index);
      
      FcGetMagicValue(p, FC_FAMILY, family_name);
      GetPairFromFcMagicValue(entry.m_fontconfig_details.m_family_name, family_name);
      
      FcGetMagicValue(p, FC_FOUNDRY, foundary_name);
      GetPairFromFcMagicValue(entry.m_fontconfig_details.m_foundary_name, foundary_name);
      
      FcGetMagicValue(p, FC_WEIGHT, font_weight);
      GetPairFromFcMagicValue(entry.m_fontconfig_details.m_weight, font_weight);
      
      FcGetMagicValue(p, FC_SLANT, font_slant);
      GetPairFromFcMagicValue(entry.m_fontconfig_details.m_slant, font_slant);
      
      FcGetMagicValue(p, FC_STYLE, font_style);
      GetPairFromFcMagicValue(entry.m_fontconfig_details.m_style, font_style);
      
      #if (FC_MAJOR>=2 && FC_MINOR>=7) || (FC_MAJOR>=3)   
      {        
        FcGetMagicValue(p, FC_LANG, lang);
        if(lang.m_exists)
          {
            FcStrSet *langs_as_strs;
            FcStrList *iter;
            FcChar8 *current;
            
            langs_as_strs=FcLangSetGetLangs(lang.m_value); //do we need to free this thing??
            iter=FcStrListCreate(langs_as_strs);
            
            for(current=FcStrListNext(iter); current; current=FcStrListNext(iter))
              {
                const char *str(reinterpret_cast<const char*>(current));
                entry.m_fontconfig_details.m_languages.insert(std::string(str));
              }
            FcStrListDone(iter);
            FcStrSetDestroy(langs_as_strs);
          }
      }
      #endif
              
      WRATHassert(m_font_list.find(entry.font())==m_font_list.end());
      m_font_list[entry.font()]=entry;
    }
}