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

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

Issue 2268663002: Add simple font fallback on Mac. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 4 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 * 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 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[], 527 virtual int onCharsToGlyphs(const void* chars, Encoding, uint16_t glyphs[],
528 int glyphCount) const override; 528 int glyphCount) const override;
529 int onCountGlyphs() const override; 529 int onCountGlyphs() const override;
530 530
531 private: 531 private:
532 bool fIsLocalStream; 532 bool fIsLocalStream;
533 533
534 typedef SkTypeface INHERITED; 534 typedef SkTypeface INHERITED;
535 }; 535 };
536 536
537 /** Creates a typeface without searching the cache. Takes ownership of the CTFon tRef. */
538 static SkTypeface* NewFromFontRef(CTFontRef fontRef, CFTypeRef resourceRef, bool isLocalStream) {
539 SkASSERT(fontRef);
540
541 AutoCFRelease<CTFontDescriptorRef> desc(CTFontCopyFontDescriptor(fontRef));
542 SkFontStyle style = fontstyle_from_descriptor(desc);
543
544 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(fontRef);
545 bool isFixedPitch = SkToBool(traits & kCTFontMonoSpaceTrait);
546 return new SkTypeface_Mac(fontRef, resourceRef, style, isFixedPitch, isLocal Stream);
547 }
548
549 static bool find_by_CTFontRef(SkTypeface* cached, void* context) { 537 static bool find_by_CTFontRef(SkTypeface* cached, void* context) {
550 CTFontRef self = (CTFontRef)context; 538 CTFontRef self = (CTFontRef)context;
551 CTFontRef other = ((SkTypeface_Mac*)cached)->fFontRef; 539 CTFontRef other = ((SkTypeface_Mac*)cached)->fFontRef;
552 540
553 return CFEqual(self, other); 541 return CFEqual(self, other);
554 } 542 }
555 543
556 /** Creates a typeface from a name, searching the cache. */ 544 /** Creates a typeface, searching the cache if isLocalStream is false.
557 static SkTypeface* NewFromName(const char familyName[], const SkFontStyle& theSt yle) { 545 * Takes ownership of the CTFontRef and CFTypeRef.
546 */
547 static SkTypeface* create_from_CTFontRef(CTFontRef f, CFTypeRef r, bool isLocalS tream) {
548 SkASSERT(f);
549 AutoCFRelease<CTFontRef> font(f);
550 AutoCFRelease<CFTypeRef> resource(r);
551
552 if (!isLocalStream) {
553 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (void*)font.get());
554 if (face) {
555 return face;
556 }
557 }
558
559 AutoCFRelease<CTFontDescriptorRef> desc(CTFontCopyFontDescriptor(font));
560 SkFontStyle style = fontstyle_from_descriptor(desc);
561 CTFontSymbolicTraits traits = CTFontGetSymbolicTraits(font);
562 bool isFixedPitch = SkToBool(traits & kCTFontMonoSpaceTrait);
563
564 SkTypeface* face = new SkTypeface_Mac(font.release(), resource.release(),
565 style, isFixedPitch, isLocalStream);
566 if (!isLocalStream) {
567 SkTypefaceCache::Add(face);
568 }
569 return face;
570 }
571
572 /** Creates a typeface from a descriptor, searching the cache. */
573 static SkTypeface* create_from_desc(CTFontDescriptorRef desc) {
574 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(desc, 0, null ptr));
575 if (!ctFont) {
576 return nullptr;
577 }
578
579 return create_from_CTFontRef(ctFont.release(), nullptr, false);
580 }
581
582 static CTFontDescriptorRef create_descriptor(const char familyName[], const SkFo ntStyle& style) {
558 CTFontSymbolicTraits ctFontTraits = 0; 583 CTFontSymbolicTraits ctFontTraits = 0;
559 if (theStyle.weight() >= SkFontStyle::kBold_Weight) { 584 if (style.weight() >= SkFontStyle::kBold_Weight) {
560 ctFontTraits |= kCTFontBoldTrait; 585 ctFontTraits |= kCTFontBoldTrait;
561 } 586 }
562 if (theStyle.slant() != SkFontStyle::kUpright_Slant) { 587 if (style.slant() != SkFontStyle::kUpright_Slant) {
563 ctFontTraits |= kCTFontItalicTrait; 588 ctFontTraits |= kCTFontItalicTrait;
564 } 589 }
565 590
566 //TODO: add weight width slant 591 //TODO: add weight width slant
567 592
568 // Create the font info 593 // Create the font info
569 AutoCFRelease<CFStringRef> cfFontName(make_CFString(familyName)); 594 AutoCFRelease<CFStringRef> cfFontName(make_CFString(familyName));
570 595
571 AutoCFRelease<CFNumberRef> cfFontTraits( 596 AutoCFRelease<CFNumberRef> cfFontTraits(
572 CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &ctFontTrai ts)); 597 CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &ctFontTrai ts));
(...skipping 10 matching lines...) Expand all
583 608
584 if (!cfFontName || !cfFontTraits || !cfAttributes || !cfTraits) { 609 if (!cfFontName || !cfFontTraits || !cfAttributes || !cfTraits) {
585 return nullptr; 610 return nullptr;
586 } 611 }
587 612
588 CFDictionaryAddValue(cfTraits, kCTFontSymbolicTrait, cfFontTraits); 613 CFDictionaryAddValue(cfTraits, kCTFontSymbolicTrait, cfFontTraits);
589 614
590 CFDictionaryAddValue(cfAttributes, kCTFontFamilyNameAttribute, cfFontName); 615 CFDictionaryAddValue(cfAttributes, kCTFontFamilyNameAttribute, cfFontName);
591 CFDictionaryAddValue(cfAttributes, kCTFontTraitsAttribute, cfTraits); 616 CFDictionaryAddValue(cfAttributes, kCTFontTraitsAttribute, cfTraits);
592 617
593 AutoCFRelease<CTFontDescriptorRef> ctFontDesc( 618 return CTFontDescriptorCreateWithAttributes(cfAttributes);
594 CTFontDescriptorCreateWithAttributes(cfAttributes)); 619 }
595 if (!ctFontDesc) { 620
621 /** Creates a typeface from a name, searching the cache. */
622 static SkTypeface* create_from_name(const char familyName[], const SkFontStyle& style) {
623 AutoCFRelease<CTFontDescriptorRef> desc(create_descriptor(familyName, style) );
624 if (!desc) {
596 return nullptr; 625 return nullptr;
597 } 626 }
598 627 return create_from_desc(desc);
599 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(ctFontDesc, 0 , nullptr));
600 if (!ctFont) {
601 return nullptr;
602 }
603
604 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi d*)ctFont.get());
605 if (face) {
606 return face;
607 }
608 face = NewFromFontRef(ctFont.release(), nullptr, false);
609 SkTypefaceCache::Add(face);
610 return face;
611 } 628 }
612 629
613 SK_DECLARE_STATIC_MUTEX(gGetDefaultFaceMutex); 630 SK_DECLARE_STATIC_MUTEX(gGetDefaultFaceMutex);
614 static SkTypeface* GetDefaultFace() { 631 static SkTypeface* GetDefaultFace() {
615 SkAutoMutexAcquire ma(gGetDefaultFaceMutex); 632 SkAutoMutexAcquire ma(gGetDefaultFaceMutex);
616 633
617 static SkTypeface* gDefaultFace; 634 static SkTypeface* gDefaultFace;
618 635
619 if (nullptr == gDefaultFace) { 636 if (nullptr == gDefaultFace) {
620 gDefaultFace = NewFromName(FONT_DEFAULT_NAME, SkFontStyle()); 637 gDefaultFace = create_from_name(FONT_DEFAULT_NAME, SkFontStyle());
621 } 638 }
622 return gDefaultFace; 639 return gDefaultFace;
623 } 640 }
624 641
625 /////////////////////////////////////////////////////////////////////////////// 642 ///////////////////////////////////////////////////////////////////////////////
626 643
627 extern CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face); 644 extern CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face);
628 CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face) { 645 CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face) {
629 const SkTypeface_Mac* macface = (const SkTypeface_Mac*)face; 646 const SkTypeface_Mac* macface = (const SkTypeface_Mac*)face;
630 return macface ? macface->fFontRef.get() : nullptr; 647 return macface ? macface->fFontRef.get() : nullptr;
631 } 648 }
632 649
633 /* This function is visible on the outside. It first searches the cache, and if 650 /* This function is visible on the outside. It first searches the cache, and if
634 * not found, returns a new entry (after adding it to the cache). 651 * not found, returns a new entry (after adding it to the cache).
635 */ 652 */
636 SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef, CFTypeRef resourceRef) { 653 SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef, CFTypeRef resourceRef) {
637 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi d*)fontRef);
638 if (face) {
639 return face;
640 }
641 CFRetain(fontRef); 654 CFRetain(fontRef);
642 if (resourceRef) { 655 if (resourceRef) {
643 CFRetain(resourceRef); 656 CFRetain(resourceRef);
644 } 657 }
645 face = NewFromFontRef(fontRef, resourceRef, false); 658 return create_from_CTFontRef(fontRef, resourceRef, false);
646 SkTypefaceCache::Add(face);
647 return face;
648 } 659 }
649 660
650 static const char* map_css_names(const char* name) { 661 static const char* map_css_names(const char* name) {
651 static const struct { 662 static const struct {
652 const char* fFrom; // name the caller specified 663 const char* fFrom; // name the caller specified
653 const char* fTo; // "canonical" name we map to 664 const char* fTo; // "canonical" name we map to
654 } gPairs[] = { 665 } gPairs[] = {
655 { "sans-serif", "Helvetica" }, 666 { "sans-serif", "Helvetica" },
656 { "serif", "Times" }, 667 { "serif", "Times" },
657 { "monospace", "Courier" } 668 { "monospace", "Courier" }
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after
1495 /////////////////////////////////////////////////////////////////////////////// 1506 ///////////////////////////////////////////////////////////////////////////////
1496 1507
1497 // Returns nullptr on failure 1508 // Returns nullptr on failure
1498 // Call must still manage its ownership of provider 1509 // Call must still manage its ownership of provider
1499 static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) { 1510 static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) {
1500 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); 1511 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider));
1501 if (nullptr == cg) { 1512 if (nullptr == cg) {
1502 return nullptr; 1513 return nullptr;
1503 } 1514 }
1504 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, nullptr, nullptr); 1515 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, nullptr, nullptr);
1505 return ct ? NewFromFontRef(ct, nullptr, true) : nullptr; 1516 return ct ? create_from_CTFontRef(ct, nullptr, true) : nullptr;
1506 } 1517 }
1507 1518
1508 // Web fonts added to the the CTFont registry do not return their character set. 1519 // Web fonts added to the the CTFont registry do not return their character set.
1509 // Iterate through the font in this case. The existing caller caches the result, 1520 // Iterate through the font in this case. The existing caller caches the result,
1510 // so the performance impact isn't too bad. 1521 // so the performance impact isn't too bad.
1511 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount, 1522 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount,
1512 SkTDArray<SkUnichar>* glyphToUnicode) { 1523 SkTDArray<SkUnichar>* glyphToUnicode) {
1513 glyphToUnicode->setCount(SkToInt(glyphCount)); 1524 glyphToUnicode->setCount(SkToInt(glyphCount));
1514 SkUnichar* out = glyphToUnicode->begin(); 1525 SkUnichar* out = glyphToUnicode->begin();
1515 sk_bzero(out, glyphCount * sizeof(SkUnichar)); 1526 sk_bzero(out, glyphCount * sizeof(SkUnichar));
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after
2183 return value * value; 2194 return value * value;
2184 } 2195 }
2185 2196
2186 // We normalize each axis (weight, width, italic) to be base-900 2197 // We normalize each axis (weight, width, italic) to be base-900
2187 static int compute_metric(const SkFontStyle& a, const SkFontStyle& b) { 2198 static int compute_metric(const SkFontStyle& a, const SkFontStyle& b) {
2188 return sqr(a.weight() - b.weight()) + 2199 return sqr(a.weight() - b.weight()) +
2189 sqr((a.width() - b.width()) * 100) + 2200 sqr((a.width() - b.width()) * 100) +
2190 sqr((a.slant() != b.slant()) * 900); 2201 sqr((a.slant() != b.slant()) * 900);
2191 } 2202 }
2192 2203
2193 static SkTypeface* createFromDesc(CTFontDescriptorRef desc) {
2194 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(desc, 0, null ptr));
2195 if (!ctFont) {
2196 return nullptr;
2197 }
2198
2199 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi d*)ctFont.get());
2200 if (face) {
2201 return face;
2202 }
2203
2204 face = NewFromFontRef(ctFont.release(), nullptr, false);
2205 SkTypefaceCache::Add(face);
2206 return face;
2207 }
2208
2209 class SkFontStyleSet_Mac : public SkFontStyleSet { 2204 class SkFontStyleSet_Mac : public SkFontStyleSet {
2210 public: 2205 public:
2211 SkFontStyleSet_Mac(CTFontDescriptorRef desc) 2206 SkFontStyleSet_Mac(CTFontDescriptorRef desc)
2212 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, nullptr)) 2207 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, nullptr))
2213 , fCount(0) { 2208 , fCount(0) {
2214 if (nullptr == fArray) { 2209 if (nullptr == fArray) {
2215 fArray = CFArrayCreate(nullptr, nullptr, 0, nullptr); 2210 fArray = CFArrayCreate(nullptr, nullptr, 0, nullptr);
2216 } 2211 }
2217 fCount = SkToInt(CFArrayGetCount(fArray)); 2212 fCount = SkToInt(CFArrayGetCount(fArray));
2218 } 2213 }
(...skipping 16 matching lines...) Expand all
2235 if (!find_desc_str(desc, kCTFontStyleNameAttribute, name)) { 2230 if (!find_desc_str(desc, kCTFontStyleNameAttribute, name)) {
2236 name->reset(); 2231 name->reset();
2237 } 2232 }
2238 } 2233 }
2239 } 2234 }
2240 2235
2241 SkTypeface* createTypeface(int index) override { 2236 SkTypeface* createTypeface(int index) override {
2242 SkASSERT((unsigned)index < (unsigned)CFArrayGetCount(fArray)); 2237 SkASSERT((unsigned)index < (unsigned)CFArrayGetCount(fArray));
2243 CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(f Array, index); 2238 CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(f Array, index);
2244 2239
2245 return createFromDesc(desc); 2240 return create_from_desc(desc);
2246 } 2241 }
2247 2242
2248 SkTypeface* matchStyle(const SkFontStyle& pattern) override { 2243 SkTypeface* matchStyle(const SkFontStyle& pattern) override {
2249 if (0 == fCount) { 2244 if (0 == fCount) {
2250 return nullptr; 2245 return nullptr;
2251 } 2246 }
2252 return createFromDesc(findMatchingDesc(pattern)); 2247 return create_from_desc(findMatchingDesc(pattern));
2253 } 2248 }
2254 2249
2255 private: 2250 private:
2256 CFArrayRef fArray; 2251 CFArrayRef fArray;
2257 int fCount; 2252 int fCount;
2258 2253
2259 CTFontDescriptorRef findMatchingDesc(const SkFontStyle& pattern) const { 2254 CTFontDescriptorRef findMatchingDesc(const SkFontStyle& pattern) const {
2260 int bestMetric = SK_MaxS32; 2255 int bestMetric = SK_MaxS32;
2261 CTFontDescriptorRef bestDesc = nullptr; 2256 CTFontDescriptorRef bestDesc = nullptr;
2262 2257
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2331 AutoCFRelease<CFStringRef> cfName(make_CFString(familyName)); 2326 AutoCFRelease<CFStringRef> cfName(make_CFString(familyName));
2332 return CreateSet(cfName); 2327 return CreateSet(cfName);
2333 } 2328 }
2334 2329
2335 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], 2330 virtual SkTypeface* onMatchFamilyStyle(const char familyName[],
2336 const SkFontStyle& fontStyle) const o verride { 2331 const SkFontStyle& fontStyle) const o verride {
2337 SkAutoTUnref<SkFontStyleSet> sset(this->matchFamily(familyName)); 2332 SkAutoTUnref<SkFontStyleSet> sset(this->matchFamily(familyName));
2338 return sset->matchStyle(fontStyle); 2333 return sset->matchStyle(fontStyle);
2339 } 2334 }
2340 2335
2341 virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], con st SkFontStyle&, 2336 virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[],
2337 const SkFontStyle& style,
2342 const char* bcp47[], int bcp 47Count, 2338 const char* bcp47[], int bcp 47Count,
2343 SkUnichar character) const o verride { 2339 SkUnichar character) const o verride {
2344 return nullptr; 2340 AutoCFRelease<CTFontDescriptorRef> desc(create_descriptor(familyName, st yle));
2341 AutoCFRelease<CTFontRef> currentFont(CTFontCreateWithFontDescriptor(desc , 0, nullptr));
2342
2343 // kCFStringEncodingUTF32 is BE unless there is a BOM.
2344 // Since there is no machine endian option, explicitly state machine end ian.
2345 #ifdef SK_CPU_LENDIAN
2346 constexpr CFStringEncoding encoding = kCFStringEncodingUTF32LE;
2347 #else
2348 constexpr CFStringEncoding encoding = kCFStringEncodingUTF32BE;
2349 #endif
2350 AutoCFRelease<CFStringRef> string(CFStringCreateWithBytes(
2351 kCFAllocatorDefault, reinterpret_cast<const UInt8 *>(&character) , sizeof(character),
2352 encoding, false));
2353 CFRange range = CFRangeMake(0, CFStringGetLength(string)); // in UniCha r units.
2354 AutoCFRelease<CTFontRef> fallbackFont(CTFontCreateForString(currentFont, string, range));
2355 return create_from_CTFontRef(fallbackFont.release(), nullptr, false);
2345 } 2356 }
2346 2357
2347 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, 2358 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember,
2348 const SkFontStyle&) const override { 2359 const SkFontStyle&) const override {
2349 return nullptr; 2360 return nullptr;
2350 } 2361 }
2351 2362
2352 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override { 2363 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override {
2353 AutoCFRelease<CGDataProviderRef> pr(SkCreateDataProviderFromData(data)); 2364 AutoCFRelease<CGDataProviderRef> pr(SkCreateDataProviderFromData(data));
2354 if (nullptr == pr) { 2365 if (nullptr == pr) {
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2490 // The CGFontRef returned by CGFontCreateCopyWithVariations when the pas sed CGFontRef was 2501 // The CGFontRef returned by CGFontCreateCopyWithVariations when the pas sed CGFontRef was
2491 // created from a data provider does not appear to have any ownership of the underlying 2502 // created from a data provider does not appear to have any ownership of the underlying
2492 // data. The original CGFontRef must be kept alive until the copy will n o longer be used. 2503 // data. The original CGFontRef must be kept alive until the copy will n o longer be used.
2493 AutoCFRelease<CGFontRef> cgVariant; 2504 AutoCFRelease<CGFontRef> cgVariant;
2494 if (cgVariations) { 2505 if (cgVariations) {
2495 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations)); 2506 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations));
2496 } else { 2507 } else {
2497 cgVariant.reset(cg.release()); 2508 cgVariant.reset(cg.release());
2498 } 2509 }
2499 2510
2500 CTFontRef ct = CTFontCreateWithGraphicsFont(cgVariant, 0, nullptr, nullp tr); 2511 AutoCFRelease<CTFontRef> ct(CTFontCreateWithGraphicsFont(cgVariant, 0, n ullptr, nullptr));
2501 if (!ct) { 2512 if (!ct) {
2502 return nullptr; 2513 return nullptr;
2503 } 2514 }
2504 return NewFromFontRef(ct, cg.release(), true); 2515 return create_from_CTFontRef(ct.release(), cg.release(), true);
2505 } 2516 }
2506 2517
2507 static CFDictionaryRef get_axes(CGFontRef cg, SkFontData* fontData) { 2518 static CFDictionaryRef get_axes(CGFontRef cg, SkFontData* fontData) {
2508 AutoCFRelease<CFArrayRef> cgAxes(CGFontCopyVariationAxes(cg)); 2519 AutoCFRelease<CFArrayRef> cgAxes(CGFontCopyVariationAxes(cg));
2509 if (!cgAxes) { 2520 if (!cgAxes) {
2510 return nullptr; 2521 return nullptr;
2511 } 2522 }
2512 2523
2513 CFIndex axisCount = CFArrayGetCount(cgAxes); 2524 CFIndex axisCount = CFArrayGetCount(cgAxes);
2514 if (0 == axisCount || axisCount != fontData->getAxisCount()) { 2525 if (0 == axisCount || axisCount != fontData->getAxisCount()) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2573 // The CGFontRef returned by CGFontCreateCopyWithVariations when the pas sed CGFontRef was 2584 // The CGFontRef returned by CGFontCreateCopyWithVariations when the pas sed CGFontRef was
2574 // created from a data provider does not appear to have any ownership of the underlying 2585 // created from a data provider does not appear to have any ownership of the underlying
2575 // data. The original CGFontRef must be kept alive until the copy will n o longer be used. 2586 // data. The original CGFontRef must be kept alive until the copy will n o longer be used.
2576 AutoCFRelease<CGFontRef> cgVariant; 2587 AutoCFRelease<CGFontRef> cgVariant;
2577 if (cgVariations) { 2588 if (cgVariations) {
2578 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations)); 2589 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations));
2579 } else { 2590 } else {
2580 cgVariant.reset(cg.release()); 2591 cgVariant.reset(cg.release());
2581 } 2592 }
2582 2593
2583 CTFontRef ct = CTFontCreateWithGraphicsFont(cgVariant, 0, nullptr, nullp tr); 2594 AutoCFRelease<CTFontRef> ct(CTFontCreateWithGraphicsFont(cgVariant, 0, n ullptr, nullptr));
2584 if (!ct) { 2595 if (!ct) {
2585 return nullptr; 2596 return nullptr;
2586 } 2597 }
2587 return NewFromFontRef(ct, cg.release(), true); 2598 return create_from_CTFontRef(ct.release(), cg.release(), true);
2588 } 2599 }
2589 2600
2590 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override { 2601 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override {
2591 AutoCFRelease<CGDataProviderRef> pr(CGDataProviderCreateWithFilename(pat h)); 2602 AutoCFRelease<CGDataProviderRef> pr(CGDataProviderCreateWithFilename(pat h));
2592 if (nullptr == pr) { 2603 if (nullptr == pr) {
2593 return nullptr; 2604 return nullptr;
2594 } 2605 }
2595 return create_from_dataProvider(pr); 2606 return create_from_dataProvider(pr);
2596 } 2607 }
2597 2608
2598 SkTypeface* onLegacyCreateTypeface(const char familyName[], SkFontStyle styl e) const override { 2609 SkTypeface* onLegacyCreateTypeface(const char familyName[], SkFontStyle styl e) const override {
2599 if (familyName) { 2610 if (familyName) {
2600 familyName = map_css_names(familyName); 2611 familyName = map_css_names(familyName);
2601 } 2612 }
2602 2613
2603 if (!familyName || !*familyName) { 2614 if (!familyName || !*familyName) {
2604 familyName = FONT_DEFAULT_NAME; 2615 familyName = FONT_DEFAULT_NAME;
2605 } 2616 }
2606 2617
2607 SkTypeface* face = NewFromName(familyName, style); 2618 SkTypeface* face = create_from_name(familyName, style);
2608 if (face) { 2619 if (face) {
2609 return face; 2620 return face;
2610 } 2621 }
2611 2622
2612 return SkSafeRef(GetDefaultFace()); 2623 return SkSafeRef(GetDefaultFace());
2613 } 2624 }
2614 }; 2625 };
2615 2626
2616 /////////////////////////////////////////////////////////////////////////////// 2627 ///////////////////////////////////////////////////////////////////////////////
2617 2628
2618 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; } 2629 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; }
2619 2630
2620 #endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) 2631 #endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
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