OLD | NEW |
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 Loading... |
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 |
OLD | NEW |