1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
3*834a2baaSAndroid Build Coastguard Worker *
4*834a2baaSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*834a2baaSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*834a2baaSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*834a2baaSAndroid Build Coastguard Worker *
8*834a2baaSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*834a2baaSAndroid Build Coastguard Worker *
10*834a2baaSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*834a2baaSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*834a2baaSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*834a2baaSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*834a2baaSAndroid Build Coastguard Worker * limitations under the License.
15*834a2baaSAndroid Build Coastguard Worker */
16*834a2baaSAndroid Build Coastguard Worker
17*834a2baaSAndroid Build Coastguard Worker #include <com_android_text_flags.h>
18*834a2baaSAndroid Build Coastguard Worker #include <flag_macros.h>
19*834a2baaSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*834a2baaSAndroid Build Coastguard Worker
21*834a2baaSAndroid Build Coastguard Worker #include "FontTestUtils.h"
22*834a2baaSAndroid Build Coastguard Worker #include "FontVariationTestUtils.h"
23*834a2baaSAndroid Build Coastguard Worker #include "FreeTypeMinikinFontForTest.h"
24*834a2baaSAndroid Build Coastguard Worker #include "MinikinInternal.h"
25*834a2baaSAndroid Build Coastguard Worker #include "minikin/Constants.h"
26*834a2baaSAndroid Build Coastguard Worker #include "minikin/FontCollection.h"
27*834a2baaSAndroid Build Coastguard Worker
28*834a2baaSAndroid Build Coastguard Worker namespace minikin {
29*834a2baaSAndroid Build Coastguard Worker
30*834a2baaSAndroid Build Coastguard Worker // The test font has following glyphs.
31*834a2baaSAndroid Build Coastguard Worker // U+82A6
32*834a2baaSAndroid Build Coastguard Worker // U+82A6 U+FE00 (VS1)
33*834a2baaSAndroid Build Coastguard Worker // U+82A6 U+E0100 (VS17)
34*834a2baaSAndroid Build Coastguard Worker // U+82A6 U+E0101 (VS18)
35*834a2baaSAndroid Build Coastguard Worker // U+82A6 U+E0102 (VS19)
36*834a2baaSAndroid Build Coastguard Worker // U+845B
37*834a2baaSAndroid Build Coastguard Worker // U+845B U+FE01 (VS2)
38*834a2baaSAndroid Build Coastguard Worker // U+845B U+E0101 (VS18)
39*834a2baaSAndroid Build Coastguard Worker // U+845B U+E0102 (VS19)
40*834a2baaSAndroid Build Coastguard Worker // U+845B U+E0103 (VS20)
41*834a2baaSAndroid Build Coastguard Worker // U+537F
42*834a2baaSAndroid Build Coastguard Worker // U+717D U+FE02 (VS3)
43*834a2baaSAndroid Build Coastguard Worker // U+717D U+E0102 (VS19)
44*834a2baaSAndroid Build Coastguard Worker // U+717D U+E0103 (VS20)
45*834a2baaSAndroid Build Coastguard Worker const char kVsTestFont[] = "VariationSelectorTest-Regular.ttf";
46*834a2baaSAndroid Build Coastguard Worker
expectVSGlyphs(const FontCollection * fc,uint32_t codepoint,const std::set<uint32_t> & vsSet)47*834a2baaSAndroid Build Coastguard Worker void expectVSGlyphs(const FontCollection* fc, uint32_t codepoint, const std::set<uint32_t>& vsSet) {
48*834a2baaSAndroid Build Coastguard Worker for (uint32_t vs = 0xFE00; vs <= 0xE01EF; ++vs) {
49*834a2baaSAndroid Build Coastguard Worker // Move to variation selectors supplements after variation selectors.
50*834a2baaSAndroid Build Coastguard Worker if (vs == 0xFF00) {
51*834a2baaSAndroid Build Coastguard Worker vs = 0xE0100;
52*834a2baaSAndroid Build Coastguard Worker }
53*834a2baaSAndroid Build Coastguard Worker if (vsSet.find(vs) == vsSet.end()) {
54*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(fc->hasVariationSelector(codepoint, vs))
55*834a2baaSAndroid Build Coastguard Worker << "Glyph for U+" << std::hex << codepoint << " U+" << vs;
56*834a2baaSAndroid Build Coastguard Worker } else {
57*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(fc->hasVariationSelector(codepoint, vs))
58*834a2baaSAndroid Build Coastguard Worker << "Glyph for U+" << std::hex << codepoint << " U+" << vs;
59*834a2baaSAndroid Build Coastguard Worker }
60*834a2baaSAndroid Build Coastguard Worker }
61*834a2baaSAndroid Build Coastguard Worker }
62*834a2baaSAndroid Build Coastguard Worker
expectVSGlyphsForVsTestFont(const FontCollection * fc)63*834a2baaSAndroid Build Coastguard Worker void expectVSGlyphsForVsTestFont(const FontCollection* fc) {
64*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(fc->hasVariationSelector(0x82A6, 0));
65*834a2baaSAndroid Build Coastguard Worker expectVSGlyphs(fc, 0x82A6, std::set<uint32_t>({0xFE00, 0xFE0E, 0xE0100, 0xE0101, 0xE0102}));
66*834a2baaSAndroid Build Coastguard Worker
67*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(fc->hasVariationSelector(0x845B, 0));
68*834a2baaSAndroid Build Coastguard Worker expectVSGlyphs(fc, 0x845B, std::set<uint32_t>({0xFE01, 0xFE0E, 0xE0101, 0xE0102, 0xE0103}));
69*834a2baaSAndroid Build Coastguard Worker
70*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(fc->hasVariationSelector(0x537F, 0));
71*834a2baaSAndroid Build Coastguard Worker expectVSGlyphs(fc, 0x537F, std::set<uint32_t>({0xFE0E}));
72*834a2baaSAndroid Build Coastguard Worker
73*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(fc->hasVariationSelector(0x717D, 0));
74*834a2baaSAndroid Build Coastguard Worker expectVSGlyphs(fc, 0x717D, std::set<uint32_t>({0xFE02, 0xE0102, 0xE0103}));
75*834a2baaSAndroid Build Coastguard Worker }
76*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,hasVariationSelectorTest)77*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, hasVariationSelectorTest) {
78*834a2baaSAndroid Build Coastguard Worker auto fc = buildFontCollection(kVsTestFont);
79*834a2baaSAndroid Build Coastguard Worker expectVSGlyphsForVsTestFont(fc.get());
80*834a2baaSAndroid Build Coastguard Worker }
81*834a2baaSAndroid Build Coastguard Worker
82*834a2baaSAndroid Build Coastguard Worker const char kEmojiXmlFile[] = "emoji.xml";
83*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,hasVariationSelectorTest_emoji)84*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, hasVariationSelectorTest_emoji) {
85*834a2baaSAndroid Build Coastguard Worker auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
86*834a2baaSAndroid Build Coastguard Worker
87*834a2baaSAndroid Build Coastguard Worker // Both text/color font have cmap format 14 subtable entry for VS15/VS16 respectively.
88*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(collection->hasVariationSelector(0x2623, 0xFE0E));
89*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(collection->hasVariationSelector(0x2623, 0xFE0F));
90*834a2baaSAndroid Build Coastguard Worker
91*834a2baaSAndroid Build Coastguard Worker // The text font has cmap format 14 subtable entry for VS15 but the color font doesn't have for
92*834a2baaSAndroid Build Coastguard Worker // VS16
93*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(collection->hasVariationSelector(0x2626, 0xFE0E));
94*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(collection->hasVariationSelector(0x2626, 0xFE0F));
95*834a2baaSAndroid Build Coastguard Worker
96*834a2baaSAndroid Build Coastguard Worker // The color font has cmap format 14 subtable entry for VS16 but the text font doesn't have for
97*834a2baaSAndroid Build Coastguard Worker // VS15.
98*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(collection->hasVariationSelector(0x262A, 0xFE0E));
99*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(collection->hasVariationSelector(0x262A, 0xFE0F));
100*834a2baaSAndroid Build Coastguard Worker
101*834a2baaSAndroid Build Coastguard Worker // Neither text/color font have cmap format 14 subtable entry for VS15/VS16.
102*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(collection->hasVariationSelector(0x262E, 0xFE0E));
103*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(collection->hasVariationSelector(0x262E, 0xFE0F));
104*834a2baaSAndroid Build Coastguard Worker
105*834a2baaSAndroid Build Coastguard Worker // Text font doesn't support U+1F3FD. Only the color emoji fonts has. So VS15 is not supported.
106*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(collection->hasVariationSelector(0x1F3FD, 0xFE0E));
107*834a2baaSAndroid Build Coastguard Worker
108*834a2baaSAndroid Build Coastguard Worker // Text font doesn't have U+262F U+FE0E or even its base code point U+262F.
109*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(collection->hasVariationSelector(0x262F, 0xFE0E));
110*834a2baaSAndroid Build Coastguard Worker
111*834a2baaSAndroid Build Coastguard Worker // None of the fonts support U+2229.
112*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(collection->hasVariationSelector(0x2229, 0xFE0E));
113*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(collection->hasVariationSelector(0x2229, 0xFE0F));
114*834a2baaSAndroid Build Coastguard Worker }
115*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,newEmojiTest)116*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, newEmojiTest) {
117*834a2baaSAndroid Build Coastguard Worker auto collection = buildFontCollectionFromXml(kEmojiXmlFile);
118*834a2baaSAndroid Build Coastguard Worker
119*834a2baaSAndroid Build Coastguard Worker // U+2695, U+2640, U+2642 are not in emoji catrgory in Unicode 9 but they are now in emoji
120*834a2baaSAndroid Build Coastguard Worker // category. Should return true even if U+FE0E was appended.
121*834a2baaSAndroid Build Coastguard Worker // These three emojis are only avalilable in TextEmoji.ttf but U+2695 is excluded here since it
122*834a2baaSAndroid Build Coastguard Worker // is used in other tests.
123*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(collection->hasVariationSelector(0x2640, 0xFE0E));
124*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(collection->hasVariationSelector(0x2640, 0xFE0F));
125*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(collection->hasVariationSelector(0x2642, 0xFE0E));
126*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(collection->hasVariationSelector(0x2642, 0xFE0F));
127*834a2baaSAndroid Build Coastguard Worker }
128*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,createWithVariations)129*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, createWithVariations) {
130*834a2baaSAndroid Build Coastguard Worker // This font has 'wdth' and 'wght' axes.
131*834a2baaSAndroid Build Coastguard Worker const char kMultiAxisFont[] = "MultiAxis.ttf";
132*834a2baaSAndroid Build Coastguard Worker const char kNoAxisFont[] = "Regular.ttf";
133*834a2baaSAndroid Build Coastguard Worker
134*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> multiAxisFc = buildFontCollection(kMultiAxisFont);
135*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> noAxisFc = buildFontCollection(kNoAxisFont);
136*834a2baaSAndroid Build Coastguard Worker
137*834a2baaSAndroid Build Coastguard Worker {
138*834a2baaSAndroid Build Coastguard Worker // Do not ceate new instance if none of variations are specified.
139*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(nullptr,
140*834a2baaSAndroid Build Coastguard Worker multiAxisFc->createCollectionWithVariation(std::vector<FontVariation>()));
141*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, noAxisFc->createCollectionWithVariation(std::vector<FontVariation>()));
142*834a2baaSAndroid Build Coastguard Worker }
143*834a2baaSAndroid Build Coastguard Worker {
144*834a2baaSAndroid Build Coastguard Worker // New instance should be used for supported variation.
145*834a2baaSAndroid Build Coastguard Worker std::vector<FontVariation> variations = {{MakeTag('w', 'd', 't', 'h'), 1.0f}};
146*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> newFc(
147*834a2baaSAndroid Build Coastguard Worker multiAxisFc->createCollectionWithVariation(variations));
148*834a2baaSAndroid Build Coastguard Worker EXPECT_NE(nullptr, newFc.get());
149*834a2baaSAndroid Build Coastguard Worker EXPECT_NE(multiAxisFc.get(), newFc.get());
150*834a2baaSAndroid Build Coastguard Worker
151*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, noAxisFc->createCollectionWithVariation(variations));
152*834a2baaSAndroid Build Coastguard Worker }
153*834a2baaSAndroid Build Coastguard Worker {
154*834a2baaSAndroid Build Coastguard Worker // New instance should be used for supported variation (multiple variations case).
155*834a2baaSAndroid Build Coastguard Worker std::vector<FontVariation> variations = {{MakeTag('w', 'd', 't', 'h'), 1.0f},
156*834a2baaSAndroid Build Coastguard Worker {MakeTag('w', 'g', 'h', 't'), 1.0f}};
157*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> newFc(
158*834a2baaSAndroid Build Coastguard Worker multiAxisFc->createCollectionWithVariation(variations));
159*834a2baaSAndroid Build Coastguard Worker EXPECT_NE(nullptr, newFc.get());
160*834a2baaSAndroid Build Coastguard Worker EXPECT_NE(multiAxisFc.get(), newFc.get());
161*834a2baaSAndroid Build Coastguard Worker
162*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, noAxisFc->createCollectionWithVariation(variations));
163*834a2baaSAndroid Build Coastguard Worker }
164*834a2baaSAndroid Build Coastguard Worker {
165*834a2baaSAndroid Build Coastguard Worker // Do not ceate new instance if none of variations are supported.
166*834a2baaSAndroid Build Coastguard Worker std::vector<FontVariation> variations = {{MakeTag('Z', 'Z', 'Z', 'Z'), 1.0f}};
167*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, multiAxisFc->createCollectionWithVariation(variations));
168*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, noAxisFc->createCollectionWithVariation(variations));
169*834a2baaSAndroid Build Coastguard Worker }
170*834a2baaSAndroid Build Coastguard Worker {
171*834a2baaSAndroid Build Coastguard Worker // At least one axis is supported, should create new instance.
172*834a2baaSAndroid Build Coastguard Worker std::vector<FontVariation> variations = {{MakeTag('w', 'd', 't', 'h'), 1.0f},
173*834a2baaSAndroid Build Coastguard Worker {MakeTag('Z', 'Z', 'Z', 'Z'), 1.0f}};
174*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> newFc(
175*834a2baaSAndroid Build Coastguard Worker multiAxisFc->createCollectionWithVariation(variations));
176*834a2baaSAndroid Build Coastguard Worker EXPECT_NE(nullptr, newFc.get());
177*834a2baaSAndroid Build Coastguard Worker EXPECT_NE(multiAxisFc.get(), newFc.get());
178*834a2baaSAndroid Build Coastguard Worker
179*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(nullptr, noAxisFc->createCollectionWithVariation(variations));
180*834a2baaSAndroid Build Coastguard Worker }
181*834a2baaSAndroid Build Coastguard Worker }
182*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,createCollectionWithFamilies)183*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, createCollectionWithFamilies) {
184*834a2baaSAndroid Build Coastguard Worker auto fallback = buildFontCollectionFromXml(kEmojiXmlFile);
185*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontFamily> family = buildFontFamily(kVsTestFont);
186*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> created = fallback->createCollectionWithFamilies({family});
187*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(fallback->getFamilyCount() + 1, created->getFamilyCount());
188*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(family, created->getFamilyAt(0));
189*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < fallback->getFamilyCount(); i++) {
190*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(fallback->getFamilyAt(i), created->getFamilyAt(i + 1));
191*834a2baaSAndroid Build Coastguard Worker }
192*834a2baaSAndroid Build Coastguard Worker }
193*834a2baaSAndroid Build Coastguard Worker
writeToBuffer(const std::vector<std::shared_ptr<FontCollection>> & collections)194*834a2baaSAndroid Build Coastguard Worker std::vector<uint8_t> writeToBuffer(
195*834a2baaSAndroid Build Coastguard Worker const std::vector<std::shared_ptr<FontCollection>>& collections) {
196*834a2baaSAndroid Build Coastguard Worker BufferWriter fakeWriter(nullptr);
197*834a2baaSAndroid Build Coastguard Worker FontCollection::writeVector(&fakeWriter, collections);
198*834a2baaSAndroid Build Coastguard Worker std::vector<uint8_t> buffer(fakeWriter.size());
199*834a2baaSAndroid Build Coastguard Worker BufferWriter writer(buffer.data());
200*834a2baaSAndroid Build Coastguard Worker FontCollection::writeVector(&writer, collections);
201*834a2baaSAndroid Build Coastguard Worker return buffer;
202*834a2baaSAndroid Build Coastguard Worker }
203*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,bufferTest)204*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, bufferTest) {
205*834a2baaSAndroid Build Coastguard Worker FreeTypeMinikinFontForTestFactory::init();
206*834a2baaSAndroid Build Coastguard Worker {
207*834a2baaSAndroid Build Coastguard Worker std::vector<std::shared_ptr<FontCollection>> original({buildFontCollection(kVsTestFont)});
208*834a2baaSAndroid Build Coastguard Worker std::vector<uint8_t> buffer = writeToBuffer(original);
209*834a2baaSAndroid Build Coastguard Worker BufferReader reader(buffer.data());
210*834a2baaSAndroid Build Coastguard Worker auto copied = FontCollection::readVector(&reader);
211*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, copied.size());
212*834a2baaSAndroid Build Coastguard Worker expectVSGlyphsForVsTestFont(copied[0].get());
213*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(original[0]->getSupportedAxesCount(), copied[0]->getSupportedAxesCount());
214*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < original[0]->getSupportedAxesCount(); i++) {
215*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(original[0]->getSupportedAxisAt(i), copied[0]->getSupportedAxisAt(i));
216*834a2baaSAndroid Build Coastguard Worker }
217*834a2baaSAndroid Build Coastguard Worker // Id will be different.
218*834a2baaSAndroid Build Coastguard Worker EXPECT_NE(original[0]->getId(), copied[0]->getId());
219*834a2baaSAndroid Build Coastguard Worker std::vector<uint8_t> newBuffer = writeToBuffer(copied);
220*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(buffer, newBuffer);
221*834a2baaSAndroid Build Coastguard Worker }
222*834a2baaSAndroid Build Coastguard Worker {
223*834a2baaSAndroid Build Coastguard Worker // Test that FontFamily instances are shared.
224*834a2baaSAndroid Build Coastguard Worker std::vector<std::shared_ptr<FontFamily>> families = {buildFontFamily(kVsTestFont)};
225*834a2baaSAndroid Build Coastguard Worker auto fc1 = FontCollection::create(families);
226*834a2baaSAndroid Build Coastguard Worker auto fc2 = FontCollection::create(families);
227*834a2baaSAndroid Build Coastguard Worker std::vector<std::shared_ptr<FontCollection>> original({fc1, fc2});
228*834a2baaSAndroid Build Coastguard Worker std::vector<uint8_t> buffer = writeToBuffer(original);
229*834a2baaSAndroid Build Coastguard Worker BufferReader reader(buffer.data());
230*834a2baaSAndroid Build Coastguard Worker auto copied = FontCollection::readVector(&reader);
231*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, copied.size());
232*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(copied[0]->getFamilyAt(0), copied[1]->getFamilyAt(0));
233*834a2baaSAndroid Build Coastguard Worker std::vector<uint8_t> newBuffer = writeToBuffer(copied);
234*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(buffer, newBuffer);
235*834a2baaSAndroid Build Coastguard Worker }
236*834a2baaSAndroid Build Coastguard Worker {
237*834a2baaSAndroid Build Coastguard Worker // Test axes.
238*834a2baaSAndroid Build Coastguard Worker // This font has 'wdth' and 'wght' axes.
239*834a2baaSAndroid Build Coastguard Worker const char kMultiAxisFont[] = "MultiAxis.ttf";
240*834a2baaSAndroid Build Coastguard Worker std::vector<std::shared_ptr<FontCollection>> original(
241*834a2baaSAndroid Build Coastguard Worker {buildFontCollection(kMultiAxisFont)});
242*834a2baaSAndroid Build Coastguard Worker std::vector<uint8_t> buffer = writeToBuffer(original);
243*834a2baaSAndroid Build Coastguard Worker BufferReader reader(buffer.data());
244*834a2baaSAndroid Build Coastguard Worker auto copied = FontCollection::readVector(&reader);
245*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, copied.size());
246*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(2u, copied[0]->getSupportedAxesCount());
247*834a2baaSAndroid Build Coastguard Worker // mSupportedAxes must be sorted.
248*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MakeTag('w', 'd', 't', 'h'), copied[0]->getSupportedAxisAt(0));
249*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MakeTag('w', 'g', 'h', 't'), copied[0]->getSupportedAxisAt(1));
250*834a2baaSAndroid Build Coastguard Worker std::vector<uint8_t> newBuffer = writeToBuffer(copied);
251*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(buffer, newBuffer);
252*834a2baaSAndroid Build Coastguard Worker }
253*834a2baaSAndroid Build Coastguard Worker }
254*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,FamilyMatchResultBuilderTest)255*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, FamilyMatchResultBuilderTest) {
256*834a2baaSAndroid Build Coastguard Worker using Builder = FontCollection::FamilyMatchResult::Builder;
257*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(Builder().empty());
258*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, Builder().size());
259*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, Builder().add(5).size());
260*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, Builder().add(5).add(4).size());
261*834a2baaSAndroid Build Coastguard Worker
262*834a2baaSAndroid Build Coastguard Worker // Reset
263*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(Builder().add(5).reset().empty());
264*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, Builder().add(5).reset().size());
265*834a2baaSAndroid Build Coastguard Worker }
266*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,FamilyMatchResultTest)267*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, FamilyMatchResultTest) {
268*834a2baaSAndroid Build Coastguard Worker using Builder = FontCollection::FamilyMatchResult::Builder;
269*834a2baaSAndroid Build Coastguard Worker
270*834a2baaSAndroid Build Coastguard Worker auto r = Builder().build();
271*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, r.size());
272*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(r.empty());
273*834a2baaSAndroid Build Coastguard Worker
274*834a2baaSAndroid Build Coastguard Worker r = Builder().add(1).build();
275*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, r.size());
276*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(r.empty());
277*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, r[0]);
278*834a2baaSAndroid Build Coastguard Worker
279*834a2baaSAndroid Build Coastguard Worker r = Builder().add(1).add(2).build();
280*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, r.size());
281*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(r.empty());
282*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, r[0]);
283*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, r[1]);
284*834a2baaSAndroid Build Coastguard Worker }
285*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,FamilyMatchResultTest_BuilderHoldeFirst7)286*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, FamilyMatchResultTest_BuilderHoldeFirst7) {
287*834a2baaSAndroid Build Coastguard Worker auto b = FontCollection::FamilyMatchResult::Builder();
288*834a2baaSAndroid Build Coastguard Worker for (uint8_t i = 0; i < 128; ++i) {
289*834a2baaSAndroid Build Coastguard Worker b.add(i);
290*834a2baaSAndroid Build Coastguard Worker }
291*834a2baaSAndroid Build Coastguard Worker auto r = b.build();
292*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(7u, r.size());
293*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(r.empty());
294*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, r[0]);
295*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, r[1]);
296*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, r[2]);
297*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3u, r[3]);
298*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(4u, r[4]);
299*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5u, r[5]);
300*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(6u, r[6]);
301*834a2baaSAndroid Build Coastguard Worker }
302*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,FamilyMatchResultTest_iterator)303*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, FamilyMatchResultTest_iterator) {
304*834a2baaSAndroid Build Coastguard Worker auto b = FontCollection::FamilyMatchResult::Builder();
305*834a2baaSAndroid Build Coastguard Worker for (uint8_t i = 0; i < 7; ++i) {
306*834a2baaSAndroid Build Coastguard Worker b.add(i);
307*834a2baaSAndroid Build Coastguard Worker }
308*834a2baaSAndroid Build Coastguard Worker auto r = b.build();
309*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(7u, r.size());
310*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(r.empty());
311*834a2baaSAndroid Build Coastguard Worker int i = 0;
312*834a2baaSAndroid Build Coastguard Worker for (auto v : r) {
313*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(i, v);
314*834a2baaSAndroid Build Coastguard Worker i++;
315*834a2baaSAndroid Build Coastguard Worker }
316*834a2baaSAndroid Build Coastguard Worker }
317*834a2baaSAndroid Build Coastguard Worker
TEST(FontCollectionTest,FamilyMatchResultTest_intersect)318*834a2baaSAndroid Build Coastguard Worker TEST(FontCollectionTest, FamilyMatchResultTest_intersect) {
319*834a2baaSAndroid Build Coastguard Worker using Builder = FontCollection::FamilyMatchResult::Builder;
320*834a2baaSAndroid Build Coastguard Worker
321*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(Builder().add(1).add(2).add(3).build(),
322*834a2baaSAndroid Build Coastguard Worker FontCollection::FamilyMatchResult::intersect(Builder().add(1).add(2).add(3).build(),
323*834a2baaSAndroid Build Coastguard Worker Builder().add(1).add(2).add(3).build()));
324*834a2baaSAndroid Build Coastguard Worker
325*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(Builder().build(),
326*834a2baaSAndroid Build Coastguard Worker FontCollection::FamilyMatchResult::intersect(Builder().add(1).add(2).add(3).build(),
327*834a2baaSAndroid Build Coastguard Worker Builder().build()));
328*834a2baaSAndroid Build Coastguard Worker
329*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(Builder().build(),
330*834a2baaSAndroid Build Coastguard Worker FontCollection::FamilyMatchResult::intersect(Builder().add(2).add(4).add(6).build(),
331*834a2baaSAndroid Build Coastguard Worker Builder().add(1).add(3).add(5).build()));
332*834a2baaSAndroid Build Coastguard Worker
333*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(Builder().add(1).add(3).build(),
334*834a2baaSAndroid Build Coastguard Worker FontCollection::FamilyMatchResult::intersect(Builder().add(1).add(2).add(3).build(),
335*834a2baaSAndroid Build Coastguard Worker Builder().add(1).add(3).add(5).build()));
336*834a2baaSAndroid Build Coastguard Worker }
337*834a2baaSAndroid Build Coastguard Worker
TEST_WITH_FLAGS(FontCollectionTest,getBestFont,REQUIRES_FLAGS_ENABLED (ACONFIG_FLAG (com::android::text::flags,typeface_redesign_readonly)))338*834a2baaSAndroid Build Coastguard Worker TEST_WITH_FLAGS(FontCollectionTest, getBestFont,
339*834a2baaSAndroid Build Coastguard Worker REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(com::android::text::flags,
340*834a2baaSAndroid Build Coastguard Worker typeface_redesign_readonly))) {
341*834a2baaSAndroid Build Coastguard Worker FreeTypeMinikinFontForTestFactory::init();
342*834a2baaSAndroid Build Coastguard Worker
343*834a2baaSAndroid Build Coastguard Worker const uint32_t localeListId = registerLocaleList("en-US");
344*834a2baaSAndroid Build Coastguard Worker
345*834a2baaSAndroid Build Coastguard Worker auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(
346*834a2baaSAndroid Build Coastguard Worker getTestFontPath("WeightEqualsEmVariableFont.ttf"));
347*834a2baaSAndroid Build Coastguard Worker auto font = Font::Builder(minikinFont).build();
348*834a2baaSAndroid Build Coastguard Worker auto family = FontFamily::create({font});
349*834a2baaSAndroid Build Coastguard Worker auto fc = FontCollection::create({family});
350*834a2baaSAndroid Build Coastguard Worker
351*834a2baaSAndroid Build Coastguard Worker auto getBestFont = [&](FontStyle style, const VariationSettings& varSettings) -> FakedFont {
352*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text = {'a'};
353*834a2baaSAndroid Build Coastguard Worker auto runs = fc->itemize(text, style, localeListId, FamilyVariant::DEFAULT, 1);
354*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, runs.size());
355*834a2baaSAndroid Build Coastguard Worker return fc->getBestFont(text, runs[0], style, varSettings);
356*834a2baaSAndroid Build Coastguard Worker };
357*834a2baaSAndroid Build Coastguard Worker
358*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(parseVariationSettings(""),
359*834a2baaSAndroid Build Coastguard Worker getBestFont(FontStyle(), VariationSettings()).fakery.variationSettings());
360*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(parseVariationSettings("'wght' 700"),
361*834a2baaSAndroid Build Coastguard Worker getBestFont(FontStyle(FontStyle::Weight::BOLD), VariationSettings())
362*834a2baaSAndroid Build Coastguard Worker .fakery.variationSettings());
363*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(parseVariationSettings("'wght' 700"),
364*834a2baaSAndroid Build Coastguard Worker getBestFont(FontStyle(), parseVariationSettings("'wght' 700"))
365*834a2baaSAndroid Build Coastguard Worker .fakery.variationSettings());
366*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(parseVariationSettings("'ital' 1"),
367*834a2baaSAndroid Build Coastguard Worker getBestFont(FontStyle(FontStyle::Slant::ITALIC), VariationSettings())
368*834a2baaSAndroid Build Coastguard Worker .fakery.variationSettings());
369*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(parseVariationSettings("'ital' 1, 'wght' 500"),
370*834a2baaSAndroid Build Coastguard Worker getBestFont(FontStyle(FontStyle::Weight::MEDIUM, FontStyle::Slant::ITALIC),
371*834a2baaSAndroid Build Coastguard Worker VariationSettings())
372*834a2baaSAndroid Build Coastguard Worker .fakery.variationSettings());
373*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(parseVariationSettings("'ital' 1, 'wght' 500"),
374*834a2baaSAndroid Build Coastguard Worker getBestFont(FontStyle(FontStyle::Slant::ITALIC), parseVariationSettings("'wght' 500"))
375*834a2baaSAndroid Build Coastguard Worker .fakery.variationSettings());
376*834a2baaSAndroid Build Coastguard Worker }
377*834a2baaSAndroid Build Coastguard Worker
378*834a2baaSAndroid Build Coastguard Worker } // namespace minikin
379