diff --git a/ChangeLog b/ChangeLog index 609713e..1411198 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-05-05 Eric Wasylishen + + * Undo the previous change and try a different approach.. + just cache the character set in CairoFaceInfo, but load them + as needed as we were doing before. + 2011-05-05 Eric Wasylishen * Source/cairo/CairoFontEnumerator.m: diff --git a/Headers/cairo/CairoFaceInfo.h b/Headers/cairo/CairoFaceInfo.h index 658ff23..4e90d9a 100644 --- a/Headers/cairo/CairoFaceInfo.h +++ b/Headers/cairo/CairoFaceInfo.h @@ -45,6 +45,8 @@ FcPattern *_pattern; NSString *_familyName; + NSCharacterSet *_characterSet; + BOOL _hasNoCharacterSet; } - (id) initWithfamilyName: (NSString *)familyName diff --git a/Source/cairo/CairoFaceInfo.m b/Source/cairo/CairoFaceInfo.m index 521f79a..122d2ca 100644 --- a/Source/cairo/CairoFaceInfo.m +++ b/Source/cairo/CairoFaceInfo.m @@ -58,7 +58,7 @@ } FcPatternDestroy(_pattern); RELEASE(_familyName); - + RELEASE(_characterSet); [super dealloc]; } @@ -125,15 +125,30 @@ - (NSCharacterSet*)characterSet { - FcCharSet *fcCharset; - NSCharacterSet *characterSet = nil; - - if (FcResultMatch == FcPatternGetCharSet(_pattern, FC_CHARSET, 0, &fcCharset)) + if (_characterSet == nil && !_hasNoCharacterSet) { - characterSet = [[[FontconfigCharacterSet alloc] initWithFontconfigCharSet: fcCharset] autorelease]; - } - - return characterSet; + FcResult result; + FcPattern *resolved; + FcCharSet *charset; + + FcConfigSubstitute(NULL, _pattern, FcMatchPattern); + FcDefaultSubstitute(_pattern); + resolved = FcFontMatch(NULL, _pattern, &result); + + if (FcResultMatch == FcPatternGetCharSet(resolved, FC_CHARSET, 0, &charset)) + { + _characterSet = [[FontconfigCharacterSet alloc] initWithFontconfigCharSet: charset]; + } + + /* Only try to get the character set once because FcFontMatch is expensive */ + if (_characterSet == nil) + { + _hasNoCharacterSet = YES; + } + + FcPatternDestroy(resolved); + } + return _characterSet; } @end diff --git a/Source/cairo/CairoFontEnumerator.m b/Source/cairo/CairoFontEnumerator.m index cfb4981..f6b23b0 100644 --- a/Source/cairo/CairoFontEnumerator.m +++ b/Source/cairo/CairoFontEnumerator.m @@ -152,7 +152,7 @@ static NSArray *faFromFc(FcPattern *pat) FcPattern *pat = FcPatternCreate(); FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_SLANT, FC_WEIGHT, - FC_SPACING, FC_CHARSET, NULL); + FC_SPACING, NULL); FcFontSet *fs = FcFontList(NULL, pat, os); FcPatternDestroy(pat);