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

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

Issue 243453003: Proper unicode-range font loading behavior (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 8 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "platform/fonts/GlyphPageTreeNode.h" 6 #include "platform/fonts/GlyphPageTreeNode.h"
7 7
8 #include "platform/fonts/SegmentedFontData.h" 8 #include "platform/fonts/SegmentedFontData.h"
9 #include "platform/fonts/SimpleFontData.h" 9 #include "platform/fonts/SimpleFontData.h"
10 #include <gtest/gtest.h> 10 #include <gtest/gtest.h>
11 11
12 namespace WebCore { 12 namespace WebCore {
13 13
14 class TestCustomFontData : public CustomFontData {
15 public:
16 static PassRefPtr<TestCustomFontData> create() { return adoptRef(new TestCus tomFontData()); }
17 private:
18 TestCustomFontData() { }
19 virtual bool isLoadingFallback() const OVERRIDE { return true; }
20 };
21
14 class TestSimpleFontData : public SimpleFontData { 22 class TestSimpleFontData : public SimpleFontData {
15 public: 23 public:
16 static PassRefPtr<TestSimpleFontData> create(UChar32 from, UChar32 to) 24 static PassRefPtr<TestSimpleFontData> create(UChar32 from, UChar32 to)
17 { 25 {
18 return adoptRef(new TestSimpleFontData(from, to)); 26 return adoptRef(new TestSimpleFontData(nullptr, from, to));
27 }
28
29 static PassRefPtr<TestSimpleFontData> createUnloaded(UChar32 from, UChar32 t o)
30 {
31 return adoptRef(new TestSimpleFontData(TestCustomFontData::create(), fro m, to));
19 } 32 }
20 33
21 private: 34 private:
22 TestSimpleFontData(UChar32 from, UChar32 to) 35 TestSimpleFontData(PassRefPtr<CustomFontData> customData, UChar32 from, UCha r32 to)
23 : SimpleFontData(nullptr, 10, false, false) 36 : SimpleFontData(customData, 10, false, false)
24 , m_from(from) 37 , m_from(from)
25 , m_to(to) 38 , m_to(to)
26 { 39 {
27 } 40 }
28 41
29 bool fillGlyphPage(GlyphPage* pageToFill, unsigned offset, unsigned length, UChar* buffer, unsigned bufferLength) const OVERRIDE 42 bool fillGlyphPage(GlyphPage* pageToFill, unsigned offset, unsigned length, UChar* buffer, unsigned bufferLength) const OVERRIDE
30 { 43 {
31 const Glyph kGlyph = 1; 44 const Glyph kGlyph = 1;
32 String bufferString(buffer, bufferLength); 45 String bufferString(buffer, bufferLength);
33 unsigned bufferIndex = 0; 46 unsigned bufferIndex = 0;
(...skipping 10 matching lines...) Expand all
44 } 57 }
45 58
46 UChar32 m_from; 59 UChar32 m_from;
47 UChar32 m_to; 60 UChar32 m_to;
48 }; 61 };
49 62
50 TEST(GlyphPageTreeNode, rootChild) 63 TEST(GlyphPageTreeNode, rootChild)
51 { 64 {
52 const unsigned kPageNumber = 0; 65 const unsigned kPageNumber = 0;
53 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount(); 66 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
54 67 {
55 RefPtr<TestSimpleFontData> data = TestSimpleFontData::create('a', 'z'); 68 RefPtr<TestSimpleFontData> data = TestSimpleFontData::create('a', 'z');
56 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kPageN umber); 69 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kP ageNumber);
57 EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount()); 70 EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount ());
58 EXPECT_TRUE(node->page()->glyphAt('a')); 71 EXPECT_TRUE(node->page()->glyphAt('a'));
59 EXPECT_FALSE(node->page()->glyphAt('A')); 72 EXPECT_FALSE(node->page()->glyphAt('A'));
60 EXPECT_FALSE(node->isSystemFallback()); 73 EXPECT_FALSE(node->isSystemFallback());
61 EXPECT_EQ(1u, node->level()); 74 EXPECT_EQ(1u, node->level());
62 EXPECT_EQ(node, node->page()->owner()); 75 EXPECT_EQ(node, node->page()->owner());
63 76 }
64 GlyphPageTreeNode::pruneTreeFontData(data.get());
65 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount()); 77 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
66 } 78 }
67 79
68 TEST(GlyphPageTreeNode, level2) 80 TEST(GlyphPageTreeNode, level2)
69 { 81 {
70 const unsigned kPageNumber = 0; 82 const unsigned kPageNumber = 0;
71 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount(); 83 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
84 {
85 RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::create('A', 'C ');
86 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E ');
87 GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(dataAtoC.get( ), kPageNumber);
88 GlyphPageTreeNode* node2 = node1->getChild(dataCtoE.get(), kPageNumber);
89 EXPECT_EQ(pageCountBeforeTest + 3, GlyphPageTreeNode::treeGlyphPageCount ());
72 90
73 RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::create('A', 'C'); 91 EXPECT_EQ(2u, node2->level());
74 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E'); 92 EXPECT_EQ(dataAtoC, node2->page()->glyphDataForCharacter('A').fontData);
75 GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(dataAtoC.get(), k PageNumber); 93 EXPECT_EQ(dataAtoC, node2->page()->glyphDataForCharacter('C').fontData);
76 GlyphPageTreeNode* node2 = node1->getChild(dataCtoE.get(), kPageNumber); 94 EXPECT_EQ(dataCtoE, node2->page()->glyphDataForCharacter('E').fontData);
77 EXPECT_EQ(pageCountBeforeTest + 3, GlyphPageTreeNode::treeGlyphPageCount()); 95 }
78
79 EXPECT_EQ(2u, node2->level());
80 EXPECT_EQ(dataAtoC, node2->page()->fontDataForCharacter('A'));
81 EXPECT_EQ(dataAtoC, node2->page()->fontDataForCharacter('C'));
82 EXPECT_EQ(dataCtoE, node2->page()->fontDataForCharacter('E'));
83
84 GlyphPageTreeNode::pruneTreeFontData(dataAtoC.get());
85 GlyphPageTreeNode::pruneTreeFontData(dataCtoE.get());
86 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount()); 96 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
87 } 97 }
88 98
89 TEST(GlyphPageTreeNode, segmentedData) 99 TEST(GlyphPageTreeNode, segmentedData)
90 { 100 {
91 const unsigned kPageNumber = 0; 101 const unsigned kPageNumber = 0;
92 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount(); 102 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
103 {
104 RefPtr<TestSimpleFontData> dataBtoC = TestSimpleFontData::create('B', 'C ');
105 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E ');
106 RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
107 segmentedData->appendRange(FontDataRange('A', 'C', dataBtoC));
108 segmentedData->appendRange(FontDataRange('C', 'D', dataCtoE));
109 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(segmentedData. get(), kPageNumber);
93 110
94 RefPtr<TestSimpleFontData> dataBtoC = TestSimpleFontData::create('B', 'C'); 111 EXPECT_EQ(0, node->page()->glyphDataForCharacter('A').fontData);
95 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E'); 112 EXPECT_EQ(dataBtoC, node->page()->glyphDataForCharacter('B').fontData);
96 RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create(); 113 EXPECT_EQ(dataBtoC, node->page()->glyphDataForCharacter('C').fontData);
97 segmentedData->appendRange(FontDataRange('A', 'C', dataBtoC)); 114 EXPECT_EQ(dataCtoE, node->page()->glyphDataForCharacter('D').fontData);
98 segmentedData->appendRange(FontDataRange('C', 'D', dataCtoE)); 115 EXPECT_EQ(0, node->page()->glyphDataForCharacter('E').fontData);
99 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(segmentedData.get( ), kPageNumber); 116 }
100
101 EXPECT_EQ(0, node->page()->fontDataForCharacter('A'));
102 EXPECT_EQ(dataBtoC, node->page()->fontDataForCharacter('B'));
103 EXPECT_EQ(dataBtoC, node->page()->fontDataForCharacter('C'));
104 EXPECT_EQ(dataCtoE, node->page()->fontDataForCharacter('D'));
105 EXPECT_EQ(0, node->page()->fontDataForCharacter('E'));
106
107 GlyphPageTreeNode::pruneTreeCustomFontData(segmentedData.get());
108 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount()); 117 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
109 } 118 }
110 119
111 TEST(GlyphPageTreeNode, outsideBMP) 120 TEST(GlyphPageTreeNode, outsideBMP)
112 { 121 {
113 const unsigned kPageNumber = 0x1f300 / GlyphPage::size; 122 const unsigned kPageNumber = 0x1f300 / GlyphPage::size;
114 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount(); 123 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
115 124 {
116 RefPtr<TestSimpleFontData> data = TestSimpleFontData::create(0x1f310, 0x1f32 0); 125 RefPtr<TestSimpleFontData> data = TestSimpleFontData::create(0x1f310, 0x 1f320);
117 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kPageN umber); 126 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kP ageNumber);
118 EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount()); 127 EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount ());
119 EXPECT_FALSE(node->page()->glyphForCharacter(0x1f30f)); 128 EXPECT_FALSE(node->page()->glyphForCharacter(0x1f30f));
120 EXPECT_TRUE(node->page()->glyphForCharacter(0x1f310)); 129 EXPECT_TRUE(node->page()->glyphForCharacter(0x1f310));
121 EXPECT_TRUE(node->page()->glyphForCharacter(0x1f320)); 130 EXPECT_TRUE(node->page()->glyphForCharacter(0x1f320));
122 EXPECT_FALSE(node->page()->glyphForCharacter(0x1f321)); 131 EXPECT_FALSE(node->page()->glyphForCharacter(0x1f321));
123 132 }
124 GlyphPageTreeNode::pruneTreeFontData(data.get());
125 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount()); 133 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
126 } 134 }
127 135
136 TEST(GlyphPageTreeNode, customData)
137 {
138 const unsigned kPageNumber = 0;
139 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
140 {
141 RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::createUnloaded ('A', 'C');
142 RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D ');
143 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::createUnloaded ('C', 'E');
144 RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
145 segmentedData->appendRange(FontDataRange('A', 'C', dataAtoC));
146 segmentedData->appendRange(FontDataRange('B', 'D', dataBtoD));
147 segmentedData->appendRange(FontDataRange('C', 'E', dataCtoE));
148 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(segmentedData. get(), kPageNumber);
149
150 EXPECT_EQ(0, node->page()->glyphDataForCharacter('A').fontData);
151 EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('B').fontData);
152 EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('C').fontData);
153 EXPECT_EQ(dataBtoD, node->page()->glyphDataForCharacter('D').fontData);
154 EXPECT_EQ(0, node->page()->glyphDataForCharacter('E').fontData);
155
156 EXPECT_EQ(dataAtoC->customFontData(), node->page()->customFontToLoadAt(' A'));
157 EXPECT_EQ(dataAtoC->customFontData(), node->page()->customFontToLoadAt(' B'));
158 EXPECT_EQ(dataAtoC->customFontData(), node->page()->customFontToLoadAt(' C'));
159 EXPECT_EQ(0, node->page()->customFontToLoadAt('D'));
160 EXPECT_EQ(dataCtoE->customFontData(), node->page()->customFontToLoadAt(' E'));
161 }
162 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
163 }
164
165 TEST(GlyphPageTreeNode, customDataWithMultiplePages)
166 {
167 const unsigned kPageNumber = 0;
168 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
169 {
170 RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::createUnloaded ('A', 'C');
171 RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D ');
172 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::createUnloaded ('C', 'E');
173 RefPtr<SegmentedFontData> segmentedData1 = SegmentedFontData::create();
174 RefPtr<SegmentedFontData> segmentedData2 = SegmentedFontData::create();
175 RefPtr<SegmentedFontData> segmentedData3 = SegmentedFontData::create();
176 segmentedData1->appendRange(FontDataRange('A', 'C', dataAtoC));
177 segmentedData2->appendRange(FontDataRange('B', 'D', dataBtoD));
178 segmentedData3->appendRange(FontDataRange('C', 'E', dataCtoE));
179 GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(segmentedData 1.get(), kPageNumber);
180 GlyphPageTreeNode* node2 = node1->getChild(segmentedData2.get(), kPageNu mber);
181 GlyphPageTreeNode* node3 = node2->getChild(segmentedData3.get(), kPageNu mber);
182
183 EXPECT_EQ(0, node3->page()->glyphDataForCharacter('A').fontData);
184 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('B').fontData);
185 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('C').fontData);
186 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('D').fontData);
187 EXPECT_EQ(0, node3->page()->glyphDataForCharacter('E').fontData);
188
189 EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt( 'A'));
190 EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt( 'B'));
191 EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt( 'C'));
192 EXPECT_EQ(0, node3->page()->customFontToLoadAt('D'));
193 EXPECT_EQ(dataCtoE->customFontData(), node3->page()->customFontToLoadAt( 'E'));
194 }
195 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
196 }
197
198 TEST(GlyphPageTreeNode, systemFallback)
199 {
200 const unsigned kPageNumber = 0;
201 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount();
202 {
203 RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::createUnloaded ('A', 'C');
204 RefPtr<TestSimpleFontData> dataBtoD = TestSimpleFontData::create('B', 'D ');
205 RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create();
206 segmentedData->appendRange(FontDataRange('A', 'C', dataAtoC));
207 GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(segmentedData .get(), kPageNumber);
208 GlyphPageTreeNode* node2 = node1->getChild(dataBtoD.get(), kPageNumber);
209 GlyphPageTreeNode* node3 = node2->getChild(0, kPageNumber);
210
211 EXPECT_TRUE(node3->isSystemFallback());
212
213 EXPECT_EQ(0, node3->page()->glyphDataForCharacter('A').fontData);
214 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('B').fontData);
215 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('C').fontData);
216 EXPECT_EQ(dataBtoD, node3->page()->glyphDataForCharacter('D').fontData);
217
218 EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt( 'A'));
219 EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt( 'B'));
220 EXPECT_EQ(dataAtoC->customFontData(), node3->page()->customFontToLoadAt( 'C'));
221 EXPECT_EQ(0, node3->page()->customFontToLoadAt('D'));
222 }
223 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount());
224 }
225
128 } // namespace WebCore 226 } // namespace WebCore
OLDNEW
« Source/platform/fonts/GlyphPageTreeNode.cpp ('K') | « Source/platform/fonts/GlyphPageTreeNode.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698