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

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

Issue 1860993004: Test CTFonts for equality, not just name and style. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Remove the rest of the name/style only matching. Created 4 years, 8 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 432 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 #if defined(__MAC_10_7) || defined(__IPHONE_4_3) 443 #if defined(__MAC_10_7) || defined(__IPHONE_4_3)
444 static const uint32_t SkCTFontColorGlyphsTrait = kCTFontColorGlyphsTrait; 444 static const uint32_t SkCTFontColorGlyphsTrait = kCTFontColorGlyphsTrait;
445 #else 445 #else
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(CTFontRef fontRef, CFTypeRef resourceRef, 451 SkTypeface_Mac(CTFontRef fontRef, CFTypeRef resourceRef,
452 const SkFontStyle& fs, bool isFixedPitch, 452 const SkFontStyle& fs, bool isFixedPitch,
453 const char requestedName[], bool isLocalStream) 453 bool isLocalStream)
454 : SkTypeface(fs, SkTypefaceCache::NewFontID(), isFixedPitch) 454 : SkTypeface(fs, SkTypefaceCache::NewFontID(), isFixedPitch)
455 , fRequestedName(requestedName)
456 , fFontRef(fontRef) // caller has already called CFRetain for us 455 , fFontRef(fontRef) // caller has already called CFRetain for us
457 , fOriginatingCFTypeRef(resourceRef) // caller has already called CFReta in for us 456 , fOriginatingCFTypeRef(resourceRef) // caller has already called CFReta in for us
458 , fHasColorGlyphs(SkToBool(CTFontGetSymbolicTraits(fFontRef) & SkCTFontC olorGlyphsTrait)) 457 , fHasColorGlyphs(SkToBool(CTFontGetSymbolicTraits(fFontRef) & SkCTFontC olorGlyphsTrait))
459 , fIsLocalStream(isLocalStream) 458 , fIsLocalStream(isLocalStream)
460 { 459 {
461 SkASSERT(fontRef); 460 SkASSERT(fontRef);
462 } 461 }
463 462
464 SkString fRequestedName;
465 AutoCFRelease<CTFontRef> fFontRef; 463 AutoCFRelease<CTFontRef> fFontRef;
466 AutoCFRelease<CFTypeRef> fOriginatingCFTypeRef; 464 AutoCFRelease<CFTypeRef> fOriginatingCFTypeRef;
467 const bool fHasColorGlyphs; 465 const bool fHasColorGlyphs;
468 466
469 protected: 467 protected:
470 int onGetUPEM() const override; 468 int onGetUPEM() const override;
471 SkStreamAsset* onOpenStream(int* ttcIndex) const override; 469 SkStreamAsset* onOpenStream(int* ttcIndex) const override;
472 SkFontData* onCreateFontData() const override; 470 SkFontData* onCreateFontData() const override;
473 void onGetFamilyName(SkString* familyName) const override; 471 void onGetFamilyName(SkString* familyName) const override;
474 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; 472 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override;
(...skipping 10 matching lines...) Expand all
485 int glyphCount) const override; 483 int glyphCount) const override;
486 int onCountGlyphs() const override; 484 int onCountGlyphs() const override;
487 485
488 private: 486 private:
489 bool fIsLocalStream; 487 bool fIsLocalStream;
490 488
491 typedef SkTypeface INHERITED; 489 typedef SkTypeface INHERITED;
492 }; 490 };
493 491
494 /** Creates a typeface without searching the cache. Takes ownership of the CTFon tRef. */ 492 /** Creates a typeface without searching the cache. Takes ownership of the CTFon tRef. */
495 static SkTypeface* NewFromFontRef(CTFontRef fontRef, CFTypeRef resourceRef, 493 static SkTypeface* NewFromFontRef(CTFontRef fontRef, CFTypeRef resourceRef, bool isLocalStream) {
496 const char name[], bool isLocalStream)
497 {
498 SkASSERT(fontRef); 494 SkASSERT(fontRef);
499 bool isFixedPitch; 495 bool isFixedPitch;
500 SkFontStyle style = SkFontStyle(computeStyleBits(fontRef, &isFixedPitch)); 496 SkFontStyle style = SkFontStyle(computeStyleBits(fontRef, &isFixedPitch));
501 497
502 return new SkTypeface_Mac(fontRef, resourceRef, style, isFixedPitch, name, i sLocalStream); 498 return new SkTypeface_Mac(fontRef, resourceRef, style, isFixedPitch, isLocal Stream);
503 } 499 }
504 500
505 static bool find_by_CTFontRef(SkTypeface* cached, const SkFontStyle&, void* cont ext) { 501 static bool find_by_CTFontRef(SkTypeface* cached, const SkFontStyle&, void* cont ext) {
506 CTFontRef self = (CTFontRef)context; 502 CTFontRef self = (CTFontRef)context;
507 CTFontRef other = ((SkTypeface_Mac*)cached)->fFontRef; 503 CTFontRef other = ((SkTypeface_Mac*)cached)->fFontRef;
508 504
509 return CFEqual(self, other); 505 return CFEqual(self, other);
510 } 506 }
511 507
512 /** Creates a typeface from a name, searching the cache. */ 508 /** Creates a typeface from a name, searching the cache. */
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 if (!ctFontDesc) { 547 if (!ctFontDesc) {
552 return nullptr; 548 return nullptr;
553 } 549 }
554 550
555 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(ctFontDesc, 0 , nullptr)); 551 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(ctFontDesc, 0 , nullptr));
556 if (!ctFont) { 552 if (!ctFont) {
557 return nullptr; 553 return nullptr;
558 } 554 }
559 555
560 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi d*)ctFont.get()); 556 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi d*)ctFont.get());
561 if (!face) { 557 if (face) {
562 face = NewFromFontRef(ctFont.release(), nullptr, nullptr, false); 558 return face;
mtklein 2016/04/08 00:59:49 this'd be easier to review if you keep the demorga
563 SkTypefaceCache::Add(face, face->fontStyle());
564 } 559 }
560 face = NewFromFontRef(ctFont.release(), nullptr, false);
561 SkTypefaceCache::Add(face, face->fontStyle());
565 return face; 562 return face;
566 } 563 }
567 564
568 SK_DECLARE_STATIC_MUTEX(gGetDefaultFaceMutex); 565 SK_DECLARE_STATIC_MUTEX(gGetDefaultFaceMutex);
569 static SkTypeface* GetDefaultFace() { 566 static SkTypeface* GetDefaultFace() {
570 SkAutoMutexAcquire ma(gGetDefaultFaceMutex); 567 SkAutoMutexAcquire ma(gGetDefaultFaceMutex);
571 568
572 static SkTypeface* gDefaultFace; 569 static SkTypeface* gDefaultFace;
573 570
574 if (nullptr == gDefaultFace) { 571 if (nullptr == gDefaultFace) {
575 gDefaultFace = NewFromName(FONT_DEFAULT_NAME, SkFontStyle()); 572 gDefaultFace = NewFromName(FONT_DEFAULT_NAME, SkFontStyle());
576 SkTypefaceCache::Add(gDefaultFace, SkFontStyle());
577 } 573 }
578 return gDefaultFace; 574 return gDefaultFace;
579 } 575 }
580 576
581 /////////////////////////////////////////////////////////////////////////////// 577 ///////////////////////////////////////////////////////////////////////////////
582 578
583 extern CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face); 579 extern CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face);
584 CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face) { 580 CTFontRef SkTypeface_GetCTFontRef(const SkTypeface* face) {
585 const SkTypeface_Mac* macface = (const SkTypeface_Mac*)face; 581 const SkTypeface_Mac* macface = (const SkTypeface_Mac*)face;
586 return macface ? macface->fFontRef.get() : nullptr; 582 return macface ? macface->fFontRef.get() : nullptr;
587 } 583 }
588 584
589 /* This function is visible on the outside. It first searches the cache, and if 585 /* This function is visible on the outside. It first searches the cache, and if
590 * not found, returns a new entry (after adding it to the cache). 586 * not found, returns a new entry (after adding it to the cache).
591 */ 587 */
592 SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef, CFTypeRef resourceRef) { 588 SkTypeface* SkCreateTypefaceFromCTFont(CTFontRef fontRef, CFTypeRef resourceRef) {
593 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi d*)fontRef); 589 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi d*)fontRef);
594 if (!face) { 590 if (face) {
595 CFRetain(fontRef); 591 return face;
596 if (resourceRef) {
597 CFRetain(resourceRef);
598 }
599 face = NewFromFontRef(fontRef, resourceRef, nullptr, false);
600 SkTypefaceCache::Add(face, face->fontStyle());
601 } 592 }
593 CFRetain(fontRef);
594 if (resourceRef) {
595 CFRetain(resourceRef);
596 }
597 face = NewFromFontRef(fontRef, resourceRef, false);
598 SkTypefaceCache::Add(face, face->fontStyle());
602 return face; 599 return face;
603 } 600 }
604 601
605 struct NameStyle {
606 const char* fName;
607 SkFontStyle fStyle;
608 };
609
610 static bool find_by_NameStyle(SkTypeface* cachedFace, const SkFontStyle& cachedS tyle, void* ctx) {
611 const SkTypeface_Mac* cachedMacFace = static_cast<SkTypeface_Mac*>(cachedFac e);
612 const NameStyle* requested = static_cast<const NameStyle*>(ctx);
613
614 return cachedStyle == requested->fStyle
615 && cachedMacFace->fRequestedName.equals(requested->fName);
616 }
617
618 static const char* map_css_names(const char* name) { 602 static const char* map_css_names(const char* name) {
619 static const struct { 603 static const struct {
620 const char* fFrom; // name the caller specified 604 const char* fFrom; // name the caller specified
621 const char* fTo; // "canonical" name we map to 605 const char* fTo; // "canonical" name we map to
622 } gPairs[] = { 606 } gPairs[] = {
623 { "sans-serif", "Helvetica" }, 607 { "sans-serif", "Helvetica" },
624 { "serif", "Times" }, 608 { "serif", "Times" },
625 { "monospace", "Courier" } 609 { "monospace", "Courier" }
626 }; 610 };
627 611
(...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 /////////////////////////////////////////////////////////////////////////////// 1446 ///////////////////////////////////////////////////////////////////////////////
1463 1447
1464 // Returns nullptr on failure 1448 // Returns nullptr on failure
1465 // Call must still manage its ownership of provider 1449 // Call must still manage its ownership of provider
1466 static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) { 1450 static SkTypeface* create_from_dataProvider(CGDataProviderRef provider) {
1467 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); 1451 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider));
1468 if (nullptr == cg) { 1452 if (nullptr == cg) {
1469 return nullptr; 1453 return nullptr;
1470 } 1454 }
1471 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, nullptr, nullptr); 1455 CTFontRef ct = CTFontCreateWithGraphicsFont(cg, 0, nullptr, nullptr);
1472 return ct ? NewFromFontRef(ct, nullptr, nullptr, true) : nullptr; 1456 return ct ? NewFromFontRef(ct, nullptr, true) : nullptr;
1473 } 1457 }
1474 1458
1475 // Web fonts added to the the CTFont registry do not return their character set. 1459 // Web fonts added to the the CTFont registry do not return their character set.
1476 // Iterate through the font in this case. The existing caller caches the result, 1460 // Iterate through the font in this case. The existing caller caches the result,
1477 // so the performance impact isn't too bad. 1461 // so the performance impact isn't too bad.
1478 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount, 1462 static void populate_glyph_to_unicode_slow(CTFontRef ctFont, CFIndex glyphCount,
1479 SkTDArray<SkUnichar>* glyphToUnicode) { 1463 SkTDArray<SkUnichar>* glyphToUnicode) {
1480 glyphToUnicode->setCount(SkToInt(glyphCount)); 1464 glyphToUnicode->setCount(SkToInt(glyphCount));
1481 SkUnichar* out = glyphToUnicode->begin(); 1465 SkUnichar* out = glyphToUnicode->begin();
1482 sk_bzero(out, glyphCount * sizeof(SkUnichar)); 1466 sk_bzero(out, glyphCount * sizeof(SkUnichar));
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after
2172 return value * value; 2156 return value * value;
2173 } 2157 }
2174 2158
2175 // We normalize each axis (weight, width, italic) to be base-900 2159 // We normalize each axis (weight, width, italic) to be base-900
2176 static int compute_metric(const SkFontStyle& a, const SkFontStyle& b) { 2160 static int compute_metric(const SkFontStyle& a, const SkFontStyle& b) {
2177 return sqr(a.weight() - b.weight()) + 2161 return sqr(a.weight() - b.weight()) +
2178 sqr((a.width() - b.width()) * 100) + 2162 sqr((a.width() - b.width()) * 100) +
2179 sqr((a.isItalic() != b.isItalic()) * 900); 2163 sqr((a.isItalic() != b.isItalic()) * 900);
2180 } 2164 }
2181 2165
2182 static SkTypeface* createFromDesc(CFStringRef cfFamilyName, CTFontDescriptorRef desc) { 2166 static SkTypeface* createFromDesc(CTFontDescriptorRef desc) {
2183 NameStyle cacheRequest;
2184 SkString skFamilyName;
2185 CFStringToSkString(cfFamilyName, &skFamilyName);
2186 cacheRequest.fName = skFamilyName.c_str();
2187 cacheRequest.fStyle = fontstyle_from_descriptor(desc);
2188
2189 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_NameStyle, &cac heRequest);
2190 if (face) {
2191 return face;
2192 }
2193
2194 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(desc, 0, null ptr)); 2167 AutoCFRelease<CTFontRef> ctFont(CTFontCreateWithFontDescriptor(desc, 0, null ptr));
2195 if (!ctFont) { 2168 if (!ctFont) {
2196 return nullptr; 2169 return nullptr;
2197 } 2170 }
2198 2171
2199 bool isFixedPitch; 2172 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_CTFontRef, (voi d*)ctFont.get());
2200 (void)computeStyleBits(ctFont, &isFixedPitch); 2173 if (face) {
2174 return face;
2175 }
2201 2176
2202 face = new SkTypeface_Mac(ctFont.release(), nullptr, cacheRequest.fStyle, is FixedPitch, 2177 face = NewFromFontRef(ctFont.release(), nullptr, false);
2203 skFamilyName.c_str(), false);
2204 SkTypefaceCache::Add(face, face->fontStyle()); 2178 SkTypefaceCache::Add(face, face->fontStyle());
2205 return face; 2179 return face;
2206 } 2180 }
2207 2181
2208 class SkFontStyleSet_Mac : public SkFontStyleSet { 2182 class SkFontStyleSet_Mac : public SkFontStyleSet {
2209 public: 2183 public:
2210 SkFontStyleSet_Mac(CFStringRef familyName, CTFontDescriptorRef desc) 2184 SkFontStyleSet_Mac(CTFontDescriptorRef desc)
2211 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, nullptr)) 2185 : fArray(CTFontDescriptorCreateMatchingFontDescriptors(desc, nullptr))
2212 , fFamilyName(familyName)
2213 , fCount(0) { 2186 , fCount(0) {
2214 CFRetain(familyName);
2215 if (nullptr == fArray) { 2187 if (nullptr == fArray) {
2216 fArray = CFArrayCreate(nullptr, nullptr, 0, nullptr); 2188 fArray = CFArrayCreate(nullptr, nullptr, 0, nullptr);
2217 } 2189 }
2218 fCount = SkToInt(CFArrayGetCount(fArray)); 2190 fCount = SkToInt(CFArrayGetCount(fArray));
2219 } 2191 }
2220 2192
2221 virtual ~SkFontStyleSet_Mac() { 2193 virtual ~SkFontStyleSet_Mac() {
2222 CFRelease(fArray); 2194 CFRelease(fArray);
2223 CFRelease(fFamilyName);
2224 } 2195 }
2225 2196
2226 int count() override { 2197 int count() override {
2227 return fCount; 2198 return fCount;
2228 } 2199 }
2229 2200
2230 void getStyle(int index, SkFontStyle* style, SkString* name) override { 2201 void getStyle(int index, SkFontStyle* style, SkString* name) override {
2231 SkASSERT((unsigned)index < (unsigned)fCount); 2202 SkASSERT((unsigned)index < (unsigned)fCount);
2232 CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(f Array, index); 2203 CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(f Array, index);
2233 if (style) { 2204 if (style) {
2234 *style = fontstyle_from_descriptor(desc); 2205 *style = fontstyle_from_descriptor(desc);
2235 } 2206 }
2236 if (name) { 2207 if (name) {
2237 if (!find_desc_str(desc, kCTFontStyleNameAttribute, name)) { 2208 if (!find_desc_str(desc, kCTFontStyleNameAttribute, name)) {
2238 name->reset(); 2209 name->reset();
2239 } 2210 }
2240 } 2211 }
2241 } 2212 }
2242 2213
2243 SkTypeface* createTypeface(int index) override { 2214 SkTypeface* createTypeface(int index) override {
2244 SkASSERT((unsigned)index < (unsigned)CFArrayGetCount(fArray)); 2215 SkASSERT((unsigned)index < (unsigned)CFArrayGetCount(fArray));
2245 CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(f Array, index); 2216 CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtIndex(f Array, index);
2246 2217
2247 return createFromDesc(fFamilyName, desc); 2218 return createFromDesc(desc);
2248 } 2219 }
2249 2220
2250 SkTypeface* matchStyle(const SkFontStyle& pattern) override { 2221 SkTypeface* matchStyle(const SkFontStyle& pattern) override {
2251 if (0 == fCount) { 2222 if (0 == fCount) {
2252 return nullptr; 2223 return nullptr;
2253 } 2224 }
2254 return createFromDesc(fFamilyName, findMatchingDesc(pattern)); 2225 return createFromDesc(findMatchingDesc(pattern));
2255 } 2226 }
2256 2227
2257 private: 2228 private:
2258 CFArrayRef fArray; 2229 CFArrayRef fArray;
2259 CFStringRef fFamilyName;
2260 int fCount; 2230 int fCount;
2261 2231
2262 CTFontDescriptorRef findMatchingDesc(const SkFontStyle& pattern) const { 2232 CTFontDescriptorRef findMatchingDesc(const SkFontStyle& pattern) const {
2263 int bestMetric = SK_MaxS32; 2233 int bestMetric = SK_MaxS32;
2264 CTFontDescriptorRef bestDesc = nullptr; 2234 CTFontDescriptorRef bestDesc = nullptr;
2265 2235
2266 for (int i = 0; i < fCount; ++i) { 2236 for (int i = 0; i < fCount; ++i) {
2267 CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtInd ex(fArray, i); 2237 CTFontDescriptorRef desc = (CTFontDescriptorRef)CFArrayGetValueAtInd ex(fArray, i);
2268 int metric = compute_metric(pattern, fontstyle_from_descriptor(desc) ); 2238 int metric = compute_metric(pattern, fontstyle_from_descriptor(desc) );
2269 if (0 == metric) { 2239 if (0 == metric) {
(...skipping 21 matching lines...) Expand all
2291 static SkFontStyleSet* CreateSet(CFStringRef cfFamilyName) { 2261 static SkFontStyleSet* CreateSet(CFStringRef cfFamilyName) {
2292 AutoCFRelease<CFMutableDictionaryRef> cfAttr( 2262 AutoCFRelease<CFMutableDictionaryRef> cfAttr(
2293 CFDictionaryCreateMutable(kCFAllocatorDefault, 0, 2263 CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
2294 &kCFTypeDictionaryKeyCallBacks, 2264 &kCFTypeDictionaryKeyCallBacks,
2295 &kCFTypeDictionaryValueCallBacks)); 2265 &kCFTypeDictionaryValueCallBacks));
2296 2266
2297 CFDictionaryAddValue(cfAttr, kCTFontFamilyNameAttribute, cfFamilyName); 2267 CFDictionaryAddValue(cfAttr, kCTFontFamilyNameAttribute, cfFamilyName);
2298 2268
2299 AutoCFRelease<CTFontDescriptorRef> desc( 2269 AutoCFRelease<CTFontDescriptorRef> desc(
2300 CTFontDescriptorCreateWithAttributes(cfAttr)); 2270 CTFontDescriptorCreateWithAttributes(cfAttr));
2301 return new SkFontStyleSet_Mac(cfFamilyName, desc); 2271 return new SkFontStyleSet_Mac(desc);
2302 } 2272 }
2303 2273
2304 public: 2274 public:
2305 SkFontMgr_Mac() 2275 SkFontMgr_Mac()
2306 : fNames(SkCTFontManagerCopyAvailableFontFamilyNames()) 2276 : fNames(SkCTFontManagerCopyAvailableFontFamilyNames())
2307 , fCount(fNames ? SkToInt(CFArrayGetCount(fNames)) : 0) {} 2277 , fCount(fNames ? SkToInt(CFArrayGetCount(fNames)) : 0) {}
2308 2278
2309 virtual ~SkFontMgr_Mac() { 2279 virtual ~SkFontMgr_Mac() {
2310 CFSafeRelease(fNames); 2280 CFSafeRelease(fNames);
2311 } 2281 }
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
2497 if (cgVariations) { 2467 if (cgVariations) {
2498 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations)); 2468 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations));
2499 } else { 2469 } else {
2500 cgVariant.reset(cg.release()); 2470 cgVariant.reset(cg.release());
2501 } 2471 }
2502 2472
2503 CTFontRef ct = CTFontCreateWithGraphicsFont(cgVariant, 0, nullptr, nullp tr); 2473 CTFontRef ct = CTFontCreateWithGraphicsFont(cgVariant, 0, nullptr, nullp tr);
2504 if (!ct) { 2474 if (!ct) {
2505 return nullptr; 2475 return nullptr;
2506 } 2476 }
2507 return NewFromFontRef(ct, cg.release(), nullptr, true); 2477 return NewFromFontRef(ct, cg.release(), true);
2508 } 2478 }
2509 2479
2510 static CFDictionaryRef get_axes(CGFontRef cg, SkFontData* fontData) { 2480 static CFDictionaryRef get_axes(CGFontRef cg, SkFontData* fontData) {
2511 AutoCFRelease<CFArrayRef> cgAxes(CGFontCopyVariationAxes(cg)); 2481 AutoCFRelease<CFArrayRef> cgAxes(CGFontCopyVariationAxes(cg));
2512 if (!cgAxes) { 2482 if (!cgAxes) {
2513 return nullptr; 2483 return nullptr;
2514 } 2484 }
2515 2485
2516 CFIndex axisCount = CFArrayGetCount(cgAxes); 2486 CFIndex axisCount = CFArrayGetCount(cgAxes);
2517 if (0 == axisCount || axisCount != fontData->getAxisCount()) { 2487 if (0 == axisCount || axisCount != fontData->getAxisCount()) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
2580 if (cgVariations) { 2550 if (cgVariations) {
2581 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations)); 2551 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations));
2582 } else { 2552 } else {
2583 cgVariant.reset(cg.release()); 2553 cgVariant.reset(cg.release());
2584 } 2554 }
2585 2555
2586 CTFontRef ct = CTFontCreateWithGraphicsFont(cgVariant, 0, nullptr, nullp tr); 2556 CTFontRef ct = CTFontCreateWithGraphicsFont(cgVariant, 0, nullptr, nullp tr);
2587 if (!ct) { 2557 if (!ct) {
2588 return nullptr; 2558 return nullptr;
2589 } 2559 }
2590 return NewFromFontRef(ct, cg.release(), nullptr, true); 2560 return NewFromFontRef(ct, cg.release(), true);
2591 } 2561 }
2592 2562
2593 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override { 2563 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override {
2594 AutoCFRelease<CGDataProviderRef> pr(CGDataProviderCreateWithFilename(pat h)); 2564 AutoCFRelease<CGDataProviderRef> pr(CGDataProviderCreateWithFilename(pat h));
2595 if (nullptr == pr) { 2565 if (nullptr == pr) {
2596 return nullptr; 2566 return nullptr;
2597 } 2567 }
2598 return create_from_dataProvider(pr); 2568 return create_from_dataProvider(pr);
2599 } 2569 }
2600 2570
2601 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], 2571 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[],
2602 unsigned styleBits) const overrid e { 2572 unsigned styleBits) const overrid e {
2603 2573
2604 SkFontStyle style = SkFontStyle((SkTypeface::Style)styleBits); 2574 SkFontStyle style = SkFontStyle((SkTypeface::Style)styleBits);
2605 if (familyName) { 2575 if (familyName) {
2606 familyName = map_css_names(familyName); 2576 familyName = map_css_names(familyName);
2607 } 2577 }
2608 2578
2609 if (!familyName || !*familyName) { 2579 if (!familyName || !*familyName) {
2610 familyName = FONT_DEFAULT_NAME; 2580 familyName = FONT_DEFAULT_NAME;
2611 } 2581 }
2612 2582
2613 NameStyle cacheRequest = { familyName, style }; 2583 SkTypeface* face = NewFromName(familyName, style);
2614 SkTypeface* face = SkTypefaceCache::FindByProcAndRef(find_by_NameStyle, &cacheRequest); 2584 if (face) {
2585 return face;
2586 }
2615 2587
2616 if (nullptr == face) { 2588 return SkSafeRef(GetDefaultFace());
2617 face = NewFromName(familyName, style);
2618 if (face) {
2619 SkTypefaceCache::Add(face, style);
2620 } else {
2621 face = GetDefaultFace();
2622 face->ref();
2623 }
2624 }
2625 return face;
2626 } 2589 }
2627 }; 2590 };
2628 2591
2629 /////////////////////////////////////////////////////////////////////////////// 2592 ///////////////////////////////////////////////////////////////////////////////
2630 2593
2631 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; } 2594 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; }
2632 2595
2633 #endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) 2596 #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