| Index: src/ports/SkFontHost_mac.cpp
|
| diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp
|
| index c10d830715a7864a60b03ac07fa059f4644bb11d..8db318b3ff5238798e91740f8bd616aeba2f59a7 100644
|
| --- a/src/ports/SkFontHost_mac.cpp
|
| +++ b/src/ports/SkFontHost_mac.cpp
|
| @@ -715,62 +715,24 @@ private:
|
| };
|
|
|
| // CTFontCreateCopyWithAttributes or CTFontCreateCopyWithSymbolicTraits cannot be used on 10.10
|
| -// as they appear to be buggy with respect to the default font. It is not possible to use
|
| -// descriptors with CTFontCreateWithFontDescriptor, since that does not work with non-system
|
| -// fonts. As a result, create the strike specific CTFonts from the underlying CGFont.
|
| +// and later, as they will return different underlying fonts depending on the size requested.
|
| +// It is not possible to use descriptors with CTFontCreateWithFontDescriptor, since that does not
|
| +// work with non-system fonts. As a result, create the strike specific CTFonts from the underlying
|
| +// CGFont.
|
| static CTFontRef ctfont_create_exact_copy(CTFontRef baseFont, CGFloat textSize,
|
| - const CGAffineTransform* transform, bool setVertical)
|
| + const CGAffineTransform* transform)
|
| {
|
| - AutoCFRelease<CTFontDescriptorRef> baseExtraDescriptor;
|
| - AutoCFRelease<CGFontRef> baseCGFont(CTFontCopyGraphicsFont(baseFont, &baseExtraDescriptor));
|
| -
|
| - // Make a mutable copy of baseExtraDescriptor attributes.
|
| - AutoCFRelease<CFMutableDictionaryRef> newAttributes([](CTFontDescriptorRef descriptor) ->
|
| - CFMutableDictionaryRef {
|
| - if (nullptr == descriptor) {
|
| - return CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
|
| - &kCFTypeDictionaryKeyCallBacks,
|
| - &kCFTypeDictionaryValueCallBacks);
|
| - }
|
| - AutoCFRelease<CFDictionaryRef> attributes(CTFontDescriptorCopyAttributes(descriptor));
|
| - return CFDictionaryCreateMutableCopy(kCFAllocatorDefault, 0, attributes);
|
| - }(baseExtraDescriptor));
|
| -
|
| - // Copy all of the attributes out of the CTFont.
|
| - AutoCFRelease<CTFontDescriptorRef> baseDescriptor(CTFontCopyFontDescriptor(baseFont));
|
| - AutoCFRelease<CFDictionaryRef> baseAttributes(CTFontDescriptorCopyAttributes(baseDescriptor));
|
| - CFDictionaryApplyFunction(baseAttributes, [](CFTypeRef key, CFTypeRef value, void* context) {
|
| - CFMutableDictionaryRef self = static_cast<CFMutableDictionaryRef>(context);
|
| - CFDictionarySetValue(self, key, value);
|
| - }, newAttributes.get());
|
| -
|
| - // Set the text size in attributes.
|
| - AutoCFRelease<CFNumberRef> cfTextSize(
|
| - CFNumberCreate(kCFAllocatorDefault, kCFNumberCGFloatType, &textSize));
|
| - CFDictionarySetValue(newAttributes, kCTFontSizeAttribute, cfTextSize);
|
| -
|
| - // Set the transform in attributes.
|
| - if (nullptr == transform) {
|
| - CFDictionaryRemoveValue(newAttributes, kCTFontMatrixAttribute);
|
| - } else {
|
| - AutoCFRelease<CFDataRef> cfMatrixData(CFDataCreate(
|
| - kCFAllocatorDefault, reinterpret_cast<const UInt8*>(transform), sizeof(*transform)));
|
| - CFDictionarySetValue(newAttributes, kCTFontMatrixAttribute, cfMatrixData);
|
| - }
|
| -
|
| - // Set vertical orientation to attributes if requested.
|
| - if (setVertical) {
|
| - CTFontOrientation ctOrientation = kCTFontVerticalOrientation;
|
| - AutoCFRelease<CFNumberRef> cfVertical(
|
| - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &ctOrientation));
|
| - CFDictionarySetValue(newAttributes, kCTFontOrientationAttribute, cfVertical);
|
| - }
|
| + AutoCFRelease<CGFontRef> baseCGFont(CTFontCopyGraphicsFont(baseFont, nullptr));
|
|
|
| - // Create the new CTFont from the baseCGFont.
|
| - AutoCFRelease<CTFontDescriptorRef> newDescriptor(
|
| - CTFontDescriptorCreateWithAttributes(newAttributes));
|
| - return CTFontCreateWithGraphicsFont(baseCGFont, textSize, transform, newDescriptor);
|
| + // The last parameter (CTFontDescriptorRef attributes) *must* be nullptr.
|
| + // If non-nullptr then with fonts with variation axes, the copy will fail in
|
| + // CGFontVariationFromDictCallback when it assumes kCGFontVariationAxisName is CFNumberRef
|
| + // which it quite obviously is not.
|
|
|
| + // Because we cannot setup the CTFont descriptor to match, the same restriction applies here
|
| + // as other uses of CTFontCreateWithGraphicsFont which is that such CTFonts should not escape
|
| + // the scaler context, since they aren't 'normal'.
|
| + return CTFontCreateWithGraphicsFont(baseCGFont, textSize, transform, nullptr);
|
| }
|
|
|
| SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface,
|
| @@ -803,9 +765,9 @@ SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface,
|
| // Some properties, like 'trak', are based on the text size (before applying the matrix).
|
| CGFloat textSize = ScalarToCG(scale.y());
|
|
|
| - fCTFont.reset(ctfont_create_exact_copy(ctFont, textSize, &fTransform, fVertical));
|
| + fCTFont.reset(ctfont_create_exact_copy(ctFont, textSize, &fTransform));
|
| fCGFont.reset(CTFontCopyGraphicsFont(fCTFont, nullptr));
|
| - fCTUnrotatedFont.reset(ctfont_create_exact_copy(ctFont, textSize, nullptr, false));
|
| + fCTUnrotatedFont.reset(ctfont_create_exact_copy(ctFont, textSize, nullptr));
|
|
|
| // The fUnitMatrix includes the text size (and em) as it is used to scale the raw font data.
|
| SkScalar emPerFUnit = SkScalarInvert(SkIntToScalar(CGFontGetUnitsPerEm(fCGFont)));
|
| @@ -1406,7 +1368,7 @@ void SkScalerContext_Mac::generatePath(const SkGlyph& glyph, SkPath* path) {
|
| }
|
|
|
| CGAffineTransform xform = MatrixToCGAffineTransform(m, scaleX, scaleY);
|
| - font = ctfont_create_exact_copy(fCTFont, 1, &xform, false);
|
| + font = ctfont_create_exact_copy(fCTFont, 1, &xform);
|
| }
|
|
|
| CGGlyph cgGlyph = (CGGlyph)glyph.getGlyphID();
|
| @@ -1603,7 +1565,7 @@ SkAdvancedTypefaceMetrics* SkTypeface_Mac::onGetAdvancedTypefaceMetrics(
|
|
|
| CTFontRef originalCTFont = fFontRef.get();
|
| AutoCFRelease<CTFontRef> ctFont(ctfont_create_exact_copy(
|
| - originalCTFont, CTFontGetUnitsPerEm(originalCTFont), nullptr, false));
|
| + originalCTFont, CTFontGetUnitsPerEm(originalCTFont), nullptr));
|
|
|
| SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics;
|
|
|
|
|