| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 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 "SkDataTable.h" | 8 #include "SkDataTable.h" |
| 9 #include "SkFixed.h" | 9 #include "SkFixed.h" |
| 10 #include "SkFontDescriptor.h" | 10 #include "SkFontDescriptor.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 | 106 |
| 107 template<typename T, void (*D)(T*)> void FcTDestroy(T* t) { | 107 template<typename T, void (*D)(T*)> void FcTDestroy(T* t) { |
| 108 FCLocker::AssertHeld(); | 108 FCLocker::AssertHeld(); |
| 109 D(t); | 109 D(t); |
| 110 } | 110 } |
| 111 template <typename T, T* (*C)(), void (*D)(T*)> class SkAutoFc | 111 template <typename T, T* (*C)(), void (*D)(T*)> class SkAutoFc |
| 112 : public SkAutoTCallVProc<T, FcTDestroy<T, D> > { | 112 : public SkAutoTCallVProc<T, FcTDestroy<T, D> > { |
| 113 public: | 113 public: |
| 114 SkAutoFc() : SkAutoTCallVProc<T, FcTDestroy<T, D> >(C()) { | 114 SkAutoFc() : SkAutoTCallVProc<T, FcTDestroy<T, D> >(C()) { |
| 115 T* obj = this->operator T*(); | 115 T* obj = this->operator T*(); |
| 116 SK_ALWAYSBREAK(NULL != obj); | 116 SK_ALWAYSBREAK(nullptr != obj); |
| 117 } | 117 } |
| 118 explicit SkAutoFc(T* obj) : SkAutoTCallVProc<T, FcTDestroy<T, D> >(obj) {} | 118 explicit SkAutoFc(T* obj) : SkAutoTCallVProc<T, FcTDestroy<T, D> >(obj) {} |
| 119 }; | 119 }; |
| 120 | 120 |
| 121 typedef SkAutoFc<FcCharSet, FcCharSetCreate, FcCharSetDestroy> SkAutoFcCharSet; | 121 typedef SkAutoFc<FcCharSet, FcCharSetCreate, FcCharSetDestroy> SkAutoFcCharSet; |
| 122 typedef SkAutoFc<FcConfig, FcConfigCreate, FcConfigDestroy> SkAutoFcConfig; | 122 typedef SkAutoFc<FcConfig, FcConfigCreate, FcConfigDestroy> SkAutoFcConfig; |
| 123 typedef SkAutoFc<FcFontSet, FcFontSetCreate, FcFontSetDestroy> SkAutoFcFontSet; | 123 typedef SkAutoFc<FcFontSet, FcFontSetCreate, FcFontSetDestroy> SkAutoFcFontSet; |
| 124 typedef SkAutoFc<FcLangSet, FcLangSetCreate, FcLangSetDestroy> SkAutoFcLangSet; | 124 typedef SkAutoFc<FcLangSet, FcLangSetCreate, FcLangSetDestroy> SkAutoFcLangSet; |
| 125 typedef SkAutoFc<FcObjectSet, FcObjectSetCreate, FcObjectSetDestroy> SkAutoFcObj
ectSet; | 125 typedef SkAutoFc<FcObjectSet, FcObjectSetCreate, FcObjectSetDestroy> SkAutoFcObj
ectSet; |
| 126 typedef SkAutoFc<FcPattern, FcPatternCreate, FcPatternDestroy> SkAutoFcPattern; | 126 typedef SkAutoFc<FcPattern, FcPatternCreate, FcPatternDestroy> SkAutoFcPattern; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 155 * A element with the weak bit is scored after FC_LANG, without the weak bit is
scored before. | 155 * A element with the weak bit is scored after FC_LANG, without the weak bit is
scored before. |
| 156 * Note that the weak bit is stored on the element, not on the value it holds. | 156 * Note that the weak bit is stored on the element, not on the value it holds. |
| 157 */ | 157 */ |
| 158 static SkWeakReturn is_weak(FcPattern* pattern, const char object[], int id) { | 158 static SkWeakReturn is_weak(FcPattern* pattern, const char object[], int id) { |
| 159 FCLocker::AssertHeld(); | 159 FCLocker::AssertHeld(); |
| 160 | 160 |
| 161 FcResult result; | 161 FcResult result; |
| 162 | 162 |
| 163 // Create a copy of the pattern with only the value 'pattern'['object'['id']
] in it. | 163 // Create a copy of the pattern with only the value 'pattern'['object'['id']
] in it. |
| 164 // Internally, FontConfig pattern objects are linked lists, so faster to rem
ove from head. | 164 // Internally, FontConfig pattern objects are linked lists, so faster to rem
ove from head. |
| 165 SkAutoFcObjectSet requestedObjectOnly(FcObjectSetBuild(object, NULL)); | 165 SkAutoFcObjectSet requestedObjectOnly(FcObjectSetBuild(object, nullptr)); |
| 166 SkAutoFcPattern minimal(FcPatternFilter(pattern, requestedObjectOnly)); | 166 SkAutoFcPattern minimal(FcPatternFilter(pattern, requestedObjectOnly)); |
| 167 FcBool hasId = true; | 167 FcBool hasId = true; |
| 168 for (int i = 0; hasId && i < id; ++i) { | 168 for (int i = 0; hasId && i < id; ++i) { |
| 169 hasId = FcPatternRemove(minimal, object, 0); | 169 hasId = FcPatternRemove(minimal, object, 0); |
| 170 } | 170 } |
| 171 if (!hasId) { | 171 if (!hasId) { |
| 172 return kNoId_WeakReturn; | 172 return kNoId_WeakReturn; |
| 173 } | 173 } |
| 174 FcValue value; | 174 FcValue value; |
| 175 result = FcPatternGet(minimal, object, 0, &value); | 175 result = FcPatternGet(minimal, object, 0, &value); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 ? kIsWeak_WeakReturn : kIsStrong_WeakReturn; | 219 ? kIsWeak_WeakReturn : kIsStrong_WeakReturn; |
| 220 } | 220 } |
| 221 | 221 |
| 222 /** Removes weak elements from either FC_FAMILY or FC_POSTSCRIPT_NAME objects in
the property. | 222 /** Removes weak elements from either FC_FAMILY or FC_POSTSCRIPT_NAME objects in
the property. |
| 223 * This can be quite expensive, and should not be used more than once per font
lookup. | 223 * This can be quite expensive, and should not be used more than once per font
lookup. |
| 224 * This removes all of the weak elements after the last strong element. | 224 * This removes all of the weak elements after the last strong element. |
| 225 */ | 225 */ |
| 226 static void remove_weak(FcPattern* pattern, const char object[]) { | 226 static void remove_weak(FcPattern* pattern, const char object[]) { |
| 227 FCLocker::AssertHeld(); | 227 FCLocker::AssertHeld(); |
| 228 | 228 |
| 229 SkAutoFcObjectSet requestedObjectOnly(FcObjectSetBuild(object, NULL)); | 229 SkAutoFcObjectSet requestedObjectOnly(FcObjectSetBuild(object, nullptr)); |
| 230 SkAutoFcPattern minimal(FcPatternFilter(pattern, requestedObjectOnly)); | 230 SkAutoFcPattern minimal(FcPatternFilter(pattern, requestedObjectOnly)); |
| 231 | 231 |
| 232 int lastStrongId = -1; | 232 int lastStrongId = -1; |
| 233 int numIds; | 233 int numIds; |
| 234 SkWeakReturn result; | 234 SkWeakReturn result; |
| 235 for (int id = 0; ; ++id) { | 235 for (int id = 0; ; ++id) { |
| 236 result = is_weak(minimal, object, 0); | 236 result = is_weak(minimal, object, 0); |
| 237 if (kNoId_WeakReturn == result) { | 237 if (kNoId_WeakReturn == result) { |
| 238 numIds = id; | 238 numIds = id; |
| 239 break; | 239 break; |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 SkAutoFcPattern pattern; | 505 SkAutoFcPattern pattern; |
| 506 fcpattern_from_skfontstyle(style, pattern); | 506 fcpattern_from_skfontstyle(style, pattern); |
| 507 FcConfigSubstitute(fFontMgr->fFC, pattern, FcMatchPattern); | 507 FcConfigSubstitute(fFontMgr->fFC, pattern, FcMatchPattern); |
| 508 FcDefaultSubstitute(pattern); | 508 FcDefaultSubstitute(pattern); |
| 509 | 509 |
| 510 FcResult result; | 510 FcResult result; |
| 511 FcFontSet* fontSets[1] = { fFontSet }; | 511 FcFontSet* fontSets[1] = { fFontSet }; |
| 512 SkAutoFcPattern match(FcFontSetMatch(fFontMgr->fFC, | 512 SkAutoFcPattern match(FcFontSetMatch(fFontMgr->fFC, |
| 513 fontSets, SK_ARRAY_COUNT(fontSe
ts), | 513 fontSets, SK_ARRAY_COUNT(fontSe
ts), |
| 514 pattern, &result)); | 514 pattern, &result)); |
| 515 if (NULL == match) { | 515 if (nullptr == match) { |
| 516 return NULL; | 516 return nullptr; |
| 517 } | 517 } |
| 518 | 518 |
| 519 return fFontMgr->createTypefaceFromFcPattern(match); | 519 return fFontMgr->createTypefaceFromFcPattern(match); |
| 520 } | 520 } |
| 521 | 521 |
| 522 private: | 522 private: |
| 523 SkAutoTUnref<const SkFontMgr_fontconfig> fFontMgr; | 523 SkAutoTUnref<const SkFontMgr_fontconfig> fFontMgr; |
| 524 SkAutoFcFontSet fFontSet; | 524 SkAutoFcFontSet fFontSet; |
| 525 }; | 525 }; |
| 526 | 526 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 537 static SkDataTable* GetFamilyNames(FcConfig* fcconfig) { | 537 static SkDataTable* GetFamilyNames(FcConfig* fcconfig) { |
| 538 FCLocker lock; | 538 FCLocker lock; |
| 539 | 539 |
| 540 SkTDArray<const char*> names; | 540 SkTDArray<const char*> names; |
| 541 SkTDArray<size_t> sizes; | 541 SkTDArray<size_t> sizes; |
| 542 | 542 |
| 543 static const FcSetName fcNameSet[] = { FcSetSystem, FcSetApplication }; | 543 static const FcSetName fcNameSet[] = { FcSetSystem, FcSetApplication }; |
| 544 for (int setIndex = 0; setIndex < (int)SK_ARRAY_COUNT(fcNameSet); ++setI
ndex) { | 544 for (int setIndex = 0; setIndex < (int)SK_ARRAY_COUNT(fcNameSet); ++setI
ndex) { |
| 545 // Return value of FcConfigGetFonts must not be destroyed. | 545 // Return value of FcConfigGetFonts must not be destroyed. |
| 546 FcFontSet* allFonts(FcConfigGetFonts(fcconfig, fcNameSet[setIndex]))
; | 546 FcFontSet* allFonts(FcConfigGetFonts(fcconfig, fcNameSet[setIndex]))
; |
| 547 if (NULL == allFonts) { | 547 if (nullptr == allFonts) { |
| 548 continue; | 548 continue; |
| 549 } | 549 } |
| 550 | 550 |
| 551 for (int fontIndex = 0; fontIndex < allFonts->nfont; ++fontIndex) { | 551 for (int fontIndex = 0; fontIndex < allFonts->nfont; ++fontIndex) { |
| 552 FcPattern* current = allFonts->fonts[fontIndex]; | 552 FcPattern* current = allFonts->fonts[fontIndex]; |
| 553 for (int id = 0; ; ++id) { | 553 for (int id = 0; ; ++id) { |
| 554 FcChar8* fcFamilyName; | 554 FcChar8* fcFamilyName; |
| 555 FcResult result = FcPatternGetString(current, FC_FAMILY, id,
&fcFamilyName); | 555 FcResult result = FcPatternGetString(current, FC_FAMILY, id,
&fcFamilyName); |
| 556 if (FcResultNoId == result) { | 556 if (FcResultNoId == result) { |
| 557 break; | 557 break; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 580 | 580 |
| 581 mutable SkMutex fTFCacheMutex; | 581 mutable SkMutex fTFCacheMutex; |
| 582 mutable SkTypefaceCache fTFCache; | 582 mutable SkTypefaceCache fTFCache; |
| 583 /** Creates a typeface using a typeface cache. | 583 /** Creates a typeface using a typeface cache. |
| 584 * @param pattern a complete pattern from FcFontRenderPrepare. | 584 * @param pattern a complete pattern from FcFontRenderPrepare. |
| 585 */ | 585 */ |
| 586 SkTypeface* createTypefaceFromFcPattern(FcPattern* pattern) const { | 586 SkTypeface* createTypefaceFromFcPattern(FcPattern* pattern) const { |
| 587 FCLocker::AssertHeld(); | 587 FCLocker::AssertHeld(); |
| 588 SkAutoMutexAcquire ama(fTFCacheMutex); | 588 SkAutoMutexAcquire ama(fTFCacheMutex); |
| 589 SkTypeface* face = fTFCache.findByProcAndRef(FindByFcPattern, pattern); | 589 SkTypeface* face = fTFCache.findByProcAndRef(FindByFcPattern, pattern); |
| 590 if (NULL == face) { | 590 if (nullptr == face) { |
| 591 FcPatternReference(pattern); | 591 FcPatternReference(pattern); |
| 592 face = SkTypeface_fontconfig::Create(pattern); | 592 face = SkTypeface_fontconfig::Create(pattern); |
| 593 if (face) { | 593 if (face) { |
| 594 fTFCache.add(face, SkFontStyle()); | 594 fTFCache.add(face, SkFontStyle()); |
| 595 } | 595 } |
| 596 } | 596 } |
| 597 return face; | 597 return face; |
| 598 } | 598 } |
| 599 | 599 |
| 600 public: | 600 public: |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 if (0 == FcStrCmpIgnoreCase(patternString, fontString)) { | 651 if (0 == FcStrCmpIgnoreCase(patternString, fontString)) { |
| 652 return true; | 652 return true; |
| 653 } | 653 } |
| 654 } | 654 } |
| 655 } | 655 } |
| 656 return false; | 656 return false; |
| 657 } | 657 } |
| 658 | 658 |
| 659 static bool FontAccessible(FcPattern* font) { | 659 static bool FontAccessible(FcPattern* font) { |
| 660 // FontConfig can return fonts which are unreadable. | 660 // FontConfig can return fonts which are unreadable. |
| 661 const char* filename = get_string(font, FC_FILE, NULL); | 661 const char* filename = get_string(font, FC_FILE, nullptr); |
| 662 if (NULL == filename) { | 662 if (nullptr == filename) { |
| 663 return false; | 663 return false; |
| 664 } | 664 } |
| 665 return sk_exists(filename, kRead_SkFILE_Flag); | 665 return sk_exists(filename, kRead_SkFILE_Flag); |
| 666 } | 666 } |
| 667 | 667 |
| 668 static bool FontFamilyNameMatches(FcPattern* font, FcPattern* pattern) { | 668 static bool FontFamilyNameMatches(FcPattern* font, FcPattern* pattern) { |
| 669 return AnyMatching(font, pattern, FC_FAMILY); | 669 return AnyMatching(font, pattern, FC_FAMILY); |
| 670 } | 670 } |
| 671 | 671 |
| 672 static bool FontContainsCharacter(FcPattern* font, uint32_t character) { | 672 static bool FontContainsCharacter(FcPattern* font, uint32_t character) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 689 | 689 |
| 690 SkFontStyleSet* onMatchFamily(const char familyName[]) const override { | 690 SkFontStyleSet* onMatchFamily(const char familyName[]) const override { |
| 691 FCLocker lock; | 691 FCLocker lock; |
| 692 | 692 |
| 693 SkAutoFcPattern pattern; | 693 SkAutoFcPattern pattern; |
| 694 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); | 694 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); |
| 695 FcConfigSubstitute(fFC, pattern, FcMatchPattern); | 695 FcConfigSubstitute(fFC, pattern, FcMatchPattern); |
| 696 FcDefaultSubstitute(pattern); | 696 FcDefaultSubstitute(pattern); |
| 697 | 697 |
| 698 FcPattern* matchPattern; | 698 FcPattern* matchPattern; |
| 699 SkAutoFcPattern strongPattern(NULL); | 699 SkAutoFcPattern strongPattern(nullptr); |
| 700 if (familyName) { | 700 if (familyName) { |
| 701 strongPattern.reset(FcPatternDuplicate(pattern)); | 701 strongPattern.reset(FcPatternDuplicate(pattern)); |
| 702 remove_weak(strongPattern, FC_FAMILY); | 702 remove_weak(strongPattern, FC_FAMILY); |
| 703 matchPattern = strongPattern; | 703 matchPattern = strongPattern; |
| 704 } else { | 704 } else { |
| 705 matchPattern = pattern; | 705 matchPattern = pattern; |
| 706 } | 706 } |
| 707 | 707 |
| 708 SkAutoFcFontSet matches; | 708 SkAutoFcFontSet matches; |
| 709 // TODO: Some families have 'duplicates' due to symbolic links. | 709 // TODO: Some families have 'duplicates' due to symbolic links. |
| 710 // The patterns are exactly the same except for the FC_FILE. | 710 // The patterns are exactly the same except for the FC_FILE. |
| 711 // It should be possible to collapse these patterns by normalizing. | 711 // It should be possible to collapse these patterns by normalizing. |
| 712 static const FcSetName fcNameSet[] = { FcSetSystem, FcSetApplication }; | 712 static const FcSetName fcNameSet[] = { FcSetSystem, FcSetApplication }; |
| 713 for (int setIndex = 0; setIndex < (int)SK_ARRAY_COUNT(fcNameSet); ++setI
ndex) { | 713 for (int setIndex = 0; setIndex < (int)SK_ARRAY_COUNT(fcNameSet); ++setI
ndex) { |
| 714 // Return value of FcConfigGetFonts must not be destroyed. | 714 // Return value of FcConfigGetFonts must not be destroyed. |
| 715 FcFontSet* allFonts(FcConfigGetFonts(fFC, fcNameSet[setIndex])); | 715 FcFontSet* allFonts(FcConfigGetFonts(fFC, fcNameSet[setIndex])); |
| 716 if (NULL == allFonts) { | 716 if (nullptr == allFonts) { |
| 717 continue; | 717 continue; |
| 718 } | 718 } |
| 719 | 719 |
| 720 for (int fontIndex = 0; fontIndex < allFonts->nfont; ++fontIndex) { | 720 for (int fontIndex = 0; fontIndex < allFonts->nfont; ++fontIndex) { |
| 721 FcPattern* font = allFonts->fonts[fontIndex]; | 721 FcPattern* font = allFonts->fonts[fontIndex]; |
| 722 if (FontAccessible(font) && FontFamilyNameMatches(font, matchPat
tern)) { | 722 if (FontAccessible(font) && FontFamilyNameMatches(font, matchPat
tern)) { |
| 723 FcFontSetAdd(matches, FcFontRenderPrepare(fFC, pattern, font
)); | 723 FcFontSetAdd(matches, FcFontRenderPrepare(fFC, pattern, font
)); |
| 724 } | 724 } |
| 725 } | 725 } |
| 726 } | 726 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 741 | 741 |
| 742 // We really want to match strong (prefered) and same (acceptable) only
here. | 742 // We really want to match strong (prefered) and same (acceptable) only
here. |
| 743 // If a family name was specified, assume that any weak matches after th
e last strong match | 743 // If a family name was specified, assume that any weak matches after th
e last strong match |
| 744 // are weak (default) and ignore them. | 744 // are weak (default) and ignore them. |
| 745 // The reason for is that after substitution the pattern for 'sans-serif
' looks like | 745 // The reason for is that after substitution the pattern for 'sans-serif
' looks like |
| 746 // "wwwwwwwwwwwwwwswww" where there are many weak but preferred names, f
ollowed by defaults. | 746 // "wwwwwwwwwwwwwwswww" where there are many weak but preferred names, f
ollowed by defaults. |
| 747 // So it is possible to have weakly matching but preferred names. | 747 // So it is possible to have weakly matching but preferred names. |
| 748 // In aliases, bindings are weak by default, so this is easy and common. | 748 // In aliases, bindings are weak by default, so this is easy and common. |
| 749 // If no family name was specified, we'll probably only get weak matches
, but that's ok. | 749 // If no family name was specified, we'll probably only get weak matches
, but that's ok. |
| 750 FcPattern* matchPattern; | 750 FcPattern* matchPattern; |
| 751 SkAutoFcPattern strongPattern(NULL); | 751 SkAutoFcPattern strongPattern(nullptr); |
| 752 if (familyName) { | 752 if (familyName) { |
| 753 strongPattern.reset(FcPatternDuplicate(pattern)); | 753 strongPattern.reset(FcPatternDuplicate(pattern)); |
| 754 remove_weak(strongPattern, FC_FAMILY); | 754 remove_weak(strongPattern, FC_FAMILY); |
| 755 matchPattern = strongPattern; | 755 matchPattern = strongPattern; |
| 756 } else { | 756 } else { |
| 757 matchPattern = pattern; | 757 matchPattern = pattern; |
| 758 } | 758 } |
| 759 | 759 |
| 760 FcResult result; | 760 FcResult result; |
| 761 SkAutoFcPattern font(FcFontMatch(fFC, pattern, &result)); | 761 SkAutoFcPattern font(FcFontMatch(fFC, pattern, &result)); |
| 762 if (NULL == font || !FontAccessible(font) || !FontFamilyNameMatches(font
, matchPattern)) { | 762 if (nullptr == font || !FontAccessible(font) || !FontFamilyNameMatches(f
ont, matchPattern)) { |
| 763 return NULL; | 763 return nullptr; |
| 764 } | 764 } |
| 765 | 765 |
| 766 return createTypefaceFromFcPattern(font); | 766 return createTypefaceFromFcPattern(font); |
| 767 } | 767 } |
| 768 | 768 |
| 769 virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], | 769 virtual SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], |
| 770 const SkFontStyle& style, | 770 const SkFontStyle& style, |
| 771 const char* bcp47[], | 771 const char* bcp47[], |
| 772 int bcp47Count, | 772 int bcp47Count, |
| 773 SkUnichar character) const o
verride | 773 SkUnichar character) const o
verride |
| (...skipping 20 matching lines...) Expand all Loading... |
| 794 FcLangSetAdd(langSet, (const FcChar8*)bcp47[i]); | 794 FcLangSetAdd(langSet, (const FcChar8*)bcp47[i]); |
| 795 } | 795 } |
| 796 FcPatternAddLangSet(pattern, FC_LANG, langSet); | 796 FcPatternAddLangSet(pattern, FC_LANG, langSet); |
| 797 } | 797 } |
| 798 | 798 |
| 799 FcConfigSubstitute(fFC, pattern, FcMatchPattern); | 799 FcConfigSubstitute(fFC, pattern, FcMatchPattern); |
| 800 FcDefaultSubstitute(pattern); | 800 FcDefaultSubstitute(pattern); |
| 801 | 801 |
| 802 FcResult result; | 802 FcResult result; |
| 803 SkAutoFcPattern font(FcFontMatch(fFC, pattern, &result)); | 803 SkAutoFcPattern font(FcFontMatch(fFC, pattern, &result)); |
| 804 if (NULL == font || !FontAccessible(font) || !FontContainsCharacter(font
, character)) { | 804 if (nullptr == font || !FontAccessible(font) || !FontContainsCharacter(f
ont, character)) { |
| 805 return NULL; | 805 return nullptr; |
| 806 } | 806 } |
| 807 | 807 |
| 808 return createTypefaceFromFcPattern(font); | 808 return createTypefaceFromFcPattern(font); |
| 809 } | 809 } |
| 810 | 810 |
| 811 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* typeface, | 811 virtual SkTypeface* onMatchFaceStyle(const SkTypeface* typeface, |
| 812 const SkFontStyle& style) const overrid
e | 812 const SkFontStyle& style) const overrid
e |
| 813 { | 813 { |
| 814 //TODO: should the SkTypeface_fontconfig know its family? | 814 //TODO: should the SkTypeface_fontconfig know its family? |
| 815 const SkTypeface_fontconfig* fcTypeface = | 815 const SkTypeface_fontconfig* fcTypeface = |
| 816 static_cast<const SkTypeface_fontconfig*>(typeface); | 816 static_cast<const SkTypeface_fontconfig*>(typeface); |
| 817 return this->matchFamilyStyle(get_string(fcTypeface->fPattern, FC_FAMILY
), style); | 817 return this->matchFamilyStyle(get_string(fcTypeface->fPattern, FC_FAMILY
), style); |
| 818 } | 818 } |
| 819 | 819 |
| 820 SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) cons
t override { | 820 SkTypeface* onCreateFromStream(SkStreamAsset* bareStream, int ttcIndex) cons
t override { |
| 821 SkAutoTDelete<SkStreamAsset> stream(bareStream); | 821 SkAutoTDelete<SkStreamAsset> stream(bareStream); |
| 822 const size_t length = stream->getLength(); | 822 const size_t length = stream->getLength(); |
| 823 if (length <= 0 || (1u << 30) < length) { | 823 if (length <= 0 || (1u << 30) < length) { |
| 824 return NULL; | 824 return nullptr; |
| 825 } | 825 } |
| 826 | 826 |
| 827 SkFontStyle style; | 827 SkFontStyle style; |
| 828 bool isFixedWidth = false; | 828 bool isFixedWidth = false; |
| 829 if (!fScanner.scanFont(stream, ttcIndex, NULL, &style, &isFixedWidth, NU
LL)) { | 829 if (!fScanner.scanFont(stream, ttcIndex, nullptr, &style, &isFixedWidth,
nullptr)) { |
| 830 return NULL; | 830 return nullptr; |
| 831 } | 831 } |
| 832 | 832 |
| 833 return new SkTypeface_stream(new SkFontData(stream.detach(), ttcIndex, N
ULL, 0), style, | 833 return new SkTypeface_stream(new SkFontData(stream.detach(), ttcIndex, n
ullptr, 0), style, |
| 834 isFixedWidth); | 834 isFixedWidth); |
| 835 } | 835 } |
| 836 | 836 |
| 837 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override { | 837 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override { |
| 838 return this->createFromStream(new SkMemoryStream(data), ttcIndex); | 838 return this->createFromStream(new SkMemoryStream(data), ttcIndex); |
| 839 } | 839 } |
| 840 | 840 |
| 841 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override
{ | 841 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override
{ |
| 842 return this->createFromStream(SkStream::NewFromFile(path), ttcIndex); | 842 return this->createFromStream(SkStream::NewFromFile(path), ttcIndex); |
| 843 } | 843 } |
| 844 | 844 |
| 845 SkTypeface* onCreateFromFontData(SkFontData* fontData) const override { | 845 SkTypeface* onCreateFromFontData(SkFontData* fontData) const override { |
| 846 SkStreamAsset* stream(fontData->getStream()); | 846 SkStreamAsset* stream(fontData->getStream()); |
| 847 const size_t length = stream->getLength(); | 847 const size_t length = stream->getLength(); |
| 848 if (length <= 0 || (1u << 30) < length) { | 848 if (length <= 0 || (1u << 30) < length) { |
| 849 return NULL; | 849 return nullptr; |
| 850 } | 850 } |
| 851 | 851 |
| 852 const int ttcIndex = fontData->getIndex(); | 852 const int ttcIndex = fontData->getIndex(); |
| 853 SkFontStyle style; | 853 SkFontStyle style; |
| 854 bool isFixedWidth = false; | 854 bool isFixedWidth = false; |
| 855 if (!fScanner.scanFont(stream, ttcIndex, NULL, &style, &isFixedWidth, NU
LL)) { | 855 if (!fScanner.scanFont(stream, ttcIndex, nullptr, &style, &isFixedWidth,
nullptr)) { |
| 856 return NULL; | 856 return nullptr; |
| 857 } | 857 } |
| 858 | 858 |
| 859 return new SkTypeface_stream(fontData, style, isFixedWidth); | 859 return new SkTypeface_stream(fontData, style, isFixedWidth); |
| 860 } | 860 } |
| 861 | 861 |
| 862 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], | 862 virtual SkTypeface* onLegacyCreateTypeface(const char familyName[], |
| 863 unsigned styleBits) const overrid
e { | 863 unsigned styleBits) const overrid
e { |
| 864 bool bold = styleBits & SkTypeface::kBold; | 864 bool bold = styleBits & SkTypeface::kBold; |
| 865 bool italic = styleBits & SkTypeface::kItalic; | 865 bool italic = styleBits & SkTypeface::kItalic; |
| 866 SkFontStyle style = SkFontStyle(bold ? SkFontStyle::kBold_Weight | 866 SkFontStyle style = SkFontStyle(bold ? SkFontStyle::kBold_Weight |
| 867 : SkFontStyle::kNormal_Weight, | 867 : SkFontStyle::kNormal_Weight, |
| 868 SkFontStyle::kNormal_Width, | 868 SkFontStyle::kNormal_Width, |
| 869 italic ? SkFontStyle::kItalic_Slant | 869 italic ? SkFontStyle::kItalic_Slant |
| 870 : SkFontStyle::kUpright_Slant); | 870 : SkFontStyle::kUpright_Slant); |
| 871 SkAutoTUnref<SkTypeface> typeface(this->matchFamilyStyle(familyName, sty
le)); | 871 SkAutoTUnref<SkTypeface> typeface(this->matchFamilyStyle(familyName, sty
le)); |
| 872 if (typeface.get()) { | 872 if (typeface.get()) { |
| 873 return typeface.detach(); | 873 return typeface.detach(); |
| 874 } | 874 } |
| 875 | 875 |
| 876 return this->matchFamilyStyle(NULL, style); | 876 return this->matchFamilyStyle(nullptr, style); |
| 877 } | 877 } |
| 878 }; | 878 }; |
| 879 | 879 |
| 880 SK_API SkFontMgr* SkFontMgr_New_FontConfig(FcConfig* fc) { | 880 SK_API SkFontMgr* SkFontMgr_New_FontConfig(FcConfig* fc) { |
| 881 return new SkFontMgr_fontconfig(fc); | 881 return new SkFontMgr_fontconfig(fc); |
| 882 } | 882 } |
| OLD | NEW |