Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: third_party/WebKit/Source/platform/fonts/GlyphPageTreeNodeTest.cpp

Issue 1479003002: Remove Simple Text Path (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "platform/fonts/GlyphPageTreeNode.h"
6
7 #include "platform/fonts/SegmentedFontData.h"
8 #include "platform/fonts/SimpleFontData.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace blink {
12
13 namespace {
14
15 class TestCustomFontData : public CustomFontData {
16 public:
17 static PassRefPtr<TestCustomFontData> create() {
18 return adoptRef(new TestCustomFontData());
19 }
20
21 private:
22 TestCustomFontData() {}
23 bool isLoadingFallback() const override { return true; }
24 };
25
26 class TestSimpleFontData : public SimpleFontData {
27 public:
28 static PassRefPtr<TestSimpleFontData> create(UChar32 from, UChar32 to) {
29 return adoptRef(new TestSimpleFontData(nullptr, from, to));
30 }
31
32 static PassRefPtr<TestSimpleFontData> createUnloaded(UChar32 from,
33 UChar32 to) {
34 return adoptRef(
35 new TestSimpleFontData(TestCustomFontData::create(), from, to));
36 }
37
38 private:
39 TestSimpleFontData(PassRefPtr<CustomFontData> customData,
40 UChar32 from,
41 UChar32 to)
42 : SimpleFontData(std::move(customData), 10, false, false),
43 m_from(from),
44 m_to(to) {}
45
46 bool fillGlyphPage(GlyphPage* pageToFill,
47 unsigned offset,
48 unsigned length,
49 UChar* buffer,
50 unsigned bufferLength) const override {
51 const Glyph kGlyph = 1;
52 String bufferString(buffer, bufferLength);
53 unsigned bufferIndex = 0;
54 bool hasGlyphs = false;
55 for (unsigned i = 0; i < length; i++) {
56 UChar32 c = bufferString.characterStartingAt(bufferIndex);
57 bufferIndex += U16_LENGTH(c);
58 if (m_from <= c && c <= m_to) {
59 pageToFill->setGlyphDataForIndex(offset + i, kGlyph, this);
60 hasGlyphs = true;
61 }
62 }
63 return hasGlyphs;
64 }
65
66 UChar32 m_from;
67 UChar32 m_to;
68 };
69
70 } // anonymous namespace
71
72 TEST(GlyphPageTreeNodeTest, rootChild) {
73 const unsigned kPageNumber = 0;
74 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
75 {
76 RefPtr<TestSimpleFontData> data = TestSimpleFontData::create('a', 'z');
77 GlyphPageTreeNode* node =
78 GlyphPageTreeNode::getNormalRootChild(data.get(), kPageNumber);
79 EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount());
80 EXPECT_TRUE(node->page()->glyphAt('a'));
81 EXPECT_FALSE(node->page()->glyphAt('A'));
82 EXPECT_FALSE(node->isSystemFallback());
83 EXPECT_EQ(1u, node->level());
84 EXPECT_EQ(node, node->page()->owner());
85 }
86 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
87 }
88
89 TEST(GlyphPageTreeNodeTest, level2) {
90 const unsigned kPageNumber = 0;
91 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
92 {
93 RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::create('A', 'C');
94 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E');
95 GlyphPageTreeNode* node1 =
96 GlyphPageTreeNode::getNormalRootChild(dataAtoC.get(), kPageNumber);
97 GlyphPageTreeNode* node2 =
98 node1->getNormalChild(dataCtoE.get(), kPageNumber);
99 EXPECT_EQ(pageCountBeforeTest + 3, GlyphPageTreeNode::treeGlyphPageCount());
100
101 EXPECT_EQ(2u, node2->level());
102 EXPECT_EQ(dataAtoC, node2->page()->glyphDataForCharacter('A').fontData);
103 EXPECT_EQ(dataAtoC, node2->page()->glyphDataForCharacter('C').fontData);
104 EXPECT_EQ(dataCtoE, node2->page()->glyphDataForCharacter('E').fontData);
105 }
106 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
107 }
108
109 TEST(GlyphPageTreeNodeTest, segmentedData) {
110 const unsigned kPageNumber = 0;
111 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
112 {
113 RefPtr<TestSimpleFontData> dataBtoC = TestSimpleFontData::create('B', 'C');
114 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E');
115 RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
116 segmentedData->appendFace(
117 adoptRef(new FontDataForRangeSet(dataBtoC, 'A', 'C')));
118 segmentedData->appendFace(
119 adoptRef(new FontDataForRangeSet(dataCtoE, 'C', 'D')));
120 GlyphPageTreeNode* node =
121 GlyphPageTreeNode::getNormalRootChild(segmentedData.get(), kPageNumber);
122
123 EXPECT_EQ(0, node->page()->glyphDataForCharacter('A').fontData);
124 EXPECT_EQ(dataBtoC, node->page()->glyphDataForCharacter('B').fontData);
125 EXPECT_EQ(dataBtoC, node->page()->glyphDataForCharacter('C').fontData);
126 EXPECT_EQ(dataCtoE, node->page()->glyphDataForCharacter('D').fontData);
127 EXPECT_EQ(0, node->page()->glyphDataForCharacter('E').fontData);
128 }
129 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
130 }
131
132 TEST(GlyphPageTreeNodeTest, outsideBMP) {
133 const unsigned kPageNumber = 0x1f300 / GlyphPage::size;
134 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
135 {
136 RefPtr<TestSimpleFontData> data =
137 TestSimpleFontData::create(0x1f310, 0x1f320);
138 GlyphPageTreeNode* node =
139 GlyphPageTreeNode::getNormalRootChild(data.get(), kPageNumber);
140 EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount());
141 EXPECT_FALSE(node->page()->glyphForCharacter(0x1f30f));
142 EXPECT_TRUE(node->page()->glyphForCharacter(0x1f310));
143 EXPECT_TRUE(node->page()->glyphForCharacter(0x1f320));
144 EXPECT_FALSE(node->page()->glyphForCharacter(0x1f321));
145 }
146 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
147 }
148
149 TEST(GlyphPageTreeNodeTest, customData) {
150 const unsigned kPageNumber = 0;
151 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
152 {
153 RefPtr<TestSimpleFontData> dataAtoC =
154 TestSimpleFontData::createUnloaded('A', 'C');
155 RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D');
156 RefPtr<TestSimpleFontData> dataCtoE =
157 TestSimpleFontData::createUnloaded('C', 'E');
158 RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
159 segmentedData->appendFace(
160 adoptRef(new FontDataForRangeSet(dataAtoC, 'A', 'C')));
161 segmentedData->appendFace(
162 adoptRef(new FontDataForRangeSet(dataBtoD, 'B', 'D')));
163 segmentedData->appendFace(
164 adoptRef(new FontDataForRangeSet(dataCtoE, 'C', 'E')));
165 GlyphPageTreeNode* node =
166 GlyphPageTreeNode::getNormalRootChild(segmentedData.get(), kPageNumber);
167
168 EXPECT_EQ(0, node->page()->glyphDataForCharacter('A').fontData);
169 EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('B').fontData);
170 EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('C').fontData);
171 EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('D').fontData);
172 EXPECT_EQ(0, node->page()->glyphDataForCharacter('E').fontData);
173
174 EXPECT_EQ(dataAtoC->customFontData(),
175 node->page()->customFontToLoadAt('A'));
176 EXPECT_EQ(dataAtoC->customFontData(),
177 node->page()->customFontToLoadAt('B'));
178 EXPECT_EQ(dataAtoC->customFontData(),
179 node->page()->customFontToLoadAt('C'));
180 EXPECT_EQ(0, node->page()->customFontToLoadAt('D'));
181 EXPECT_EQ(dataCtoE->customFontData(),
182 node->page()->customFontToLoadAt('E'));
183 }
184 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
185 }
186
187 TEST(GlyphPageTreeNodeTest, customDataWithMultiplePages) {
188 const unsigned kPageNumber = 0;
189 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
190 {
191 RefPtr<TestSimpleFontData> dataAtoC =
192 TestSimpleFontData::createUnloaded('A', 'C');
193 RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D');
194 RefPtr<TestSimpleFontData> dataCtoE =
195 TestSimpleFontData::createUnloaded('C', 'E');
196 RefPtr<SegmentedFontData> segmentedData1 = SegmentedFontData::create();
197 RefPtr<SegmentedFontData> segmentedData2 = SegmentedFontData::create();
198 RefPtr<SegmentedFontData> segmentedData3 = SegmentedFontData::create();
199 segmentedData1->appendFace(
200 adoptRef(new FontDataForRangeSet(dataAtoC, 'A', 'C')));
201 segmentedData2->appendFace(
202 adoptRef(new FontDataForRangeSet(dataBtoD, 'B', 'D')));
203 segmentedData3->appendFace(
204 adoptRef(new FontDataForRangeSet(dataCtoE, 'C', 'E')));
205 GlyphPageTreeNode* node1 = GlyphPageTreeNode::getNormalRootChild(
206 segmentedData1.get(), kPageNumber);
207 GlyphPageTreeNode* node2 =
208 node1->getNormalChild(segmentedData2.get(), kPageNumber);
209 GlyphPageTreeNode* node3 =
210 node2->getNormalChild(segmentedData3.get(), kPageNumber);
211
212 EXPECT_EQ(0, node3->page()->glyphDataForCharacter('A').fontData);
213 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('B').fontData);
214 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('C').fontData);
215 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('D').fontData);
216 EXPECT_EQ(0, node3->page()->glyphDataForCharacter('E').fontData);
217
218 EXPECT_EQ(dataAtoC->customFontData(),
219 node3->page()->customFontToLoadAt('A'));
220 EXPECT_EQ(dataAtoC->customFontData(),
221 node3->page()->customFontToLoadAt('B'));
222 EXPECT_EQ(dataAtoC->customFontData(),
223 node3->page()->customFontToLoadAt('C'));
224 EXPECT_EQ(0, node3->page()->customFontToLoadAt('D'));
225 EXPECT_EQ(dataCtoE->customFontData(),
226 node3->page()->customFontToLoadAt('E'));
227 }
228 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
229 }
230
231 TEST(GlyphPageTreeNodeTest, systemFallback) {
232 const unsigned kPageNumber = 0;
233 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
234 {
235 RefPtr<TestSimpleFontData> dataAtoC =
236 TestSimpleFontData::createUnloaded('A', 'C');
237 RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D');
238 RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
239 segmentedData->appendFace(
240 adoptRef(new FontDataForRangeSet(dataAtoC, 'A', 'C')));
241 GlyphPageTreeNode* node1 =
242 GlyphPageTreeNode::getNormalRootChild(segmentedData.get(), kPageNumber);
243 GlyphPageTreeNode* node2 =
244 node1->getNormalChild(dataBtoD.get(), kPageNumber);
245 SystemFallbackGlyphPageTreeNode* node3 =
246 node2->getSystemFallbackChild(kPageNumber);
247
248 EXPECT_TRUE(node3->isSystemFallback());
249
250 EXPECT_EQ(0, node3->page()->glyphDataForCharacter('A').fontData);
251 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('B').fontData);
252 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('C').fontData);
253 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('D').fontData);
254
255 EXPECT_EQ(dataAtoC->customFontData(),
256 node3->page()->customFontToLoadAt('A'));
257 EXPECT_EQ(dataAtoC->customFontData(),
258 node3->page()->customFontToLoadAt('B'));
259 EXPECT_EQ(dataAtoC->customFontData(),
260 node3->page()->customFontToLoadAt('C'));
261 EXPECT_EQ(0, node3->page()->customFontToLoadAt('D'));
262 }
263 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
264 }
265
266 TEST(GlyphPageTreeNodeTest, systemFallbackScriptIsolation) {
267 const unsigned kPageNumber = 0;
268 RefPtr<TestSimpleFontData> defaultData = TestSimpleFontData::create('A', 'B');
269 GlyphPageTreeNode* node1 =
270 GlyphPageTreeNode::getNormalRootChild(defaultData.get(), kPageNumber);
271 SystemFallbackGlyphPageTreeNode* node2 =
272 node1->getSystemFallbackChild(kPageNumber);
273
274 EXPECT_TRUE(node2->isSystemFallback());
275
276 GlyphPage* commonPage = node2->page(USCRIPT_COMMON);
277 GlyphPage* latinPage = node2->page(USCRIPT_LATIN);
278 GlyphPage* simplifiedChinesePage = node2->page(USCRIPT_SIMPLIFIED_HAN);
279 GlyphPage* traditionalChinesePage = node2->page(USCRIPT_TRADITIONAL_HAN);
280 GlyphPage* japanesePage = node2->page(USCRIPT_KATAKANA_OR_HIRAGANA);
281 EXPECT_NE(commonPage, latinPage);
282 EXPECT_NE(commonPage, simplifiedChinesePage);
283 EXPECT_NE(commonPage, traditionalChinesePage);
284 EXPECT_NE(simplifiedChinesePage, traditionalChinesePage);
285 EXPECT_NE(commonPage, japanesePage);
286 EXPECT_NE(japanesePage, simplifiedChinesePage);
287 EXPECT_NE(japanesePage, traditionalChinesePage);
288 }
289
290 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698