| /* |
| * Copyright 2013 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/core/SkFont.h" |
| #include "include/core/SkFontArguments.h" |
| #include "include/core/SkFontMgr.h" |
| #include "include/core/SkFontParameters.h" |
| #include "include/core/SkFontStyle.h" |
| #include "include/core/SkFontTypes.h" |
| #include "include/core/SkRefCnt.h" |
| #include "include/core/SkStream.h" |
| #include "include/core/SkString.h" |
| #include "include/core/SkTypeface.h" |
| #include "include/core/SkTypes.h" |
| #include "include/private/base/SkDebug.h" |
| #include "include/private/base/SkMalloc.h" |
| #include "src/core/SkAdvancedTypefaceMetrics.h" // IWYU pragma: keep |
| #include "src/core/SkScalerContext.h" |
| #include "tests/Test.h" |
| #include "tools/flags/CommandLineFlags.h" |
| |
| #include <cstddef> |
| #include <cstdint> |
| #include <initializer_list> |
| #include <memory> |
| #include <vector> |
| |
| class SkDescriptor; |
| class SkFontDescriptor; |
| |
| DECLARE_bool(verboseFontMgr) |
| |
| DEF_TEST(FontMgr_Font, reporter) { |
| SkFont font(nullptr, 24); |
| |
| //REPORTER_ASSERT(reporter, SkTypeface::GetDefaultTypeface() == font.getTypeface()); |
| REPORTER_ASSERT(reporter, 24 == font.getSize()); |
| REPORTER_ASSERT(reporter, 1 == font.getScaleX()); |
| REPORTER_ASSERT(reporter, 0 == font.getSkewX()); |
| |
| uint16_t glyphs[5]; |
| sk_bzero(glyphs, sizeof(glyphs)); |
| |
| // Check that no glyphs are copied with insufficient storage. |
| int count = font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, 2); |
| REPORTER_ASSERT(reporter, 5 == count); |
| for (const auto glyph : glyphs) { REPORTER_ASSERT(reporter, glyph == 0); } |
| |
| SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, |
| std::size(glyphs)) == count); |
| |
| for (int i = 0; i < count; ++i) { |
| REPORTER_ASSERT(reporter, 0 != glyphs[i]); |
| } |
| REPORTER_ASSERT(reporter, glyphs[0] != glyphs[1]); // 'h' != 'e' |
| REPORTER_ASSERT(reporter, glyphs[2] == glyphs[3]); // 'l' == 'l' |
| |
| const SkFont newFont(font.makeWithSize(36)); |
| REPORTER_ASSERT(reporter, font.getTypefaceOrDefault() == newFont.getTypefaceOrDefault()); |
| REPORTER_ASSERT(reporter, 36 == newFont.getSize()); // double check we haven't changed |
| REPORTER_ASSERT(reporter, 24 == font.getSize()); // double check we haven't changed |
| } |
| |
| /* |
| * If the font backend is going to "alias" some font names to other fonts |
| * (e.g. sans -> Arial) then we want to at least get the same typeface back |
| * if we request the alias name multiple times. |
| */ |
| DEF_TEST(FontMgr_AliasNames, reporter) { |
| const char* inNames[] = { |
| "sans", "sans-serif", "serif", "monospace", "times", "helvetica" |
| }; |
| |
| for (size_t i = 0; i < std::size(inNames); ++i) { |
| sk_sp<SkTypeface> first(SkTypeface::MakeFromName(inNames[i], SkFontStyle())); |
| if (nullptr == first.get()) { |
| continue; |
| } |
| SkString firstName; |
| first->getFamilyName(&firstName); |
| for (int j = 0; j < 10; ++j) { |
| sk_sp<SkTypeface> face(SkTypeface::MakeFromName(inNames[i], SkFontStyle())); |
| |
| SkString name; |
| face->getFamilyName(&name); |
| REPORTER_ASSERT(reporter, first->uniqueID() == face->uniqueID(), |
| "Request \"%s\" First Name: \"%s\" Id: %x Received Name \"%s\" Id %x", |
| inNames[i], firstName.c_str(), first->uniqueID(), name.c_str(), face->uniqueID()); |
| } |
| } |
| } |
| |
| DEF_TEST(FontMgr_Iter, reporter) { |
| sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault()); |
| int count = fm->countFamilies(); |
| |
| for (int i = 0; i < count; ++i) { |
| SkString fname; |
| fm->getFamilyName(i, &fname); |
| |
| sk_sp<SkFontStyleSet> fnset(fm->matchFamily(fname.c_str())); |
| sk_sp<SkFontStyleSet> set(fm->createStyleSet(i)); |
| REPORTER_ASSERT(reporter, fnset->count() == set->count()); |
| |
| if (FLAGS_verboseFontMgr) { |
| SkDebugf("[%2d] %s\n", i, fname.c_str()); |
| } |
| |
| for (int j = 0; j < set->count(); ++j) { |
| SkString sname; |
| SkFontStyle fs; |
| set->getStyle(j, &fs, &sname); |
| |
| if (FLAGS_verboseFontMgr) { |
| SkDebugf("\t[%d] %s [%3d %d %d]\n", j, sname.c_str(), |
| fs.weight(), fs.width(), fs.slant()); |
| } |
| |
| sk_sp<SkTypeface> face1(set->createTypeface(j)); |
| if (!face1) { |
| REPORTER_ASSERT(reporter, face1.get()); |
| continue; |
| } |
| SkString name1; |
| face1->getFamilyName(&name1); |
| SkFontStyle s1 = face1->fontStyle(); |
| |
| // Note that fs != s1 is fine, though probably rare. |
| |
| sk_sp<SkTypeface> face2(fm->matchFamilyStyle(name1.c_str(), s1)); |
| if (!face2) { |
| REPORTER_ASSERT(reporter, face2.get()); |
| continue; |
| } |
| SkString name2; |
| face2->getFamilyName(&name2); |
| |
| REPORTER_ASSERT(reporter, name1 == name2, "%s == %s", name1.c_str(), name2.c_str()); |
| |
| // TODO: This should work, but Mac matches the wrong font sometimes. |
| if ((false)) { |
| SkFontStyle s2 = face2->fontStyle(); |
| REPORTER_ASSERT(reporter, s1 == s2, "%s [%3d %d %d] != %s [%3d %d %d]", |
| name1.c_str(), s1.weight(), s1.width(), s1.slant(), |
| name2.c_str(), s2.weight(), s2.width(), s2.slant()); |
| } |
| } |
| } |
| } |
| |
| DEF_TEST(FontMgr_Match, reporter) { |
| sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault()); |
| sk_sp<SkFontStyleSet> styleSet(fm->matchFamily(nullptr)); |
| REPORTER_ASSERT(reporter, styleSet); |
| } |
| |
| DEF_TEST(FontMgr_MatchFamilyStyle, reporter) { |
| sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault()); |
| |
| sk_sp<SkFontStyleSet> styleSet(fm->matchFamily("Non Existing Family Name")); |
| REPORTER_ASSERT(reporter, styleSet); |
| REPORTER_ASSERT(reporter, styleSet->count() == 0); |
| |
| using FS = SkFontStyle; |
| sk_sp<SkTypeface> typeface(fm->matchFamilyStyle("Non Existing Family Name", FS::Normal())); |
| REPORTER_ASSERT(reporter, !typeface); |
| |
| // TODO: enable after determining if a default font should be required. |
| if ((false)) { |
| sk_sp<SkTypeface> def(fm->matchFamilyStyle(nullptr, FS::Normal())); |
| REPORTER_ASSERT(reporter, def); |
| } |
| } |
| |
| DEF_TEST(FontMgr_MatchStyleCSS3, reporter) { |
| static const SkFontStyle invalidFontStyle(101, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant); |
| |
| class TestTypeface : public SkTypeface { |
| public: |
| TestTypeface(const SkFontStyle& fontStyle) : SkTypeface(fontStyle, false){} |
| protected: |
| std::unique_ptr<SkStreamAsset> onOpenStream(int* ttcIndex) const override { return nullptr; } |
| sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override { |
| return sk_ref_sp(this); |
| } |
| std::unique_ptr<SkScalerContext> onCreateScalerContext( |
| const SkScalerContextEffects& effects, const SkDescriptor* desc) const override |
| { |
| return SkScalerContext::MakeEmpty( |
| sk_ref_sp(const_cast<TestTypeface*>(this)), effects, desc); |
| } |
| void onFilterRec(SkScalerContextRec*) const override { } |
| std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override { |
| return nullptr; |
| } |
| void onGetFontDescriptor(SkFontDescriptor*, bool*) const override { } |
| void onCharsToGlyphs(const SkUnichar* chars, int count, SkGlyphID glyphs[]) const override { |
| sk_bzero(glyphs, count * sizeof(glyphs[0])); |
| } |
| int onCountGlyphs() const override { return 0; } |
| void getPostScriptGlyphNames(SkString*) const override {} |
| void getGlyphToUnicodeMap(SkUnichar*) const override {} |
| int onGetUPEM() const override { return 0; } |
| class EmptyLocalizedStrings : public SkTypeface::LocalizedStrings { |
| public: |
| bool next(SkTypeface::LocalizedString*) override { return false; } |
| }; |
| void onGetFamilyName(SkString* familyName) const override { |
| familyName->reset(); |
| } |
| bool onGetPostScriptName(SkString*) const override { return false; } |
| SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override { |
| return new EmptyLocalizedStrings; |
| } |
| bool onGlyphMaskNeedsCurrentColor() const override { return false; } |
| int onGetVariationDesignPosition( |
| SkFontArguments::VariationPosition::Coordinate coordinates[], |
| int coordinateCount) const override |
| { |
| return 0; |
| } |
| int onGetVariationDesignParameters(SkFontParameters::Variation::Axis parameters[], |
| int parameterCount) const override |
| { |
| return -1; |
| } |
| int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } |
| size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override { |
| return 0; |
| } |
| }; |
| |
| class TestFontStyleSet : public SkFontStyleSet { |
| public: |
| TestFontStyleSet(std::initializer_list<SkFontStyle> styles) : fStyles(styles) {} |
| int count() override { return static_cast<int>(fStyles.size()); } |
| void getStyle(int index, SkFontStyle* style, SkString*) override { |
| if (style) { |
| *style = fStyles[index]; |
| } |
| } |
| SkTypeface* createTypeface(int index) override { |
| if (index < 0 || this->count() <= index) { |
| return new TestTypeface(invalidFontStyle); |
| } |
| return new TestTypeface(fStyles[index]); |
| } |
| SkTypeface* matchStyle(const SkFontStyle& pattern) override { |
| return this->matchStyleCSS3(pattern); |
| } |
| private: |
| std::vector<SkFontStyle> fStyles; |
| }; |
| |
| SkFontStyle condensed_normal_100(SkFontStyle::kThin_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle condensed_normal_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle condensed_italic_100(SkFontStyle::kThin_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kItalic_Slant); |
| SkFontStyle condensed_italic_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kItalic_Slant); |
| SkFontStyle condensed_obliqu_100(SkFontStyle::kThin_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kOblique_Slant); |
| SkFontStyle condensed_obliqu_900(SkFontStyle::kBlack_Weight, SkFontStyle::kCondensed_Width, SkFontStyle::kOblique_Slant); |
| SkFontStyle expanded_normal_100(SkFontStyle::kThin_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle expanded_normal_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle expanded_italic_100(SkFontStyle::kThin_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kItalic_Slant); |
| SkFontStyle expanded_italic_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kItalic_Slant); |
| SkFontStyle expanded_obliqu_100(SkFontStyle::kThin_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kOblique_Slant); |
| SkFontStyle expanded_obliqu_900(SkFontStyle::kBlack_Weight, SkFontStyle::kExpanded_Width, SkFontStyle::kOblique_Slant); |
| |
| SkFontStyle normal_normal_100(SkFontStyle::kThin_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle normal_normal_300(SkFontStyle::kLight_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle normal_normal_400(SkFontStyle::kNormal_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle normal_normal_500(SkFontStyle::kMedium_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle normal_normal_600(SkFontStyle::kSemiBold_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant); |
| SkFontStyle normal_normal_900(SkFontStyle::kBlack_Weight, SkFontStyle::kNormal_Width, SkFontStyle::kUpright_Slant); |
| |
| struct StyleSetTest { |
| TestFontStyleSet styleSet; |
| struct Case { |
| SkFontStyle pattern; |
| SkFontStyle expectedResult; |
| }; |
| std::vector<Case> cases; |
| } tests[] = { |
| { |
| { normal_normal_500, normal_normal_400 }, |
| { |
| { normal_normal_400, normal_normal_400 }, |
| { normal_normal_500, normal_normal_500 }, |
| }, |
| }, |
| |
| { |
| { normal_normal_500, normal_normal_300 }, |
| { |
| { normal_normal_300, normal_normal_300 }, |
| { normal_normal_400, normal_normal_500 }, |
| { normal_normal_500, normal_normal_500 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_100,condensed_normal_900,condensed_italic_100,condensed_italic_900, |
| expanded_normal_100, expanded_normal_900, expanded_italic_100, expanded_italic_900 }, |
| { |
| { condensed_normal_100, condensed_normal_100 }, |
| { condensed_normal_900, condensed_normal_900 }, |
| { condensed_italic_100, condensed_italic_100 }, |
| { condensed_italic_900, condensed_italic_900 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_100,condensed_italic_100,expanded_normal_100,expanded_italic_100 }, |
| { |
| { condensed_normal_100, condensed_normal_100 }, |
| { condensed_normal_900, condensed_normal_100 }, |
| { condensed_italic_100, condensed_italic_100 }, |
| { condensed_italic_900, condensed_italic_100 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_100 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_100 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_900,condensed_italic_900,expanded_normal_900,expanded_italic_900 }, |
| { |
| { condensed_normal_100, condensed_normal_900 }, |
| { condensed_normal_900, condensed_normal_900 }, |
| { condensed_italic_100, condensed_italic_900 }, |
| { condensed_italic_900, condensed_italic_900 }, |
| { expanded_normal_100, expanded_normal_900 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_italic_900 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_100,condensed_normal_900,expanded_normal_100,expanded_normal_900 }, |
| { |
| { condensed_normal_100, condensed_normal_100 }, |
| { condensed_normal_900, condensed_normal_900 }, |
| { condensed_italic_100, condensed_normal_100 }, |
| { condensed_italic_900, condensed_normal_900 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_normal_100 }, |
| { expanded_italic_900, expanded_normal_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_100,expanded_normal_100 }, |
| { |
| { condensed_normal_100, condensed_normal_100 }, |
| { condensed_normal_900, condensed_normal_100 }, |
| { condensed_italic_100, condensed_normal_100 }, |
| { condensed_italic_900, condensed_normal_100 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_100 }, |
| { expanded_italic_100, expanded_normal_100 }, |
| { expanded_italic_900, expanded_normal_100 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_900,expanded_normal_900 }, |
| { |
| { condensed_normal_100, condensed_normal_900 }, |
| { condensed_normal_900, condensed_normal_900 }, |
| { condensed_italic_100, condensed_normal_900 }, |
| { condensed_italic_900, condensed_normal_900 }, |
| { expanded_normal_100, expanded_normal_900 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_normal_900 }, |
| { expanded_italic_900, expanded_normal_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_italic_100,condensed_italic_900,expanded_italic_100,expanded_italic_900 }, |
| { |
| { condensed_normal_100, condensed_italic_100 }, |
| { condensed_normal_900, condensed_italic_900 }, |
| { condensed_italic_100, condensed_italic_100 }, |
| { condensed_italic_900, condensed_italic_900 }, |
| { expanded_normal_100, expanded_italic_100 }, |
| { expanded_normal_900, expanded_italic_900 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_italic_100,expanded_italic_100 }, |
| { |
| { condensed_normal_100, condensed_italic_100 }, |
| { condensed_normal_900, condensed_italic_100 }, |
| { condensed_italic_100, condensed_italic_100 }, |
| { condensed_italic_900, condensed_italic_100 }, |
| { expanded_normal_100, expanded_italic_100 }, |
| { expanded_normal_900, expanded_italic_100 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_100 }, |
| }, |
| }, |
| |
| { |
| { condensed_italic_900,expanded_italic_900 }, |
| { |
| { condensed_normal_100, condensed_italic_900 }, |
| { condensed_normal_900, condensed_italic_900 }, |
| { condensed_italic_100, condensed_italic_900 }, |
| { condensed_italic_900, condensed_italic_900 }, |
| { expanded_normal_100, expanded_italic_900 }, |
| { expanded_normal_900, expanded_italic_900 }, |
| { expanded_italic_100, expanded_italic_900 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_100,condensed_normal_900,condensed_italic_100,condensed_italic_900 }, |
| { |
| { condensed_normal_100, condensed_normal_100 }, |
| { condensed_normal_900, condensed_normal_900 }, |
| { condensed_italic_100, condensed_italic_100 }, |
| { condensed_italic_900, condensed_italic_900 }, |
| { expanded_normal_100, condensed_normal_100 }, |
| { expanded_normal_900, condensed_normal_900 }, |
| { expanded_italic_100, condensed_italic_100 }, |
| { expanded_italic_900, condensed_italic_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_100,condensed_italic_100 }, |
| { |
| { condensed_normal_100, condensed_normal_100 }, |
| { condensed_normal_900, condensed_normal_100 }, |
| { condensed_italic_100, condensed_italic_100 }, |
| { condensed_italic_900, condensed_italic_100 }, |
| { expanded_normal_100, condensed_normal_100 }, |
| { expanded_normal_900, condensed_normal_100 }, |
| { expanded_italic_100, condensed_italic_100 }, |
| { expanded_italic_900, condensed_italic_100 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_900,condensed_italic_900 }, |
| { |
| { condensed_normal_100, condensed_normal_900 }, |
| { condensed_normal_900, condensed_normal_900 }, |
| { condensed_italic_100, condensed_italic_900 }, |
| { condensed_italic_900, condensed_italic_900 }, |
| { expanded_normal_100, condensed_normal_900 }, |
| { expanded_normal_900, condensed_normal_900 }, |
| { expanded_italic_100, condensed_italic_900 }, |
| { expanded_italic_900, condensed_italic_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_100,condensed_normal_900 }, |
| { |
| { condensed_normal_100, condensed_normal_100 }, |
| { condensed_normal_900, condensed_normal_900 }, |
| { condensed_italic_100, condensed_normal_100 }, |
| { condensed_italic_900, condensed_normal_900 }, |
| { expanded_normal_100, condensed_normal_100 }, |
| { expanded_normal_900, condensed_normal_900 }, |
| { expanded_italic_100, condensed_normal_100 }, |
| { expanded_italic_900, condensed_normal_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_100 }, |
| { |
| { condensed_normal_100, condensed_normal_100 }, |
| { condensed_normal_900, condensed_normal_100 }, |
| { condensed_italic_100, condensed_normal_100 }, |
| { condensed_italic_900, condensed_normal_100 }, |
| { expanded_normal_100, condensed_normal_100 }, |
| { expanded_normal_900, condensed_normal_100 }, |
| { expanded_italic_100, condensed_normal_100 }, |
| { expanded_italic_900, condensed_normal_100 }, |
| }, |
| }, |
| |
| { |
| { condensed_normal_900 }, |
| { |
| { condensed_normal_100, condensed_normal_900 }, |
| { condensed_normal_900, condensed_normal_900 }, |
| { condensed_italic_100, condensed_normal_900 }, |
| { condensed_italic_900, condensed_normal_900 }, |
| { expanded_normal_100, condensed_normal_900 }, |
| { expanded_normal_900, condensed_normal_900 }, |
| { expanded_italic_100, condensed_normal_900 }, |
| { expanded_italic_900, condensed_normal_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_italic_100,condensed_italic_900 }, |
| { |
| { condensed_normal_100, condensed_italic_100 }, |
| { condensed_normal_900, condensed_italic_900 }, |
| { condensed_italic_100, condensed_italic_100 }, |
| { condensed_italic_900, condensed_italic_900 }, |
| { expanded_normal_100, condensed_italic_100 }, |
| { expanded_normal_900, condensed_italic_900 }, |
| { expanded_italic_100, condensed_italic_100 }, |
| { expanded_italic_900, condensed_italic_900 }, |
| }, |
| }, |
| |
| { |
| { condensed_italic_100 }, |
| { |
| { condensed_normal_100, condensed_italic_100 }, |
| { condensed_normal_900, condensed_italic_100 }, |
| { condensed_italic_100, condensed_italic_100 }, |
| { condensed_italic_900, condensed_italic_100 }, |
| { expanded_normal_100, condensed_italic_100 }, |
| { expanded_normal_900, condensed_italic_100 }, |
| { expanded_italic_100, condensed_italic_100 }, |
| { expanded_italic_900, condensed_italic_100 }, |
| }, |
| }, |
| |
| { |
| { condensed_italic_900 }, |
| { |
| { condensed_normal_100, condensed_italic_900 }, |
| { condensed_normal_900, condensed_italic_900 }, |
| { condensed_italic_100, condensed_italic_900 }, |
| { condensed_italic_900, condensed_italic_900 }, |
| { expanded_normal_100, condensed_italic_900 }, |
| { expanded_normal_900, condensed_italic_900 }, |
| { expanded_italic_100, condensed_italic_900 }, |
| { expanded_italic_900, condensed_italic_900 }, |
| }, |
| }, |
| |
| { |
| { expanded_normal_100,expanded_normal_900, |
| expanded_italic_100,expanded_italic_900 }, |
| { |
| { condensed_normal_100, expanded_normal_100 }, |
| { condensed_normal_900, expanded_normal_900 }, |
| { condensed_italic_100, expanded_italic_100 }, |
| { condensed_italic_900, expanded_italic_900 }, |
| { condensed_obliqu_100, expanded_italic_100 }, |
| { condensed_obliqu_900, expanded_italic_900 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| { expanded_obliqu_100, expanded_italic_100 }, |
| { expanded_obliqu_900, expanded_italic_900 }, |
| }, |
| }, |
| |
| { |
| { expanded_normal_100,expanded_italic_100 }, |
| { |
| { condensed_normal_100, expanded_normal_100 }, |
| { condensed_normal_900, expanded_normal_100 }, |
| { condensed_italic_100, expanded_italic_100 }, |
| { condensed_italic_900, expanded_italic_100 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_100 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_100 }, |
| }, |
| }, |
| |
| { |
| { expanded_normal_900,expanded_italic_900 }, |
| { |
| { condensed_normal_100, expanded_normal_900 }, |
| { condensed_normal_900, expanded_normal_900 }, |
| { condensed_italic_100, expanded_italic_900 }, |
| { condensed_italic_900, expanded_italic_900 }, |
| { expanded_normal_100, expanded_normal_900 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_italic_900 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| }, |
| }, |
| |
| { |
| { expanded_normal_100,expanded_normal_900 }, |
| { |
| { condensed_normal_100, expanded_normal_100 }, |
| { condensed_normal_900, expanded_normal_900 }, |
| { condensed_italic_100, expanded_normal_100 }, |
| { condensed_italic_900, expanded_normal_900 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_normal_100 }, |
| { expanded_italic_900, expanded_normal_900 }, |
| }, |
| }, |
| |
| { |
| { expanded_normal_100 }, |
| { |
| { condensed_normal_100, expanded_normal_100 }, |
| { condensed_normal_900, expanded_normal_100 }, |
| { condensed_italic_100, expanded_normal_100 }, |
| { condensed_italic_900, expanded_normal_100 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_100 }, |
| { expanded_italic_100, expanded_normal_100 }, |
| { expanded_italic_900, expanded_normal_100 }, |
| }, |
| }, |
| |
| { |
| { expanded_normal_900 }, |
| { |
| { condensed_normal_100, expanded_normal_900 }, |
| { condensed_normal_900, expanded_normal_900 }, |
| { condensed_italic_100, expanded_normal_900 }, |
| { condensed_italic_900, expanded_normal_900 }, |
| { expanded_normal_100, expanded_normal_900 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_normal_900 }, |
| { expanded_italic_900, expanded_normal_900 }, |
| }, |
| }, |
| |
| { |
| { expanded_italic_100,expanded_italic_900 }, |
| { |
| { condensed_normal_100, expanded_italic_100 }, |
| { condensed_normal_900, expanded_italic_900 }, |
| { condensed_italic_100, expanded_italic_100 }, |
| { condensed_italic_900, expanded_italic_900 }, |
| { expanded_normal_100, expanded_italic_100 }, |
| { expanded_normal_900, expanded_italic_900 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| }, |
| }, |
| |
| { |
| { expanded_italic_100 }, |
| { |
| { condensed_normal_100, expanded_italic_100 }, |
| { condensed_normal_900, expanded_italic_100 }, |
| { condensed_italic_100, expanded_italic_100 }, |
| { condensed_italic_900, expanded_italic_100 }, |
| { expanded_normal_100, expanded_italic_100 }, |
| { expanded_normal_900, expanded_italic_100 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_100 }, |
| }, |
| }, |
| |
| { |
| { expanded_italic_900 }, |
| { |
| { condensed_normal_100, expanded_italic_900 }, |
| { condensed_normal_900, expanded_italic_900 }, |
| { condensed_italic_100, expanded_italic_900 }, |
| { condensed_italic_900, expanded_italic_900 }, |
| { expanded_normal_100, expanded_italic_900 }, |
| { expanded_normal_900, expanded_italic_900 }, |
| { expanded_italic_100, expanded_italic_900 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| }, |
| }, |
| |
| { |
| { normal_normal_100, normal_normal_900 }, |
| { |
| { normal_normal_300, normal_normal_100 }, |
| { normal_normal_400, normal_normal_100 }, |
| { normal_normal_500, normal_normal_100 }, |
| { normal_normal_600, normal_normal_900 }, |
| }, |
| }, |
| |
| { |
| { normal_normal_100, normal_normal_400, normal_normal_900 }, |
| { |
| { normal_normal_300, normal_normal_100 }, |
| { normal_normal_400, normal_normal_400 }, |
| { normal_normal_500, normal_normal_400 }, |
| { normal_normal_600, normal_normal_900 }, |
| }, |
| }, |
| |
| { |
| { normal_normal_100, normal_normal_500, normal_normal_900 }, |
| { |
| { normal_normal_300, normal_normal_100 }, |
| { normal_normal_400, normal_normal_500 }, |
| { normal_normal_500, normal_normal_500 }, |
| { normal_normal_600, normal_normal_900 }, |
| }, |
| }, |
| |
| { |
| { }, |
| { |
| { normal_normal_300, invalidFontStyle }, |
| { normal_normal_400, invalidFontStyle }, |
| { normal_normal_500, invalidFontStyle }, |
| { normal_normal_600, invalidFontStyle }, |
| }, |
| }, |
| { |
| { expanded_normal_100,expanded_normal_900, |
| expanded_italic_100,expanded_italic_900, |
| expanded_obliqu_100,expanded_obliqu_900, }, |
| { |
| { condensed_normal_100, expanded_normal_100 }, |
| { condensed_normal_900, expanded_normal_900 }, |
| { condensed_italic_100, expanded_italic_100 }, |
| { condensed_italic_900, expanded_italic_900 }, |
| { condensed_obliqu_100, expanded_obliqu_100 }, |
| { condensed_obliqu_900, expanded_obliqu_900 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| { expanded_obliqu_100, expanded_obliqu_100 }, |
| { expanded_obliqu_900, expanded_obliqu_900 }, |
| }, |
| }, |
| { |
| { expanded_normal_100,expanded_normal_900, |
| expanded_obliqu_100,expanded_obliqu_900, }, |
| { |
| { condensed_normal_100, expanded_normal_100 }, |
| { condensed_normal_900, expanded_normal_900 }, |
| { condensed_italic_100, expanded_obliqu_100 }, |
| { condensed_italic_900, expanded_obliqu_900 }, |
| { condensed_obliqu_100, expanded_obliqu_100 }, |
| { condensed_obliqu_900, expanded_obliqu_900 }, |
| { expanded_normal_100, expanded_normal_100 }, |
| { expanded_normal_900, expanded_normal_900 }, |
| { expanded_italic_100, expanded_obliqu_100 }, |
| { expanded_italic_900, expanded_obliqu_900 }, |
| { expanded_obliqu_100, expanded_obliqu_100 }, |
| { expanded_obliqu_900, expanded_obliqu_900 }, |
| }, |
| }, |
| { |
| { expanded_italic_100,expanded_italic_900, |
| expanded_obliqu_100,expanded_obliqu_900, }, |
| { |
| { condensed_normal_100, expanded_obliqu_100 }, |
| { condensed_normal_900, expanded_obliqu_900 }, |
| { condensed_italic_100, expanded_italic_100 }, |
| { condensed_italic_900, expanded_italic_900 }, |
| { condensed_obliqu_100, expanded_obliqu_100 }, |
| { condensed_obliqu_900, expanded_obliqu_900 }, |
| { expanded_normal_100, expanded_obliqu_100 }, |
| { expanded_normal_900, expanded_obliqu_900 }, |
| { expanded_italic_100, expanded_italic_100 }, |
| { expanded_italic_900, expanded_italic_900 }, |
| { expanded_obliqu_100, expanded_obliqu_100 }, |
| { expanded_obliqu_900, expanded_obliqu_900 }, |
| }, |
| }, |
| }; |
| |
| for (StyleSetTest& test : tests) { |
| for (const StyleSetTest::Case& testCase : test.cases) { |
| sk_sp<SkTypeface> typeface(test.styleSet.matchStyle(testCase.pattern)); |
| if (typeface) { |
| REPORTER_ASSERT(reporter, typeface->fontStyle() == testCase.expectedResult); |
| } else { |
| REPORTER_ASSERT(reporter, invalidFontStyle == testCase.expectedResult); |
| } |
| } |
| } |
| } |
| |
| DEF_TEST(FontMgr_MatchCharacter, reporter) { |
| sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault()); |
| // 0xD800 <= codepoint <= 0xDFFF || 0x10FFFF < codepoint are invalid |
| SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x0)); |
| SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0xD800)); |
| SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0xDFFF)); |
| SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x110000)); |
| SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, 0x1FFFFF)); |
| SkSafeUnref(fm->matchFamilyStyleCharacter("Blah", SkFontStyle::Normal(), nullptr, 0, -1)); |
| } |