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 "config.h" |
| 6 #include "platform/fonts/GlyphPageTreeNode.h" |
| 7 |
| 8 #include "platform/fonts/SegmentedFontData.h" |
| 9 #include "platform/fonts/SimpleFontData.h" |
| 10 #include <gtest/gtest.h> |
| 11 |
| 12 namespace WebCore { |
| 13 |
| 14 class TestSimpleFontData : public SimpleFontData { |
| 15 public: |
| 16 static PassRefPtr<TestSimpleFontData> create(UChar32 from, UChar32 to) |
| 17 { |
| 18 return adoptRef(new TestSimpleFontData(from, to)); |
| 19 } |
| 20 |
| 21 private: |
| 22 TestSimpleFontData(UChar32 from, UChar32 to) |
| 23 : SimpleFontData(nullptr, 10, false, false) |
| 24 , m_from(from) |
| 25 , m_to(to) |
| 26 { |
| 27 } |
| 28 |
| 29 bool fillGlyphPage(GlyphPage* pageToFill, unsigned offset, unsigned length,
UChar* buffer, unsigned bufferLength) const OVERRIDE |
| 30 { |
| 31 const Glyph kGlyph = 1; |
| 32 String bufferString(buffer, bufferLength); |
| 33 unsigned bufferIndex = 0; |
| 34 bool hasGlyphs = false; |
| 35 for (unsigned i = 0; i < length; i++) { |
| 36 UChar32 c = bufferString.characterStartingAt(bufferIndex); |
| 37 bufferIndex += U16_LENGTH(c); |
| 38 if (m_from <= c && c <= m_to) { |
| 39 pageToFill->setGlyphDataForIndex(offset + i, kGlyph, this); |
| 40 hasGlyphs = true; |
| 41 } |
| 42 } |
| 43 return hasGlyphs; |
| 44 } |
| 45 |
| 46 UChar32 m_from; |
| 47 UChar32 m_to; |
| 48 }; |
| 49 |
| 50 TEST(GlyphPageTreeNode, rootChild) |
| 51 { |
| 52 const unsigned kPageNumber = 0; |
| 53 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount(); |
| 54 |
| 55 RefPtr<TestSimpleFontData> data = TestSimpleFontData::create('a', 'z'); |
| 56 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kPageN
umber); |
| 57 EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount()); |
| 58 EXPECT_TRUE(node->page()->glyphAt('a')); |
| 59 EXPECT_FALSE(node->page()->glyphAt('A')); |
| 60 EXPECT_FALSE(node->isSystemFallback()); |
| 61 EXPECT_EQ(1u, node->level()); |
| 62 EXPECT_EQ(node, node->page()->owner()); |
| 63 |
| 64 GlyphPageTreeNode::pruneTreeFontData(data.get()); |
| 65 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount()); |
| 66 } |
| 67 |
| 68 TEST(GlyphPageTreeNode, level2) |
| 69 { |
| 70 const unsigned kPageNumber = 0; |
| 71 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount(); |
| 72 |
| 73 RefPtr<TestSimpleFontData> dataAtoC = TestSimpleFontData::create('A', 'C'); |
| 74 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E'); |
| 75 GlyphPageTreeNode* node1 = GlyphPageTreeNode::getRootChild(dataAtoC.get(), k
PageNumber); |
| 76 GlyphPageTreeNode* node2 = node1->getChild(dataCtoE.get(), kPageNumber); |
| 77 EXPECT_EQ(pageCountBeforeTest + 3, GlyphPageTreeNode::treeGlyphPageCount()); |
| 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()); |
| 87 } |
| 88 |
| 89 TEST(GlyphPageTreeNode, segmentedData) |
| 90 { |
| 91 const unsigned kPageNumber = 0; |
| 92 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount(); |
| 93 |
| 94 RefPtr<TestSimpleFontData> dataBtoC = TestSimpleFontData::create('B', 'C'); |
| 95 RefPtr<TestSimpleFontData> dataCtoE = TestSimpleFontData::create('C', 'E'); |
| 96 RefPtr<SegmentedFontData> segmentedData = SegmentedFontData::create(); |
| 97 segmentedData->appendRange(FontDataRange('A', 'C', dataBtoC)); |
| 98 segmentedData->appendRange(FontDataRange('C', 'D', dataCtoE)); |
| 99 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(segmentedData.get(
), kPageNumber); |
| 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()); |
| 109 } |
| 110 |
| 111 TEST(GlyphPageTreeNode, outsideBMP) |
| 112 { |
| 113 const unsigned kPageNumber = 0x1f300 / GlyphPage::size; |
| 114 size_t pageCountBeforeTest = GlyphPageTreeNode::treeGlyphPageCount(); |
| 115 |
| 116 RefPtr<TestSimpleFontData> data = TestSimpleFontData::create(0x1f310, 0x1f32
0); |
| 117 GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(data.get(), kPageN
umber); |
| 118 EXPECT_EQ(pageCountBeforeTest + 1, GlyphPageTreeNode::treeGlyphPageCount()); |
| 119 EXPECT_FALSE(node->page()->glyphForCharacter(0x1f30f)); |
| 120 EXPECT_TRUE(node->page()->glyphForCharacter(0x1f310)); |
| 121 EXPECT_TRUE(node->page()->glyphForCharacter(0x1f320)); |
| 122 EXPECT_FALSE(node->page()->glyphForCharacter(0x1f321)); |
| 123 |
| 124 GlyphPageTreeNode::pruneTreeFontData(data.get()); |
| 125 EXPECT_EQ(pageCountBeforeTest, GlyphPageTreeNode::treeGlyphPageCount()); |
| 126 } |
| 127 |
| 128 } // namespace WebCore |
OLD | NEW |