| 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 |