FontConfigFont * FcGetFontFromFile (gchar * filepath, int index) { g_assert(FcInit()); int count; FontConfigFont * font = font_config_font_new(); FcBlanks * blanks = FcBlanksCreate(); FcPattern * pattern = FcFreeTypeQuery((const FcChar8 *) filepath, index, blanks, &count); if (!pattern) { g_warning("Failed to create FontConfig pattern for file : %s", filepath); if (font) g_object_unref(font); if (blanks) FcBlanksDestroy(blanks); return NULL; } else { get_font_details_from_pattern(font, pattern); } if (blanks) FcBlanksDestroy(blanks); if (pattern) FcPatternDestroy(pattern); return font; }
void FcConfigDestroy (FcConfig *config) { FcSetName set; FcExprPage *page; if (--config->ref > 0) return; if (config == _fcConfig) _fcConfig = 0; FcStrSetDestroy (config->configDirs); FcStrSetDestroy (config->fontDirs); FcStrSetDestroy (config->cacheDirs); FcStrSetDestroy (config->configFiles); FcStrSetDestroy (config->acceptGlobs); FcStrSetDestroy (config->rejectGlobs); FcFontSetDestroy (config->acceptPatterns); FcFontSetDestroy (config->rejectPatterns); if (config->blanks) FcBlanksDestroy (config->blanks); FcSubstDestroy (config->substPattern); FcSubstDestroy (config->substFont); FcSubstDestroy (config->substScan); for (set = FcSetSystem; set <= FcSetApplication; set++) if (config->fonts[set]) FcFontSetDestroy (config->fonts[set]); page = config->expr_pool; while (page) { FcExprPage *next = page->next_page; FcMemFree (FC_MEM_EXPR, sizeof (FcExprPage)); free (page); page = next; } free (config); FcMemFree (FC_MEM_CONFIG, sizeof (FcConfig)); }
void FcConfigDestroy (FcConfig *config) { FcSetName set; FcExprPage *page; if (FcRefDec (&config->ref) != 1) return; (void) fc_atomic_ptr_cmpexch (&_fcConfig, config, NULL); FcStrSetDestroy (config->configDirs); FcStrSetDestroy (config->fontDirs); FcStrSetDestroy (config->cacheDirs); FcStrSetDestroy (config->configFiles); FcStrSetDestroy (config->acceptGlobs); FcStrSetDestroy (config->rejectGlobs); FcFontSetDestroy (config->acceptPatterns); FcFontSetDestroy (config->rejectPatterns); if (config->blanks) FcBlanksDestroy (config->blanks); FcSubstDestroy (config->substPattern); FcSubstDestroy (config->substFont); FcSubstDestroy (config->substScan); for (set = FcSetSystem; set <= FcSetApplication; set++) if (config->fonts[set]) FcFontSetDestroy (config->fonts[set]); page = config->expr_pool; while (page) { FcExprPage *next = page->next_page; free (page); page = next; } if (config->sysRoot) FcStrFree (config->sysRoot); free (config); }
FcBool FcConfigAddBlank (FcConfig *config, FcChar32 blank) { FcBlanks *b, *freeme = 0; b = config->blanks; if (!b) { freeme = b = FcBlanksCreate (); if (!b) return FcFalse; } if (!FcBlanksAdd (b, blank)) { if (freeme) FcBlanksDestroy (freeme); return FcFalse; } config->blanks = b; return FcTrue; }