18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef GlyphPageTreeNode_h
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define GlyphPageTreeNode_h
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <string.h>
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/HashMap.h>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/PassRefPtr.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RefCounted.h>
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/unicode/Unicode.h>
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid showGlyphPageTrees();
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid showGlyphPageTree(unsigned pageNumber);
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass FontData;
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass GlyphPageTreeNode;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass SimpleFontData;
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef unsigned short Glyph;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Holds the glyph index and the corresponding SimpleFontData information for a given
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// character.
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct GlyphData {
545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    GlyphData(Glyph g = 0, const SimpleFontData* f = 0)
555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        : glyph(g)
565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        , fontData(f)
575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Glyph glyph;
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const SimpleFontData* fontData;
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// A GlyphPage contains a fixed-size set of GlyphData mappings for a contiguous
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// range of characters in the Unicode code space. GlyphPages are indexed
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// starting from 0 and incrementing for each 256 glyphs.
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// One page may actually include glyphs from other fonts if the characters are
685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// missing in the primary font. It is owned by exactly one GlyphPageTreeNode,
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// although multiple nodes may reference it as their "page" if they are supposed
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// to be overriding the parent's node, but provide no additional information.
715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianclass GlyphPage : public RefCounted<GlyphPage> {
725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianpublic:
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static PassRefPtr<GlyphPage> create(GlyphPageTreeNode* owner)
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adoptRef(new GlyphPage(owner));
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static const size_t size = 256; // Covers Latin-1 in a single page.
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    unsigned indexForCharacter(UChar32 c) const { return c % size; }
815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    GlyphData glyphDataForCharacter(UChar32 c) const
825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        unsigned index = indexForCharacter(c);
845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return GlyphData(m_glyphs[index], m_glyphFontData[index]);
855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    GlyphData glyphDataForIndex(unsigned index) const
885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        ASSERT(index < size);
905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return GlyphData(m_glyphs[index], m_glyphFontData[index]);
915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Glyph glyphAt(unsigned index) const
945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        ASSERT(index < size);
965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return m_glyphs[index];
975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    const SimpleFontData* fontDataForCharacter(UChar32 c) const
1005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
1015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return m_glyphFontData[indexForCharacter(c)];
1025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setGlyphDataForCharacter(UChar32 c, Glyph g, const SimpleFontData* f)
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        setGlyphDataForIndex(indexForCharacter(c), g, f);
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setGlyphDataForIndex(unsigned index, Glyph g, const SimpleFontData* f)
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(index < size);
1115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_glyphs[index] = g;
1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_glyphFontData[index] = f;
1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    void setGlyphDataForIndex(unsigned index, const GlyphData& glyphData)
1155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
1165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        setGlyphDataForIndex(index, glyphData.glyph, glyphData.fontData);
1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    void copyFrom(const GlyphPage& other)
1205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        memcpy(m_glyphs, other.m_glyphs, sizeof(m_glyphs));
1225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        memcpy(m_glyphFontData, other.m_glyphFontData, sizeof(m_glyphFontData));
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    void clear()
1265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
1275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        memset(m_glyphs, 0, sizeof(m_glyphs));
1285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        memset(m_glyphFontData, 0, sizeof(m_glyphFontData));
1295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GlyphPageTreeNode* owner() const { return m_owner; }
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Implemented by the platform.
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool fill(unsigned offset, unsigned length, UChar* characterBuffer, unsigned bufferLength, const SimpleFontData*);
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GlyphPage(GlyphPageTreeNode* owner)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        : m_owner(owner)
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Separate arrays, rather than array of GlyphData, to save space.
1435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Glyph m_glyphs[size];
1445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    const SimpleFontData* m_glyphFontData[size];
1455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    GlyphPageTreeNode* m_owner;
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// The glyph page tree is a data structure that maps (FontData, glyph page number)
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// to a GlyphPage.  Level 0 (the "root") is special. There is one root
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// GlyphPageTreeNode for each glyph page number.  The roots do not have a
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// GlyphPage associated with them, and their initializePage() function is never
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// called to fill the glyphs.
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Each root node maps a FontData pointer to another GlyphPageTreeNode at
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// level 1 (the "root child") that stores the actual glyphs for a specific font data.
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// These nodes will only have a GlyphPage if they have glyphs for that range.
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Levels greater than one correspond to subsequent levels of the fallback list
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// for that font. These levels override their parent's page of glyphs by
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// filling in holes with the new font (thus making a more complete page).
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// A NULL FontData pointer corresponds to the system fallback
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// font. It is tracked separately from the regular pages and overrides so that
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the glyph pages do not get polluted with these last-resort glyphs. The
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// system fallback page is not populated at construction like the other pages,
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// but on demand for each glyph, because the system may need to use different
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// fallback fonts for each. This lazy population is done by the Font.
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass GlyphPageTreeNode {
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GlyphPageTreeNode()
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        : m_parent(0)
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        , m_level(0)
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        , m_isSystemFallback(false)
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        , m_customFontCount(0)
1766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        , m_systemFallbackChild(0)
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        , m_pageNumber(0)
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~GlyphPageTreeNode();
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static HashMap<int, GlyphPageTreeNode*>* roots;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static GlyphPageTreeNode* pageZeroRoot;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static GlyphPageTreeNode* getRootChild(const FontData* fontData, unsigned pageNumber)
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return getRoot(pageNumber)->getChild(fontData, pageNumber);
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static void pruneTreeCustomFontData(const FontData*);
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static void pruneTreeFontData(const SimpleFontData*);
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void pruneCustomFontData(const FontData*);
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void pruneFontData(const SimpleFontData*, unsigned level = 0);
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
199852a85ba96877ec81137d97c77bce0afb3634968Russell Brenner#if PLATFORM(ANDROID)
200852a85ba96877ec81137d97c77bce0afb3634968Russell Brenner    static void resetRoots();
201852a85ba96877ec81137d97c77bce0afb3634968Russell Brenner    void resetChildren();
202852a85ba96877ec81137d97c77bce0afb3634968Russell Brenner#endif
203852a85ba96877ec81137d97c77bce0afb3634968Russell Brenner
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GlyphPageTreeNode* parent() const { return m_parent; }
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GlyphPageTreeNode* getChild(const FontData*, unsigned pageNumber);
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Returns a page of glyphs (or NULL if there are no glyphs in this page's character range).
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GlyphPage* page() const { return m_page.get(); }
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Returns the level of this node. See class-level comment.
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned level() const { return m_level; }
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The system fallback font has special rules (see above).
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isSystemFallback() const { return m_isSystemFallback; }
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static size_t treeGlyphPageCount();
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t pageCount() const;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static GlyphPageTreeNode* getRoot(unsigned pageNumber);
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void initializePage(const FontData*, unsigned pageNumber);
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG
2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void showSubtree();
2250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
2260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GlyphPageTreeNode* m_parent;
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<GlyphPage> m_page;
2296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    unsigned m_level : 31;
2306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    bool m_isSystemFallback : 1;
2316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    unsigned m_customFontCount;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HashMap<const FontData*, GlyphPageTreeNode*> m_children;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    GlyphPageTreeNode* m_systemFallbackChild;
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef NDEBUG
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned m_pageNumber;
2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    friend void ::showGlyphPageTree(unsigned pageNumber);
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // GlyphPageTreeNode_h
245