1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker * Copyright (C) 2017 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 "minikin/MeasuredText.h"
18*834a2baaSAndroid Build Coastguard Worker
19*834a2baaSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*834a2baaSAndroid Build Coastguard Worker
21*834a2baaSAndroid Build Coastguard Worker #include "minikin/LineBreaker.h"
22*834a2baaSAndroid Build Coastguard Worker #include "minikin/Measurement.h"
23*834a2baaSAndroid Build Coastguard Worker
24*834a2baaSAndroid Build Coastguard Worker #include "FontTestUtils.h"
25*834a2baaSAndroid Build Coastguard Worker #include "UnicodeUtils.h"
26*834a2baaSAndroid Build Coastguard Worker
27*834a2baaSAndroid Build Coastguard Worker namespace minikin {
28*834a2baaSAndroid Build Coastguard Worker
29*834a2baaSAndroid Build Coastguard Worker constexpr float CHAR_WIDTH = 10.0; // Mock implementation always returns 10.0 for advance.
30*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,RunTests)31*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, RunTests) {
32*834a2baaSAndroid Build Coastguard Worker constexpr uint32_t CHAR_COUNT = 6;
33*834a2baaSAndroid Build Coastguard Worker constexpr float REPLACEMENT_WIDTH = 20.0f;
34*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
35*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
36*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
37*834a2baaSAndroid Build Coastguard Worker
38*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
39*834a2baaSAndroid Build Coastguard Worker
40*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint1(font);
41*834a2baaSAndroid Build Coastguard Worker paint1.size = 10.0f; // make 1em = 10px
42*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, 2, std::move(paint1), lbStyle, lbWordStyle, true /* can hyphenate */,
43*834a2baaSAndroid Build Coastguard Worker false /* is RTL */);
44*834a2baaSAndroid Build Coastguard Worker builder.addReplacementRun(2, 4, REPLACEMENT_WIDTH, 0 /* locale list id */);
45*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint2(font);
46*834a2baaSAndroid Build Coastguard Worker paint2.size = 10.0f; // make 1em = 10px
47*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(4, 6, std::move(paint2), lbStyle, lbWordStyle, true /* can hyphenate */,
48*834a2baaSAndroid Build Coastguard Worker false /* is RTL */);
49*834a2baaSAndroid Build Coastguard Worker
50*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text(CHAR_COUNT, 'a');
51*834a2baaSAndroid Build Coastguard Worker
52*834a2baaSAndroid Build Coastguard Worker std::unique_ptr<MeasuredText> measuredText = builder.build(
53*834a2baaSAndroid Build Coastguard Worker text, true /* compute hyphenation */, false /* compute full layout */,
54*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */, nullptr /* no hint */);
55*834a2baaSAndroid Build Coastguard Worker
56*834a2baaSAndroid Build Coastguard Worker ASSERT_TRUE(measuredText);
57*834a2baaSAndroid Build Coastguard Worker
58*834a2baaSAndroid Build Coastguard Worker // ReplacementRun assigns all width to the first character and leave zeros others.
59*834a2baaSAndroid Build Coastguard Worker std::vector<float> expectedWidths = {CHAR_WIDTH, CHAR_WIDTH, REPLACEMENT_WIDTH,
60*834a2baaSAndroid Build Coastguard Worker 0, CHAR_WIDTH, CHAR_WIDTH};
61*834a2baaSAndroid Build Coastguard Worker
62*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(expectedWidths, measuredText->widths);
63*834a2baaSAndroid Build Coastguard Worker }
64*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,getBoundsTest)65*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getBoundsTest) {
66*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
67*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
68*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
69*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
70*834a2baaSAndroid Build Coastguard Worker
71*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
72*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
73*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
74*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
75*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
76*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
77*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
78*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
79*834a2baaSAndroid Build Coastguard Worker
80*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, 0.0f, 0.0f, 0.0f), mt->getBounds(text, Range(0, 0)));
81*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(0, 1)));
82*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 20.0f, 0.0f), mt->getBounds(text, Range(0, 2)));
83*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(1, 2)));
84*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 130.0f, 0.0f), mt->getBounds(text, Range(0, text.size())));
85*834a2baaSAndroid Build Coastguard Worker }
86*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,getBoundsTest_LTR)87*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getBoundsTest_LTR) {
88*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("\u0028"); // U+0028 has 1em in LTR, 3em in RTL.
89*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Bbox.ttf");
90*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
91*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
92*834a2baaSAndroid Build Coastguard Worker
93*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
94*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
95*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
96*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
97*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
98*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
99*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
100*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
101*834a2baaSAndroid Build Coastguard Worker
102*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(0, 1)));
103*834a2baaSAndroid Build Coastguard Worker }
104*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,getBoundsTest_RTL)105*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getBoundsTest_RTL) {
106*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("\u0028"); // U+0028 has 1em in LTR, 3em in RTL.
107*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Bbox.ttf");
108*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
109*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
110*834a2baaSAndroid Build Coastguard Worker
111*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
112*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
113*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
114*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
115*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, true /* is RTL */);
116*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
117*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
118*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
119*834a2baaSAndroid Build Coastguard Worker
120*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -30.0f, 30.0f, 0.0f), mt->getBounds(text, Range(0, 2)));
121*834a2baaSAndroid Build Coastguard Worker }
122*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,getBoundsTest_multiStyle)123*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getBoundsTest_multiStyle) {
124*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
125*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
126*834a2baaSAndroid Build Coastguard Worker uint32_t helloLength = 7; // length of "Hello, "
127*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
128*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
129*834a2baaSAndroid Build Coastguard Worker
130*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
131*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
132*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
133*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, helloLength, std::move(paint), lbStyle, lbWordStyle,
134*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
135*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint2(font);
136*834a2baaSAndroid Build Coastguard Worker paint2.size = 20.0f;
137*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(helloLength, text.size(), std::move(paint2), lbStyle, lbWordStyle,
138*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
139*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
140*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
141*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
142*834a2baaSAndroid Build Coastguard Worker
143*834a2baaSAndroid Build Coastguard Worker // In this example, the glyph shape is as wollows.
144*834a2baaSAndroid Build Coastguard Worker // (y axis, em unit)
145*834a2baaSAndroid Build Coastguard Worker // -2 ┌───┬───┬───┬───┬───┬───┐
146*834a2baaSAndroid Build Coastguard Worker // │ │ │ │ │ │ │
147*834a2baaSAndroid Build Coastguard Worker // -1 ┌─┬─┬─┬─┬─┬─┬─┤ W │ o │ r │ l │ d │ ! │
148*834a2baaSAndroid Build Coastguard Worker // │H│e│l│l│o│,│ │ │ │ │ │ │ │
149*834a2baaSAndroid Build Coastguard Worker // 0 └─┴─┴─┴─┴─┴─┴─┴───┴───┴───┴───┴───┴───┘
150*834a2baaSAndroid Build Coastguard Worker // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 (x axis, em unit)
151*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, 0.0f, 0.0f, 0.0f), mt->getBounds(text, Range(0, 0)));
152*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(0, 1)));
153*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 20.0f, 0.0f), mt->getBounds(text, Range(0, 2)));
154*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), mt->getBounds(text, Range(1, 2)));
155*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, 0.0f, 0.0f, 0.0f), mt->getBounds(text, Range(7, 7)));
156*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -20.0f, 20.0f, 0.0f), mt->getBounds(text, Range(7, 8)));
157*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -20.0f, 30.0f, 0.0f), mt->getBounds(text, Range(6, 8)));
158*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -20.0f, 190.0f, 0.0f), mt->getBounds(text, Range(0, text.size())));
159*834a2baaSAndroid Build Coastguard Worker }
160*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,getExtentTest)161*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getExtentTest) {
162*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
163*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
164*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
165*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
166*834a2baaSAndroid Build Coastguard Worker
167*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
168*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
169*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
170*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
171*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
172*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
173*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kernign */,
174*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
175*834a2baaSAndroid Build Coastguard Worker
176*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(0.0f, 0.0f), mt->getExtent(text, Range(0, 0)));
177*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, 1)));
178*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, 2)));
179*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(1, 2)));
180*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, text.size())));
181*834a2baaSAndroid Build Coastguard Worker }
182*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,getExtentTest_multiStyle)183*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, getExtentTest_multiStyle) {
184*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
185*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
186*834a2baaSAndroid Build Coastguard Worker uint32_t helloLength = 7; // length of "Hello, "
187*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
188*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
189*834a2baaSAndroid Build Coastguard Worker
190*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
191*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
192*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
193*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, helloLength, std::move(paint), lbStyle, lbWordStyle,
194*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
195*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint2(font);
196*834a2baaSAndroid Build Coastguard Worker paint2.size = 20.0f;
197*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(helloLength, text.size(), std::move(paint2), 0 /* no line break */,
198*834a2baaSAndroid Build Coastguard Worker 0 /* no line break word style */, true /* can hyphenate */,
199*834a2baaSAndroid Build Coastguard Worker false /* is RTL */);
200*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
201*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
202*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
203*834a2baaSAndroid Build Coastguard Worker
204*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(0.0f, 0.0f), mt->getExtent(text, Range(0, 0)));
205*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, 1)));
206*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(0, 2)));
207*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-80.0f, 20.0f), mt->getExtent(text, Range(1, 2)));
208*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(0.0f, 0.0f), mt->getExtent(text, Range(7, 7)));
209*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-160.0f, 40.0f), mt->getExtent(text, Range(7, 8)));
210*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-160.0f, 40.0f), mt->getExtent(text, Range(6, 8)));
211*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinExtent(-160.0f, 40.0f), mt->getExtent(text, Range(0, text.size())));
212*834a2baaSAndroid Build Coastguard Worker }
213*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,buildLayoutTest)214*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, buildLayoutTest) {
215*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
216*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
217*834a2baaSAndroid Build Coastguard Worker Range fullContext(0, text.size());
218*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
219*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
220*834a2baaSAndroid Build Coastguard Worker
221*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
222*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
223*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
224*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
225*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
226*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
227*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
228*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
229*834a2baaSAndroid Build Coastguard Worker
230*834a2baaSAndroid Build Coastguard Worker MinikinRect rect;
231*834a2baaSAndroid Build Coastguard Worker MinikinPaint samePaint(font);
232*834a2baaSAndroid Build Coastguard Worker samePaint.size = 10.0f;
233*834a2baaSAndroid Build Coastguard Worker
234*834a2baaSAndroid Build Coastguard Worker Layout layout = mt->buildLayout(text, Range(0, 0), fullContext, samePaint,
235*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
236*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, layout.nGlyphs());
237*834a2baaSAndroid Build Coastguard Worker
238*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, 1), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
239*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT);
240*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
241*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
242*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
243*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
244*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getAdvance());
245*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(0));
246*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
247*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, 1), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
248*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
249*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), rect);
250*834a2baaSAndroid Build Coastguard Worker
251*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, 2), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
252*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT);
253*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(2u, layout.nGlyphs());
254*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
255*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
256*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
257*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getX(1));
258*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(1));
259*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getAdvance());
260*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(0));
261*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(1));
262*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, layout.getAdvances().size());
263*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, 2), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
264*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
265*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 20.0f, 0.0f), rect);
266*834a2baaSAndroid Build Coastguard Worker
267*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(1, 2), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
268*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT);
269*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
270*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
271*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
272*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
273*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getAdvance());
274*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(0));
275*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
276*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(1, 2), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
277*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
278*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), rect);
279*834a2baaSAndroid Build Coastguard Worker
280*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, text.size()), fullContext, samePaint,
281*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
282*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(text.size(), layout.nGlyphs());
283*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
284*834a2baaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < text.size(); ++i) {
285*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(layout.getFont(0), layout.getFont(i)) << i;
286*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f * i, layout.getX(i)) << i;
287*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(i)) << i;
288*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(i)) << i;
289*834a2baaSAndroid Build Coastguard Worker }
290*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(130.0f, layout.getAdvance());
291*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(text.size(), layout.getAdvances().size());
292*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, text.size()), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
293*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
294*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 130.0f, 0.0f), rect);
295*834a2baaSAndroid Build Coastguard Worker }
296*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,buildLayoutTest_multiStyle)297*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, buildLayoutTest_multiStyle) {
298*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
299*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
300*834a2baaSAndroid Build Coastguard Worker uint32_t helloLength = 7; // length of "Hello, "
301*834a2baaSAndroid Build Coastguard Worker Range fullContext(0, text.size());
302*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
303*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
304*834a2baaSAndroid Build Coastguard Worker
305*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
306*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
307*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
308*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, helloLength, std::move(paint), lbStyle, lbWordStyle,
309*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
310*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint2(font);
311*834a2baaSAndroid Build Coastguard Worker paint2.size = 20.0f;
312*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(helloLength, text.size(), std::move(paint2), lbStyle, lbWordStyle,
313*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
314*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
315*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
316*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
317*834a2baaSAndroid Build Coastguard Worker
318*834a2baaSAndroid Build Coastguard Worker MinikinRect rect;
319*834a2baaSAndroid Build Coastguard Worker MinikinPaint samePaint(font);
320*834a2baaSAndroid Build Coastguard Worker samePaint.size = 10.0f;
321*834a2baaSAndroid Build Coastguard Worker
322*834a2baaSAndroid Build Coastguard Worker Layout layout = mt->buildLayout(text, Range(0, 0), fullContext, samePaint,
323*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
324*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, layout.nGlyphs());
325*834a2baaSAndroid Build Coastguard Worker
326*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, 1), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
327*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT);
328*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
329*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
330*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
331*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
332*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getAdvance());
333*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(0));
334*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
335*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, 1), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
336*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
337*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), rect);
338*834a2baaSAndroid Build Coastguard Worker
339*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, 2), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
340*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT);
341*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(2u, layout.nGlyphs());
342*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
343*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
344*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
345*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getX(1));
346*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(1));
347*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getAdvance());
348*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(0));
349*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(1));
350*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, layout.getAdvances().size());
351*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, 2), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
352*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
353*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 20.0f, 0.0f), rect);
354*834a2baaSAndroid Build Coastguard Worker
355*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(1, 2), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
356*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT);
357*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
358*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
359*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
360*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
361*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getAdvance());
362*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(10.0f, layout.getCharAdvance(0));
363*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
364*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(1, 2), Bidi::LTR, samePaint, StartHyphenEdit::NO_EDIT,
365*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
366*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -10.0f, 10.0f, 0.0f), rect);
367*834a2baaSAndroid Build Coastguard Worker
368*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(7, 7), fullContext, samePaint, StartHyphenEdit::NO_EDIT,
369*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT);
370*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, layout.nGlyphs());
371*834a2baaSAndroid Build Coastguard Worker
372*834a2baaSAndroid Build Coastguard Worker MinikinPaint samePaint2(font);
373*834a2baaSAndroid Build Coastguard Worker samePaint2.size = 20.0f;
374*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(7, 8), fullContext, samePaint2, StartHyphenEdit::NO_EDIT,
375*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT);
376*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
377*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
378*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
379*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
380*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getAdvance());
381*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getCharAdvance(0));
382*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
383*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(7, 8), Bidi::LTR, samePaint2, StartHyphenEdit::NO_EDIT,
384*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
385*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -20.0f, 20.0f, 0.0f), rect);
386*834a2baaSAndroid Build Coastguard Worker }
387*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,buildLayoutTest_differentPaint)388*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, buildLayoutTest_differentPaint) {
389*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
390*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
391*834a2baaSAndroid Build Coastguard Worker Range fullContext(0, text.size());
392*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
393*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
394*834a2baaSAndroid Build Coastguard Worker
395*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
396*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
397*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
398*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
399*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
400*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
401*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
402*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
403*834a2baaSAndroid Build Coastguard Worker
404*834a2baaSAndroid Build Coastguard Worker MinikinRect rect;
405*834a2baaSAndroid Build Coastguard Worker MinikinPaint differentPaint(font);
406*834a2baaSAndroid Build Coastguard Worker differentPaint.size = 20.0f;
407*834a2baaSAndroid Build Coastguard Worker
408*834a2baaSAndroid Build Coastguard Worker Layout layout = mt->buildLayout(text, Range(0, 0), fullContext, differentPaint,
409*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
410*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, layout.nGlyphs());
411*834a2baaSAndroid Build Coastguard Worker
412*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, 1), fullContext, differentPaint,
413*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
414*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
415*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
416*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
417*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
418*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getAdvance());
419*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getCharAdvance(0));
420*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
421*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, 1), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
422*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
423*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -20.0f, 20.0f, 0.0f), rect);
424*834a2baaSAndroid Build Coastguard Worker
425*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, 2), fullContext, differentPaint,
426*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
427*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(2u, layout.nGlyphs());
428*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
429*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
430*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
431*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getX(1));
432*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(1));
433*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(40.0f, layout.getAdvance());
434*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getCharAdvance(0));
435*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getCharAdvance(1));
436*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, layout.getAdvances().size());
437*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, 2), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
438*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
439*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -20.0f, 40.0f, 0.0f), rect);
440*834a2baaSAndroid Build Coastguard Worker
441*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(1, 2), fullContext, differentPaint,
442*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
443*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
444*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
445*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
446*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
447*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getAdvance());
448*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getCharAdvance(0));
449*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
450*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(1, 2), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
451*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
452*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -20.0f, 20.0f, 0.0f), rect);
453*834a2baaSAndroid Build Coastguard Worker
454*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, text.size()), fullContext, differentPaint,
455*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
456*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(text.size(), layout.nGlyphs());
457*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
458*834a2baaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < text.size(); ++i) {
459*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(layout.getFont(0), layout.getFont(i)) << i;
460*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f * i, layout.getX(i)) << i;
461*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(i)) << i;
462*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(20.0f, layout.getCharAdvance(i)) << i;
463*834a2baaSAndroid Build Coastguard Worker }
464*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(260.0f, layout.getAdvance());
465*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(text.size(), layout.getAdvances().size());
466*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, text.size()), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
467*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
468*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -20.0f, 260.0f, 0.0f), rect);
469*834a2baaSAndroid Build Coastguard Worker }
470*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,buildLayoutTest_multiStyle_differentPaint)471*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, buildLayoutTest_multiStyle_differentPaint) {
472*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
473*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
474*834a2baaSAndroid Build Coastguard Worker uint32_t helloLength = 7; // length of "Hello, "
475*834a2baaSAndroid Build Coastguard Worker Range fullContext(0, text.size());
476*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
477*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
478*834a2baaSAndroid Build Coastguard Worker
479*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
480*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
481*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
482*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, helloLength, std::move(paint), lbStyle, lbWordStyle,
483*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
484*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint2(font);
485*834a2baaSAndroid Build Coastguard Worker paint2.size = 20.0f;
486*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(helloLength, text.size(), std::move(paint2), lbStyle, lbWordStyle,
487*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false /* is RTL */);
488*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
489*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
490*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
491*834a2baaSAndroid Build Coastguard Worker
492*834a2baaSAndroid Build Coastguard Worker MinikinRect rect;
493*834a2baaSAndroid Build Coastguard Worker MinikinPaint differentPaint(font);
494*834a2baaSAndroid Build Coastguard Worker differentPaint.size = 30.0f;
495*834a2baaSAndroid Build Coastguard Worker
496*834a2baaSAndroid Build Coastguard Worker Layout layout = mt->buildLayout(text, Range(0, 0), fullContext, differentPaint,
497*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
498*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, layout.nGlyphs());
499*834a2baaSAndroid Build Coastguard Worker
500*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, 1), fullContext, differentPaint,
501*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
502*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
503*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
504*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
505*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
506*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getAdvance());
507*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getCharAdvance(0));
508*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
509*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, 1), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
510*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
511*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -30.0f, 30.0f, 0.0f), rect);
512*834a2baaSAndroid Build Coastguard Worker
513*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, 2), fullContext, differentPaint,
514*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
515*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(2u, layout.nGlyphs());
516*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
517*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
518*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
519*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getX(1));
520*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(1));
521*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(60.0f, layout.getAdvance());
522*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getCharAdvance(0));
523*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getCharAdvance(1));
524*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, layout.getAdvances().size());
525*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, 2), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
526*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
527*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -30.0f, 60.0f, 0.0f), rect);
528*834a2baaSAndroid Build Coastguard Worker
529*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(1, 2), fullContext, differentPaint,
530*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
531*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
532*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
533*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
534*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
535*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getAdvance());
536*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getCharAdvance(0));
537*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
538*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(1, 2), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
539*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
540*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -30.0f, 30.0f, 0.0f), rect);
541*834a2baaSAndroid Build Coastguard Worker
542*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(7, 7), fullContext, differentPaint,
543*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
544*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0u, layout.nGlyphs());
545*834a2baaSAndroid Build Coastguard Worker
546*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(7, 8), fullContext, differentPaint,
547*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
548*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(1u, layout.nGlyphs());
549*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
550*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
551*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
552*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getAdvance());
553*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getCharAdvance(0));
554*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(1u, layout.getAdvances().size());
555*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(7, 8), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
556*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
557*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -30.0f, 30.0f, 0.0f), rect);
558*834a2baaSAndroid Build Coastguard Worker
559*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(6, 8), fullContext, differentPaint,
560*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
561*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(2u, layout.nGlyphs());
562*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0) && layout.getFont(0) == layout.getFont(1));
563*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getX(0));
564*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(0));
565*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getX(1));
566*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(1));
567*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(60.0f, layout.getAdvance());
568*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getCharAdvance(0));
569*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getCharAdvance(1));
570*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(2u, layout.getAdvances().size());
571*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(6, 8), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
572*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
573*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -30.0f, 60.0f, 0.0f), rect);
574*834a2baaSAndroid Build Coastguard Worker
575*834a2baaSAndroid Build Coastguard Worker layout = mt->buildLayout(text, Range(0, text.size()), fullContext, differentPaint,
576*834a2baaSAndroid Build Coastguard Worker StartHyphenEdit::NO_EDIT, EndHyphenEdit::NO_EDIT);
577*834a2baaSAndroid Build Coastguard Worker ASSERT_EQ(text.size(), layout.nGlyphs());
578*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(layout.getFont(0));
579*834a2baaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < text.size(); ++i) {
580*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(layout.getFont(0), layout.getFont(i)) << i;
581*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f * i, layout.getX(i)) << i;
582*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(0.0f, layout.getY(i)) << i;
583*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(30.0f, layout.getCharAdvance(i)) << i;
584*834a2baaSAndroid Build Coastguard Worker }
585*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(390.0f, layout.getAdvance());
586*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(text.size(), layout.getAdvances().size());
587*834a2baaSAndroid Build Coastguard Worker getBounds(text, Range(0, text.size()), Bidi::LTR, differentPaint, StartHyphenEdit::NO_EDIT,
588*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, &rect);
589*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(MinikinRect(0.0f, -30.0f, 390.0f, 0.0f), rect);
590*834a2baaSAndroid Build Coastguard Worker }
591*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,testLineBreakStyle_from_builder)592*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, testLineBreakStyle_from_builder) {
593*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
594*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
595*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::Loose; // loose
596*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::Phrase; // phrase
597*834a2baaSAndroid Build Coastguard Worker
598*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder looseStyleBuilder;
599*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
600*834a2baaSAndroid Build Coastguard Worker looseStyleBuilder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
601*834a2baaSAndroid Build Coastguard Worker true /* can hyphenate */, false);
602*834a2baaSAndroid Build Coastguard Worker auto mt = looseStyleBuilder.build(text, true /* hyphenation */, true /* full layout */,
603*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
604*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
605*834a2baaSAndroid Build Coastguard Worker
606*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, mt->runs.size());
607*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakStyle::Loose, mt->runs[0]->lineBreakStyle());
608*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakWordStyle::Phrase, mt->runs[0]->lineBreakWordStyle());
609*834a2baaSAndroid Build Coastguard Worker
610*834a2baaSAndroid Build Coastguard Worker lbStyle = (int)LineBreakStyle::Normal; // normal
611*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder normalStyleBuilder;
612*834a2baaSAndroid Build Coastguard Worker MinikinPaint normalStylePaint(font);
613*834a2baaSAndroid Build Coastguard Worker normalStyleBuilder.addStyleRun(0, text.size(), std::move(normalStylePaint), lbStyle,
614*834a2baaSAndroid Build Coastguard Worker lbWordStyle, true /* can hyphenate */, false);
615*834a2baaSAndroid Build Coastguard Worker mt = normalStyleBuilder.build(text, true /* hyphenation */, true /* full layout */,
616*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
617*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
618*834a2baaSAndroid Build Coastguard Worker
619*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, mt->runs.size());
620*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakStyle::Normal, mt->runs[0]->lineBreakStyle());
621*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakWordStyle::Phrase, mt->runs[0]->lineBreakWordStyle());
622*834a2baaSAndroid Build Coastguard Worker
623*834a2baaSAndroid Build Coastguard Worker lbStyle = (int)LineBreakStyle::Strict; // strict
624*834a2baaSAndroid Build Coastguard Worker lbWordStyle = (int)LineBreakWordStyle::None; // no word style
625*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder strictStyleBuilder;
626*834a2baaSAndroid Build Coastguard Worker MinikinPaint strictStylePaint(font);
627*834a2baaSAndroid Build Coastguard Worker strictStyleBuilder.addStyleRun(0, text.size(), std::move(strictStylePaint), lbStyle,
628*834a2baaSAndroid Build Coastguard Worker lbWordStyle, true /* can hyphenate */, false);
629*834a2baaSAndroid Build Coastguard Worker mt = strictStyleBuilder.build(text, true /* hyphenation */, true /* full layout */,
630*834a2baaSAndroid Build Coastguard Worker false /* computeBounds */, false /* ignore kerning */,
631*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
632*834a2baaSAndroid Build Coastguard Worker
633*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, mt->runs.size());
634*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakStyle::Strict, mt->runs[0]->lineBreakStyle());
635*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakWordStyle::None, mt->runs[0]->lineBreakWordStyle());
636*834a2baaSAndroid Build Coastguard Worker }
637*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,testLineBreakStyle_from_run)638*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, testLineBreakStyle_from_run) {
639*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
640*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
641*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::Strict;
642*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::Phrase;
643*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
644*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
645*834a2baaSAndroid Build Coastguard Worker
646*834a2baaSAndroid Build Coastguard Worker StyleRun styleRun(range, std::move(paint), lbStyle, lbWordStyle, true /* can hyphenate */,
647*834a2baaSAndroid Build Coastguard Worker false /* isRtl */);
648*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakStyle::Strict, styleRun.lineBreakStyle());
649*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakWordStyle::Phrase, styleRun.lineBreakWordStyle());
650*834a2baaSAndroid Build Coastguard Worker
651*834a2baaSAndroid Build Coastguard Worker ReplacementRun replacementRun(range, 10.0f /* width */, 0 /* locale list id */);
652*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakStyle::None, replacementRun.lineBreakStyle());
653*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(LineBreakWordStyle::None, replacementRun.lineBreakWordStyle());
654*834a2baaSAndroid Build Coastguard Worker }
655*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,hasOverhang_false)656*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, hasOverhang_false) {
657*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("Hello, World!");
658*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("Ascii.ttf");
659*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
660*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
661*834a2baaSAndroid Build Coastguard Worker
662*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
663*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
664*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
665*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
666*834a2baaSAndroid Build Coastguard Worker true /* hyphenation */, false /* is RTL */);
667*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
668*834a2baaSAndroid Build Coastguard Worker true /* computeBounds */, false /* ignore kerning */,
669*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
670*834a2baaSAndroid Build Coastguard Worker EXPECT_FALSE(mt->hasOverhang(Range(0, text.size())));
671*834a2baaSAndroid Build Coastguard Worker }
672*834a2baaSAndroid Build Coastguard Worker
TEST(MeasuredTextTest,hasOverhang_true)673*834a2baaSAndroid Build Coastguard Worker TEST(MeasuredTextTest, hasOverhang_true) {
674*834a2baaSAndroid Build Coastguard Worker auto text = utf8ToUtf16("b");
675*834a2baaSAndroid Build Coastguard Worker auto font = buildFontCollection("OvershootTest.ttf");
676*834a2baaSAndroid Build Coastguard Worker int lbStyle = (int)LineBreakStyle::None;
677*834a2baaSAndroid Build Coastguard Worker int lbWordStyle = (int)LineBreakWordStyle::None;
678*834a2baaSAndroid Build Coastguard Worker
679*834a2baaSAndroid Build Coastguard Worker MeasuredTextBuilder builder;
680*834a2baaSAndroid Build Coastguard Worker MinikinPaint paint(font);
681*834a2baaSAndroid Build Coastguard Worker paint.size = 10.0f;
682*834a2baaSAndroid Build Coastguard Worker builder.addStyleRun(0, text.size(), std::move(paint), lbStyle, lbWordStyle,
683*834a2baaSAndroid Build Coastguard Worker true /* hyphenation */, false /* is RTL */);
684*834a2baaSAndroid Build Coastguard Worker auto mt = builder.build(text, true /* hyphenation */, true /* full layout */,
685*834a2baaSAndroid Build Coastguard Worker true /* computeBounds */, false /* ignore kerning */,
686*834a2baaSAndroid Build Coastguard Worker nullptr /* no hint */);
687*834a2baaSAndroid Build Coastguard Worker EXPECT_TRUE(mt->hasOverhang(Range(0, text.size())));
688*834a2baaSAndroid Build Coastguard Worker }
689*834a2baaSAndroid Build Coastguard Worker
690*834a2baaSAndroid Build Coastguard Worker } // namespace minikin
691