Index: src/ports/SkFontHost_mac.cpp |
=================================================================== |
--- src/ports/SkFontHost_mac.cpp (revision 8417) |
+++ src/ports/SkFontHost_mac.cpp (working copy) |
@@ -1937,8 +1937,32 @@ |
: SkFontStyle::kUpright_Slant); |
} |
+struct NameFontStyleRec { |
+ SkString fFamilyName; |
+ SkFontStyle fFontStyle; |
+}; |
+ |
+static bool nameFontStyleProc(SkTypeface* face, SkTypeface::Style, |
+ void* ctx) { |
+ SkTypeface_Mac* macFace = (SkTypeface_Mac*)face; |
+ const NameFontStyleRec* rec = (const NameFontStyleRec*)ctx; |
+ |
+ return macFace->fFontStyle == rec->fFontStyle && |
+ macFace->fName == rec->fFamilyName; |
+} |
+ |
static SkTypeface* createFromDesc(CFStringRef cfFamilyName, |
CTFontDescriptorRef desc) { |
+ NameFontStyleRec rec; |
+ CFStringToSkString(cfFamilyName, &rec.fFamilyName); |
+ rec.fFontStyle = desc2fontstyle(desc); |
+ |
+ SkTypeface* face = SkTypefaceCache::FindByProcAndRef(nameFontStyleProc, |
+ &rec); |
+ if (face) { |
+ return face; |
+ } |
+ |
AutoCFRelease<CTFontRef> ctNamed(CTFontCreateWithName(cfFamilyName, 1, NULL)); |
CTFontRef ctFont = CTFontCreateCopyWithAttributes(ctNamed, 1, NULL, desc); |
if (NULL == ctFont) { |
@@ -1952,30 +1976,37 @@ |
(void)computeStyleBits(ctFont, &isFixedPitch); |
SkFontID fontID = CTFontRef_to_SkFontID(ctFont); |
- return new SkTypeface_Mac(desc2fontstyle(desc), fontID, isFixedPitch, |
- ctFont, str.c_str()); |
+ face = SkNEW_ARGS(SkTypeface_Mac, (rec.fFontStyle, fontID, isFixedPitch, |
+ ctFont, str.c_str())); |
+ SkTypefaceCache::Add(face, face->style()); |
+ return face; |
} |
class SkFontStyleSet_Mac : public SkFontStyleSet { |
public: |
SkFontStyleSet_Mac(CFStringRef familyName, CTFontDescriptorRef desc) |
: fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, NULL)) |
- , fFamilyName(familyName) { |
+ , fFamilyName(familyName) |
+ , fCount(0) { |
CFRetain(familyName); |
+ if (NULL == fArray) { |
+ fArray = CFArrayCreate(NULL, NULL, 0, NULL); |
+ } |
+ fCount = CFArrayGetCount(fArray); |
} |
virtual ~SkFontStyleSet_Mac() { |
- CFSafeRelease(fArray); |
+ CFRelease(fArray); |
CFRelease(fFamilyName); |
} |
virtual int count() SK_OVERRIDE { |
- return CFArrayGetCount(fArray); |
+ return fCount; |
} |
virtual void getStyle(int index, SkFontStyle* style, |
SkString* name) SK_OVERRIDE { |
- SkASSERT((unsigned)index < (unsigned)CFArrayGetCount(fArray)); |
+ SkASSERT((unsigned)index < (unsigned)fCount); |
CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(fArray, index); |
if (style) { |
*style = desc2fontstyle(desc); |
@@ -1997,6 +2028,7 @@ |
private: |
CFArrayRef fArray; |
CFStringRef fFamilyName; |
+ int fCount; |
}; |
class SkFontMgr_Mac : public SkFontMgr { |