Chromium Code Reviews| Index: src/ports/SkFontHost_mac.cpp |
| diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp |
| index 53d5610575b1f4867a7ae13188823a0b78bb4dbf..0af50b745e7b6e4bcd12a8a63632c121c01314bf 100644 |
| --- a/src/ports/SkFontHost_mac.cpp |
| +++ b/src/ports/SkFontHost_mac.cpp |
| @@ -450,9 +450,8 @@ class SkTypeface_Mac : public SkTypeface { |
| public: |
| SkTypeface_Mac(CTFontRef fontRef, CFTypeRef resourceRef, |
| const SkFontStyle& fs, bool isFixedPitch, |
| - const char requestedName[], bool isLocalStream) |
| + bool isLocalStream) |
| : SkTypeface(fs, SkTypefaceCache::NewFontID(), isFixedPitch) |
| - , fRequestedName(requestedName) |
| , fFontRef(fontRef) // caller has already called CFRetain for us |
| , fOriginatingCFTypeRef(resourceRef) // caller has already called CFRetain for us |
| , fHasColorGlyphs(SkToBool(CTFontGetSymbolicTraits(fFontRef) & SkCTFontColorGlyphsTrait)) |
| @@ -461,7 +460,6 @@ public: |
| SkASSERT(fontRef); |
| } |
| - SkString fRequestedName; |
| AutoCFRelease<CTFontRef> fFontRef; |
| AutoCFRelease<CFTypeRef> fOriginatingCFTypeRef; |
| const bool fHasColorGlyphs; |
| @@ -492,14 +490,12 @@ private: |
| }; |
| /** Creates a typeface without searching the cache. Takes ownership of the CTFontRef. */ |
| -static SkTypeface* NewFromFontRef(CTFontRef fontRef, CFTypeRef resourceRef, |
| - const char name[], bool isLocalStream) |
| -{ |
| +static SkTypeface* NewFromFontRef(CTFontRef fontRef, CFTypeRef resourceRef, bool isLocalStream) { |
| SkASSERT(fontRef); |
| bool isFixedPitch; |
| SkFontStyle style = SkFontStyle(computeStyleBits(fontRef, &isFixedPitch)); |
| - return new SkTypeface_Mac(fontRef, resourceRef, style, isFixedPitch, name, isLocalStream); |
| + return new SkTypeface_Mac(fontRef, resourceRef, style, isFixedPitch, isLocalStream); |
| } |
| static bool find_by_CTFontRef(SkTypeface* cached, const SkFontStyle&, void* context) { |
| @@ -558,10 +554,11 @@ static SkTypeface* NewFromName(const char familyName[], const SkFontStyle& theSt |
| } |
| SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (void*)ctFont.get()); |
| - if (!face) { |
| - face = NewFromFontRef(ctFont.release(), nullptr, nullptr, false); |
|
mtklein
2016/04/08 00:59:49
this'd be easier to review if you keep the demorga
|
| - SkTypefaceCache::Add(face, face->fontStyle()); |
| + if (face) { |
| + return face; |
| } |
| + face = NewFromFontRef(ctFont.release(), nullptr, false); |
| + SkTypefaceCache::Add(face, face->fontStyle()); |
| return face; |
| } |
| @@ -573,7 +570,6 @@ static SkTypeface* GetDefaultFace() { |
| if (nullptr == gDefaultFace) { |
| gDefaultFace = NewFromName(FONT_DEFAULT_NAME, SkFontStyle()); |
| - SkTypefaceCache::Add(gDefaultFace, SkFontStyle()); |
| } |
| return gDefaultFace; |
| } |
| @@ -591,30 +587,18 @@ CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face) { |
| */ |
| SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef, CFTypeRef resourceRef) { |
| SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (void*)fontRef); |
| - if (!face) { |
| - CFRetain(fontRef); |
| - if (resourceRef) { |
| - CFRetain(resourceRef); |
| - } |
| - face = NewFromFontRef(fontRef, resourceRef, nullptr, false); |
| - SkTypefaceCache::Add(face, face->fontStyle()); |
| + if (face) { |
| + return face; |
| + } |
| + CFRetain(fontRef); |
| + if (resourceRef) { |
| + CFRetain(resourceRef); |
| } |
| + face = NewFromFontRef(fontRef, resourceRef, false); |
| + SkTypefaceCache::Add(face, face->fontStyle()); |
| return face; |
| } |
| -struct NameStyle { |
| - const char* fName; |
| - SkFontStyle fStyle; |
| -}; |
| - |
| -static bool find_by_NameStyle(SkTypeface* cachedFace, const SkFontStyle& cachedStyle, void* ctx) { |
| - const SkTypeface_Mac* cachedMacFace = static_cast<SkTypeface_Mac*>(cachedFace); |
| - const NameStyle* requested = static_cast<const NameStyle*>(ctx); |
| - |
| - return cachedStyle == requested->fStyle |
| - && cachedMacFace->fRequestedName.equals(requested->fName); |
| -} |
| - |
| static const char* map_css_names(const char* name) { |
| static const struct { |
| const char* fFrom; // name the caller specified |
| @@ -1469,7 +1453,7 @@ static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) { |
| return nullptr; |
| } |
| CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, nullptr, nullptr); |
| - return ct ? NewFromFontRef(ct, nullptr, nullptr, true) : nullptr; |
| + return ct ? NewFromFontRef(ct, nullptr, true) : nullptr; |
| } |
| // Web fonts added to the the CTFont registry do not return their character set. |
| @@ -2179,39 +2163,27 @@ static int compute_metric(const SkFontStyle& a, const SkFontStyle& b) { |
| sqr((a.isItalic() != b.isItalic()) * 900); |
| } |
| -static SkTypeface* createFromDesc(CFStringRef cfFamilyName, CTFontDescriptorRef desc) { |
| - NameStyle cacheRequest; |
| - SkString skFamilyName; |
| - CFStringToSkString(cfFamilyName, &skFamilyName); |
| - cacheRequest.fName = skFamilyName.c_str(); |
| - cacheRequest.fStyle = fontstyle_from_descriptor(desc); |
| - |
| - SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_NameStyle, &cacheRequest); |
| - if (face) { |
| - return face; |
| - } |
| - |
| +static SkTypeface* createFromDesc(CTFontDescriptorRef desc) { |
| AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(desc, 0, nullptr)); |
| if (!ctFont) { |
| return nullptr; |
| } |
| - bool isFixedPitch; |
| - (void)computeStyleBits(ctFont, &isFixedPitch); |
| + SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (void*)ctFont.get()); |
| + if (face) { |
| + return face; |
| + } |
| - face = new SkTypeface_Mac(ctFont.release(), nullptr, cacheRequest.fStyle, isFixedPitch, |
| - skFamilyName.c_str(), false); |
| + face = NewFromFontRef(ctFont.release(), nullptr, false); |
| SkTypefaceCache::Add(face, face->fontStyle()); |
| return face; |
| } |
| class SkFontStyleSet_Mac : public SkFontStyleSet { |
| public: |
| - SkFontStyleSet_Mac(CFStringRef familyName, CTFontDescriptorRef desc) |
| + SkFontStyleSet_Mac(CTFontDescriptorRef desc) |
| : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, nullptr)) |
| - , fFamilyName(familyName) |
| , fCount(0) { |
| - CFRetain(familyName); |
| if (nullptr == fArray) { |
| fArray = CFArrayCreate(nullptr, nullptr, 0, nullptr); |
| } |
| @@ -2220,7 +2192,6 @@ public: |
| virtual ~SkFontStyleSet_Mac() { |
| CFRelease(fArray); |
| - CFRelease(fFamilyName); |
| } |
| int count() override { |
| @@ -2244,19 +2215,18 @@ public: |
| SkASSERT((unsigned)index < (unsigned)CFArrayGetCount(fArray)); |
| CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(fArray, index); |
| - return createFromDesc(fFamilyName, desc); |
| + return createFromDesc(desc); |
| } |
| SkTypeface* matchStyle(const SkFontStyle& pattern) override { |
| if (0 == fCount) { |
| return nullptr; |
| } |
| - return createFromDesc(fFamilyName, findMatchingDesc(pattern)); |
| + return createFromDesc(findMatchingDesc(pattern)); |
| } |
| private: |
| CFArrayRef fArray; |
| - CFStringRef fFamilyName; |
| int fCount; |
| CTFontDescriptorRef findMatchingDesc(const SkFontStyle& pattern) const { |
| @@ -2298,7 +2268,7 @@ class SkFontMgr_Mac : public SkFontMgr { |
| AutoCFRelease<CTFontDescriptorRef> desc( |
| CTFontDescriptorCreateWithAttributes(cfAttr)); |
| - return new SkFontStyleSet_Mac(cfFamilyName, desc); |
| + return new SkFontStyleSet_Mac(desc); |
| } |
| public: |
| @@ -2504,7 +2474,7 @@ protected: |
| if (!ct) { |
| return nullptr; |
| } |
| - return NewFromFontRef(ct, cg.release(), nullptr, true); |
| + return NewFromFontRef(ct, cg.release(), true); |
| } |
| static CFDictionaryRef get_axes(CGFontRef cg, SkFontData* fontData) { |
| @@ -2587,7 +2557,7 @@ protected: |
| if (!ct) { |
| return nullptr; |
| } |
| - return NewFromFontRef(ct, cg.release(), nullptr, true); |
| + return NewFromFontRef(ct, cg.release(), true); |
| } |
| SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override { |
| @@ -2610,19 +2580,12 @@ protected: |
| familyName = FONT_DEFAULT_NAME; |
| } |
| - NameStyle cacheRequest = { familyName, style }; |
| - SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_NameStyle, &cacheRequest); |
| - |
| - if (nullptr == face) { |
| - face = NewFromName(familyName, style); |
| - if (face) { |
| - SkTypefaceCache::Add(face, style); |
| - } else { |
| - face = GetDefaultFace(); |
| - face->ref(); |
| - } |
| + SkTypeface* face = NewFromName(familyName, style); |
| + if (face) { |
| + return face; |
| } |
| - return face; |
| + |
| + return SkSafeRef(GetDefaultFace()); |
| } |
| }; |