OLD | NEW |
| (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 | |
OLD | NEW |