| OLD | NEW |
| 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 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 static const uint32_t SkCTFontColorGlyphsTrait = (1 << 13); | 446 static const uint32_t SkCTFontColorGlyphsTrait = (1 << 13); |
| 447 #endif | 447 #endif |
| 448 | 448 |
| 449 class SkTypeface_Mac : public SkTypeface { | 449 class SkTypeface_Mac : public SkTypeface { |
| 450 public: | 450 public: |
| 451 SkTypeface_Mac(const SkFontStyle& fs, SkFontID fontID, bool isFixedPitch, | 451 SkTypeface_Mac(const SkFontStyle& fs, SkFontID fontID, bool isFixedPitch, |
| 452 CTFontRef fontRef, const char requestedName[], bool isLocalSt
ream) | 452 CTFontRef fontRef, const char requestedName[], bool isLocalSt
ream) |
| 453 : SkTypeface(fs, fontID, isFixedPitch) | 453 : SkTypeface(fs, fontID, isFixedPitch) |
| 454 , fRequestedName(requestedName) | 454 , fRequestedName(requestedName) |
| 455 , fFontRef(fontRef) // caller has already called CFRetain for us | 455 , fFontRef(fontRef) // caller has already called CFRetain for us |
| 456 , fHasColorGlyphs(SkToBool(CTFontGetSymbolicTraits(fFontRef) & SkCTFontC
olorGlyphsTrait)) |
| 456 , fIsLocalStream(isLocalStream) | 457 , fIsLocalStream(isLocalStream) |
| 457 , fHasColorGlyphs(CTFontGetSymbolicTraits(fFontRef) & SkCTFontColorGlyph
sTrait) | |
| 458 { | 458 { |
| 459 SkASSERT(fontRef); | 459 SkASSERT(fontRef); |
| 460 } | 460 } |
| 461 | 461 |
| 462 SkString fRequestedName; | 462 SkString fRequestedName; |
| 463 AutoCFRelease<CTFontRef> fFontRef; | 463 AutoCFRelease<CTFontRef> fFontRef; |
| 464 const bool fHasColorGlyphs; |
| 464 | 465 |
| 465 protected: | 466 protected: |
| 466 int onGetUPEM() const override; | 467 int onGetUPEM() const override; |
| 467 SkStreamAsset* onOpenStream(int* ttcIndex) const override; | 468 SkStreamAsset* onOpenStream(int* ttcIndex) const override; |
| 468 void onGetFamilyName(SkString* familyName) const override; | 469 void onGetFamilyName(SkString* familyName) const override; |
| 469 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; | 470 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; |
| 470 int onGetTableTags(SkFontTableTag tags[]) const override; | 471 int onGetTableTags(SkFontTableTag tags[]) const override; |
| 471 virtual size_t onGetTableData(SkFontTableTag, size_t offset, | 472 virtual size_t onGetTableData(SkFontTableTag, size_t offset, |
| 472 size_t length, void* data) const override; | 473 size_t length, void* data) const override; |
| 473 SkScalerContext* onCreateScalerContext(const SkDescriptor*) const override; | 474 SkScalerContext* onCreateScalerContext(const SkDescriptor*) const override; |
| 474 void onFilterRec(SkScalerContextRec*) const override; | 475 void onFilterRec(SkScalerContextRec*) const override; |
| 475 void onGetFontDescriptor(SkFontDescriptor*, bool*) const override; | 476 void onGetFontDescriptor(SkFontDescriptor*, bool*) const override; |
| 476 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( | 477 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
| 477 SkAdvancedTypefaceMetrics::PerGlyphInfo, | 478 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
| 478 const uint32_t*, uint32_t) const override; | 479 const uint32_t*, uint32_t) const override; |
| 479 virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[], | 480 virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[], |
| 480 int glyphCount) const override; | 481 int glyphCount) const override; |
| 481 int onCountGlyphs() const override; | 482 int onCountGlyphs() const override; |
| 482 | 483 |
| 483 private: | 484 private: |
| 484 bool fIsLocalStream; | 485 bool fIsLocalStream; |
| 485 bool fHasColorGlyphs; | |
| 486 | 486 |
| 487 typedef SkTypeface INHERITED; | 487 typedef SkTypeface INHERITED; |
| 488 }; | 488 }; |
| 489 | 489 |
| 490 static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[], bool isL
ocalStream) { | 490 static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[], bool isL
ocalStream) { |
| 491 SkASSERT(fontRef); | 491 SkASSERT(fontRef); |
| 492 bool isFixedPitch; | 492 bool isFixedPitch; |
| 493 SkFontStyle style = SkFontStyle(computeStyleBits(fontRef, &isFixedPitch)); | 493 SkFontStyle style = SkFontStyle(computeStyleBits(fontRef, &isFixedPitch)); |
| 494 SkFontID fontID = CTFontRef_to_SkFontID(fontRef); | 494 SkFontID fontID = CTFontRef_to_SkFontID(fontRef); |
| 495 | 495 |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 900 CGPoint point = CGPointMake(-glyph.fLeft + subX, glyph.fTop + glyph.fHeight
- subY); | 900 CGPoint point = CGPointMake(-glyph.fLeft + subX, glyph.fTop + glyph.fHeight
- subY); |
| 901 // Prior to 10.10, CTFontDrawGlyphs acted like CGContextShowGlyphsAtPosition
s and took | 901 // Prior to 10.10, CTFontDrawGlyphs acted like CGContextShowGlyphsAtPosition
s and took |
| 902 // 'positions' which are in text space. The glyph location (in device space)
must be | 902 // 'positions' which are in text space. The glyph location (in device space)
must be |
| 903 // mapped into text space, so that CG can convert it back into device space. | 903 // mapped into text space, so that CG can convert it back into device space. |
| 904 // In 10.10.1, this is handled directly in CTFontDrawGlyphs. | 904 // In 10.10.1, this is handled directly in CTFontDrawGlyphs. |
| 905 | 905 |
| 906 // However, in 10.10.2 color glyphs no longer rotate based on the font trans
form. | 906 // However, in 10.10.2 color glyphs no longer rotate based on the font trans
form. |
| 907 // So always make the font transform identity and place the transform on the
context. | 907 // So always make the font transform identity and place the transform on the
context. |
| 908 point = CGPointApplyAffineTransform(point, context.fInvTransform); | 908 point = CGPointApplyAffineTransform(point, context.fInvTransform); |
| 909 | 909 |
| 910 // Attempt to keep on the stack a hard reference to the font tables. |
| 911 // This is an experiment to see if this affects crbug.com/413332 . |
| 912 // When 10.6 headers are no longer supported, 'sbix' can be replaced with kC
TFontTableSbix. |
| 913 AutoCFRelease<CFDataRef> sbix; |
| 914 if (static_cast<SkTypeface_Mac*>(context.getTypeface())->fHasColorGlyphs) { |
| 915 sbix.reset(CGFontCopyTableForTag(context.fCGFont, 'sbix')); |
| 916 } |
| 910 ctFontDrawGlyphs(context.fCTUnrotatedFont, &glyphID, &point, 1, fCG); | 917 ctFontDrawGlyphs(context.fCTUnrotatedFont, &glyphID, &point, 1, fCG); |
| 911 | 918 |
| 912 SkASSERT(rowBytesPtr); | 919 SkASSERT(rowBytesPtr); |
| 913 *rowBytesPtr = rowBytes; | 920 *rowBytesPtr = rowBytes; |
| 914 return image; | 921 return image; |
| 915 } | 922 } |
| 916 | 923 |
| 917 void SkScalerContext_Mac::getVerticalOffset(CGGlyph glyphID, SkPoint* offset) co
nst { | 924 void SkScalerContext_Mac::getVerticalOffset(CGGlyph glyphID, SkPoint* offset) co
nst { |
| 918 // Snow Leopard returns cgVertOffset in completely un-transformed FUnits (em
space, y up). | 925 // Snow Leopard returns cgVertOffset in completely un-transformed FUnits (em
space, y up). |
| 919 // Lion and Leopard return cgVertOffset in CG units (pixels, y up). | 926 // Lion and Leopard return cgVertOffset in CG units (pixels, y up). |
| (...skipping 1366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2286 } | 2293 } |
| 2287 return face; | 2294 return face; |
| 2288 } | 2295 } |
| 2289 }; | 2296 }; |
| 2290 | 2297 |
| 2291 /////////////////////////////////////////////////////////////////////////////// | 2298 /////////////////////////////////////////////////////////////////////////////// |
| 2292 | 2299 |
| 2293 SkFontMgr* SkFontMgr::Factory() { | 2300 SkFontMgr* SkFontMgr::Factory() { |
| 2294 return SkNEW(SkFontMgr_Mac); | 2301 return SkNEW(SkFontMgr_Mac); |
| 2295 } | 2302 } |
| OLD | NEW |