void FcDefaultSubstitute (FcPattern *pattern) { FcValue v; int i; if (FcPatternObjectGet (pattern, FC_WEIGHT_OBJECT, 0, &v) == FcResultNoMatch ) FcPatternObjectAddInteger (pattern, FC_WEIGHT_OBJECT, FC_WEIGHT_MEDIUM); if (FcPatternObjectGet (pattern, FC_SLANT_OBJECT, 0, &v) == FcResultNoMatch) FcPatternObjectAddInteger (pattern, FC_SLANT_OBJECT, FC_SLANT_ROMAN); if (FcPatternObjectGet (pattern, FC_WIDTH_OBJECT, 0, &v) == FcResultNoMatch) FcPatternObjectAddInteger (pattern, FC_WIDTH_OBJECT, FC_WIDTH_NORMAL); for (i = 0; i < NUM_FC_BOOL_DEFAULTS; i++) if (FcPatternObjectGet (pattern, FcBoolDefaults[i].field, 0, &v) == FcResultNoMatch) FcPatternObjectAddBool (pattern, FcBoolDefaults[i].field, FcBoolDefaults[i].value); if (FcPatternObjectGet (pattern, FC_PIXEL_SIZE_OBJECT, 0, &v) == FcResultNoMatch) { double dpi, size, scale; if (FcPatternObjectGetDouble (pattern, FC_SIZE_OBJECT, 0, &size) != FcResultMatch) { size = 12.0; (void) FcPatternObjectDel (pattern, FC_SIZE_OBJECT); FcPatternObjectAddDouble (pattern, FC_SIZE_OBJECT, size); } if (FcPatternObjectGetDouble (pattern, FC_SCALE_OBJECT, 0, &scale) != FcResultMatch) { scale = 1.0; (void) FcPatternObjectDel (pattern, FC_SCALE_OBJECT); FcPatternObjectAddDouble (pattern, FC_SCALE_OBJECT, scale); } size *= scale; if (FcPatternObjectGetDouble (pattern, FC_DPI_OBJECT, 0, &dpi) != FcResultMatch) { dpi = 75.0; (void) FcPatternObjectDel (pattern, FC_DPI_OBJECT); FcPatternObjectAddDouble (pattern, FC_DPI_OBJECT, dpi); } size *= dpi / 72.0; FcPatternObjectAddDouble (pattern, FC_PIXEL_SIZE_OBJECT, size); } if (FcPatternObjectGet (pattern, FC_LANG_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAddString (pattern, FC_LANG_OBJECT, FcGetDefaultLang ()); } if (FcPatternObjectGet (pattern, FC_FONTVERSION_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAddInteger (pattern, FC_FONTVERSION_OBJECT, 0x7fffffff); } if (FcPatternObjectGet (pattern, FC_HINT_STYLE_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAddInteger (pattern, FC_HINT_STYLE_OBJECT, FC_HINT_FULL); } }
void FcDefaultSubstitute(FcPattern *pattern) { FcValue v, namelang, v2; int i; if (FcPatternObjectGet(pattern, FC_WEIGHT_OBJECT, 0, &v) == FcResultNoMatch) FcPatternObjectAddInteger(pattern, FC_WEIGHT_OBJECT, FC_WEIGHT_NORMAL); if (FcPatternObjectGet(pattern, FC_SLANT_OBJECT, 0, &v) == FcResultNoMatch) FcPatternObjectAddInteger(pattern, FC_SLANT_OBJECT, FC_SLANT_ROMAN); if (FcPatternObjectGet(pattern, FC_WIDTH_OBJECT, 0, &v) == FcResultNoMatch) FcPatternObjectAddInteger(pattern, FC_WIDTH_OBJECT, FC_WIDTH_NORMAL); for (i = 0; i < NUM_FC_BOOL_DEFAULTS; i++) if (FcPatternObjectGet(pattern, FcBoolDefaults[i].field, 0, &v) == FcResultNoMatch) FcPatternObjectAddBool(pattern, FcBoolDefaults[i].field, FcBoolDefaults[i].value); if (FcPatternObjectGet(pattern, FC_PIXEL_SIZE_OBJECT, 0, &v) == FcResultNoMatch) { double dpi, size, scale; if (FcPatternObjectGetDouble(pattern, FC_SIZE_OBJECT, 0, &size) != FcResultMatch) { size = 12.0; (void)FcPatternObjectDel(pattern, FC_SIZE_OBJECT); FcPatternObjectAddDouble(pattern, FC_SIZE_OBJECT, size); } if (FcPatternObjectGetDouble(pattern, FC_SCALE_OBJECT, 0, &scale) != FcResultMatch) { scale = 1.0; (void)FcPatternObjectDel(pattern, FC_SCALE_OBJECT); FcPatternObjectAddDouble(pattern, FC_SCALE_OBJECT, scale); } size *= scale; if (FcPatternObjectGetDouble(pattern, FC_DPI_OBJECT, 0, &dpi) != FcResultMatch) { dpi = 75.0; (void)FcPatternObjectDel(pattern, FC_DPI_OBJECT); FcPatternObjectAddDouble(pattern, FC_DPI_OBJECT, dpi); } size *= dpi / 72.0; FcPatternObjectAddDouble(pattern, FC_PIXEL_SIZE_OBJECT, size); } if (FcPatternObjectGet(pattern, FC_FONTVERSION_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAddInteger(pattern, FC_FONTVERSION_OBJECT, 0x7fffffff); } if (FcPatternObjectGet(pattern, FC_HINT_STYLE_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAddInteger(pattern, FC_HINT_STYLE_OBJECT, FC_HINT_FULL); } if (FcPatternObjectGet(pattern, FC_NAMELANG_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAddString(pattern, FC_NAMELANG_OBJECT, FcGetDefaultLang()); } /* shouldn't be failed. */ FcPatternObjectGet(pattern, FC_NAMELANG_OBJECT, 0, &namelang); /* Add a fallback to ensure the english name when the requested language * isn't available. this would helps for the fonts that have non-English * name at the beginning. */ /* Set "en-us" instead of "en" to avoid giving higher score to "en". * This is a hack for the case that the orth is not like ll-cc, because, * if no namelang isn't explicitly set, it will has something like ll-cc * according to current locale. which may causes FcLangDifferentTerritory * at FcLangCompare(). thus, the English name is selected so that * exact matched "en" has higher score than ll-cc. */ v2.type = FcTypeString; v2.u.s = (FcChar8 *)"en-us"; if (FcPatternObjectGet(pattern, FC_FAMILYLANG_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAdd(pattern, FC_FAMILYLANG_OBJECT, namelang, FcTrue); FcPatternObjectAddWithBinding(pattern, FC_FAMILYLANG_OBJECT, v2, FcValueBindingWeak, FcTrue); } if (FcPatternObjectGet(pattern, FC_STYLELANG_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAdd(pattern, FC_STYLELANG_OBJECT, namelang, FcTrue); FcPatternObjectAddWithBinding(pattern, FC_STYLELANG_OBJECT, v2, FcValueBindingWeak, FcTrue); } if (FcPatternObjectGet(pattern, FC_FULLNAMELANG_OBJECT, 0, &v) == FcResultNoMatch) { FcPatternObjectAdd(pattern, FC_FULLNAMELANG_OBJECT, namelang, FcTrue); FcPatternObjectAddWithBinding(pattern, FC_FULLNAMELANG_OBJECT, v2, FcValueBindingWeak, FcTrue); } if (FcPatternObjectGet(pattern, FC_PRGNAME_OBJECT, 0, &v) == FcResultNoMatch) { FcChar8 *prgname = FcGetPrgname(); if (prgname) FcPatternObjectAddString(pattern, FC_PRGNAME_OBJECT, prgname); } }