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