From 8b0d34990e64d75a6eaa971773acb83a0bdd096c Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Thu, 5 May 2011 20:05:13 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/back/trunk@32987 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++++++ Headers/cairo/CairoFaceInfo.h | 2 ++ Source/cairo/CairoFaceInfo.m | 33 ++++++++++++++++++++++-------- Source/cairo/CairoFontEnumerator.m | 2 +- 4 files changed, 33 insertions(+), 10 deletions(-) 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);