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 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 FcLangSetAdd(strongLangSet, (const FcChar8*)"nomatchlang"); | 189 FcLangSetAdd(strongLangSet, (const FcChar8*)"nomatchlang"); |
190 SkAutoFcPattern strong(FcPatternDuplicate(minimal)); | 190 SkAutoFcPattern strong(FcPatternDuplicate(minimal)); |
191 FcPatternAddLangSet(strong, FC_LANG, strongLangSet); | 191 FcPatternAddLangSet(strong, FC_LANG, strongLangSet); |
192 | 192 |
193 SkAutoFcLangSet weakLangSet; | 193 SkAutoFcLangSet weakLangSet; |
194 FcLangSetAdd(weakLangSet, (const FcChar8*)"matchlang"); | 194 FcLangSetAdd(weakLangSet, (const FcChar8*)"matchlang"); |
195 SkAutoFcPattern weak; | 195 SkAutoFcPattern weak; |
196 FcPatternAddString(weak, object, (const FcChar8*)"nomatchstring"); | 196 FcPatternAddString(weak, object, (const FcChar8*)"nomatchstring"); |
197 FcPatternAddLangSet(weak, FC_LANG, weakLangSet); | 197 FcPatternAddLangSet(weak, FC_LANG, weakLangSet); |
198 | 198 |
199 FcFontSetAdd(fontSet, strong.detach()); | 199 FcFontSetAdd(fontSet, strong.release()); |
200 FcFontSetAdd(fontSet, weak.detach()); | 200 FcFontSetAdd(fontSet, weak.release()); |
201 | 201 |
202 // Add 'matchlang' to the copy of the pattern. | 202 // Add 'matchlang' to the copy of the pattern. |
203 FcPatternAddLangSet(minimal, FC_LANG, weakLangSet); | 203 FcPatternAddLangSet(minimal, FC_LANG, weakLangSet); |
204 | 204 |
205 // Run a match against the copy of the pattern. | 205 // Run a match against the copy of the pattern. |
206 // If the 'id' was weak, then we should match the pattern with 'matchlang'. | 206 // If the 'id' was weak, then we should match the pattern with 'matchlang'. |
207 // If the 'id' was strong, then we should match the pattern with 'nomatchlan
g'. | 207 // If the 'id' was strong, then we should match the pattern with 'nomatchlan
g'. |
208 | 208 |
209 // Note that this config is only used for FcFontRenderPrepare, which we don'
t even want. | 209 // Note that this config is only used for FcFontRenderPrepare, which we don'
t even want. |
210 // However, there appears to be no way to match/sort without it. | 210 // However, there appears to be no way to match/sort without it. |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 } |
727 | 727 |
728 return new StyleSet(this, matches.detach()); | 728 return new StyleSet(this, matches.release()); |
729 } | 729 } |
730 | 730 |
731 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], | 731 virtual SkTypeface* onMatchFamilyStyle(const char familyName[], |
732 const SkFontStyle& style) const overr
ide | 732 const SkFontStyle& style) const overr
ide |
733 { | 733 { |
734 FCLocker lock; | 734 FCLocker lock; |
735 | 735 |
736 SkAutoFcPattern pattern; | 736 SkAutoFcPattern pattern; |
737 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); | 737 FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)familyName); |
738 fcpattern_from_skfontstyle(style, pattern); | 738 fcpattern_from_skfontstyle(style, pattern); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 if (length <= 0 || (1u << 30) < length) { | 823 if (length <= 0 || (1u << 30) < length) { |
824 return nullptr; | 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, nullptr, &style, &isFixedWidth,
nullptr)) { | 829 if (!fScanner.scanFont(stream, ttcIndex, nullptr, &style, &isFixedWidth,
nullptr)) { |
830 return nullptr; | 830 return nullptr; |
831 } | 831 } |
832 | 832 |
833 return new SkTypeface_stream(new SkFontData(stream.detach(), ttcIndex, n
ullptr, 0), style, | 833 return new SkTypeface_stream(new SkFontData(stream.release(), ttcIndex,
nullptr, 0), style, |
834 isFixedWidth); | 834 isFixedWidth); |
835 } | 835 } |
836 | 836 |
837 SkTypeface* onCreateFromStream(SkStreamAsset* s, const FontParameters& param
s) const override { | 837 SkTypeface* onCreateFromStream(SkStreamAsset* s, const FontParameters& param
s) const override { |
838 using Scanner = SkTypeface_FreeType::Scanner; | 838 using Scanner = SkTypeface_FreeType::Scanner; |
839 SkAutoTDelete<SkStreamAsset> stream(s); | 839 SkAutoTDelete<SkStreamAsset> stream(s); |
840 bool isFixedPitch; | 840 bool isFixedPitch; |
841 SkFontStyle style; | 841 SkFontStyle style; |
842 SkString name; | 842 SkString name; |
843 Scanner::AxisDefinitions axisDefinitions; | 843 Scanner::AxisDefinitions axisDefinitions; |
844 if (!fScanner.scanFont(stream, params.getCollectionIndex(), &name, &styl
e, &isFixedPitch, | 844 if (!fScanner.scanFont(stream, params.getCollectionIndex(), &name, &styl
e, &isFixedPitch, |
845 &axisDefinitions)) | 845 &axisDefinitions)) |
846 { | 846 { |
847 return nullptr; | 847 return nullptr; |
848 } | 848 } |
849 | 849 |
850 int paramAxisCount; | 850 int paramAxisCount; |
851 const FontParameters::Axis* paramAxes = params.getAxes(¶mAxisCount); | 851 const FontParameters::Axis* paramAxes = params.getAxes(¶mAxisCount); |
852 SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count()); | 852 SkAutoSTMalloc<4, SkFixed> axisValues(axisDefinitions.count()); |
853 Scanner::computeAxisValues(axisDefinitions, paramAxes, paramAxisCount, a
xisValues, name); | 853 Scanner::computeAxisValues(axisDefinitions, paramAxes, paramAxisCount, a
xisValues, name); |
854 | 854 |
855 SkFontData* data(new SkFontData(stream.detach(), params.getCollectionInd
ex(), | 855 SkFontData* data(new SkFontData(stream.release(), params.getCollectionIn
dex(), |
856 axisValues.get(), axisDefinitions.count(
))); | 856 axisValues.get(), axisDefinitions.count(
))); |
857 return new SkTypeface_stream(data, style, isFixedPitch); | 857 return new SkTypeface_stream(data, style, isFixedPitch); |
858 } | 858 } |
859 | 859 |
860 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override { | 860 SkTypeface* onCreateFromData(SkData* data, int ttcIndex) const override { |
861 return this->createFromStream(new SkMemoryStream(data), ttcIndex); | 861 return this->createFromStream(new SkMemoryStream(data), ttcIndex); |
862 } | 862 } |
863 | 863 |
864 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override
{ | 864 SkTypeface* onCreateFromFile(const char path[], int ttcIndex) const override
{ |
865 return this->createFromStream(SkStream::NewFromFile(path), ttcIndex); | 865 return this->createFromStream(SkStream::NewFromFile(path), ttcIndex); |
(...skipping 20 matching lines...) Expand all Loading... |
886 unsigned styleBits) const overrid
e { | 886 unsigned styleBits) const overrid
e { |
887 bool bold = styleBits & SkTypeface::kBold; | 887 bool bold = styleBits & SkTypeface::kBold; |
888 bool italic = styleBits & SkTypeface::kItalic; | 888 bool italic = styleBits & SkTypeface::kItalic; |
889 SkFontStyle style = SkFontStyle(bold ? SkFontStyle::kBold_Weight | 889 SkFontStyle style = SkFontStyle(bold ? SkFontStyle::kBold_Weight |
890 : SkFontStyle::kNormal_Weight, | 890 : SkFontStyle::kNormal_Weight, |
891 SkFontStyle::kNormal_Width, | 891 SkFontStyle::kNormal_Width, |
892 italic ? SkFontStyle::kItalic_Slant | 892 italic ? SkFontStyle::kItalic_Slant |
893 : SkFontStyle::kUpright_Slant); | 893 : SkFontStyle::kUpright_Slant); |
894 SkAutoTUnref<SkTypeface> typeface(this->matchFamilyStyle(familyName, sty
le)); | 894 SkAutoTUnref<SkTypeface> typeface(this->matchFamilyStyle(familyName, sty
le)); |
895 if (typeface.get()) { | 895 if (typeface.get()) { |
896 return typeface.detach(); | 896 return typeface.release(); |
897 } | 897 } |
898 | 898 |
899 return this->matchFamilyStyle(nullptr, style); | 899 return this->matchFamilyStyle(nullptr, style); |
900 } | 900 } |
901 }; | 901 }; |
902 | 902 |
903 SK_API SkFontMgr* SkFontMgr_New_FontConfig(FcConfig* fc) { | 903 SK_API SkFontMgr* SkFontMgr_New_FontConfig(FcConfig* fc) { |
904 return new SkFontMgr_fontconfig(fc); | 904 return new SkFontMgr_fontconfig(fc); |
905 } | 905 } |
OLD | NEW |