OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkTypes.h" // Keep this before any #ifdef ... | 8 #include "SkTypes.h" // Keep this before any #ifdef ... |
9 #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) | 9 #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) |
10 | 10 |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 SkASSERT(fontRef); | 479 SkASSERT(fontRef); |
480 | 480 |
481 AutoCFRelease<CTFontDescriptorRef> desc(CTFontCopyFontDescriptor(fontRef)); | 481 AutoCFRelease<CTFontDescriptorRef> desc(CTFontCopyFontDescriptor(fontRef)); |
482 SkFontStyle style = fontstyle_from_descriptor(desc); | 482 SkFontStyle style = fontstyle_from_descriptor(desc); |
483 | 483 |
484 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(fontRef); | 484 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(fontRef); |
485 bool isFixedPitch = SkToBool(traits & kCTFontMonoSpaceTrait); | 485 bool isFixedPitch = SkToBool(traits & kCTFontMonoSpaceTrait); |
486 return new SkTypeface_Mac(fontRef, resourceRef, style, isFixedPitch, isLocal
Stream); | 486 return new SkTypeface_Mac(fontRef, resourceRef, style, isFixedPitch, isLocal
Stream); |
487 } | 487 } |
488 | 488 |
489 static bool find_by_CTFontRef(SkTypeface* cached, const SkFontStyle&, void* cont
ext) { | 489 static bool find_by_CTFontRef(SkTypeface* cached, void* context) { |
490 CTFontRef self = (CTFontRef)context; | 490 CTFontRef self = (CTFontRef)context; |
491 CTFontRef other = ((SkTypeface_Mac*)cached)->fFontRef; | 491 CTFontRef other = ((SkTypeface_Mac*)cached)->fFontRef; |
492 | 492 |
493 return CFEqual(self, other); | 493 return CFEqual(self, other); |
494 } | 494 } |
495 | 495 |
496 /** Creates a typeface from a name, searching the cache. */ | 496 /** Creates a typeface from a name, searching the cache. */ |
497 static SkTypeface* NewFromName(const char familyName[], const SkFontStyle& theSt
yle) { | 497 static SkTypeface* NewFromName(const char familyName[], const SkFontStyle& theSt
yle) { |
498 CTFontSymbolicTraits ctFontTraits = 0; | 498 CTFontSymbolicTraits ctFontTraits = 0; |
499 if (theStyle.weight() >= SkFontStyle::kBold_Weight) { | 499 if (theStyle.weight() >= SkFontStyle::kBold_Weight) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(ctFontDesc, 0
, nullptr)); | 539 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(ctFontDesc, 0
, nullptr)); |
540 if (!ctFont) { | 540 if (!ctFont) { |
541 return nullptr; | 541 return nullptr; |
542 } | 542 } |
543 | 543 |
544 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi
d*)ctFont.get()); | 544 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi
d*)ctFont.get()); |
545 if (face) { | 545 if (face) { |
546 return face; | 546 return face; |
547 } | 547 } |
548 face = NewFromFontRef(ctFont.release(), nullptr, false); | 548 face = NewFromFontRef(ctFont.release(), nullptr, false); |
549 SkTypefaceCache::Add(face, face->fontStyle()); | 549 SkTypefaceCache::Add(face); |
550 return face; | 550 return face; |
551 } | 551 } |
552 | 552 |
553 SK_DECLARE_STATIC_MUTEX(gGetDefaultFaceMutex); | 553 SK_DECLARE_STATIC_MUTEX(gGetDefaultFaceMutex); |
554 static SkTypeface* GetDefaultFace() { | 554 static SkTypeface* GetDefaultFace() { |
555 SkAutoMutexAcquire ma(gGetDefaultFaceMutex); | 555 SkAutoMutexAcquire ma(gGetDefaultFaceMutex); |
556 | 556 |
557 static SkTypeface* gDefaultFace; | 557 static SkTypeface* gDefaultFace; |
558 | 558 |
559 if (nullptr == gDefaultFace) { | 559 if (nullptr == gDefaultFace) { |
(...skipping 16 matching lines...) Expand all Loading... |
576 SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef, CFTypeRef resourceRef)
{ | 576 SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef, CFTypeRef resourceRef)
{ |
577 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi
d*)fontRef); | 577 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi
d*)fontRef); |
578 if (face) { | 578 if (face) { |
579 return face; | 579 return face; |
580 } | 580 } |
581 CFRetain(fontRef); | 581 CFRetain(fontRef); |
582 if (resourceRef) { | 582 if (resourceRef) { |
583 CFRetain(resourceRef); | 583 CFRetain(resourceRef); |
584 } | 584 } |
585 face = NewFromFontRef(fontRef, resourceRef, false); | 585 face = NewFromFontRef(fontRef, resourceRef, false); |
586 SkTypefaceCache::Add(face, face->fontStyle()); | 586 SkTypefaceCache::Add(face); |
587 return face; | 587 return face; |
588 } | 588 } |
589 | 589 |
590 static const char* map_css_names(const char* name) { | 590 static const char* map_css_names(const char* name) { |
591 static const struct { | 591 static const struct { |
592 const char* fFrom; // name the caller specified | 592 const char* fFrom; // name the caller specified |
593 const char* fTo; // "canonical" name we map to | 593 const char* fTo; // "canonical" name we map to |
594 } gPairs[] = { | 594 } gPairs[] = { |
595 { "sans-serif", "Helvetica" }, | 595 { "sans-serif", "Helvetica" }, |
596 { "serif", "Times" }, | 596 { "serif", "Times" }, |
(...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2159 if (!ctFont) { | 2159 if (!ctFont) { |
2160 return nullptr; | 2160 return nullptr; |
2161 } | 2161 } |
2162 | 2162 |
2163 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi
d*)ctFont.get()); | 2163 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi
d*)ctFont.get()); |
2164 if (face) { | 2164 if (face) { |
2165 return face; | 2165 return face; |
2166 } | 2166 } |
2167 | 2167 |
2168 face = NewFromFontRef(ctFont.release(), nullptr, false); | 2168 face = NewFromFontRef(ctFont.release(), nullptr, false); |
2169 SkTypefaceCache::Add(face, face->fontStyle()); | 2169 SkTypefaceCache::Add(face); |
2170 return face; | 2170 return face; |
2171 } | 2171 } |
2172 | 2172 |
2173 class SkFontStyleSet_Mac : public SkFontStyleSet { | 2173 class SkFontStyleSet_Mac : public SkFontStyleSet { |
2174 public: | 2174 public: |
2175 SkFontStyleSet_Mac(CTFontDescriptorRef desc) | 2175 SkFontStyleSet_Mac(CTFontDescriptorRef desc) |
2176 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, nullptr)) | 2176 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, nullptr)) |
2177 , fCount(0) { | 2177 , fCount(0) { |
2178 if (nullptr == fArray) { | 2178 if (nullptr == fArray) { |
2179 fArray = CFArrayCreate(nullptr, nullptr, 0, nullptr); | 2179 fArray = CFArrayCreate(nullptr, nullptr, 0, nullptr); |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2575 | 2575 |
2576 return SkSafeRef(GetDefaultFace()); | 2576 return SkSafeRef(GetDefaultFace()); |
2577 } | 2577 } |
2578 }; | 2578 }; |
2579 | 2579 |
2580 /////////////////////////////////////////////////////////////////////////////// | 2580 /////////////////////////////////////////////////////////////////////////////// |
2581 | 2581 |
2582 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; } | 2582 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; } |
2583 | 2583 |
2584 #endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) | 2584 #endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) |
OLD | NEW |