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 <vector> | 9 #include <vector> |
10 #ifdef SK_BUILD_FOR_MAC | 10 #ifdef SK_BUILD_FOR_MAC |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 protected: | 411 protected: |
412 friend class SkFontHost; // to access our protected members for deprecate
d methods | 412 friend class SkFontHost; // to access our protected members for deprecate
d methods |
413 | 413 |
414 virtual int onGetUPEM() const SK_OVERRIDE; | 414 virtual int onGetUPEM() const SK_OVERRIDE; |
415 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; | 415 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; |
416 virtual size_t onGetTableData(SkFontTableTag, size_t offset, | 416 virtual size_t onGetTableData(SkFontTableTag, size_t offset, |
417 size_t length, void* data) const SK_OVERRIDE; | 417 size_t length, void* data) const SK_OVERRIDE; |
418 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; | 418 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK
_OVERRIDE; |
419 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; | 419 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
420 virtual void onGetFontDescriptor(SkFontDescriptor*) const SK_OVERRIDE; | 420 virtual void onGetFontDescriptor(SkFontDescriptor*) const SK_OVERRIDE; |
421 | 421 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
| 422 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
| 423 const uint32_t*, uint32_t) const SK_OVERRIDE; |
| 424 |
422 private: | 425 private: |
423 typedef SkTypeface INHERITED; | 426 typedef SkTypeface INHERITED; |
424 }; | 427 }; |
425 | 428 |
426 static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[]) { | 429 static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[]) { |
427 SkASSERT(fontRef); | 430 SkASSERT(fontRef); |
428 bool isMonospace; | 431 bool isMonospace; |
429 SkTypeface::Style style = computeStyleBits(fontRef, &isMonospace); | 432 SkTypeface::Style style = computeStyleBits(fontRef, &isMonospace); |
430 SkFontID fontID = CTFontRef_to_SkFontID(fontRef); | 433 SkFontID fontID = CTFontRef_to_SkFontID(fontRef); |
431 | 434 |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 typedef SkScalerContext INHERITED; | 653 typedef SkScalerContext INHERITED; |
651 }; | 654 }; |
652 | 655 |
653 SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface, | 656 SkScalerContext_Mac::SkScalerContext_Mac(SkTypeface_Mac* typeface, |
654 const SkDescriptor* desc) | 657 const SkDescriptor* desc) |
655 : INHERITED(typeface, desc) | 658 : INHERITED(typeface, desc) |
656 , fFBoundingBoxes(NULL) | 659 , fFBoundingBoxes(NULL) |
657 , fFBoundingBoxesGlyphOffset(0) | 660 , fFBoundingBoxesGlyphOffset(0) |
658 , fGeneratedFBoundingBoxes(false) | 661 , fGeneratedFBoundingBoxes(false) |
659 { | 662 { |
660 CTFontRef ctFont = GetFontRefFromFontID(fRec.fFontID); | 663 CTFontRef ctFont = typeface->fFontRef.get(); |
661 CFIndex numGlyphs = CTFontGetGlyphCount(ctFont); | 664 CFIndex numGlyphs = CTFontGetGlyphCount(ctFont); |
662 | 665 |
663 // Get the state we need | 666 // Get the state we need |
664 fRec.getSingleMatrix(&fMatrix); | 667 fRec.getSingleMatrix(&fMatrix); |
665 fUnitMatrix = fMatrix; | 668 fUnitMatrix = fMatrix; |
666 | 669 |
667 // extract the font size out of the matrix, but leave the skewing for italic | 670 // extract the font size out of the matrix, but leave the skewing for italic |
668 SkScalar reciprocal = SkScalarInvert(fRec.fTextSize); | 671 SkScalar reciprocal = SkScalarInvert(fRec.fTextSize); |
669 fUnitMatrix.preScale(reciprocal, reciprocal); | 672 fUnitMatrix.preScale(reciprocal, reciprocal); |
670 | 673 |
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1465 // Reserve enough room for the worst-case string, | 1468 // Reserve enough room for the worst-case string, |
1466 // plus 1 byte for the trailing null. | 1469 // plus 1 byte for the trailing null. |
1467 CFIndex length = CFStringGetMaximumSizeForEncoding(CFStringGetLength(src), | 1470 CFIndex length = CFStringGetMaximumSizeForEncoding(CFStringGetLength(src), |
1468 kCFStringEncodingUTF8) +
1; | 1471 kCFStringEncodingUTF8) +
1; |
1469 dst->resize(length); | 1472 dst->resize(length); |
1470 CFStringGetCString(src, dst->writable_str(), length, kCFStringEncodingUTF8); | 1473 CFStringGetCString(src, dst->writable_str(), length, kCFStringEncodingUTF8); |
1471 // Resize to the actual UTF-8 length used, stripping the null character. | 1474 // Resize to the actual UTF-8 length used, stripping the null character. |
1472 dst->resize(strlen(dst->c_str())); | 1475 dst->resize(strlen(dst->c_str())); |
1473 } | 1476 } |
1474 | 1477 |
1475 // static | 1478 SkAdvancedTypefaceMetrics* SkTypeface_Mac::onGetAdvancedTypefaceMetrics( |
1476 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics( | |
1477 uint32_t fontID, | |
1478 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, | 1479 SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo, |
1479 const uint32_t* glyphIDs, | 1480 const uint32_t* glyphIDs, |
1480 uint32_t glyphIDsCount) { | 1481 uint32_t glyphIDsCount) const { |
1481 CTFontRef originalCTFont = GetFontRefFromFontID(fontID); | 1482 |
| 1483 CTFontRef originalCTFont = fFontRef.get(); |
1482 AutoCFRelease<CTFontRef> ctFont(CTFontCreateCopyWithAttributes( | 1484 AutoCFRelease<CTFontRef> ctFont(CTFontCreateCopyWithAttributes( |
1483 originalCTFont, CTFontGetUnitsPerEm(originalCTFont), NULL, NULL)); | 1485 originalCTFont, CTFontGetUnitsPerEm(originalCTFont), NULL, NULL)); |
1484 SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics; | 1486 SkAdvancedTypefaceMetrics* info = new SkAdvancedTypefaceMetrics; |
1485 | 1487 |
1486 { | 1488 { |
1487 AutoCFRelease<CFStringRef> fontName(CTFontCopyPostScriptName(ctFont)); | 1489 AutoCFRelease<CFStringRef> fontName(CTFontCopyPostScriptName(ctFont)); |
1488 CFStringToSkString(fontName, &info->fFontName); | 1490 CFStringToSkString(fontName, &info->fFontName); |
1489 } | 1491 } |
1490 | 1492 |
1491 info->fMultiMaster = false; | 1493 info->fMultiMaster = false; |
1492 CFIndex glyphCount = CTFontGetGlyphCount(ctFont); | 1494 CFIndex glyphCount = CTFontGetGlyphCount(ctFont); |
1493 info->fLastGlyphID = SkToU16(glyphCount - 1); | 1495 info->fLastGlyphID = SkToU16(glyphCount - 1); |
1494 info->fEmSize = CTFontGetUnitsPerEm(ctFont); | 1496 info->fEmSize = CTFontGetUnitsPerEm(ctFont); |
1495 | 1497 |
1496 if (perGlyphInfo & SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo) { | 1498 if (perGlyphInfo & SkAdvancedTypefaceMetrics::kToUnicode_PerGlyphInfo) { |
1497 populate_glyph_to_unicode(ctFont, glyphCount, &info->fGlyphToUnicode); | 1499 populate_glyph_to_unicode(ctFont, glyphCount, &info->fGlyphToUnicode); |
1498 } | 1500 } |
1499 | 1501 |
1500 info->fStyle = 0; | 1502 info->fStyle = 0; |
1501 | 1503 |
1502 // If it's not a truetype font, mark it as 'other'. Assume that TrueType | 1504 // If it's not a truetype font, mark it as 'other'. Assume that TrueType |
1503 // fonts always have both glyf and loca tables. At the least, this is what | 1505 // fonts always have both glyf and loca tables. At the least, this is what |
1504 // sfntly needs to subset the font. CTFontCopyAttribute() does not always | 1506 // sfntly needs to subset the font. CTFontCopyAttribute() does not always |
1505 // succeed in determining this directly. | 1507 // succeed in determining this directly. |
1506 if (!GetTableSize(fontID, 'glyf') || !GetTableSize(fontID, 'loca')) { | 1508 if (!this->getTableSize('glyf') || !this->getTableSize('loca')) { |
1507 info->fType = SkAdvancedTypefaceMetrics::kOther_Font; | 1509 info->fType = SkAdvancedTypefaceMetrics::kOther_Font; |
1508 info->fItalicAngle = 0; | 1510 info->fItalicAngle = 0; |
1509 info->fAscent = 0; | 1511 info->fAscent = 0; |
1510 info->fDescent = 0; | 1512 info->fDescent = 0; |
1511 info->fStemV = 0; | 1513 info->fStemV = 0; |
1512 info->fCapHeight = 0; | 1514 info->fCapHeight = 0; |
1513 info->fBBox = SkIRect::MakeEmpty(); | 1515 info->fBBox = SkIRect::MakeEmpty(); |
1514 return info; | 1516 return info; |
1515 } | 1517 } |
1516 | 1518 |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1879 } | 1881 } |
1880 | 1882 |
1881 void SkTypeface_Mac::onGetFontDescriptor(SkFontDescriptor* desc) const { | 1883 void SkTypeface_Mac::onGetFontDescriptor(SkFontDescriptor* desc) const { |
1882 this->INHERITED::onGetFontDescriptor(desc); | 1884 this->INHERITED::onGetFontDescriptor(desc); |
1883 SkString tmpStr; | 1885 SkString tmpStr; |
1884 | 1886 |
1885 desc->setFamilyName(get_str(CTFontCopyFamilyName(fFontRef), &tmpStr)); | 1887 desc->setFamilyName(get_str(CTFontCopyFamilyName(fFontRef), &tmpStr)); |
1886 desc->setFullName(get_str(CTFontCopyFullName(fFontRef), &tmpStr)); | 1888 desc->setFullName(get_str(CTFontCopyFullName(fFontRef), &tmpStr)); |
1887 desc->setPostscriptName(get_str(CTFontCopyPostScriptName(fFontRef), &tmpStr)
); | 1889 desc->setPostscriptName(get_str(CTFontCopyPostScriptName(fFontRef), &tmpStr)
); |
1888 } | 1890 } |
OLD | NEW |