Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(386)

Side by Side Diff: src/ports/SkFontHost_mac.cpp

Issue 1362053003: Avoid last param to CTFontCreateWithGraphicsFont. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkTypes.h" // Keep this before any #ifdef ... 9 #include "SkTypes.h" // Keep this before any #ifdef ...
10 10
(...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 bool fGeneratedFBoundingBoxes; 708 bool fGeneratedFBoundingBoxes;
709 const bool fDoSubPosition; 709 const bool fDoSubPosition;
710 const bool fVertical; 710 const bool fVertical;
711 711
712 friend class Offscreen; 712 friend class Offscreen;
713 713
714 typedef SkScalerContext INHERITED; 714 typedef SkScalerContext INHERITED;
715 }; 715 };
716 716
717 // CTFontCreateCopyWithAttributes or CTFontCreateCopyWithSymbolicTraits cannot b e used on 10.10 717 // CTFontCreateCopyWithAttributes or CTFontCreateCopyWithSymbolicTraits cannot b e used on 10.10
718 // as they appear to be buggy with respect to the default font. It is not possib le to use 718 // and later, as they will return different underlying fonts depending on the si ze requested.
719 // descriptors with CTFontCreateWithFontDescriptor, since that does not work wit h non-system 719 // It is not possible to use descriptors with CTFontCreateWithFontDescriptor, si nce that does not
720 // fonts. As a result, create the strike specific CTFonts from the underlying CG Font. 720 // work with non-system fonts. As a result, create the strike specific CTFonts f rom the underlying
721 // CGFont.
721 static CTFontRef ctfont_create_exact_copy(CTFontRef baseFont, CGFloat textSize, 722 static CTFontRef ctfont_create_exact_copy(CTFontRef baseFont, CGFloat textSize,
722 const CGAffineTransform* transform, bo ol setVertical) 723 const CGAffineTransform* transform)
723 { 724 {
724 AutoCFRelease<CTFontDescriptorRef> baseExtraDescriptor; 725 AutoCFRelease<CGFontRef> baseCGFont(CTFontCopyGraphicsFont(baseFont, nullptr ));
725 AutoCFRelease<CGFontRef> baseCGFont(CTFontCopyGraphicsFont(baseFont, &baseEx traDescriptor));
726 726
727 // Make a mutable copy of baseExtraDescriptor attributes. 727 // The last parameter (CTFontDescriptorRef attributes) *must* be nullptr.
728 AutoCFRelease<CFMutableDictionaryRef> newAttributes([](CTFontDescriptorRef d escriptor) -> 728 // If non-nullptr then with fonts with variation axes, the copy will fail in
729 CFMutableDictionaryRef { 729 // CGFontVariationFromDictCallback when it assumes kCGFontVariationAxisName is CFNumberRef
730 if (nullptr == descriptor) { 730 // which it quite obviously is not.
731 return CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
732 &kCFTypeDictionaryKeyCallBacks,
733 &kCFTypeDictionaryValueCallBacks);
734 }
735 AutoCFRelease<CFDictionaryRef> attributes(CTFontDescriptorCopyAttributes (descriptor));
736 return CFDictionaryCreateMutableCopy(kCFAllocatorDefault, 0, attributes) ;
737 }(baseExtraDescriptor));
738 731
739 // Copy all of the attributes out of the CTFont. 732 // Because we cannot setup the CTFont descriptor to match, the same restrict ion applies here
740 AutoCFRelease<CTFontDescriptorRef> baseDescriptor(CTFontCopyFontDescriptor(b aseFont)); 733 // as other uses of CTFontCreateWithGraphicsFont which is that such CTFonts should not escape
741 AutoCFRelease<CFDictionaryRef> baseAttributes(CTFontDescriptorCopyAttributes (baseDescriptor)); 734 // the scaler context, since they aren't 'normal'.
742 CFDictionaryApplyFunction(baseAttributes, [](CFTypeRef key, CFTypeRef value, void* context) { 735 return CTFontCreateWithGraphicsFont(baseCGFont, textSize, transform, nullptr );
743 CFMutableDictionaryRef self = static_cast<CFMutableDictionaryRef>(contex t);
744 CFDictionarySetValue(self, key, value);
745 }, newAttributes.get());
746
747 // Set the text size in attributes.
748 AutoCFRelease<CFNumberRef> cfTextSize(
749 CFNumberCreate(kCFAllocatorDefault, kCFNumberCGFloatType, &textSize));
750 CFDictionarySetValue(newAttributes, kCTFontSizeAttribute, cfTextSize);
751
752 // Set the transform in attributes.
753 if (nullptr == transform) {
754 CFDictionaryRemoveValue(newAttributes, kCTFontMatrixAttribute);
755 } else {
756 AutoCFRelease<CFDataRef> cfMatrixData(CFDataCreate(
757 kCFAllocatorDefault, reinterpret_cast<const UInt8*>(transform), size of(*transform)));
758 CFDictionarySetValue(newAttributes, kCTFontMatrixAttribute, cfMatrixData );
759 }
760
761 // Set vertical orientation to attributes if requested.
762 if (setVertical) {
763 CTFontOrientation ctOrientation = kCTFontVerticalOrientation;
764 AutoCFRelease<CFNumberRef> cfVertical(
765 CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &ctOrientat ion));
766 CFDictionarySetValue(newAttributes, kCTFontOrientationAttribute, cfVerti cal);
767 }
768
769 // Create the new CTFont from the baseCGFont.
770 AutoCFRelease<CTFontDescriptorRef> newDescriptor(
771 CTFontDescriptorCreateWithAttributes(newAttributes));
772 return CTFontCreateWithGraphicsFont(baseCGFont, textSize, transform, newDesc riptor);
773
774 } 736 }
775 737
776 SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface, 738 SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface,
777 const SkDescriptor* desc) 739 const SkDescriptor* desc)
778 : INHERITED(typeface, desc) 740 : INHERITED(typeface, desc)
779 , fFBoundingBoxes() 741 , fFBoundingBoxes()
780 , fFBoundingBoxesGlyphOffset(0) 742 , fFBoundingBoxesGlyphOffset(0)
781 , fGeneratedFBoundingBoxes(false) 743 , fGeneratedFBoundingBoxes(false)
782 , fDoSubPosition(SkToBool(fRec.fFlags & kSubpixelPositioning_Flag)) 744 , fDoSubPosition(SkToBool(fRec.fFlags & kSubpixelPositioning_Flag))
783 , fVertical(SkToBool(fRec.fFlags & kVertical_Flag)) 745 , fVertical(SkToBool(fRec.fFlags & kVertical_Flag))
(...skipping 12 matching lines...) Expand all
796 SkMatrix skTransform; 758 SkMatrix skTransform;
797 fRec.computeMatrices(SkScalerContextRec::kVertical_PreMatrixScale, &scale, & skTransform, 759 fRec.computeMatrices(SkScalerContextRec::kVertical_PreMatrixScale, &scale, & skTransform,
798 nullptr, nullptr, &fFUnitMatrix); 760 nullptr, nullptr, &fFUnitMatrix);
799 fTransform = MatrixToCGAffineTransform(skTransform); 761 fTransform = MatrixToCGAffineTransform(skTransform);
800 fInvTransform = CGAffineTransformInvert(fTransform); 762 fInvTransform = CGAffineTransformInvert(fTransform);
801 763
802 // The transform contains everything except the requested text size. 764 // The transform contains everything except the requested text size.
803 // Some properties, like 'trak', are based on the text size (before applying the matrix). 765 // Some properties, like 'trak', are based on the text size (before applying the matrix).
804 CGFloat textSize = ScalarToCG(scale.y()); 766 CGFloat textSize = ScalarToCG(scale.y());
805 767
806 fCTFont.reset(ctfont_create_exact_copy(ctFont, textSize, &fTransform, fVerti cal)); 768 fCTFont.reset(ctfont_create_exact_copy(ctFont, textSize, &fTransform));
807 fCGFont.reset(CTFontCopyGraphicsFont(fCTFont, nullptr)); 769 fCGFont.reset(CTFontCopyGraphicsFont(fCTFont, nullptr));
808 fCTUnrotatedFont.reset(ctfont_create_exact_copy(ctFont, textSize, nullptr, f alse)); 770 fCTUnrotatedFont.reset(ctfont_create_exact_copy(ctFont, textSize, nullptr));
809 771
810 // The fUnitMatrix includes the text size (and em) as it is used to scale th e raw font data. 772 // The fUnitMatrix includes the text size (and em) as it is used to scale th e raw font data.
811 SkScalar emPerFUnit = SkScalarInvert(SkIntToScalar(CGFontGetUnitsPerEm(fCGFo nt))); 773 SkScalar emPerFUnit = SkScalarInvert(SkIntToScalar(CGFontGetUnitsPerEm(fCGFo nt)));
812 fFUnitMatrix.preScale(emPerFUnit, -emPerFUnit); 774 fFUnitMatrix.preScale(emPerFUnit, -emPerFUnit);
813 } 775 }
814 776
815 /** This is an implementation of CTFontDrawGlyphs for 10.6; it was introduced in 10.7. */ 777 /** This is an implementation of CTFontDrawGlyphs for 10.6; it was introduced in 10.7. */
816 static void legacy_CTFontDrawGlyphs(CTFontRef, const CGGlyph glyphs[], const CGP oint points[], 778 static void legacy_CTFontDrawGlyphs(CTFontRef, const CGGlyph glyphs[], const CGP oint points[],
817 size_t count, CGContextRef cg) { 779 size_t count, CGContextRef cg) {
818 CGContextShowGlyphsAtPositions(cg, glyphs, points, count); 780 CGContextShowGlyphsAtPositions(cg, glyphs, points, count);
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
1399 scaleY = SK_Scalar1; // want hinting in the Y direction 1361 scaleY = SK_Scalar1; // want hinting in the Y direction
1400 break; 1362 break;
1401 case kY_SkAxisAlignment: 1363 case kY_SkAxisAlignment:
1402 scaleX = SK_Scalar1; // want hinting in the X direction 1364 scaleX = SK_Scalar1; // want hinting in the X direction
1403 break; 1365 break;
1404 default: 1366 default:
1405 break; 1367 break;
1406 } 1368 }
1407 1369
1408 CGAffineTransform xform = MatrixToCGAffineTransform(m, scaleX, scaleY); 1370 CGAffineTransform xform = MatrixToCGAffineTransform(m, scaleX, scaleY);
1409 font = ctfont_create_exact_copy(fCTFont, 1, &xform, false); 1371 font = ctfont_create_exact_copy(fCTFont, 1, &xform);
1410 } 1372 }
1411 1373
1412 CGGlyph cgGlyph = (CGGlyph)glyph.getGlyphID(); 1374 CGGlyph cgGlyph = (CGGlyph)glyph.getGlyphID();
1413 AutoCFRelease<CGPathRef> cgPath(CTFontCreatePathForGlyph(font, cgGlyph, null ptr)); 1375 AutoCFRelease<CGPathRef> cgPath(CTFontCreatePathForGlyph(font, cgGlyph, null ptr));
1414 1376
1415 path->reset(); 1377 path->reset();
1416 if (cgPath != nullptr) { 1378 if (cgPath != nullptr) {
1417 CGPathApply(cgPath, path, SkScalerContext_Mac::CTPathElement); 1379 CGPathApply(cgPath, path, SkScalerContext_Mac::CTPathElement);
1418 } 1380 }
1419 1381
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1596 1558
1597 SkAdvancedTypefaceMetrics* SkTypeface_Mac::onGetAdvancedTypefaceMetrics( 1559 SkAdvancedTypefaceMetrics* SkTypeface_Mac::onGetAdvancedTypefaceMetrics(
1598 PerGlyphInfo perGlyphInfo, 1560 PerGlyphInfo perGlyphInfo,
1599 const uint32_t* glyphIDs, 1561 const uint32_t* glyphIDs,
1600 uint32_t glyphIDsCount) const { 1562 uint32_t glyphIDsCount) const {
1601 1563
1602 AUTO_CG_LOCK(); 1564 AUTO_CG_LOCK();
1603 1565
1604 CTFontRef originalCTFont = fFontRef.get(); 1566 CTFontRef originalCTFont = fFontRef.get();
1605 AutoCFRelease<CTFontRef> ctFont(ctfont_create_exact_copy( 1567 AutoCFRelease<CTFontRef> ctFont(ctfont_create_exact_copy(
1606 originalCTFont, CTFontGetUnitsPerEm(originalCTFont), nullptr, false) ); 1568 originalCTFont, CTFontGetUnitsPerEm(originalCTFont), nullptr));
1607 1569
1608 SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics; 1570 SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics;
1609 1571
1610 { 1572 {
1611 AutoCFRelease<CFStringRef> fontName(CTFontCopyPostScriptName(ctFont)); 1573 AutoCFRelease<CFStringRef> fontName(CTFontCopyPostScriptName(ctFont));
1612 if (fontName.get()) { 1574 if (fontName.get()) {
1613 CFStringToSkString(fontName, &info->fFontName); 1575 CFStringToSkString(fontName, &info->fFontName);
1614 } 1576 }
1615 } 1577 }
1616 1578
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
2516 face->ref(); 2478 face->ref();
2517 } 2479 }
2518 } 2480 }
2519 return face; 2481 return face;
2520 } 2482 }
2521 }; 2483 };
2522 2484
2523 /////////////////////////////////////////////////////////////////////////////// 2485 ///////////////////////////////////////////////////////////////////////////////
2524 2486
2525 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; } 2487 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698