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 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
419 } | 419 } |
420 if (fs.isItalic()) { | 420 if (fs.isItalic()) { |
421 style |= SkTypeface::kItalic; | 421 style |= SkTypeface::kItalic; |
422 } | 422 } |
423 return (SkTypeface::Style)style; | 423 return (SkTypeface::Style)style; |
424 } | 424 } |
425 | 425 |
426 class SkTypeface_Mac : public SkTypeface { | 426 class SkTypeface_Mac : public SkTypeface { |
427 public: | 427 public: |
428 SkTypeface_Mac(SkTypeface::Style style, SkFontID fontID, bool isFixedPitch, | 428 SkTypeface_Mac(SkTypeface::Style style, SkFontID fontID, bool isFixedPitch, |
429 CTFontRef fontRef, const char name[]) | 429 CTFontRef fontRef, const char name[], bool isLocalStream) |
430 : SkTypeface(style, fontID, isFixedPitch) | 430 : SkTypeface(style, fontID, isFixedPitch) |
431 , fName(name) | 431 , fName(name) |
432 , fFontRef(fontRef) // caller has already called CFRetain for us | 432 , fFontRef(fontRef) // caller has already called CFRetain for us |
433 , fFontStyle(stylebits2fontstyle(style)) | 433 , fFontStyle(stylebits2fontstyle(style)) |
434 , fIsLocalStream(isLocalStream) | |
434 { | 435 { |
435 SkASSERT(fontRef); | 436 SkASSERT(fontRef); |
436 } | 437 } |
437 | 438 |
438 SkTypeface_Mac(const SkFontStyle& fs, SkFontID fontID, bool isFixedPitch, | 439 SkTypeface_Mac(const SkFontStyle& fs, SkFontID fontID, bool isFixedPitch, |
439 CTFontRef fontRef, const char name[]) | 440 CTFontRef fontRef, const char name[], bool isLocalStream) |
440 : SkTypeface(fontstyle2stylebits(fs), fontID, isFixedPitch) | 441 : SkTypeface(fontstyle2stylebits(fs), fontID, isFixedPitch) |
441 , fName(name) | 442 , fName(name) |
442 , fFontRef(fontRef) // caller has already called CFRetain for us | 443 , fFontRef(fontRef) // caller has already called CFRetain for us |
443 , fFontStyle(fs) | 444 , fFontStyle(fs) |
445 , fIsLocalStream(isLocalStream) | |
444 { | 446 { |
445 SkASSERT(fontRef); | 447 SkASSERT(fontRef); |
446 } | 448 } |
447 | 449 |
448 SkString fName; | 450 SkString fName; |
449 AutoCFRelease<CTFontRef> fFontRef; | 451 AutoCFRelease<CTFontRef> fFontRef; |
450 SkFontStyle fFontStyle; | 452 SkFontStyle fFontStyle; |
451 | 453 |
452 protected: | 454 protected: |
453 friend class SkFontHost; // to access our protected members for deprecate d methods | 455 friend class SkFontHost; // to access our protected members for deprecate d methods |
454 | 456 |
455 virtual int onGetUPEM() const SK_OVERRIDE; | 457 virtual int onGetUPEM() const SK_OVERRIDE; |
456 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; | 458 virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; |
457 virtual SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_ OVERRIDE; | 459 virtual SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const SK_ OVERRIDE; |
458 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; | 460 virtual int onGetTableTags(SkFontTableTag tags[]) const SK_OVERRIDE; |
459 virtual size_t onGetTableData(SkFontTableTag, size_t offset, | 461 virtual size_t onGetTableData(SkFontTableTag, size_t offset, |
460 size_t length, void* data) const SK_OVERRIDE; | 462 size_t length, void* data) const SK_OVERRIDE; |
461 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK _OVERRIDE; | 463 virtual SkScalerContext* onCreateScalerContext(const SkDescriptor*) const SK _OVERRIDE; |
462 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; | 464 virtual void onFilterRec(SkScalerContextRec*) const SK_OVERRIDE; |
463 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE ; | 465 virtual void onGetFontDescriptor(SkFontDescriptor*, bool*) const SK_OVERRIDE ; |
464 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( | 466 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
465 SkAdvancedTypefaceMetrics::PerGlyphInfo, | 467 SkAdvancedTypefaceMetrics::PerGlyphInfo, |
466 const uint32_t*, uint32_t) const SK_OVERRIDE; | 468 const uint32_t*, uint32_t) const SK_OVERRIDE; |
467 virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[], | 469 virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[], |
468 int glyphCount) const SK_OVERRIDE; | 470 int glyphCount) const SK_OVERRIDE; |
469 virtual int onCountGlyphs() const SK_OVERRIDE; | 471 virtual int onCountGlyphs() const SK_OVERRIDE; |
470 | 472 |
471 private: | 473 private: |
474 bool fIsLocalStream; | |
472 | 475 |
473 typedef SkTypeface INHERITED; | 476 typedef SkTypeface INHERITED; |
474 }; | 477 }; |
475 | 478 |
476 static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[]) { | 479 static SkTypeface* NewFromFontRef(CTFontRef fontRef, const char name[], bool isL ocalStream) { |
477 SkASSERT(fontRef); | 480 SkASSERT(fontRef); |
478 bool isFixedPitch; | 481 bool isFixedPitch; |
479 SkTypeface::Style style = computeStyleBits(fontRef, &isFixedPitch); | 482 SkTypeface::Style style = computeStyleBits(fontRef, &isFixedPitch); |
480 SkFontID fontID = CTFontRef_to_SkFontID(fontRef); | 483 SkFontID fontID = CTFontRef_to_SkFontID(fontRef); |
481 | 484 |
482 return new SkTypeface_Mac(style, fontID, isFixedPitch, fontRef, name); | 485 return new SkTypeface_Mac(style, fontID, isFixedPitch, fontRef, name, isLoca lStream); |
483 } | 486 } |
484 | 487 |
485 static SkTypeface* NewFromName(const char familyName[], SkTypeface::Style theSty le) { | 488 static SkTypeface* NewFromName(const char familyName[], SkTypeface::Style theSty le) { |
486 CTFontRef ctFont = NULL; | 489 CTFontRef ctFont = NULL; |
487 | 490 |
488 CTFontSymbolicTraits ctFontTraits = 0; | 491 CTFontSymbolicTraits ctFontTraits = 0; |
489 if (theStyle & SkTypeface::kBold) { | 492 if (theStyle & SkTypeface::kBold) { |
490 ctFontTraits |= kCTFontBoldTrait; | 493 ctFontTraits |= kCTFontBoldTrait; |
491 } | 494 } |
492 if (theStyle & SkTypeface::kItalic) { | 495 if (theStyle & SkTypeface::kItalic) { |
(...skipping 24 matching lines...) Expand all Loading... | |
517 CFDictionaryAddValue(cfAttributes, kCTFontTraitsAttribute, cfTraits); | 520 CFDictionaryAddValue(cfAttributes, kCTFontTraitsAttribute, cfTraits); |
518 | 521 |
519 AutoCFRelease<CTFontDescriptorRef> ctFontDesc( | 522 AutoCFRelease<CTFontDescriptorRef> ctFontDesc( |
520 CTFontDescriptorCreateWithAttributes(cfAttributes)); | 523 CTFontDescriptorCreateWithAttributes(cfAttributes)); |
521 | 524 |
522 if (ctFontDesc != NULL) { | 525 if (ctFontDesc != NULL) { |
523 ctFont = CTFontCreateWithFontDescriptor(ctFontDesc, 0, NULL); | 526 ctFont = CTFontCreateWithFontDescriptor(ctFontDesc, 0, NULL); |
524 } | 527 } |
525 } | 528 } |
526 | 529 |
527 return ctFont ? NewFromFontRef(ctFont, familyName) : NULL; | 530 return ctFont ? NewFromFontRef(ctFont, familyName, false) : NULL; |
528 } | 531 } |
529 | 532 |
530 static SkTypeface* GetDefaultFace() { | 533 static SkTypeface* GetDefaultFace() { |
531 SK_DECLARE_STATIC_MUTEX(gMutex); | 534 SK_DECLARE_STATIC_MUTEX(gMutex); |
532 SkAutoMutexAcquire ma(gMutex); | 535 SkAutoMutexAcquire ma(gMutex); |
533 | 536 |
534 static SkTypeface* gDefaultFace; | 537 static SkTypeface* gDefaultFace; |
535 | 538 |
536 if (NULL == gDefaultFace) { | 539 if (NULL == gDefaultFace) { |
537 gDefaultFace = NewFromName(FONT_DEFAULT_NAME, SkTypeface::kNormal); | 540 gDefaultFace = NewFromName(FONT_DEFAULT_NAME, SkTypeface::kNormal); |
538 SkTypefaceCache::Add(gDefaultFace, SkTypeface::kNormal); | 541 SkTypefaceCache::Add(gDefaultFace, SkTypeface::kNormal); |
539 } | 542 } |
540 return gDefaultFace; | 543 return gDefaultFace; |
541 } | 544 } |
542 | 545 |
543 /////////////////////////////////////////////////////////////////////////////// | 546 /////////////////////////////////////////////////////////////////////////////// |
544 | 547 |
545 extern CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face); | 548 extern CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face); |
546 CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face) { | 549 CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face) { |
547 const SkTypeface_Mac* macface = (const SkTypeface_Mac*)face; | 550 const SkTypeface_Mac* macface = (const SkTypeface_Mac*)face; |
548 return macface ? macface->fFontRef.get() : NULL; | 551 return macface ? macface->fFontRef.get() : NULL; |
549 } | 552 } |
550 | 553 |
551 /* This function is visible on the outside. It first searches the cache, and if | 554 static SkTypeface* internalCreateTypefaceFromCTFont(CTFontRef fontRef, bool isLo calStream) { |
552 * not found, returns a new entry (after adding it to the cache). | |
553 */ | |
554 SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef) { | |
555 SkFontID fontID = CTFontRef_to_SkFontID(fontRef); | 555 SkFontID fontID = CTFontRef_to_SkFontID(fontRef); |
556 SkTypeface* face = SkTypefaceCache::FindByID(fontID); | 556 SkTypeface* face = SkTypefaceCache::FindByID(fontID); |
557 if (face) { | 557 if (face) { |
558 face->ref(); | 558 face->ref(); |
559 } else { | 559 } else { |
560 face = NewFromFontRef(fontRef, NULL); | 560 face = NewFromFontRef(fontRef, NULL, isLocalStream); |
561 SkTypefaceCache::Add(face, face->style()); | 561 SkTypefaceCache::Add(face, face->style()); |
562 // NewFromFontRef doesn't retain the parameter, but the typeface it | 562 // NewFromFontRef doesn't retain the parameter, but the typeface it |
563 // creates does release it in its destructor, so we balance that with | 563 // creates does release it in its destructor, so we balance that with |
564 // a retain call here. | 564 // a retain call here. |
565 CFRetain(fontRef); | 565 CFRetain(fontRef); |
566 } | 566 } |
567 SkASSERT(face->getRefCnt() > 1); | 567 SkASSERT(face->getRefCnt() > 1); |
568 return face; | 568 return face; |
569 } | 569 } |
570 | 570 |
571 /* This function is visible on the outside. It first searches the cache, and if | |
572 * not found, returns a new entry (after adding it to the cache). | |
573 */ | |
574 SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef) { | |
575 return internalCreateTypefaceFromCTFont(fontRef, false); | |
576 } | |
577 | |
571 struct NameStyleRec { | 578 struct NameStyleRec { |
572 const char* fName; | 579 const char* fName; |
573 SkTypeface::Style fStyle; | 580 SkTypeface::Style fStyle; |
574 }; | 581 }; |
575 | 582 |
576 static bool FindByNameStyle(SkTypeface* face, SkTypeface::Style style, | 583 static bool FindByNameStyle(SkTypeface* face, SkTypeface::Style style, |
577 void* ctx) { | 584 void* ctx) { |
578 const SkTypeface_Mac* mface = reinterpret_cast<SkTypeface_Mac*>(face); | 585 const SkTypeface_Mac* mface = reinterpret_cast<SkTypeface_Mac*>(face); |
579 const NameStyleRec* rec = reinterpret_cast<const NameStyleRec*>(ctx); | 586 const NameStyleRec* rec = reinterpret_cast<const NameStyleRec*>(ctx); |
580 | 587 |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1431 /////////////////////////////////////////////////////////////////////////////// | 1438 /////////////////////////////////////////////////////////////////////////////// |
1432 | 1439 |
1433 // Returns NULL on failure | 1440 // Returns NULL on failure |
1434 // Call must still manage its ownership of provider | 1441 // Call must still manage its ownership of provider |
1435 static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) { | 1442 static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) { |
1436 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); | 1443 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); |
1437 if (NULL == cg) { | 1444 if (NULL == cg) { |
1438 return NULL; | 1445 return NULL; |
1439 } | 1446 } |
1440 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, NULL, NULL); | 1447 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, NULL, NULL); |
1441 return cg ? SkCreateTypefaceFromCTFont(ct) : NULL; | 1448 return cg ? internalCreateTypefaceFromCTFont(ct, true) : NULL; |
bungeman-skia
2014/06/30 15:10:23
I think this is incorrect, in that stream based ty
| |
1442 } | 1449 } |
1443 | 1450 |
1444 // Web fonts added to the the CTFont registry do not return their character set. | 1451 // Web fonts added to the the CTFont registry do not return their character set. |
1445 // Iterate through the font in this case. The existing caller caches the result, | 1452 // Iterate through the font in this case. The existing caller caches the result, |
1446 // so the performance impact isn't too bad. | 1453 // so the performance impact isn't too bad. |
1447 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount, | 1454 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount, |
1448 SkTDArray<SkUnichar>* glyphToUnicode) { | 1455 SkTDArray<SkUnichar>* glyphToUnicode) { |
1449 glyphToUnicode->setCount(SkToInt(glyphCount)); | 1456 glyphToUnicode->setCount(SkToInt(glyphCount)); |
1450 SkUnichar* out = glyphToUnicode->begin(); | 1457 SkUnichar* out = glyphToUnicode->begin(); |
1451 sk_bzero(out, glyphCount * sizeof(SkUnichar)); | 1458 sk_bzero(out, glyphCount * sizeof(SkUnichar)); |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1901 return str->c_str(); | 1908 return str->c_str(); |
1902 } | 1909 } |
1903 | 1910 |
1904 void SkTypeface_Mac::onGetFontDescriptor(SkFontDescriptor* desc, | 1911 void SkTypeface_Mac::onGetFontDescriptor(SkFontDescriptor* desc, |
1905 bool* isLocalStream) const { | 1912 bool* isLocalStream) const { |
1906 SkString tmpStr; | 1913 SkString tmpStr; |
1907 | 1914 |
1908 desc->setFamilyName(get_str(CTFontCopyFamilyName(fFontRef), &tmpStr)); | 1915 desc->setFamilyName(get_str(CTFontCopyFamilyName(fFontRef), &tmpStr)); |
1909 desc->setFullName(get_str(CTFontCopyFullName(fFontRef), &tmpStr)); | 1916 desc->setFullName(get_str(CTFontCopyFullName(fFontRef), &tmpStr)); |
1910 desc->setPostscriptName(get_str(CTFontCopyPostScriptName(fFontRef), &tmpStr) ); | 1917 desc->setPostscriptName(get_str(CTFontCopyPostScriptName(fFontRef), &tmpStr) ); |
1911 // TODO: need to add support for local-streams (here and openStream) | 1918 *isLocalStream = fIsLocalStream; |
1912 *isLocalStream = false; | |
1913 } | 1919 } |
1914 | 1920 |
1915 int SkTypeface_Mac::onCharsToGlyphs(const void* chars, Encoding encoding, | 1921 int SkTypeface_Mac::onCharsToGlyphs(const void* chars, Encoding encoding, |
1916 uint16_t glyphs[], int glyphCount) const | 1922 uint16_t glyphs[], int glyphCount) const |
1917 { | 1923 { |
1918 // Undocumented behavior of CTFontGetGlyphsForCharacters with non-bmp code p oints: | 1924 // Undocumented behavior of CTFontGetGlyphsForCharacters with non-bmp code p oints: |
1919 // When a surrogate pair is detected, the glyph index used is the index of t he high surrogate. | 1925 // When a surrogate pair is detected, the glyph index used is the index of t he high surrogate. |
1920 // It is documented that if a mapping is unavailable, the glyph will be set to 0. | 1926 // It is documented that if a mapping is unavailable, the glyph will be set to 0. |
1921 | 1927 |
1922 SkAutoSTMalloc<1024, UniChar> charStorage; | 1928 SkAutoSTMalloc<1024, UniChar> charStorage; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2121 } | 2127 } |
2122 | 2128 |
2123 SkString str; | 2129 SkString str; |
2124 CFStringToSkString(cfFamilyName, &str); | 2130 CFStringToSkString(cfFamilyName, &str); |
2125 | 2131 |
2126 bool isFixedPitch; | 2132 bool isFixedPitch; |
2127 (void)computeStyleBits(ctFont, &isFixedPitch); | 2133 (void)computeStyleBits(ctFont, &isFixedPitch); |
2128 SkFontID fontID = CTFontRef_to_SkFontID(ctFont); | 2134 SkFontID fontID = CTFontRef_to_SkFontID(ctFont); |
2129 | 2135 |
2130 face = SkNEW_ARGS(SkTypeface_Mac, (rec.fFontStyle, fontID, isFixedPitch, | 2136 face = SkNEW_ARGS(SkTypeface_Mac, (rec.fFontStyle, fontID, isFixedPitch, |
2131 ctFont, str.c_str())); | 2137 ctFont, str.c_str(), false)); |
2132 SkTypefaceCache::Add(face, face->style()); | 2138 SkTypefaceCache::Add(face, face->style()); |
2133 return face; | 2139 return face; |
2134 } | 2140 } |
2135 | 2141 |
2136 class SkFontStyleSet_Mac : public SkFontStyleSet { | 2142 class SkFontStyleSet_Mac : public SkFontStyleSet { |
2137 public: | 2143 public: |
2138 SkFontStyleSet_Mac(CFStringRef familyName, CTFontDescriptorRef desc) | 2144 SkFontStyleSet_Mac(CFStringRef familyName, CTFontDescriptorRef desc) |
2139 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, NULL)) | 2145 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, NULL)) |
2140 , fFamilyName(familyName) | 2146 , fFamilyName(familyName) |
2141 , fCount(0) { | 2147 , fCount(0) { |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2306 return create_typeface(NULL, familyName, (SkTypeface::Style)styleBits); | 2312 return create_typeface(NULL, familyName, (SkTypeface::Style)styleBits); |
2307 } | 2313 } |
2308 }; | 2314 }; |
2309 | 2315 |
2310 /////////////////////////////////////////////////////////////////////////////// | 2316 /////////////////////////////////////////////////////////////////////////////// |
2311 | 2317 |
2312 SkFontMgr* SkFontMgr::Factory() { | 2318 SkFontMgr* SkFontMgr::Factory() { |
2313 return SkNEW(SkFontMgr_Mac); | 2319 return SkNEW(SkFontMgr_Mac); |
2314 } | 2320 } |
2315 #endif | 2321 #endif |
OLD | NEW |