OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | |
3 * | |
4 * Redistribution and use in source and binary forms, with or without | |
5 * modification, are permitted provided that the following conditions | |
6 * are met: | |
7 * | |
8 * 1. Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * 2. Redistributions in binary form must reproduce the above copyright | |
11 * notice, this list of conditions and the following disclaimer in the | |
12 * documentation and/or other materials provided with the distribution. | |
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of | |
14 * its contributors may be used to endorse or promote products derived | |
15 * from this software without specific prior written permission. | |
16 * | |
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | |
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | |
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
27 */ | |
28 | |
29 #ifndef GlyphPageTreeNode_h | |
30 #define GlyphPageTreeNode_h | |
31 | |
32 #include "platform/fonts/GlyphPage.h" | |
33 #include <string.h> | |
34 #include "wtf/HashMap.h" | |
35 #include "wtf/OwnPtr.h" | |
36 #include "wtf/PassRefPtr.h" | |
37 #include "wtf/RefCounted.h" | |
38 #include "wtf/unicode/Unicode.h" | |
39 | |
40 #ifndef NDEBUG | |
41 void showGlyphPageTrees(); | |
42 void showGlyphPageTree(unsigned pageNumber); | |
43 #endif | |
44 | |
45 namespace WebCore { | |
46 | |
47 class FontData; | |
48 class SimpleFontData; | |
49 | |
50 // The glyph page tree is a data structure that maps (FontData, glyph page numbe
r) | |
51 // to a GlyphPage. Level 0 (the "root") is special. There is one root | |
52 // GlyphPageTreeNode for each glyph page number. The roots do not have a | |
53 // GlyphPage associated with them, and their initializePage() function is never | |
54 // called to fill the glyphs. | |
55 // | |
56 // Each root node maps a FontData pointer to another GlyphPageTreeNode at | |
57 // level 1 (the "root child") that stores the actual glyphs for a specific font
data. | |
58 // These nodes will only have a GlyphPage if they have glyphs for that range. | |
59 // | |
60 // Levels greater than one correspond to subsequent levels of the fallback list | |
61 // for that font. These levels override their parent's page of glyphs by | |
62 // filling in holes with the new font (thus making a more complete page). | |
63 // | |
64 // A NULL FontData pointer corresponds to the system fallback | |
65 // font. It is tracked separately from the regular pages and overrides so that | |
66 // the glyph pages do not get polluted with these last-resort glyphs. The | |
67 // system fallback page is not populated at construction like the other pages, | |
68 // but on demand for each glyph, because the system may need to use different | |
69 // fallback fonts for each. This lazy population is done by the Font. | |
70 class GlyphPageTreeNode { | |
71 WTF_MAKE_FAST_ALLOCATED; | |
72 public: | |
73 static GlyphPageTreeNode* getRootChild(const FontData* fontData, unsigned pa
geNumber) | |
74 { | |
75 return getRoot(pageNumber)->getChild(fontData, pageNumber); | |
76 } | |
77 | |
78 static void pruneTreeCustomFontData(const FontData*); | |
79 static void pruneTreeFontData(const SimpleFontData*); | |
80 | |
81 void pruneCustomFontData(const FontData*); | |
82 void pruneFontData(const SimpleFontData*, unsigned level = 0); | |
83 | |
84 GlyphPageTreeNode* parent() const { return m_parent; } | |
85 GlyphPageTreeNode* getChild(const FontData*, unsigned pageNumber); | |
86 | |
87 // Returns a page of glyphs (or NULL if there are no glyphs in this page's c
haracter range). | |
88 GlyphPage* page() const { return m_page.get(); } | |
89 | |
90 // Returns the level of this node. See class-level comment. | |
91 unsigned level() const { return m_level; } | |
92 | |
93 // The system fallback font has special rules (see above). | |
94 bool isSystemFallback() const { return m_isSystemFallback; } | |
95 | |
96 static size_t treeGlyphPageCount(); | |
97 size_t pageCount() const; | |
98 | |
99 private: | |
100 GlyphPageTreeNode() | |
101 : m_parent(0) | |
102 , m_level(0) | |
103 , m_isSystemFallback(false) | |
104 , m_customFontCount(0) | |
105 #ifndef NDEBUG | |
106 , m_pageNumber(0) | |
107 #endif | |
108 { | |
109 } | |
110 | |
111 static GlyphPageTreeNode* getRoot(unsigned pageNumber); | |
112 void initializePage(const FontData*, unsigned pageNumber); | |
113 | |
114 #ifndef NDEBUG | |
115 void showSubtree(); | |
116 #endif | |
117 | |
118 static HashMap<int, GlyphPageTreeNode*>* roots; | |
119 static GlyphPageTreeNode* pageZeroRoot; | |
120 | |
121 typedef HashMap<const FontData*, OwnPtr<GlyphPageTreeNode> > GlyphPageTreeNo
deMap; | |
122 | |
123 GlyphPageTreeNodeMap m_children; | |
124 GlyphPageTreeNode* m_parent; | |
125 RefPtr<GlyphPage> m_page; | |
126 unsigned m_level : 31; | |
127 bool m_isSystemFallback : 1; | |
128 unsigned m_customFontCount; | |
129 OwnPtr<GlyphPageTreeNode> m_systemFallbackChild; | |
130 | |
131 #ifndef NDEBUG | |
132 unsigned m_pageNumber; | |
133 | |
134 friend void ::showGlyphPageTrees(); | |
135 friend void ::showGlyphPageTree(unsigned pageNumber); | |
136 #endif | |
137 }; | |
138 | |
139 } // namespace WebCore | |
140 | |
141 #endif // GlyphPageTreeNode_h | |
OLD | NEW |