| Index: src/ports/SkFontHost_mac.cpp
|
| diff --git a/src/ports/SkFontHost_mac.cpp b/src/ports/SkFontHost_mac.cpp
|
| index a01c37efc058e31a264ca964f3613b48ca611fee..7d90d84695f386c6ad40d55f33317e9c5bacf09f 100644
|
| --- a/src/ports/SkFontHost_mac.cpp
|
| +++ b/src/ports/SkFontHost_mac.cpp
|
| @@ -282,13 +282,15 @@
|
| }
|
| }
|
|
|
| -static CGAffineTransform MatrixToCGAffineTransform(const SkMatrix& matrix) {
|
| - return CGAffineTransformMake( ScalarToCG(matrix[SkMatrix::kMScaleX]),
|
| - -ScalarToCG(matrix[SkMatrix::kMSkewY]),
|
| - -ScalarToCG(matrix[SkMatrix::kMSkewX]),
|
| - ScalarToCG(matrix[SkMatrix::kMScaleY]),
|
| - ScalarToCG(matrix[SkMatrix::kMTransX]),
|
| - ScalarToCG(matrix[SkMatrix::kMTransY]));
|
| +static CGAffineTransform MatrixToCGAffineTransform(const SkMatrix& matrix,
|
| + SkScalar sx = SK_Scalar1,
|
| + SkScalar sy = SK_Scalar1) {
|
| + return CGAffineTransformMake( ScalarToCG(matrix[SkMatrix::kMScaleX] * sx),
|
| + -ScalarToCG(matrix[SkMatrix::kMSkewY] * sy),
|
| + -ScalarToCG(matrix[SkMatrix::kMSkewX] * sx),
|
| + ScalarToCG(matrix[SkMatrix::kMScaleY] * sy),
|
| + ScalarToCG(matrix[SkMatrix::kMTransX] * sx),
|
| + ScalarToCG(matrix[SkMatrix::kMTransY] * sy));
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -712,57 +714,6 @@
|
| typedef SkScalerContext INHERITED;
|
| };
|
|
|
| -// 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.
|
| -static CTFontRef ctfont_create_exact_copy(CTFontRef baseFont, CGFloat textSize,
|
| - const CGAffineTransform* transform, bool setVertical)
|
| -{
|
| - AutoCFRelease<CTFontDescriptorRef> baseDescriptor;
|
| - AutoCFRelease<CGFontRef> baseCGFont(CTFontCopyGraphicsFont(baseFont, &baseDescriptor));
|
| -
|
| - // Make a mutable copy of baseDescriptor 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);
|
| - }(baseDescriptor));
|
| -
|
| - // 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);
|
| - }
|
| -
|
| - // Create the new CTFont from the baseCGFont.
|
| - AutoCFRelease<CTFontDescriptorRef> newDescriptor(
|
| - CTFontDescriptorCreateWithAttributes(newAttributes));
|
| - return CTFontCreateWithGraphicsFont(baseCGFont, textSize, transform, newDescriptor);
|
| -
|
| -}
|
| -
|
| SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface,
|
| const SkDescriptor* desc)
|
| : INHERITED(typeface, desc)
|
| @@ -789,13 +740,30 @@
|
| fTransform = MatrixToCGAffineTransform(skTransform);
|
| fInvTransform = CGAffineTransformInvert(fTransform);
|
|
|
| + AutoCFRelease<CTFontDescriptorRef> ctFontDesc;
|
| + if (fVertical) {
|
| + // Setting the vertical orientation here is required for vertical metrics on some versions.
|
| + AutoCFRelease<CFMutableDictionaryRef> cfAttributes(CFDictionaryCreateMutable(
|
| + kCFAllocatorDefault, 0,
|
| + &kCFTypeDictionaryKeyCallBacks,
|
| + &kCFTypeDictionaryValueCallBacks));
|
| + if (cfAttributes) {
|
| + CTFontOrientation ctOrientation = kCTFontVerticalOrientation;
|
| + AutoCFRelease<CFNumberRef> cfVertical(CFNumberCreate(
|
| + kCFAllocatorDefault, kCFNumberSInt32Type, &ctOrientation));
|
| + CFDictionaryAddValue(cfAttributes, kCTFontOrientationAttribute, cfVertical);
|
| + ctFontDesc.reset(CTFontDescriptorCreateWithAttributes(cfAttributes));
|
| + }
|
| + }
|
| +
|
| // The transform contains everything except the requested text size.
|
| // 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(CTFontCreateCopyWithAttributes(ctFont, textSize, &fTransform, ctFontDesc));
|
| fCGFont.reset(CTFontCopyGraphicsFont(fCTFont, nullptr));
|
| - fCTUnrotatedFont.reset(ctfont_create_exact_copy(ctFont, textSize, nullptr, false));
|
| + fCTUnrotatedFont.reset(CTFontCreateCopyWithAttributes(ctFont, textSize,
|
| + &CGAffineTransformIdentity, 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)));
|
| @@ -1395,13 +1363,9 @@
|
| break;
|
| }
|
|
|
| - CGFloat textSize = CTFontGetSize(fCTFont);
|
| - CGAffineTransform baseTransform = CTFontGetMatrix(fCTFont);
|
| - CGAffineTransform newTransform =
|
| - CGAffineTransformScale(baseTransform, ScalarToCG(scaleX), ScalarToCG(scaleY));
|
| -
|
| - // need to release this font when we're done
|
| - font = ctfont_create_exact_copy(fCTFont, textSize, &newTransform, false);
|
| + CGAffineTransform xform = MatrixToCGAffineTransform(m, scaleX, scaleY);
|
| + // need to release font when we're done
|
| + font = CTFontCreateCopyWithAttributes(fCTFont, 1, &xform, nullptr);
|
| }
|
|
|
| CGGlyph cgGlyph = (CGGlyph)glyph.getGlyphID();
|
| @@ -1416,7 +1380,7 @@
|
| SkMatrix m;
|
| m.setScale(SkScalarInvert(scaleX), SkScalarInvert(scaleY));
|
| path->transform(m);
|
| - // balance the call to ctfont_create_exact_copy
|
| + // balance the call to CTFontCreateCopyWithAttributes
|
| CFSafeRelease(font);
|
| }
|
| if (fVertical) {
|
| @@ -1597,9 +1561,8 @@
|
| AUTO_CG_LOCK();
|
|
|
| CTFontRef originalCTFont = fFontRef.get();
|
| - AutoCFRelease<CTFontRef> ctFont(ctfont_create_exact_copy(
|
| - originalCTFont, CTFontGetUnitsPerEm(originalCTFont), nullptr, false));
|
| -
|
| + AutoCFRelease<CTFontRef> ctFont(CTFontCreateCopyWithAttributes(
|
| + originalCTFont, CTFontGetUnitsPerEm(originalCTFont), nullptr, nullptr));
|
| SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics;
|
|
|
| {
|
|
|