aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ports
diff options
context:
space:
mode:
authorGravatar bungeman <bungeman@google.com>2016-04-08 07:22:29 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-08 07:22:29 -0700
commit53d5c6e7448fb68766a05f7bee651aa25e5d7f2b (patch)
tree23db705fb88455eb2c84ef536715e478a3c369b5 /src/ports
parent2c4bd0798e929acb9663668985eabe74d7378c46 (diff)
Test CTFonts for equality, not just name and style.
The current code looks up CTFonts from descriptors by just name and style. This is not sufficient, for example Avenir Book and Avenir Roman have the same family name but the same basic style, but are obviously not the same. BUG=skia:5162 GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1860993004 Review URL: https://codereview.chromium.org/1860993004
Diffstat (limited to 'src/ports')
-rw-r--r--src/ports/SkFontHost_mac.cpp103
1 files changed, 33 insertions, 70 deletions
diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp
index 29b52ca9d5..ec35707dd1 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);
- 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.
@@ -2180,39 +2164,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);
}
@@ -2221,7 +2193,6 @@ public:
virtual ~SkFontStyleSet_Mac() {
CFRelease(fArray);
- CFRelease(fFamilyName);
}
int count() override {
@@ -2245,19 +2216,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 {
@@ -2299,7 +2269,7 @@ class SkFontMgr_Mac : public SkFontMgr {
AutoCFRelease<CTFontDescriptorRef> desc(
CTFontDescriptorCreateWithAttributes(cfAttr));
- return new SkFontStyleSet_Mac(cfFamilyName, desc);
+ return new SkFontStyleSet_Mac(desc);
}
public:
@@ -2505,7 +2475,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) {
@@ -2588,7 +2558,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 {
@@ -2611,19 +2581,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());
}
};