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 10 matching lines...) Expand all Loading... |
21 | 21 |
22 #include "SkAdvancedTypefaceMetrics.h" | 22 #include "SkAdvancedTypefaceMetrics.h" |
23 #include "SkCGUtils.h" | 23 #include "SkCGUtils.h" |
24 #include "SkColorPriv.h" | 24 #include "SkColorPriv.h" |
25 #include "SkDescriptor.h" | 25 #include "SkDescriptor.h" |
26 #include "SkEndian.h" | 26 #include "SkEndian.h" |
27 #include "SkFloatingPoint.h" | 27 #include "SkFloatingPoint.h" |
28 #include "SkFontDescriptor.h" | 28 #include "SkFontDescriptor.h" |
29 #include "SkFontMgr.h" | 29 #include "SkFontMgr.h" |
30 #include "SkGlyph.h" | 30 #include "SkGlyph.h" |
| 31 #include "SkMakeUnique.h" |
31 #include "SkMaskGamma.h" | 32 #include "SkMaskGamma.h" |
32 #include "SkMathPriv.h" | 33 #include "SkMathPriv.h" |
33 #include "SkMutex.h" | 34 #include "SkMutex.h" |
34 #include "SkOTTable_glyf.h" | 35 #include "SkOTTable_glyf.h" |
35 #include "SkOTTable_head.h" | 36 #include "SkOTTable_head.h" |
36 #include "SkOTTable_hhea.h" | 37 #include "SkOTTable_hhea.h" |
37 #include "SkOTTable_loca.h" | 38 #include "SkOTTable_loca.h" |
38 #include "SkOTUtils.h" | 39 #include "SkOTUtils.h" |
39 #include "SkOnce.h" | 40 #include "SkOnce.h" |
40 #include "SkPaint.h" | 41 #include "SkPaint.h" |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 SkASSERT(fontRef); | 505 SkASSERT(fontRef); |
505 } | 506 } |
506 | 507 |
507 AutoCFRelease<CTFontRef> fFontRef; | 508 AutoCFRelease<CTFontRef> fFontRef; |
508 AutoCFRelease<CFTypeRef> fOriginatingCFTypeRef; | 509 AutoCFRelease<CFTypeRef> fOriginatingCFTypeRef; |
509 const bool fHasColorGlyphs; | 510 const bool fHasColorGlyphs; |
510 | 511 |
511 protected: | 512 protected: |
512 int onGetUPEM() const override; | 513 int onGetUPEM() const override; |
513 SkStreamAsset* onOpenStream(int* ttcIndex) const override; | 514 SkStreamAsset* onOpenStream(int* ttcIndex) const override; |
514 SkFontData* onCreateFontData() const override; | 515 std::unique_ptr<SkFontData> onMakeFontData() const override; |
515 void onGetFamilyName(SkString* familyName) const override; | 516 void onGetFamilyName(SkString* familyName) const override; |
516 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; | 517 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override; |
517 int onGetTableTags(SkFontTableTag tags[]) const override; | 518 int onGetTableTags(SkFontTableTag tags[]) const override; |
518 virtual size_t onGetTableData(SkFontTableTag, size_t offset, | 519 virtual size_t onGetTableData(SkFontTableTag, size_t offset, |
519 size_t length, void* data) const override; | 520 size_t length, void* data) const override; |
520 SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&, | 521 SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&, |
521 const SkDescriptor*) const override; | 522 const SkDescriptor*) const override; |
522 void onFilterRec(SkScalerContextRec*) const override; | 523 void onFilterRec(SkScalerContextRec*) const override; |
523 void onGetFontDescriptor(SkFontDescriptor*, bool*) const override; | 524 void onGetFontDescriptor(SkFontDescriptor*, bool*) const override; |
524 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( | 525 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
(...skipping 1353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1878 } | 1879 } |
1879 (*axisValues)[(int)i] = SkDoubleToFixed(axisDefaultValueDouble); | 1880 (*axisValues)[(int)i] = SkDoubleToFixed(axisDefaultValueDouble); |
1880 } | 1881 } |
1881 | 1882 |
1882 // Override the default values with the given font's stated axis values. | 1883 // Override the default values with the given font's stated axis values. |
1883 NonDefaultAxesContext c = { axisValues->get(), cgAxes.get() }; | 1884 NonDefaultAxesContext c = { axisValues->get(), cgAxes.get() }; |
1884 CFDictionaryApplyFunction(cgVariations, set_non_default_axes, &c); | 1885 CFDictionaryApplyFunction(cgVariations, set_non_default_axes, &c); |
1885 | 1886 |
1886 return true; | 1887 return true; |
1887 } | 1888 } |
1888 SkFontData* SkTypeface_Mac::onCreateFontData() const { | 1889 std::unique_ptr<SkFontData> SkTypeface_Mac::onMakeFontData() const { |
1889 int index; | 1890 int index; |
1890 SkAutoTDelete<SkStreamAsset> stream(this->onOpenStream(&index)); | 1891 std::unique_ptr<SkStreamAsset> stream(this->onOpenStream(&index)); |
1891 | 1892 |
1892 CFIndex cgAxisCount; | 1893 CFIndex cgAxisCount; |
1893 SkAutoSTMalloc<4, SkFixed> axisValues; | 1894 SkAutoSTMalloc<4, SkFixed> axisValues; |
1894 if (get_variations(fFontRef, &cgAxisCount, &axisValues)) { | 1895 if (get_variations(fFontRef, &cgAxisCount, &axisValues)) { |
1895 return new SkFontData(stream.release(), index, axisValues.get(), cgAxisC
ount); | 1896 return skstd::make_unique<SkFontData>(std::move(stream), index, |
| 1897 axisValues.get(), cgAxisCount); |
1896 } | 1898 } |
1897 return new SkFontData(stream.release(), index, nullptr, 0); | 1899 return skstd::make_unique<SkFontData>(std::move(stream), index, nullptr, 0); |
1898 } | 1900 } |
1899 | 1901 |
1900 /////////////////////////////////////////////////////////////////////////////// | 1902 /////////////////////////////////////////////////////////////////////////////// |
1901 /////////////////////////////////////////////////////////////////////////////// | 1903 /////////////////////////////////////////////////////////////////////////////// |
1902 | 1904 |
1903 int SkTypeface_Mac::onGetUPEM() const { | 1905 int SkTypeface_Mac::onGetUPEM() const { |
1904 AutoCFRelease<CGFontRef> cgFont(CTFontCopyGraphicsFont(fFontRef, nullptr)); | 1906 AutoCFRelease<CGFontRef> cgFont(CTFontCopyGraphicsFont(fFontRef, nullptr)); |
1905 return CGFontGetUnitsPerEm(cgFont); | 1907 return CGFontGetUnitsPerEm(cgFont); |
1906 } | 1908 } |
1907 | 1909 |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2360 AutoCFRelease<CTFontRef> fallbackFont(CTFontCreateForString(currentFont,
string, range)); | 2362 AutoCFRelease<CTFontRef> fallbackFont(CTFontCreateForString(currentFont,
string, range)); |
2361 return create_from_CTFontRef(fallbackFont.release(), nullptr, false); | 2363 return create_from_CTFontRef(fallbackFont.release(), nullptr, false); |
2362 } | 2364 } |
2363 | 2365 |
2364 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, | 2366 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* familyMember, |
2365 const SkFontStyle&) const override { | 2367 const SkFontStyle&) const override { |
2366 return nullptr; | 2368 return nullptr; |
2367 } | 2369 } |
2368 | 2370 |
2369 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override { | 2371 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override { |
2370 AutoCFRelease<CGDataProviderRef> pr(SkCreateDataProviderFromData(data)); | 2372 AutoCFRelease<CGDataProviderRef> pr(SkCreateDataProviderFromData(sk_ref_
sp(data))); |
2371 if (nullptr == pr) { | 2373 if (nullptr == pr) { |
2372 return nullptr; | 2374 return nullptr; |
2373 } | 2375 } |
2374 return create_from_dataProvider(pr); | 2376 return create_from_dataProvider(pr); |
2375 } | 2377 } |
2376 | 2378 |
2377 SkTypeface* onCreateFromStream(SkStreamAsset* stream, int ttcIndex) const ov
erride { | 2379 SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) cons
t override { |
2378 AutoCFRelease<CGDataProviderRef> pr(SkCreateDataProviderFromStream(strea
m)); | 2380 std::unique_ptr<SkStreamAsset> stream(bareStream); |
| 2381 AutoCFRelease<CGDataProviderRef> pr(SkCreateDataProviderFromStream(std::
move(stream))); |
2379 if (nullptr == pr) { | 2382 if (nullptr == pr) { |
2380 return nullptr; | 2383 return nullptr; |
2381 } | 2384 } |
2382 return create_from_dataProvider(pr); | 2385 return create_from_dataProvider(pr); |
2383 } | 2386 } |
2384 | 2387 |
2385 static CFNumberRef get_tag_for_name(CFStringRef name, CFArrayRef ctAxes) { | 2388 static CFNumberRef get_tag_for_name(CFStringRef name, CFArrayRef ctAxes) { |
2386 CFIndex ctAxisCount = CFArrayGetCount(ctAxes); | 2389 CFIndex ctAxisCount = CFArrayGetCount(ctAxes); |
2387 for (int i = 0; i < ctAxisCount; ++i) { | 2390 for (int i = 0; i < ctAxisCount; ++i) { |
2388 CFTypeRef ctAxisInfo = CFArrayGetValueAtIndex(ctAxes, i); | 2391 CFTypeRef ctAxisInfo = CFArrayGetValueAtIndex(ctAxes, i); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2486 break; | 2489 break; |
2487 } | 2490 } |
2488 } | 2491 } |
2489 CFNumberRef valueNumber = CFNumberCreate(kCFAllocatorDefault, kCFNum
berDoubleType, | 2492 CFNumberRef valueNumber = CFNumberCreate(kCFAllocatorDefault, kCFNum
berDoubleType, |
2490 &value); | 2493 &value); |
2491 CFDictionaryAddValue(dict, axisName, valueNumber); | 2494 CFDictionaryAddValue(dict, axisName, valueNumber); |
2492 CFRelease(valueNumber); | 2495 CFRelease(valueNumber); |
2493 } | 2496 } |
2494 return dict; | 2497 return dict; |
2495 } | 2498 } |
2496 SkTypeface* onCreateFromStream(SkStreamAsset* s, const FontParameters& param
s) const override { | 2499 SkTypeface* onCreateFromStream(SkStreamAsset* bs, const FontParameters& para
ms) const override { |
2497 AutoCFRelease<CGDataProviderRef> provider(SkCreateDataProviderFromStream
(s)); | 2500 std::unique_ptr<SkStreamAsset> s(bs); |
| 2501 AutoCFRelease<CGDataProviderRef> provider(SkCreateDataProviderFromStream
(std::move(s))); |
2498 if (nullptr == provider) { | 2502 if (nullptr == provider) { |
2499 return nullptr; | 2503 return nullptr; |
2500 } | 2504 } |
2501 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); | 2505 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); |
2502 if (nullptr == cg) { | 2506 if (nullptr == cg) { |
2503 return nullptr; | 2507 return nullptr; |
2504 } | 2508 } |
2505 | 2509 |
2506 AutoCFRelease<CFDictionaryRef> cgVariations(get_axes(cg, params)); | 2510 AutoCFRelease<CFDictionaryRef> cgVariations(get_axes(cg, params)); |
2507 // The CGFontRef returned by CGFontCreateCopyWithVariations when the pas
sed CGFontRef was | 2511 // The CGFontRef returned by CGFontCreateCopyWithVariations when the pas
sed CGFontRef was |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2567 } | 2571 } |
2568 double value = SkTPin(SkFixedToDouble(fontData->getAxis()[i]), minDo
uble, maxDouble); | 2572 double value = SkTPin(SkFixedToDouble(fontData->getAxis()[i]), minDo
uble, maxDouble); |
2569 CFNumberRef valueNumber = CFNumberCreate(kCFAllocatorDefault, kCFNum
berDoubleType, | 2573 CFNumberRef valueNumber = CFNumberCreate(kCFAllocatorDefault, kCFNum
berDoubleType, |
2570 &value); | 2574 &value); |
2571 | 2575 |
2572 CFDictionaryAddValue(dict, axisName, valueNumber); | 2576 CFDictionaryAddValue(dict, axisName, valueNumber); |
2573 CFRelease(valueNumber); | 2577 CFRelease(valueNumber); |
2574 } | 2578 } |
2575 return dict; | 2579 return dict; |
2576 } | 2580 } |
2577 SkTypeface* onCreateFromFontData(SkFontData* data) const override { | 2581 SkTypeface* onCreateFromFontData(std::unique_ptr<SkFontData> fontData) const
override { |
2578 SkAutoTDelete<SkFontData> fontData(data); | 2582 AutoCFRelease<CGDataProviderRef> provider( |
2579 SkStreamAsset* stream = fontData->detachStream(); | 2583 SkCreateDataProviderFromStream(fontData->detachStream())); |
2580 AutoCFRelease<CGDataProviderRef> provider(SkCreateDataProviderFromStream
(stream)); | |
2581 if (nullptr == provider) { | 2584 if (nullptr == provider) { |
2582 return nullptr; | 2585 return nullptr; |
2583 } | 2586 } |
2584 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); | 2587 AutoCFRelease<CGFontRef> cg(CGFontCreateWithDataProvider(provider)); |
2585 if (nullptr == cg) { | 2588 if (nullptr == cg) { |
2586 return nullptr; | 2589 return nullptr; |
2587 } | 2590 } |
2588 | 2591 |
2589 AutoCFRelease<CFDictionaryRef> cgVariations(get_axes(cg, fontData)); | 2592 AutoCFRelease<CFDictionaryRef> cgVariations(get_axes(cg, fontData.get())
); |
2590 // The CGFontRef returned by CGFontCreateCopyWithVariations when the pas
sed CGFontRef was | 2593 // The CGFontRef returned by CGFontCreateCopyWithVariations when the pas
sed CGFontRef was |
2591 // created from a data provider does not appear to have any ownership of
the underlying | 2594 // created from a data provider does not appear to have any ownership of
the underlying |
2592 // data. The original CGFontRef must be kept alive until the copy will n
o longer be used. | 2595 // data. The original CGFontRef must be kept alive until the copy will n
o longer be used. |
2593 AutoCFRelease<CGFontRef> cgVariant; | 2596 AutoCFRelease<CGFontRef> cgVariant; |
2594 if (cgVariations) { | 2597 if (cgVariations) { |
2595 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations)); | 2598 cgVariant.reset(CGFontCreateCopyWithVariations(cg, cgVariations)); |
2596 } else { | 2599 } else { |
2597 cgVariant.reset(cg.release()); | 2600 cgVariant.reset(cg.release()); |
2598 } | 2601 } |
2599 | 2602 |
(...skipping 28 matching lines...) Expand all Loading... |
2628 | 2631 |
2629 return SkSafeRef(GetDefaultFace()); | 2632 return SkSafeRef(GetDefaultFace()); |
2630 } | 2633 } |
2631 }; | 2634 }; |
2632 | 2635 |
2633 /////////////////////////////////////////////////////////////////////////////// | 2636 /////////////////////////////////////////////////////////////////////////////// |
2634 | 2637 |
2635 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; } | 2638 SkFontMgr* SkFontMgr::Factory() { return new SkFontMgr_Mac; } |
2636 | 2639 |
2637 #endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) | 2640 #endif//defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) |
OLD | NEW |