1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker * Copyright (C) 2023 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 <gtest/gtest.h>
18*834a2baaSAndroid Build Coastguard Worker
19*834a2baaSAndroid Build Coastguard Worker #include "FontTestUtils.h"
20*834a2baaSAndroid Build Coastguard Worker #include "UnicodeUtils.h"
21*834a2baaSAndroid Build Coastguard Worker #include "minikin/FontCollection.h"
22*834a2baaSAndroid Build Coastguard Worker #include "minikin/Layout.h"
23*834a2baaSAndroid Build Coastguard Worker #include "minikin/LayoutPieces.h"
24*834a2baaSAndroid Build Coastguard Worker #include "minikin/Measurement.h"
25*834a2baaSAndroid Build Coastguard Worker
26*834a2baaSAndroid Build Coastguard Worker namespace minikin {
27*834a2baaSAndroid Build Coastguard Worker
28*834a2baaSAndroid Build Coastguard Worker namespace {
29*834a2baaSAndroid Build Coastguard Worker constexpr bool LTR = false;
30*834a2baaSAndroid Build Coastguard Worker constexpr bool RTL = true;
31*834a2baaSAndroid Build Coastguard Worker } // namespace
32*834a2baaSAndroid Build Coastguard Worker
33*834a2baaSAndroid Build Coastguard Worker class LayoutLetterSpacingTest : public testing::Test {
34*834a2baaSAndroid Build Coastguard Worker protected:
LayoutLetterSpacingTest()35*834a2baaSAndroid Build Coastguard Worker LayoutLetterSpacingTest() {}
~LayoutLetterSpacingTest()36*834a2baaSAndroid Build Coastguard Worker virtual ~LayoutLetterSpacingTest() {}
SetUp()37*834a2baaSAndroid Build Coastguard Worker virtual void SetUp() override {}
TearDown()38*834a2baaSAndroid Build Coastguard Worker virtual void TearDown() override {}
39*834a2baaSAndroid Build Coastguard Worker
LayoutTest(std::initializer_list<float> expect_advances_args,std::initializer_list<float> expect_glyph_offsets_args,const std::string & utf8,bool isRtl,RunFlag runFlag)40*834a2baaSAndroid Build Coastguard Worker void LayoutTest(std::initializer_list<float> expect_advances_args,
41*834a2baaSAndroid Build Coastguard Worker std::initializer_list<float> expect_glyph_offsets_args, const std::string& utf8,
42*834a2baaSAndroid Build Coastguard Worker bool isRtl, RunFlag runFlag) {
43*834a2baaSAndroid Build Coastguard Worker ASSERT_TRUE(mPaint) << "Setup error: must call setShapeParam for setting up the test";
44*834a2baaSAndroid Build Coastguard Worker
45*834a2baaSAndroid Build Coastguard Worker // Prepare parameters
46*834a2baaSAndroid Build Coastguard Worker std::vector<float> expect_advances(expect_advances_args.begin(),
47*834a2baaSAndroid Build Coastguard Worker expect_advances_args.end());
48*834a2baaSAndroid Build Coastguard Worker std::vector<float> expect_glyph_offsets(expect_glyph_offsets_args.begin(),
49*834a2baaSAndroid Build Coastguard Worker expect_glyph_offsets_args.end());
50*834a2baaSAndroid Build Coastguard Worker std::vector<uint16_t> text = utf8ToUtf16(utf8);
51*834a2baaSAndroid Build Coastguard Worker Range range(0, text.size());
52*834a2baaSAndroid Build Coastguard Worker Bidi bidiFlag = isRtl ? Bidi::RTL : Bidi::LTR;
53*834a2baaSAndroid Build Coastguard Worker
54*834a2baaSAndroid Build Coastguard Worker // Compute widths and layout
55*834a2baaSAndroid Build Coastguard Worker std::vector<float> advances(text.size());
56*834a2baaSAndroid Build Coastguard Worker float width = Layout::measureText(text, range, bidiFlag, *mPaint, StartHyphenEdit::NO_EDIT,
57*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, advances.data(), nullptr, nullptr,
58*834a2baaSAndroid Build Coastguard Worker runFlag);
59*834a2baaSAndroid Build Coastguard Worker // Calculate width without per character widths.
60*834a2baaSAndroid Build Coastguard Worker float widthWithoutChars =
61*834a2baaSAndroid Build Coastguard Worker Layout::measureText(text, range, bidiFlag, *mPaint, StartHyphenEdit::NO_EDIT,
62*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, nullptr, nullptr, nullptr, runFlag);
63*834a2baaSAndroid Build Coastguard Worker Layout layout(text, range, bidiFlag, *mPaint, StartHyphenEdit::NO_EDIT,
64*834a2baaSAndroid Build Coastguard Worker EndHyphenEdit::NO_EDIT, runFlag);
65*834a2baaSAndroid Build Coastguard Worker
66*834a2baaSAndroid Build Coastguard Worker SCOPED_TRACE(::testing::Message()
67*834a2baaSAndroid Build Coastguard Worker << "text=" << utf8 << ", flag=" << static_cast<int>(runFlag)
68*834a2baaSAndroid Build Coastguard Worker << ", rtl=" << isRtl << ", layout = " << layout);
69*834a2baaSAndroid Build Coastguard Worker // First, Layout creation and measureText should have the same output
70*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(width, widthWithoutChars);
71*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(advances, layout.getAdvances());
72*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(width, layout.getAdvance());
73*834a2baaSAndroid Build Coastguard Worker
74*834a2baaSAndroid Build Coastguard Worker // Verify the advances
75*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(expect_advances, advances);
76*834a2baaSAndroid Build Coastguard Worker float total_advance = 0;
77*834a2baaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < expect_advances.size(); ++i) {
78*834a2baaSAndroid Build Coastguard Worker total_advance += advances[i];
79*834a2baaSAndroid Build Coastguard Worker }
80*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(total_advance, width);
81*834a2baaSAndroid Build Coastguard Worker
82*834a2baaSAndroid Build Coastguard Worker // Verify Glyph offset
83*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(expect_glyph_offsets.size(), layout.nGlyphs());
84*834a2baaSAndroid Build Coastguard Worker std::vector<float> actual_glyph_offsets;
85*834a2baaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < expect_glyph_offsets.size(); ++i) {
86*834a2baaSAndroid Build Coastguard Worker actual_glyph_offsets.push_back(layout.getX(i));
87*834a2baaSAndroid Build Coastguard Worker }
88*834a2baaSAndroid Build Coastguard Worker EXPECT_EQ(expect_glyph_offsets, actual_glyph_offsets);
89*834a2baaSAndroid Build Coastguard Worker }
90*834a2baaSAndroid Build Coastguard Worker
setShapeParam(const std::string & font,float letterSpacing)91*834a2baaSAndroid Build Coastguard Worker void setShapeParam(const std::string& font, float letterSpacing) {
92*834a2baaSAndroid Build Coastguard Worker auto fc = buildFontCollection(font);
93*834a2baaSAndroid Build Coastguard Worker mPaint = std::make_unique<MinikinPaint>(fc);
94*834a2baaSAndroid Build Coastguard Worker
95*834a2baaSAndroid Build Coastguard Worker mPaint->letterSpacing = letterSpacing;
96*834a2baaSAndroid Build Coastguard Worker mPaint->size = 10.0f;
97*834a2baaSAndroid Build Coastguard Worker mPaint->scaleX = 1.0f;
98*834a2baaSAndroid Build Coastguard Worker }
99*834a2baaSAndroid Build Coastguard Worker
100*834a2baaSAndroid Build Coastguard Worker private:
101*834a2baaSAndroid Build Coastguard Worker std::unique_ptr<MinikinPaint> mPaint;
102*834a2baaSAndroid Build Coastguard Worker };
103*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutLetterSpacingTest,measuredTextTest_LetterSpacing)104*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutLetterSpacingTest, measuredTextTest_LetterSpacing) {
105*834a2baaSAndroid Build Coastguard Worker // In this test case, use LayoutTestFont.ttf for testing. This font supports character I. The
106*834a2baaSAndroid Build Coastguard Worker // glyph of 'I' in this font has 1em width.
107*834a2baaSAndroid Build Coastguard Worker setShapeParam("LayoutTestFont.ttf", 1.0f);
108*834a2baaSAndroid Build Coastguard Worker
109*834a2baaSAndroid Build Coastguard Worker // Single letter
110*834a2baaSAndroid Build Coastguard Worker LayoutTest({20}, {5}, "I", LTR, NONE);
111*834a2baaSAndroid Build Coastguard Worker LayoutTest({15}, {0}, "I", LTR, LEFT_EDGE);
112*834a2baaSAndroid Build Coastguard Worker LayoutTest({15}, {5}, "I", LTR, RIGHT_EDGE);
113*834a2baaSAndroid Build Coastguard Worker LayoutTest({10}, {0}, "I", LTR, WHOLE_LINE);
114*834a2baaSAndroid Build Coastguard Worker
115*834a2baaSAndroid Build Coastguard Worker // Two letters
116*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20}, {5, 25}, "II", LTR, NONE);
117*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 20}, {0, 20}, "II", LTR, LEFT_EDGE);
118*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 15}, {5, 25}, "II", LTR, RIGHT_EDGE);
119*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 15}, {0, 20}, "II", LTR, WHOLE_LINE);
120*834a2baaSAndroid Build Coastguard Worker
121*834a2baaSAndroid Build Coastguard Worker // Three letters
122*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20}, {5, 25, 45}, "III", LTR, NONE);
123*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 20, 20}, {0, 20, 40}, "III", LTR, LEFT_EDGE);
124*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 15}, {5, 25, 45}, "III", LTR, RIGHT_EDGE);
125*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 20, 15}, {0, 20, 40}, "III", LTR, WHOLE_LINE);
126*834a2baaSAndroid Build Coastguard Worker }
127*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutLetterSpacingTest,measuredTextTest_LetterSpacing_ligature)128*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutLetterSpacingTest, measuredTextTest_LetterSpacing_ligature) {
129*834a2baaSAndroid Build Coastguard Worker // In this test case, use Ligature.ttf for testing. This font supports both character 'f' and
130*834a2baaSAndroid Build Coastguard Worker // character 'i', then this font has ligatured form of sequence "fi". All letters in this font
131*834a2baaSAndroid Build Coastguard Worker // have 1em width.
132*834a2baaSAndroid Build Coastguard Worker setShapeParam("Ligature.ttf", 1.0f);
133*834a2baaSAndroid Build Coastguard Worker
134*834a2baaSAndroid Build Coastguard Worker // Single letter
135*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0}, {5}, "fi", LTR, NONE);
136*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0}, {0}, "fi", LTR, LEFT_EDGE);
137*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0}, {5}, "fi", LTR, RIGHT_EDGE);
138*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0}, {0}, "fi", LTR, WHOLE_LINE);
139*834a2baaSAndroid Build Coastguard Worker
140*834a2baaSAndroid Build Coastguard Worker // Two letters
141*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0, 20, 0}, {5, 25}, "fifi", LTR, NONE);
142*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0, 20, 0}, {0, 20}, "fifi", LTR, LEFT_EDGE);
143*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0, 15, 0}, {5, 25}, "fifi", LTR, RIGHT_EDGE);
144*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0, 15, 0}, {0, 20}, "fifi", LTR, WHOLE_LINE);
145*834a2baaSAndroid Build Coastguard Worker
146*834a2baaSAndroid Build Coastguard Worker // Three letters
147*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0, 20, 0, 20, 0}, {5, 25, 45}, "fififi", LTR, NONE);
148*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0, 20, 0, 20, 0}, {0, 20, 40}, "fififi", LTR, LEFT_EDGE);
149*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0, 20, 0, 15, 0}, {5, 25, 45}, "fififi", LTR, RIGHT_EDGE);
150*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0, 20, 0, 15, 0}, {0, 20, 40}, "fififi", LTR, WHOLE_LINE);
151*834a2baaSAndroid Build Coastguard Worker }
152*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutLetterSpacingTest,measuredTextTest_LetterSpacing_Bidi)153*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutLetterSpacingTest, measuredTextTest_LetterSpacing_Bidi) {
154*834a2baaSAndroid Build Coastguard Worker const std::string LLRRLL = "aa\u05D0\u05D0aa";
155*834a2baaSAndroid Build Coastguard Worker const std::string RRLLRR = "\u05D0\u05D0aa\u05D0\u05D0";
156*834a2baaSAndroid Build Coastguard Worker
157*834a2baaSAndroid Build Coastguard Worker // In this test case, use BiDi.ttf for testing. This font supports both character 'a' and
158*834a2baaSAndroid Build Coastguard Worker // Hebrew Alef. Both letters have 1em advance.
159*834a2baaSAndroid Build Coastguard Worker setShapeParam("BiDi.ttf", 1.0f);
160*834a2baaSAndroid Build Coastguard Worker
161*834a2baaSAndroid Build Coastguard Worker // LLRRLL with LTR context
162*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20, 20, 20, 20}, {5, 25, 45, 65, 85, 105}, LLRRLL, LTR, NONE);
163*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 20, 20, 20, 20, 20}, {0, 20, 40, 60, 80, 100}, LLRRLL, LTR, LEFT_EDGE);
164*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20, 20, 20, 15}, {5, 25, 45, 65, 85, 105}, LLRRLL, LTR, RIGHT_EDGE);
165*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 20, 20, 20, 20, 15}, {0, 20, 40, 60, 80, 100}, LLRRLL, LTR, WHOLE_LINE);
166*834a2baaSAndroid Build Coastguard Worker
167*834a2baaSAndroid Build Coastguard Worker // LLRRLL with RTL context
168*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20, 20, 20, 20}, {5, 25, 45, 65, 85, 105}, LLRRLL, RTL, NONE);
169*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20, 20, 15, 20}, {0, 20, 40, 60, 80, 100}, LLRRLL, RTL, LEFT_EDGE);
170*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 15, 20, 20, 20, 20}, {5, 25, 45, 65, 85, 105}, LLRRLL, RTL, RIGHT_EDGE);
171*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 15, 20, 20, 15, 20}, {0, 20, 40, 60, 80, 100}, LLRRLL, RTL, WHOLE_LINE);
172*834a2baaSAndroid Build Coastguard Worker
173*834a2baaSAndroid Build Coastguard Worker // RRLLRR with LTR context
174*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20, 20, 20, 20}, {5, 25, 45, 65, 85, 105}, RRLLRR, LTR, NONE);
175*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 15, 20, 20, 20, 20}, {0, 20, 40, 60, 80, 100}, RRLLRR, LTR, LEFT_EDGE);
176*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20, 20, 15, 20}, {5, 25, 45, 65, 85, 105}, RRLLRR, LTR, RIGHT_EDGE);
177*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 15, 20, 20, 15, 20}, {0, 20, 40, 60, 80, 100}, RRLLRR, LTR, WHOLE_LINE);
178*834a2baaSAndroid Build Coastguard Worker
179*834a2baaSAndroid Build Coastguard Worker // RRLLRR with RTL context
180*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20, 20, 20, 20}, {5, 25, 45, 65, 85, 105}, RRLLRR, RTL, NONE);
181*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 20, 20, 20, 20, 15}, {0, 20, 40, 60, 80, 100}, RRLLRR, RTL, LEFT_EDGE);
182*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 20, 20, 20, 20, 20}, {5, 25, 45, 65, 85, 105}, RRLLRR, RTL, RIGHT_EDGE);
183*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 20, 20, 20, 20, 15}, {0, 20, 40, 60, 80, 100}, RRLLRR, RTL, WHOLE_LINE);
184*834a2baaSAndroid Build Coastguard Worker }
185*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutLetterSpacingTest,measureTextTest_ControlCharacters)186*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutLetterSpacingTest, measureTextTest_ControlCharacters) {
187*834a2baaSAndroid Build Coastguard Worker // In this test case, use ControlCharacters.ttf for testing. This font supports ASCII plus
188*834a2baaSAndroid Build Coastguard Worker // following letters.
189*834a2baaSAndroid Build Coastguard Worker // U+FEFF: ZERO WIDTH NO-BREAK SPACE: Control character and no width.
190*834a2baaSAndroid Build Coastguard Worker setShapeParam("ControlCharacters.ttf", 1.0f);
191*834a2baaSAndroid Build Coastguard Worker
192*834a2baaSAndroid Build Coastguard Worker // U+FEFF is a control character, so letter spacing should not be applied.
193*834a2baaSAndroid Build Coastguard Worker LayoutTest({0}, {0}, "\uFEFF", LTR, NONE);
194*834a2baaSAndroid Build Coastguard Worker LayoutTest({0}, {0}, "\uFEFF", LTR, LEFT_EDGE);
195*834a2baaSAndroid Build Coastguard Worker LayoutTest({0}, {0}, "\uFEFF", LTR, RIGHT_EDGE);
196*834a2baaSAndroid Build Coastguard Worker LayoutTest({0}, {0}, "\uFEFF", LTR, WHOLE_LINE);
197*834a2baaSAndroid Build Coastguard Worker
198*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0}, {5, 20}, "a\uFEFF", LTR, NONE);
199*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0}, {0, 15}, "a\uFEFF", LTR, LEFT_EDGE);
200*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0}, {5, 15}, "a\uFEFF", LTR, RIGHT_EDGE);
201*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0}, {0, 10}, "a\uFEFF", LTR, WHOLE_LINE);
202*834a2baaSAndroid Build Coastguard Worker
203*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0, 20}, {5, 20, 25}, "a\uFEFFa", LTR, NONE);
204*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0, 20}, {0, 15, 20}, "a\uFEFFa", LTR, LEFT_EDGE);
205*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0, 15}, {5, 20, 25}, "a\uFEFFa", LTR, RIGHT_EDGE);
206*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0, 15}, {0, 15, 20}, "a\uFEFFa", LTR, WHOLE_LINE);
207*834a2baaSAndroid Build Coastguard Worker
208*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 20}, {0, 5}, "\uFEFFa", LTR, NONE);
209*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 15}, {0, 0}, "\uFEFFa", LTR, LEFT_EDGE);
210*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 15}, {0, 5}, "\uFEFFa", LTR, RIGHT_EDGE);
211*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10}, {0, 0}, "\uFEFFa", LTR, WHOLE_LINE);
212*834a2baaSAndroid Build Coastguard Worker
213*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 20, 0}, {0, 5, 20}, "\uFEFFa\uFEFF", LTR, NONE);
214*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 15, 0}, {0, 0, 15}, "\uFEFFa\uFEFF", LTR, LEFT_EDGE);
215*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 15, 0}, {0, 5, 15}, "\uFEFFa\uFEFF", LTR, RIGHT_EDGE);
216*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10, 0}, {0, 0, 10}, "\uFEFFa\uFEFF", LTR, WHOLE_LINE);
217*834a2baaSAndroid Build Coastguard Worker }
218*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutLetterSpacingTest,measureTextTest_ControlCharacters_RTL)219*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutLetterSpacingTest, measureTextTest_ControlCharacters_RTL) {
220*834a2baaSAndroid Build Coastguard Worker // In this test case, use ControlCharacters.ttf for testing. This font supports ASCII plus
221*834a2baaSAndroid Build Coastguard Worker // following letters.
222*834a2baaSAndroid Build Coastguard Worker // U+FEFF: ZERO WIDTH NO-BREAK SPACE: Control character and no width.
223*834a2baaSAndroid Build Coastguard Worker setShapeParam("ControlCharacters.ttf", 1.0f);
224*834a2baaSAndroid Build Coastguard Worker
225*834a2baaSAndroid Build Coastguard Worker // U+FEFF is a control character, so letter spacing should not be applied.
226*834a2baaSAndroid Build Coastguard Worker LayoutTest({0}, {0}, "\uFEFF", RTL, NONE);
227*834a2baaSAndroid Build Coastguard Worker LayoutTest({0}, {0}, "\uFEFF", RTL, LEFT_EDGE);
228*834a2baaSAndroid Build Coastguard Worker LayoutTest({0}, {0}, "\uFEFF", RTL, RIGHT_EDGE);
229*834a2baaSAndroid Build Coastguard Worker LayoutTest({0}, {0}, "\uFEFF", RTL, WHOLE_LINE);
230*834a2baaSAndroid Build Coastguard Worker
231*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0}, {0, 5}, "\u05D0\uFEFF", RTL, NONE);
232*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0}, {0, 0}, "\u05D0\uFEFF", RTL, LEFT_EDGE);
233*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0}, {0, 5}, "\u05D0\uFEFF", RTL, RIGHT_EDGE);
234*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0}, {0, 0}, "\u05D0\uFEFF", RTL, WHOLE_LINE);
235*834a2baaSAndroid Build Coastguard Worker
236*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0, 20}, {5, 20, 25}, "\u05D0\uFEFF\u05D0", RTL, NONE);
237*834a2baaSAndroid Build Coastguard Worker LayoutTest({20, 0, 15}, {0, 15, 20}, "\u05D0\uFEFF\u05D0", RTL, LEFT_EDGE);
238*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0, 20}, {5, 20, 25}, "\u05D0\uFEFF\u05D0", RTL, RIGHT_EDGE);
239*834a2baaSAndroid Build Coastguard Worker LayoutTest({15, 0, 15}, {0, 15, 20}, "\u05D0\uFEFF\u05D0", RTL, WHOLE_LINE);
240*834a2baaSAndroid Build Coastguard Worker
241*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 20}, {5, 20}, "\uFEFF\u05D0", RTL, NONE);
242*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 15}, {0, 15}, "\uFEFF\u05D0", RTL, LEFT_EDGE);
243*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 15}, {5, 15}, "\uFEFF\u05D0", RTL, RIGHT_EDGE);
244*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10}, {0, 10}, "\uFEFF\u05D0", RTL, WHOLE_LINE);
245*834a2baaSAndroid Build Coastguard Worker
246*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 20, 0}, {0, 5, 20}, "\uFEFF\u05D0\uFEFF", RTL, NONE);
247*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 15, 0}, {0, 0, 15}, "\uFEFF\u05D0\uFEFF", RTL, LEFT_EDGE);
248*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 15, 0}, {0, 5, 15}, "\uFEFF\u05D0\uFEFF", RTL, RIGHT_EDGE);
249*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10, 0}, {0, 0, 10}, "\uFEFF\u05D0\uFEFF", RTL, WHOLE_LINE);
250*834a2baaSAndroid Build Coastguard Worker }
251*834a2baaSAndroid Build Coastguard Worker
TEST_F(LayoutLetterSpacingTest,measureTextTest_ControlCharacters_RTL_Arabic)252*834a2baaSAndroid Build Coastguard Worker TEST_F(LayoutLetterSpacingTest, measureTextTest_ControlCharacters_RTL_Arabic) {
253*834a2baaSAndroid Build Coastguard Worker // In this test case, use ControlCharacters.ttf for testing. This font supports ASCII plus
254*834a2baaSAndroid Build Coastguard Worker // following letters.
255*834a2baaSAndroid Build Coastguard Worker // U+FEFF: ZERO WIDTH NO-BREAK SPACE: Control character and no width.
256*834a2baaSAndroid Build Coastguard Worker setShapeParam("ControlCharacters.ttf", 1.0f);
257*834a2baaSAndroid Build Coastguard Worker
258*834a2baaSAndroid Build Coastguard Worker // U+FEFF is a control character, so letter spacing should not be applied.
259*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0}, {0, 0}, "\u0627\uFEFF", RTL, NONE);
260*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0}, {0, 0}, "\u0627\uFEFF", RTL, LEFT_EDGE);
261*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0}, {0, 0}, "\u0627\uFEFF", RTL, RIGHT_EDGE);
262*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0}, {0, 0}, "\u0627\uFEFF", RTL, WHOLE_LINE);
263*834a2baaSAndroid Build Coastguard Worker
264*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0, 10}, {0, 10, 10}, "\u0627\uFEFF\u0627", RTL, NONE);
265*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0, 10}, {0, 10, 10}, "\u0627\uFEFF\u0627", RTL, LEFT_EDGE);
266*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0, 10}, {0, 10, 10}, "\u0627\uFEFF\u0627", RTL, RIGHT_EDGE);
267*834a2baaSAndroid Build Coastguard Worker LayoutTest({10, 0, 10}, {0, 10, 10}, "\u0627\uFEFF\u0627", RTL, WHOLE_LINE);
268*834a2baaSAndroid Build Coastguard Worker
269*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10}, {0, 10}, "\uFEFF\u0627", RTL, NONE);
270*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10}, {0, 10}, "\uFEFF\u0627", RTL, LEFT_EDGE);
271*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10}, {0, 10}, "\uFEFF\u0627", RTL, RIGHT_EDGE);
272*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10}, {0, 10}, "\uFEFF\u0627", RTL, WHOLE_LINE);
273*834a2baaSAndroid Build Coastguard Worker
274*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10, 0}, {0, 0, 10}, "\uFEFF\u0627\uFEFF", RTL, NONE);
275*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10, 0}, {0, 0, 10}, "\uFEFF\u0627\uFEFF", RTL, LEFT_EDGE);
276*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10, 0}, {0, 0, 10}, "\uFEFF\u0627\uFEFF", RTL, RIGHT_EDGE);
277*834a2baaSAndroid Build Coastguard Worker LayoutTest({0, 10, 0}, {0, 0, 10}, "\uFEFF\u0627\uFEFF", RTL, WHOLE_LINE);
278*834a2baaSAndroid Build Coastguard Worker }
279*834a2baaSAndroid Build Coastguard Worker
280*834a2baaSAndroid Build Coastguard Worker } // namespace minikin
281