1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker * Copyright (C) 2016 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 "UnicodeUtils.h"
23*834a2baaSAndroid Build Coastguard Worker #include "minikin/FontCollection.h"
24*834a2baaSAndroid Build Coastguard Worker #include "minikin/Layout.h"
25*834a2baaSAndroid Build Coastguard Worker #include "minikin/LayoutPieces.h"
26*834a2baaSAndroid Build Coastguard Worker #include "minikin/Measurement.h"
27*834a2baaSAndroid Build Coastguard Worker
28*834a2baaSAndroid Build Coastguard Worker namespace minikin {
29*834a2baaSAndroid Build Coastguard Worker
expectAdvances(const std::vector<float> & expected,const std::vector<float> & advances)30*834a2baaSAndroid Build Coastguard Worker static void expectAdvances(const std::vector<float>& expected, const std::vector<float>& advances) {
31*834a2baaSAndroid Build Coastguard Worker EXPECT_LE(expected.size(), advances.size());
32*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expected.size(); ++i) {
33*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(expected[i], advances[i])
34*834a2baaSAndroid Build Coastguard Worker << i << "th element is different. Expected: " << expected[i]
35*834a2baaSAndroid Build Coastguard Worker << ", Actual: " << advances[i];
36*834a2baaSAndroid Build Coastguard Worker }
37*834a2baaSAndroid Build Coastguard Worker }
38*834a2baaSAndroid Build Coastguard Worker
getBounds(const U16StringPiece & text,Bidi bidiFlags,const MinikinPaint & paint,MinikinRect * out)39*834a2baaSAndroid Build Coastguard Worker static void getBounds(const U16StringPiece& text, Bidi bidiFlags, const MinikinPaint& paint,
40*834a2baaSAndroid Build Coastguard Worker MinikinRect* out) {
41*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, text.size()), bidiFlags, paint, StartHyphenEdit::NO_EDIT,
42*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, out);
43*834a2baaSAndroid Build Coastguard Worker }
44*834a2baaSAndroid Build Coastguard Worker
45*834a2baaSAndroid Build Coastguard Worker class LayoutTest : public testing::Test {
46*834a2baaSAndroid Build Coastguard Worker protected:
LayoutTest()47*834a2baaSAndroid Build Coastguard Worker LayoutTest() : mCollection(nullptr) {}
48*834a2baaSAndroid Build Coastguard Worker
~LayoutTest()49*834a2baaSAndroid Build Coastguard Worker virtual ~LayoutTest() {}
50*834a2baaSAndroid Build Coastguard Worker
SetUp()51*834a2baaSAndroid Build Coastguard Worker virtual void SetUp() override { mCollection = buildFontCollection("Ascii.ttf"); }
52*834a2baaSAndroid Build Coastguard Worker
TearDown()53*834a2baaSAndroid Build Coastguard Worker virtual void TearDown() override {}
54*834a2baaSAndroid Build Coastguard Worker
55*834a2baaSAndroid Build Coastguard Worker std::shared_ptr<FontCollection> mCollection;
56*834a2baaSAndroid Build Coastguard Worker };
57*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutTest,doLayoutTest)58*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutTest, doLayoutTest) {
59*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(mCollection);
60*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f; // make 1em = 10px
61*834a2baaSAndroid Build Coastguard Worker MinikinRect rect;
62*834a2baaSAndroid Build Coastguard Worker std::vector<float> expectedValues;
63*834a2baaSAndroid Build Coastguard Worker
64*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text;
65*834a2baaSAndroid Build Coastguard Worker
66*834a2baaSAndroid Build Coastguard Worker // The mock implementation returns 10.0f advance and 0,0-10x10 bounds for all glyph.
67*834a2baaSAndroid Build Coastguard Worker {
68*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("one word");
69*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("oneword");
70*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
71*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
72*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
73*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(70.0f, layout.getAdvance());
74*834a2baaSAndroid Build Coastguard Worker
75*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
76*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
77*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
78*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(70.0f, rect.mRight);
79*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
80*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
81*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
82*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
83*834a2baaSAndroid Build Coastguard Worker }
84*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
85*834a2baaSAndroid Build Coastguard Worker }
86*834a2baaSAndroid Build Coastguard Worker {
87*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("two words");
88*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("two words");
89*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
90*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
91*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
92*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(90.0f, layout.getAdvance());
93*834a2baaSAndroid Build Coastguard Worker
94*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
95*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
96*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
97*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(90.0f, rect.mRight);
98*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
99*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
100*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
101*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
102*834a2baaSAndroid Build Coastguard Worker }
103*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
104*834a2baaSAndroid Build Coastguard Worker }
105*834a2baaSAndroid Build Coastguard Worker {
106*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("three words");
107*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("three words test");
108*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
109*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
110*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
111*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(160.0f, layout.getAdvance());
112*834a2baaSAndroid Build Coastguard Worker
113*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
114*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
115*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
116*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(160.0f, rect.mRight);
117*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
118*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
119*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
120*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
121*834a2baaSAndroid Build Coastguard Worker }
122*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
123*834a2baaSAndroid Build Coastguard Worker }
124*834a2baaSAndroid Build Coastguard Worker {
125*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("two spaces");
126*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("two spaces");
127*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
128*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
129*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
130*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(110.0f, layout.getAdvance());
131*834a2baaSAndroid Build Coastguard Worker
132*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
133*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
134*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
135*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(110.0f, rect.mRight);
136*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
137*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
138*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
139*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
140*834a2baaSAndroid Build Coastguard Worker }
141*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
142*834a2baaSAndroid Build Coastguard Worker }
143*834a2baaSAndroid Build Coastguard Worker }
144*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutTest,doLayoutTest_wordSpacing)145*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutTest, doLayoutTest_wordSpacing) {
146*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(mCollection);
147*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f; // make 1em = 10px
148*834a2baaSAndroid Build Coastguard Worker MinikinRect rect;
149*834a2baaSAndroid Build Coastguard Worker std::vector<float> expectedValues;
150*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text;
151*834a2baaSAndroid Build Coastguard Worker
152*834a2baaSAndroid Build Coastguard Worker paint.wordSpacing = 5.0f;
153*834a2baaSAndroid Build Coastguard Worker
154*834a2baaSAndroid Build Coastguard Worker // The mock implementation returns 10.0f advance and 0,0-10x10 bounds for all glyph.
155*834a2baaSAndroid Build Coastguard Worker {
156*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("one word");
157*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("oneword");
158*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
159*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
160*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
161*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(70.0f, layout.getAdvance());
162*834a2baaSAndroid Build Coastguard Worker
163*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
164*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
165*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
166*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(70.0f, rect.mRight);
167*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
168*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
169*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
170*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
171*834a2baaSAndroid Build Coastguard Worker }
172*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
173*834a2baaSAndroid Build Coastguard Worker }
174*834a2baaSAndroid Build Coastguard Worker {
175*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("two words");
176*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("two words");
177*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
178*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
179*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
180*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(95.0f, layout.getAdvance());
181*834a2baaSAndroid Build Coastguard Worker
182*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
183*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
184*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
185*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(95.0f, rect.mRight);
186*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
187*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
188*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
189*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
190*834a2baaSAndroid Build Coastguard Worker }
191*834a2baaSAndroid Build Coastguard Worker expectedValues[3] = 15.0f;
192*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
193*834a2baaSAndroid Build Coastguard Worker }
194*834a2baaSAndroid Build Coastguard Worker {
195*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("three words test");
196*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("three words test");
197*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
198*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
199*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
200*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(170.0f, layout.getAdvance());
201*834a2baaSAndroid Build Coastguard Worker
202*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
203*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
204*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
205*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(170.0f, rect.mRight);
206*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
207*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
208*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
209*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
210*834a2baaSAndroid Build Coastguard Worker }
211*834a2baaSAndroid Build Coastguard Worker expectedValues[5] = 15.0f;
212*834a2baaSAndroid Build Coastguard Worker expectedValues[11] = 15.0f;
213*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
214*834a2baaSAndroid Build Coastguard Worker }
215*834a2baaSAndroid Build Coastguard Worker {
216*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("two spaces");
217*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("two spaces");
218*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
219*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
220*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
221*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(120.0f, layout.getAdvance());
222*834a2baaSAndroid Build Coastguard Worker
223*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
224*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
225*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
226*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(120.0f, rect.mRight);
227*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
228*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
229*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
230*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
231*834a2baaSAndroid Build Coastguard Worker }
232*834a2baaSAndroid Build Coastguard Worker expectedValues[3] = 15.0f;
233*834a2baaSAndroid Build Coastguard Worker expectedValues[4] = 15.0f;
234*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
235*834a2baaSAndroid Build Coastguard Worker }
236*834a2baaSAndroid Build Coastguard Worker }
237*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutTest,doLayoutTest_negativeWordSpacing)238*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutTest, doLayoutTest_negativeWordSpacing) {
239*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(mCollection);
240*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f; // make 1em = 10px
241*834a2baaSAndroid Build Coastguard Worker MinikinRect rect;
242*834a2baaSAndroid Build Coastguard Worker std::vector<float> expectedValues;
243*834a2baaSAndroid Build Coastguard Worker
244*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text;
245*834a2baaSAndroid Build Coastguard Worker
246*834a2baaSAndroid Build Coastguard Worker // Negative word spacing also should work.
247*834a2baaSAndroid Build Coastguard Worker paint.wordSpacing = -5.0f;
248*834a2baaSAndroid Build Coastguard Worker
249*834a2baaSAndroid Build Coastguard Worker {
250*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("one word");
251*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("oneword");
252*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
253*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
254*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
255*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(70.0f, layout.getAdvance());
256*834a2baaSAndroid Build Coastguard Worker
257*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
258*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
259*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
260*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(70.0f, rect.mRight);
261*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
262*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
263*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
264*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
265*834a2baaSAndroid Build Coastguard Worker }
266*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
267*834a2baaSAndroid Build Coastguard Worker }
268*834a2baaSAndroid Build Coastguard Worker {
269*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("two words");
270*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("two words");
271*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
272*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
273*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
274*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(85.0f, layout.getAdvance());
275*834a2baaSAndroid Build Coastguard Worker
276*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
277*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
278*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
279*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(85.0f, rect.mRight);
280*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
281*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
282*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
283*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
284*834a2baaSAndroid Build Coastguard Worker }
285*834a2baaSAndroid Build Coastguard Worker expectedValues[3] = 5.0f;
286*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
287*834a2baaSAndroid Build Coastguard Worker }
288*834a2baaSAndroid Build Coastguard Worker {
289*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("three words");
290*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("three word test");
291*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
292*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
293*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
294*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(140.0f, layout.getAdvance());
295*834a2baaSAndroid Build Coastguard Worker
296*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
297*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
298*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
299*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(140.0f, rect.mRight);
300*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
301*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
302*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
303*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
304*834a2baaSAndroid Build Coastguard Worker }
305*834a2baaSAndroid Build Coastguard Worker expectedValues[5] = 5.0f;
306*834a2baaSAndroid Build Coastguard Worker expectedValues[10] = 5.0f;
307*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
308*834a2baaSAndroid Build Coastguard Worker }
309*834a2baaSAndroid Build Coastguard Worker {
310*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("two spaces");
311*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("two spaces");
312*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
313*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
314*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
315*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(100.0f, layout.getAdvance());
316*834a2baaSAndroid Build Coastguard Worker
317*834a2baaSAndroid Build Coastguard Worker getBounds(text, Bidi::LTR, paint, &rect);
318*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mLeft);
319*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(-10.0f, rect.mTop);
320*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(100.0f, rect.mRight);
321*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, rect.mBottom);
322*834a2baaSAndroid Build Coastguard Worker expectedValues.resize(text.size());
323*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < expectedValues.size(); ++i) {
324*834a2baaSAndroid Build Coastguard Worker expectedValues[i] = 10.0f;
325*834a2baaSAndroid Build Coastguard Worker }
326*834a2baaSAndroid Build Coastguard Worker expectedValues[3] = 5.0f;
327*834a2baaSAndroid Build Coastguard Worker expectedValues[4] = 5.0f;
328*834a2baaSAndroid Build Coastguard Worker expectAdvances(expectedValues, layout.getAdvances());
329*834a2baaSAndroid Build Coastguard Worker }
330*834a2baaSAndroid Build Coastguard Worker }
331*834a2baaSAndroid Build Coastguard Worker
332*834a2baaSAndroid Build Coastguard Worker // Test that a forced-RTL layout correctly mirros a forced-LTR layout.
TEST_F(LayoutTest,doLayoutTest_rtlTest)333*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutTest, doLayoutTest_rtlTest) {
334*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(mCollection);
335*834a2baaSAndroid Build Coastguard Worker
336*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text = parseUnicodeString("'a' 'b' U+3042 U+3043 'c' 'd'");
337*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
338*834a2baaSAndroid Build Coastguard Worker
339*834a2baaSAndroid Build Coastguard Worker Layout ltrLayout(text, range, Bidi::FORCE_LTR, paint, StartHyphenEdit::NO_EDIT,
340*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
341*834a2baaSAndroid Build Coastguard Worker
342*834a2baaSAndroid Build Coastguard Worker Layout rtlLayout(text, range, Bidi::FORCE_RTL, paint, StartHyphenEdit::NO_EDIT,
343*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
344*834a2baaSAndroid Build Coastguard Worker
345*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(ltrLayout.nGlyphs(), rtlLayout.nGlyphs());
346*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(6u, ltrLayout.nGlyphs());
347*834a2baaSAndroid Build Coastguard Worker
348*834a2baaSAndroid Build Coastguard Worker size_t nGlyphs = ltrLayout.nGlyphs();
349*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < nGlyphs; ++i) {
350*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(ltrLayout.getFont(i), rtlLayout.getFont(nGlyphs - i - 1));
351*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(ltrLayout.getGlyphId(i), rtlLayout.getGlyphId(nGlyphs - i - 1));
352*834a2baaSAndroid Build Coastguard Worker }
353*834a2baaSAndroid Build Coastguard Worker }
354*834a2baaSAndroid Build Coastguard Worker
355*834a2baaSAndroid Build Coastguard Worker // Test that single-run RTL layouts of LTR-only text is laid out identical to an LTR layout.
TEST_F(LayoutTest,singleRunBidiTest)356*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutTest, singleRunBidiTest) {
357*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(mCollection);
358*834a2baaSAndroid Build Coastguard Worker
359*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text = parseUnicodeString("'1' '2' '3'");
360*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
361*834a2baaSAndroid Build Coastguard Worker
362*834a2baaSAndroid Build Coastguard Worker Layout ltrLayout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
363*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
364*834a2baaSAndroid Build Coastguard Worker
365*834a2baaSAndroid Build Coastguard Worker Layout rtlLayout(text, range, Bidi::RTL, paint, StartHyphenEdit::NO_EDIT,
366*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
367*834a2baaSAndroid Build Coastguard Worker
368*834a2baaSAndroid Build Coastguard Worker Layout defaultRtlLayout(text, range, Bidi::DEFAULT_RTL, paint, StartHyphenEdit::NO_EDIT,
369*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
370*834a2baaSAndroid Build Coastguard Worker
371*834a2baaSAndroid Build Coastguard Worker const size_t nGlyphs = ltrLayout.nGlyphs();
372*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(3u, nGlyphs);
373*834a2baaSAndroid Build Coastguard Worker
374*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(nGlyphs, rtlLayout.nGlyphs());
375*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(nGlyphs, defaultRtlLayout.nGlyphs());
376*834a2baaSAndroid Build Coastguard Worker
377*834a2baaSAndroid Build Coastguard Worker for (size_t i = 0; i < nGlyphs; ++i) {
378*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(ltrLayout.getFont(i), rtlLayout.getFont(i));
379*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(ltrLayout.getGlyphId(i), rtlLayout.getGlyphId(i));
380*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(ltrLayout.getFont(i), defaultRtlLayout.getFont(i));
381*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(ltrLayout.getGlyphId(i), defaultRtlLayout.getGlyphId(i));
382*834a2baaSAndroid Build Coastguard Worker }
383*834a2baaSAndroid Build Coastguard Worker }
384*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutTest,hyphenationTest)385*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutTest, hyphenationTest) {
386*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(mCollection);
387*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f; // make 1em = 10px
388*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text;
389*834a2baaSAndroid Build Coastguard Worker
390*834a2baaSAndroid Build Coastguard Worker // The mock implementation returns 10.0f advance for all glyphs.
391*834a2baaSAndroid Build Coastguard Worker {
392*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("one word with no hyphen edit");
393*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("oneword");
394*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
395*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
396*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
397*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(70.0f, layout.getAdvance());
398*834a2baaSAndroid Build Coastguard Worker }
399*834a2baaSAndroid Build Coastguard Worker {
400*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("one word with hyphen insertion at the end");
401*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("oneword");
402*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
403*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
404*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::INSERT_HYPHEN, RunFlag::NONE);
405*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(80.0f, layout.getAdvance());
406*834a2baaSAndroid Build Coastguard Worker }
407*834a2baaSAndroid Build Coastguard Worker {
408*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("one word with hyphen replacement at the end");
409*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("oneword");
410*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
411*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
412*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::REPLACE_WITH_HYPHEN, RunFlag::NONE);
413*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(70.0f, layout.getAdvance());
414*834a2baaSAndroid Build Coastguard Worker }
415*834a2baaSAndroid Build Coastguard Worker {
416*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("one word with hyphen insertion at the start");
417*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("oneword");
418*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
419*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::INSERT_HYPHEN,
420*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
421*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(80.0f, layout.getAdvance());
422*834a2baaSAndroid Build Coastguard Worker }
423*834a2baaSAndroid Build Coastguard Worker {
424*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE("one word with hyphen insertion at the both ends");
425*834a2baaSAndroid Build Coastguard Worker text = utf8ToUtf16("oneword");
426*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
427*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::INSERT_HYPHEN,
428*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::INSERT_HYPHEN, RunFlag::NONE);
429*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(90.0f, layout.getAdvance());
430*834a2baaSAndroid Build Coastguard Worker }
431*834a2baaSAndroid Build Coastguard Worker }
432*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutTest,measuredTextTest)433*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutTest, measuredTextTest) {
434*834a2baaSAndroid Build Coastguard Worker // The test font has following coverage and width.
435*834a2baaSAndroid Build Coastguard Worker // U+0020: 10em
436*834a2baaSAndroid Build Coastguard Worker // U+002E (.): 10em
437*834a2baaSAndroid Build Coastguard Worker // U+0043 (C): 100em
438*834a2baaSAndroid Build Coastguard Worker // U+0049 (I): 1em
439*834a2baaSAndroid Build Coastguard Worker // U+004C (L): 50em
440*834a2baaSAndroid Build Coastguard Worker // U+0056 (V): 5em
441*834a2baaSAndroid Build Coastguard Worker // U+0058 (X): 10em
442*834a2baaSAndroid Build Coastguard Worker // U+005F (_): 0em
443*834a2baaSAndroid Build Coastguard Worker // U+FFFD (invalid surrogate will be replaced to this): 7em
444*834a2baaSAndroid Build Coastguard Worker // U+10331 (\uD800\uDF31): 10em
445*834a2baaSAndroid Build Coastguard Worker auto fc = buildFontCollection("LayoutTestFont.ttf");
446*834a2baaSAndroid Build Coastguard Worker {
447*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(fc);
448*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text = utf8ToUtf16("I");
449*834a2baaSAndroid Build Coastguard Worker std::vector<float> advances(text.size());
450*834a2baaSAndroid Build Coastguard Worker uint32_t clusterCount = 0;
451*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
452*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1.0f, Layout::measureText(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
453*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, advances.data(), nullptr,
454*834a2baaSAndroid Build Coastguard Worker &clusterCount, RunFlag::NONE));
455*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, clusterCount);
456*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, advances.size());
457*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1.0f, advances[0]);
458*834a2baaSAndroid Build Coastguard Worker }
459*834a2baaSAndroid Build Coastguard Worker {
460*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(fc);
461*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text = utf8ToUtf16("IV");
462*834a2baaSAndroid Build Coastguard Worker std::vector<float> advances(text.size());
463*834a2baaSAndroid Build Coastguard Worker uint32_t clusterCount = 0;
464*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
465*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(6.0f, Layout::measureText(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
466*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, advances.data(), nullptr,
467*834a2baaSAndroid Build Coastguard Worker &clusterCount, RunFlag::NONE));
468*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(2u, clusterCount);
469*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(2u, advances.size());
470*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1.0f, advances[0]);
471*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5.0f, advances[1]);
472*834a2baaSAndroid Build Coastguard Worker }
473*834a2baaSAndroid Build Coastguard Worker {
474*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(fc);
475*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text = utf8ToUtf16("IVX");
476*834a2baaSAndroid Build Coastguard Worker std::vector<float> advances(text.size());
477*834a2baaSAndroid Build Coastguard Worker uint32_t clusterCount = 0;
478*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
479*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(16.0f,
480*834a2baaSAndroid Build Coastguard Worker Layout::measureText(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
481*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, advances.data(), nullptr,
482*834a2baaSAndroid Build Coastguard Worker &clusterCount, RunFlag::NONE));
483*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(3u, clusterCount);
484*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(3u, advances.size());
485*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1.0f, advances[0]);
486*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(5.0f, advances[1]);
487*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, advances[2]);
488*834a2baaSAndroid Build Coastguard Worker }
489*834a2baaSAndroid Build Coastguard Worker }
490*834a2baaSAndroid Build Coastguard Worker
TEST_F_WITH_FLAGS(LayoutTest,testFontRun,REQUIRES_FLAGS_ENABLED (ACONFIG_FLAG (com::android::text::flags,typeface_redesign_readonly)))491*834a2baaSAndroid Build Coastguard Worker TEST_F_WITH_FLAGS(LayoutTest, testFontRun,
492*834a2baaSAndroid Build Coastguard Worker REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(com::android::text::flags,
493*834a2baaSAndroid Build Coastguard Worker typeface_redesign_readonly))) {
494*834a2baaSAndroid Build Coastguard Worker auto latinFamily = buildFontFamily("Ascii.ttf");
495*834a2baaSAndroid Build Coastguard Worker auto jaFamily = buildFontFamily("Hiragana.ttf");
496*834a2baaSAndroid Build Coastguard Worker const std::vector<std::shared_ptr<FontFamily>> families = {latinFamily, jaFamily};
497*834a2baaSAndroid Build Coastguard Worker auto fc = FontCollection::create(families);
498*834a2baaSAndroid Build Coastguard Worker {
499*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(fc);
500*834a2baaSAndroid Build Coastguard Worker paint.size = 10;
501*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("abc"); // (0, 3): Latin letters
502*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
503*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
504*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
505*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1ul, layout.getFontRunCount());
506*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0ul, layout.getFontRunStart(0));
507*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3ul, layout.getFontRunEnd(0));
508*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ("Ascii.ttf", getBasename(layout.getFontRunFont(0).typeface()->GetFontPath()));
509*834a2baaSAndroid Build Coastguard Worker }
510*834a2baaSAndroid Build Coastguard Worker {
511*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(fc);
512*834a2baaSAndroid Build Coastguard Worker paint.size = 10;
513*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("abcあいう"); // (0, 3): Latin letters, (3, 6): Japanese letters.
514*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
515*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
516*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
517*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2ul, layout.getFontRunCount());
518*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0ul, layout.getFontRunStart(0));
519*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3ul, layout.getFontRunEnd(0));
520*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ("Ascii.ttf", getBasename(layout.getFontRunFont(0).typeface()->GetFontPath()));
521*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3ul, layout.getFontRunStart(1));
522*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(6ul, layout.getFontRunEnd(1));
523*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ("Hiragana.ttf", getBasename(layout.getFontRunFont(1).typeface()->GetFontPath()));
524*834a2baaSAndroid Build Coastguard Worker }
525*834a2baaSAndroid Build Coastguard Worker {
526*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(fc);
527*834a2baaSAndroid Build Coastguard Worker paint.size = 10;
528*834a2baaSAndroid Build Coastguard Worker // (0, 3): Latin letters, (3, 6): Japanese letters, (6, 9): Latin letters.
529*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("abcあいうdef");
530*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
531*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, Bidi::LTR, paint, StartHyphenEdit::NO_EDIT,
532*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, RunFlag::NONE);
533*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3ul, layout.getFontRunCount());
534*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0ul, layout.getFontRunStart(0));
535*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3ul, layout.getFontRunEnd(0));
536*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ("Ascii.ttf", getBasename(layout.getFontRunFont(0).typeface()->GetFontPath()));
537*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(3ul, layout.getFontRunStart(1));
538*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(6ul, layout.getFontRunEnd(1));
539*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ("Hiragana.ttf", getBasename(layout.getFontRunFont(1).typeface()->GetFontPath()));
540*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(6ul, layout.getFontRunStart(2));
541*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(9ul, layout.getFontRunEnd(2));
542*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ("Ascii.ttf", getBasename(layout.getFontRunFont(2).typeface()->GetFontPath()));
543*834a2baaSAndroid Build Coastguard Worker }
544*834a2baaSAndroid Build Coastguard Worker }
545*834a2baaSAndroid Build Coastguard Worker
546*834a2baaSAndroid Build Coastguard Worker } // namespace minikin
547