xref: /aosp_15_r20/frameworks/minikin/tests/unittest/FontTest.cpp (revision 834a2baab5fdfc28e9a428ee87c7ea8f6a06a53d)
1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker  * Copyright (C) 2018 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 #include <minikin/Constants.h>
21*834a2baaSAndroid Build Coastguard Worker 
22*834a2baaSAndroid Build Coastguard Worker #include "BufferUtils.h"
23*834a2baaSAndroid Build Coastguard Worker #include "FontTestUtils.h"
24*834a2baaSAndroid Build Coastguard Worker #include "FontVariationTestUtils.h"
25*834a2baaSAndroid Build Coastguard Worker #include "FreeTypeMinikinFontForTest.h"
26*834a2baaSAndroid Build Coastguard Worker #include "minikin/Font.h"
27*834a2baaSAndroid Build Coastguard Worker 
28*834a2baaSAndroid Build Coastguard Worker namespace minikin {
29*834a2baaSAndroid Build Coastguard Worker 
30*834a2baaSAndroid Build Coastguard Worker namespace {
31*834a2baaSAndroid Build Coastguard Worker 
getHeapSize()32*834a2baaSAndroid Build Coastguard Worker size_t getHeapSize() {
33*834a2baaSAndroid Build Coastguard Worker     struct mallinfo info = mallinfo();
34*834a2baaSAndroid Build Coastguard Worker     return info.uordblks;
35*834a2baaSAndroid Build Coastguard Worker }
36*834a2baaSAndroid Build Coastguard Worker 
37*834a2baaSAndroid Build Coastguard Worker }  // namespace
38*834a2baaSAndroid Build Coastguard Worker 
TEST(FontTest,BufferTest)39*834a2baaSAndroid Build Coastguard Worker TEST(FontTest, BufferTest) {
40*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
41*834a2baaSAndroid Build Coastguard Worker     auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(getTestFontPath("Ascii.ttf"));
42*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> original = Font::Builder(minikinFont).build();
43*834a2baaSAndroid Build Coastguard Worker     std::vector<uint8_t> buffer = writeToBuffer<Font>(*original);
44*834a2baaSAndroid Build Coastguard Worker 
45*834a2baaSAndroid Build Coastguard Worker     BufferReader reader(buffer.data());
46*834a2baaSAndroid Build Coastguard Worker     Font font(&reader);
47*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(minikinFont->GetFontPath(), font.baseTypeface()->GetFontPath());
48*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(original->style(), font.style());
49*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(original->getLocaleListId(), font.getLocaleListId());
50*834a2baaSAndroid Build Coastguard Worker     // baseFont() should return the same non-null instance when called twice.
51*834a2baaSAndroid Build Coastguard Worker     const auto& baseFont = font.baseFont();
52*834a2baaSAndroid Build Coastguard Worker     EXPECT_NE(nullptr, baseFont);
53*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(baseFont, font.baseFont());
54*834a2baaSAndroid Build Coastguard Worker     // baseTypeface() should return the same non-null instance when called twice.
55*834a2baaSAndroid Build Coastguard Worker     const auto& typeface = font.baseTypeface();
56*834a2baaSAndroid Build Coastguard Worker     EXPECT_NE(nullptr, typeface);
57*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(typeface, font.baseTypeface());
58*834a2baaSAndroid Build Coastguard Worker     std::vector<uint8_t> newBuffer = writeToBuffer<Font>(font);
59*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(buffer, newBuffer);
60*834a2baaSAndroid Build Coastguard Worker }
61*834a2baaSAndroid Build Coastguard Worker 
TEST(FontTest,MoveConstructorTest)62*834a2baaSAndroid Build Coastguard Worker TEST(FontTest, MoveConstructorTest) {
63*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
64*834a2baaSAndroid Build Coastguard Worker     // Note: by definition, only BufferReader-based Font can be moved.
65*834a2baaSAndroid Build Coastguard Worker     auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(getTestFontPath("Ascii.ttf"));
66*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> original = Font::Builder(minikinFont).build();
67*834a2baaSAndroid Build Coastguard Worker     std::vector<uint8_t> buffer = writeToBuffer<Font>(*original);
68*834a2baaSAndroid Build Coastguard Worker 
69*834a2baaSAndroid Build Coastguard Worker     size_t baseHeapSize = getHeapSize();
70*834a2baaSAndroid Build Coastguard Worker     {
71*834a2baaSAndroid Build Coastguard Worker         BufferReader reader(buffer.data());
72*834a2baaSAndroid Build Coastguard Worker         Font moveFrom(&reader);
73*834a2baaSAndroid Build Coastguard Worker         Font moveTo(std::move(moveFrom));
74*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveFrom.mExternalRefsHolder.load());
75*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveTo.mExternalRefsHolder.load());
76*834a2baaSAndroid Build Coastguard Worker     }
77*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(baseHeapSize, getHeapSize());
78*834a2baaSAndroid Build Coastguard Worker     {
79*834a2baaSAndroid Build Coastguard Worker         BufferReader reader(buffer.data());
80*834a2baaSAndroid Build Coastguard Worker         Font moveFrom(&reader);
81*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<MinikinFont> typeface = moveFrom.baseTypeface();
82*834a2baaSAndroid Build Coastguard Worker         Font moveTo(std::move(moveFrom));
83*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveFrom.mExternalRefsHolder.load());
84*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(typeface, moveTo.baseTypeface());
85*834a2baaSAndroid Build Coastguard Worker     }
86*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(baseHeapSize, getHeapSize());
87*834a2baaSAndroid Build Coastguard Worker }
88*834a2baaSAndroid Build Coastguard Worker 
TEST(FontTest,MoveAssignmentTest)89*834a2baaSAndroid Build Coastguard Worker TEST(FontTest, MoveAssignmentTest) {
90*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
91*834a2baaSAndroid Build Coastguard Worker     // Note: by definition, only BufferReader-based Font can be moved.
92*834a2baaSAndroid Build Coastguard Worker     auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(getTestFontPath("Ascii.ttf"));
93*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> original = Font::Builder(minikinFont).build();
94*834a2baaSAndroid Build Coastguard Worker     std::vector<uint8_t> buffer = writeToBuffer<Font>(*original);
95*834a2baaSAndroid Build Coastguard Worker 
96*834a2baaSAndroid Build Coastguard Worker     size_t baseHeapSize = getHeapSize();
97*834a2baaSAndroid Build Coastguard Worker     {
98*834a2baaSAndroid Build Coastguard Worker         // mExternalRefsHolder: null -> null
99*834a2baaSAndroid Build Coastguard Worker         BufferReader reader(buffer.data());
100*834a2baaSAndroid Build Coastguard Worker         Font moveFrom(&reader);
101*834a2baaSAndroid Build Coastguard Worker         BufferReader reader2(buffer.data());
102*834a2baaSAndroid Build Coastguard Worker         Font moveTo(&reader2);
103*834a2baaSAndroid Build Coastguard Worker         moveTo = std::move(moveFrom);
104*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveFrom.mExternalRefsHolder.load());
105*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveTo.mExternalRefsHolder.load());
106*834a2baaSAndroid Build Coastguard Worker     }
107*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(baseHeapSize, getHeapSize());
108*834a2baaSAndroid Build Coastguard Worker     {
109*834a2baaSAndroid Build Coastguard Worker         // mExternalRefsHolder: non-null -> null
110*834a2baaSAndroid Build Coastguard Worker         BufferReader reader(buffer.data());
111*834a2baaSAndroid Build Coastguard Worker         Font moveFrom(&reader);
112*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<MinikinFont> typeface = moveFrom.baseTypeface();
113*834a2baaSAndroid Build Coastguard Worker         BufferReader reader2(buffer.data());
114*834a2baaSAndroid Build Coastguard Worker         Font moveTo(&reader2);
115*834a2baaSAndroid Build Coastguard Worker         moveTo = std::move(moveFrom);
116*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveFrom.mExternalRefsHolder.load());
117*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(typeface, moveTo.baseTypeface());
118*834a2baaSAndroid Build Coastguard Worker     }
119*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(baseHeapSize, getHeapSize());
120*834a2baaSAndroid Build Coastguard Worker     {
121*834a2baaSAndroid Build Coastguard Worker         // mExternalRefsHolder: null -> non-null
122*834a2baaSAndroid Build Coastguard Worker         BufferReader reader(buffer.data());
123*834a2baaSAndroid Build Coastguard Worker         Font moveFrom(&reader);
124*834a2baaSAndroid Build Coastguard Worker         BufferReader reader2(buffer.data());
125*834a2baaSAndroid Build Coastguard Worker         Font moveTo(&reader2);
126*834a2baaSAndroid Build Coastguard Worker         moveTo.baseTypeface();
127*834a2baaSAndroid Build Coastguard Worker         moveTo = std::move(moveFrom);
128*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveFrom.mExternalRefsHolder.load());
129*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveTo.mExternalRefsHolder.load());
130*834a2baaSAndroid Build Coastguard Worker     }
131*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(baseHeapSize, getHeapSize());
132*834a2baaSAndroid Build Coastguard Worker     {
133*834a2baaSAndroid Build Coastguard Worker         // mExternalRefsHolder: non-null -> non-null
134*834a2baaSAndroid Build Coastguard Worker         BufferReader reader(buffer.data());
135*834a2baaSAndroid Build Coastguard Worker         Font moveFrom(&reader);
136*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<MinikinFont> typeface = moveFrom.baseTypeface();
137*834a2baaSAndroid Build Coastguard Worker         BufferReader reader2(buffer.data());
138*834a2baaSAndroid Build Coastguard Worker         Font moveTo(&reader2);
139*834a2baaSAndroid Build Coastguard Worker         moveTo.baseTypeface();
140*834a2baaSAndroid Build Coastguard Worker         moveTo = std::move(moveFrom);
141*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(nullptr, moveFrom.mExternalRefsHolder.load());
142*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(typeface, moveTo.baseTypeface());
143*834a2baaSAndroid Build Coastguard Worker     }
144*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(baseHeapSize, getHeapSize());
145*834a2baaSAndroid Build Coastguard Worker }
146*834a2baaSAndroid Build Coastguard Worker 
TEST(FontTest,getAdjustedFontTest)147*834a2baaSAndroid Build Coastguard Worker TEST(FontTest, getAdjustedFontTest) {
148*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
149*834a2baaSAndroid Build Coastguard Worker     auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(
150*834a2baaSAndroid Build Coastguard Worker             getTestFontPath("WeightEqualsEmVariableFont.ttf"));
151*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> font = Font::Builder(minikinFont).build();
152*834a2baaSAndroid Build Coastguard Worker 
153*834a2baaSAndroid Build Coastguard Worker     {
154*834a2baaSAndroid Build Coastguard Worker         auto hbFont = font->getAdjustedFont(-1, -1);
155*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(hbFont.get(), font->baseFont().get());
156*834a2baaSAndroid Build Coastguard Worker     }
157*834a2baaSAndroid Build Coastguard Worker     {
158*834a2baaSAndroid Build Coastguard Worker         // Set correct wight axis value.
159*834a2baaSAndroid Build Coastguard Worker         auto hbFont = font->getAdjustedFont(400, -1);
160*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(hb_font_get_parent(hbFont.get()), font->baseFont().get());
161*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(hbFont.get(), font->baseFont().get());
162*834a2baaSAndroid Build Coastguard Worker         unsigned int length;
163*834a2baaSAndroid Build Coastguard Worker         const float* coords = hb_font_get_var_coords_design(hbFont.get(), &length);
164*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(2u, length);  // The test font has 'wght', 'ital' axes in this order
165*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(400, coords[0]);
166*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(0, coords[1]);
167*834a2baaSAndroid Build Coastguard Worker     }
168*834a2baaSAndroid Build Coastguard Worker     {
169*834a2baaSAndroid Build Coastguard Worker         // Override existing wght axis.
170*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<Font> newFont = Font::Builder(font->getAdjustedTypeface(700, -1)).build();
171*834a2baaSAndroid Build Coastguard Worker         auto hbFont = newFont->getAdjustedFont(500, -1);
172*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(hb_font_get_parent(hbFont.get()), newFont->baseFont().get());
173*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(hbFont.get(), newFont->baseFont().get());
174*834a2baaSAndroid Build Coastguard Worker         unsigned int length;
175*834a2baaSAndroid Build Coastguard Worker         const float* coords = hb_font_get_var_coords_design(hbFont.get(), &length);
176*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(2u, length);  // The test font has 'wght', 'ital' axes in this order
177*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(500, coords[0]);
178*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(0, coords[1]);
179*834a2baaSAndroid Build Coastguard Worker     }
180*834a2baaSAndroid Build Coastguard Worker     {
181*834a2baaSAndroid Build Coastguard Worker         // Set correct wight axis value.
182*834a2baaSAndroid Build Coastguard Worker         auto hbFont = font->getAdjustedFont(-1, 1);
183*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(hb_font_get_parent(hbFont.get()), font->baseFont().get());
184*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(hbFont.get(), font->baseFont().get());
185*834a2baaSAndroid Build Coastguard Worker         unsigned int length;
186*834a2baaSAndroid Build Coastguard Worker         const float* coords = hb_font_get_var_coords_design(hbFont.get(), &length);
187*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(2u, length);      // The test font has 'wght', 'ital' axes in this order
188*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(400, coords[0]);  // 400 is a default value of `wght` axis
189*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(1, coords[1]);
190*834a2baaSAndroid Build Coastguard Worker     }
191*834a2baaSAndroid Build Coastguard Worker     {
192*834a2baaSAndroid Build Coastguard Worker         // Override existing wght axis.
193*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<Font> newFont = Font::Builder(font->getAdjustedTypeface(-1, 0)).build();
194*834a2baaSAndroid Build Coastguard Worker         auto hbFont = newFont->getAdjustedFont(-1, 1);
195*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(hb_font_get_parent(hbFont.get()), newFont->baseFont().get());
196*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(hbFont.get(), newFont->baseFont().get());
197*834a2baaSAndroid Build Coastguard Worker         unsigned int length;
198*834a2baaSAndroid Build Coastguard Worker         const float* coords = hb_font_get_var_coords_design(hbFont.get(), &length);
199*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(2u, length);      // The test font has 'wght', 'ital' axes in this order
200*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(400, coords[0]);  // 400 is a default value of `wght` axis
201*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(1, coords[1]);
202*834a2baaSAndroid Build Coastguard Worker     }
203*834a2baaSAndroid Build Coastguard Worker     {
204*834a2baaSAndroid Build Coastguard Worker         // Set correct wight axis value.
205*834a2baaSAndroid Build Coastguard Worker         auto hbFont = font->getAdjustedFont(500, 1);
206*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(hb_font_get_parent(hbFont.get()), font->baseFont().get());
207*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(hbFont.get(), font->baseFont().get());
208*834a2baaSAndroid Build Coastguard Worker         unsigned int length;
209*834a2baaSAndroid Build Coastguard Worker         const float* coords = hb_font_get_var_coords_design(hbFont.get(), &length);
210*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(2u, length);  // The test font has 'wght', 'ital' axes in this order
211*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(500, coords[0]);
212*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(1, coords[1]);
213*834a2baaSAndroid Build Coastguard Worker     }
214*834a2baaSAndroid Build Coastguard Worker     {
215*834a2baaSAndroid Build Coastguard Worker         // Override existing wght axis.
216*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<Font> newFont = Font::Builder(font->getAdjustedTypeface(500, 1)).build();
217*834a2baaSAndroid Build Coastguard Worker         auto hbFont = newFont->getAdjustedFont(700, 0);
218*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(hb_font_get_parent(hbFont.get()), newFont->baseFont().get());
219*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(hbFont.get(), newFont->baseFont().get());
220*834a2baaSAndroid Build Coastguard Worker         unsigned int length;
221*834a2baaSAndroid Build Coastguard Worker         const float* coords = hb_font_get_var_coords_design(hbFont.get(), &length);
222*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(2u, length);  // The test font has 'wght', 'ital' axes in this order
223*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(700, coords[0]);
224*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(0, coords[1]);
225*834a2baaSAndroid Build Coastguard Worker     }
226*834a2baaSAndroid Build Coastguard Worker }
227*834a2baaSAndroid Build Coastguard Worker 
TEST(FontTest,getAdjustedTypefaceTest)228*834a2baaSAndroid Build Coastguard Worker TEST(FontTest, getAdjustedTypefaceTest) {
229*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
230*834a2baaSAndroid Build Coastguard Worker     auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(
231*834a2baaSAndroid Build Coastguard Worker             getTestFontPath("WeightEqualsEmVariableFont.ttf"));
232*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> font = Font::Builder(minikinFont).build();
233*834a2baaSAndroid Build Coastguard Worker 
234*834a2baaSAndroid Build Coastguard Worker     {
235*834a2baaSAndroid Build Coastguard Worker         auto minikinFontBase = font->getAdjustedTypeface(-1, -1);
236*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(minikinFontBase.get(), font->baseTypeface().get());
237*834a2baaSAndroid Build Coastguard Worker     }
238*834a2baaSAndroid Build Coastguard Worker     {
239*834a2baaSAndroid Build Coastguard Worker         // Set correct wght axis value.
240*834a2baaSAndroid Build Coastguard Worker         auto minikinFontBase = font->getAdjustedTypeface(400, -1);
241*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(minikinFontBase.get(), font->baseTypeface().get());
242*834a2baaSAndroid Build Coastguard Worker         auto axes = minikinFontBase->GetAxes();
243*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(1u, axes.size());
244*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(TAG_wght, axes[0].axisTag);
245*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(400, axes[0].value);
246*834a2baaSAndroid Build Coastguard Worker     }
247*834a2baaSAndroid Build Coastguard Worker     {
248*834a2baaSAndroid Build Coastguard Worker         // Override existing wght axis.
249*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<Font> newFont = Font::Builder(font->getAdjustedTypeface(700, -1)).build();
250*834a2baaSAndroid Build Coastguard Worker         auto minikinFontBase = newFont->getAdjustedTypeface(500, -1);
251*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(minikinFontBase.get(), font->baseTypeface().get());
252*834a2baaSAndroid Build Coastguard Worker         auto axes = minikinFontBase->GetAxes();
253*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(1u, axes.size());
254*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(TAG_wght, axes[0].axisTag);
255*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(500, axes[0].value);
256*834a2baaSAndroid Build Coastguard Worker     }
257*834a2baaSAndroid Build Coastguard Worker     {
258*834a2baaSAndroid Build Coastguard Worker         // Set correct wght axis value.
259*834a2baaSAndroid Build Coastguard Worker         auto minikinFontBase = font->getAdjustedTypeface(-1, 1);
260*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(minikinFontBase.get(), font->baseTypeface().get());
261*834a2baaSAndroid Build Coastguard Worker         auto axes = minikinFontBase->GetAxes();
262*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(1u, axes.size());
263*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(TAG_ital, axes[0].axisTag);
264*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(1, axes[0].value);
265*834a2baaSAndroid Build Coastguard Worker     }
266*834a2baaSAndroid Build Coastguard Worker     {
267*834a2baaSAndroid Build Coastguard Worker         // Override existing wght axis.
268*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<Font> newFont = Font::Builder(font->getAdjustedTypeface(-1, 1)).build();
269*834a2baaSAndroid Build Coastguard Worker         auto minikinFontBase = newFont->getAdjustedTypeface(-1, 0);
270*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(minikinFontBase.get(), font->baseTypeface().get());
271*834a2baaSAndroid Build Coastguard Worker         auto axes = minikinFontBase->GetAxes();
272*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(1u, axes.size());
273*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(TAG_ital, axes[0].axisTag);
274*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(0, axes[0].value);
275*834a2baaSAndroid Build Coastguard Worker     }
276*834a2baaSAndroid Build Coastguard Worker     {
277*834a2baaSAndroid Build Coastguard Worker         // Set correct ital axis value.
278*834a2baaSAndroid Build Coastguard Worker         auto minikinFontBase = font->getAdjustedTypeface(400, 1);
279*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(minikinFontBase.get(), font->baseTypeface().get());
280*834a2baaSAndroid Build Coastguard Worker         auto axes = minikinFontBase->GetAxes();
281*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(2u, axes.size());
282*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(TAG_ital, axes[0].axisTag);
283*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(TAG_wght, axes[1].axisTag);
284*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(1, axes[0].value);
285*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(400, axes[1].value);
286*834a2baaSAndroid Build Coastguard Worker     }
287*834a2baaSAndroid Build Coastguard Worker     {
288*834a2baaSAndroid Build Coastguard Worker         // Override existing ital axis.
289*834a2baaSAndroid Build Coastguard Worker         std::shared_ptr<Font> newFont = Font::Builder(font->getAdjustedTypeface(500, 0)).build();
290*834a2baaSAndroid Build Coastguard Worker         auto minikinFontBase = newFont->getAdjustedTypeface(700, 1);
291*834a2baaSAndroid Build Coastguard Worker         EXPECT_NE(minikinFontBase.get(), font->baseTypeface().get());
292*834a2baaSAndroid Build Coastguard Worker         auto axes = minikinFontBase->GetAxes();
293*834a2baaSAndroid Build Coastguard Worker         ASSERT_EQ(2u, axes.size());
294*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(TAG_ital, axes[0].axisTag);
295*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(TAG_wght, axes[1].axisTag);
296*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(1, axes[0].value);
297*834a2baaSAndroid Build Coastguard Worker         EXPECT_EQ(700, axes[1].value);
298*834a2baaSAndroid Build Coastguard Worker     }
299*834a2baaSAndroid Build Coastguard Worker }
300*834a2baaSAndroid Build Coastguard Worker 
TEST(FontTest,ChildLazyCreationTest)301*834a2baaSAndroid Build Coastguard Worker TEST(FontTest, ChildLazyCreationTest) {
302*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
303*834a2baaSAndroid Build Coastguard Worker     // Note: by definition, only BufferReader-based Font can be moved.
304*834a2baaSAndroid Build Coastguard Worker     auto minikinFont =
305*834a2baaSAndroid Build Coastguard Worker             std::make_shared<FreeTypeMinikinFontForTest>(getTestFontPath("MultiAxis.ttf"));
306*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> original = Font::Builder(minikinFont).build();
307*834a2baaSAndroid Build Coastguard Worker 
308*834a2baaSAndroid Build Coastguard Worker     // The original font doesn't axes settings.
309*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(original->baseTypeface()->GetAxes().empty());
310*834a2baaSAndroid Build Coastguard Worker 
311*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> overridden = std::make_shared<Font>(
312*834a2baaSAndroid Build Coastguard Worker             original, std::vector<FontVariation>{FontVariation(MakeTag('w', 'g', 'h', 't'), 0)});
313*834a2baaSAndroid Build Coastguard Worker 
314*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1u, overridden->baseTypeface()->GetAxes().size());
315*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(MakeTag('w', 'g', 'h', 't'), overridden->baseTypeface()->GetAxes()[0].axisTag);
316*834a2baaSAndroid Build Coastguard Worker }
317*834a2baaSAndroid Build Coastguard Worker 
TEST(FontTest,FVarTableTest)318*834a2baaSAndroid Build Coastguard Worker TEST(FontTest, FVarTableTest) {
319*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
320*834a2baaSAndroid Build Coastguard Worker     auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(
321*834a2baaSAndroid Build Coastguard Worker             getTestFontPath("WeightEqualsEmVariableFont.ttf"));
322*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> font = Font::Builder(minikinFont).build();
323*834a2baaSAndroid Build Coastguard Worker 
324*834a2baaSAndroid Build Coastguard Worker     uint32_t wght = MakeTag('w', 'g', 'h', 't');
325*834a2baaSAndroid Build Coastguard Worker     uint32_t ital = MakeTag('i', 't', 'a', 'l');
326*834a2baaSAndroid Build Coastguard Worker 
327*834a2baaSAndroid Build Coastguard Worker     const FVarTable& fvar = font->getFVarTable();
328*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(fvar.contains(wght));
329*834a2baaSAndroid Build Coastguard Worker     EXPECT_TRUE(fvar.contains(ital));
330*834a2baaSAndroid Build Coastguard Worker     EXPECT_FALSE(fvar.contains(MakeTag('w', 'd', 't', 'h')));
331*834a2baaSAndroid Build Coastguard Worker 
332*834a2baaSAndroid Build Coastguard Worker     const FVarEntry& wghtTable = fvar.find(wght)->second;
333*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, wghtTable.minValue);
334*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(400, wghtTable.defValue);
335*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1000, wghtTable.maxValue);
336*834a2baaSAndroid Build Coastguard Worker 
337*834a2baaSAndroid Build Coastguard Worker     const FVarEntry& italTable = fvar.find(ital)->second;
338*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, italTable.minValue);
339*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(0, italTable.defValue);
340*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(1, italTable.maxValue);
341*834a2baaSAndroid Build Coastguard Worker }
342*834a2baaSAndroid Build Coastguard Worker 
fakedFont(const std::shared_ptr<Font> & font,const std::string & varSettings)343*834a2baaSAndroid Build Coastguard Worker FakedFont fakedFont(const std::shared_ptr<Font>& font, const std::string& varSettings) {
344*834a2baaSAndroid Build Coastguard Worker     return {font, FontFakery(false, false, parseVariationSettings(varSettings))};
345*834a2baaSAndroid Build Coastguard Worker }
346*834a2baaSAndroid Build Coastguard Worker 
TEST_WITH_FLAGS(FontTest,FakedFont_cached_hbFont,REQUIRES_FLAGS_ENABLED (ACONFIG_FLAG (com::android::text::flags,typeface_redesign_readonly)))347*834a2baaSAndroid Build Coastguard Worker TEST_WITH_FLAGS(FontTest, FakedFont_cached_hbFont,
348*834a2baaSAndroid Build Coastguard Worker                 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(com::android::text::flags,
349*834a2baaSAndroid Build Coastguard Worker                                                     typeface_redesign_readonly))) {
350*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
351*834a2baaSAndroid Build Coastguard Worker 
352*834a2baaSAndroid Build Coastguard Worker     auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(
353*834a2baaSAndroid Build Coastguard Worker             getTestFontPath("WeightEqualsEmVariableFont.ttf"));
354*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> font = Font::Builder(minikinFont).build();
355*834a2baaSAndroid Build Coastguard Worker 
356*834a2baaSAndroid Build Coastguard Worker     FakedFont faked300 = fakedFont(font, "'wght' 300");
357*834a2baaSAndroid Build Coastguard Worker     FakedFont faked400 = fakedFont(font, "'wght' 400");
358*834a2baaSAndroid Build Coastguard Worker     FakedFont faked300_2 = fakedFont(font, "'wght' 300");
359*834a2baaSAndroid Build Coastguard Worker 
360*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(faked300.hbFont().get(), faked300.hbFont().get());
361*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(faked300.hbFont().get(), faked300_2.hbFont().get());
362*834a2baaSAndroid Build Coastguard Worker     EXPECT_NE(faked300.hbFont().get(), faked400.hbFont().get());
363*834a2baaSAndroid Build Coastguard Worker }
364*834a2baaSAndroid Build Coastguard Worker 
TEST_WITH_FLAGS(FontTest,FakedFont_cached_typeface,REQUIRES_FLAGS_ENABLED (ACONFIG_FLAG (com::android::text::flags,typeface_redesign_readonly)))365*834a2baaSAndroid Build Coastguard Worker TEST_WITH_FLAGS(FontTest, FakedFont_cached_typeface,
366*834a2baaSAndroid Build Coastguard Worker                 REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(com::android::text::flags,
367*834a2baaSAndroid Build Coastguard Worker                                                     typeface_redesign_readonly))) {
368*834a2baaSAndroid Build Coastguard Worker     FreeTypeMinikinFontForTestFactory::init();
369*834a2baaSAndroid Build Coastguard Worker 
370*834a2baaSAndroid Build Coastguard Worker     auto minikinFont = std::make_shared<FreeTypeMinikinFontForTest>(
371*834a2baaSAndroid Build Coastguard Worker             getTestFontPath("WeightEqualsEmVariableFont.ttf"));
372*834a2baaSAndroid Build Coastguard Worker     std::shared_ptr<Font> font = Font::Builder(minikinFont).build();
373*834a2baaSAndroid Build Coastguard Worker 
374*834a2baaSAndroid Build Coastguard Worker     FakedFont faked300 = fakedFont(font, "'wght' 300");
375*834a2baaSAndroid Build Coastguard Worker     FakedFont faked400 = fakedFont(font, "'wght' 400");
376*834a2baaSAndroid Build Coastguard Worker     FakedFont faked300_2 = fakedFont(font, "'wght' 300");
377*834a2baaSAndroid Build Coastguard Worker 
378*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(faked300.typeface(), faked300.typeface());
379*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(faked300.typeface(), faked300_2.typeface());
380*834a2baaSAndroid Build Coastguard Worker     EXPECT_NE(faked300.typeface(), faked400.typeface());
381*834a2baaSAndroid Build Coastguard Worker }
382*834a2baaSAndroid Build Coastguard Worker 
383*834a2baaSAndroid Build Coastguard Worker }  // namespace minikin
384