18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2008 Rob Buis <buis@kde.org>
5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or
7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public
8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either
9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version.
10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful,
12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details.
15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License
17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef SVGGlyphElement_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define SVGGlyphElement_h
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG_FONTS)
26f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "Path.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGStyledElement.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <limits>
30f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include <wtf/Forward.h>
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass SVGFontData;
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch// Describe a SVG <glyph> element
37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstruct SVGGlyphIdentifier {
38f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    enum Orientation {
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        Vertical,
40f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        Horizontal,
41f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        Both
42f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    };
435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
44f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // SVG Font depends on exactly this order.
45f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    enum ArabicForm {
46f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        None = 0,
47f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        Isolated,
48f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        Terminal,
49f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        Initial,
50f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        Medial
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGGlyphIdentifier()
54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        : isValid(false)
55f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , orientation(Both)
56f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , arabicForm(None)
57f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , priority(0)
58f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , nameLength(0)
59f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , horizontalAdvanceX(0.0f)
60f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , verticalOriginX(0.0f)
61f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , verticalOriginY(0.0f)
62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        , verticalAdvanceY(0.0f)
63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
64f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
65f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
66f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Used to mark our float properties as "to be inherited from SVGFontData"
67f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static float inheritedValue()
68f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
69f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        static float s_inheritedValue = std::numeric_limits<float>::infinity();
70f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return s_inheritedValue;
71f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
72f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
73f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool operator==(const SVGGlyphIdentifier& other) const
74f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    {
75f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return isValid == other.isValid
76f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            && orientation == other.orientation
77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            && arabicForm == other.arabicForm
78f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            && glyphName == other.glyphName
79f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            && horizontalAdvanceX == other.horizontalAdvanceX
80f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            && verticalOriginX == other.verticalOriginX
81f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            && verticalOriginY == other.verticalOriginY
82f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            && verticalAdvanceY == other.verticalAdvanceY
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            && languages == other.languages;
84f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
85f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
86f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    bool isValid : 1;
87f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
88f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    unsigned orientation : 2; // Orientation
89f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    unsigned arabicForm : 3; // ArabicForm
90f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    int priority;
91f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    size_t nameLength;
92f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    String glyphName;
93f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
94f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    float horizontalAdvanceX;
95f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    float verticalOriginX;
96f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    float verticalOriginY;
97f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    float verticalAdvanceY;
98f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
99f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Path pathData;
100f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Vector<String> languages;
101f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch};
102f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
103f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochclass SVGGlyphElement : public SVGStyledElement {
104f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochpublic:
105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static PassRefPtr<SVGGlyphElement> create(const QualifiedName&, Document*);
106f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
107f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGGlyphIdentifier buildGlyphIdentifier() const;
108f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
109f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Helper function used by SVGFont
110f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static void inheritUnspecifiedAttributes(SVGGlyphIdentifier&, const SVGFontData*);
111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static String querySVGFontLanguage(const SVGElement*);
112f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
113f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // Helper function shared between SVGGlyphElement & SVGMissingGlyphElement
114f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    static SVGGlyphIdentifier buildGenericGlyphIdentifier(const SVGElement*);
115f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
116f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochprivate:
117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    SVGGlyphElement(const QualifiedName&, Document*);
118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual void parseMappedAttribute(Attribute*);
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual void fillAttributeToPropertyTypeMap();
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    virtual AttributeToPropertyTypeMap& attributeToPropertyTypeMap();
122f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
123f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual void insertedIntoDocument();
124f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual void removedFromDocument();
125f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
126f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    virtual bool rendererIsNeeded(RenderStyle*) { return false; }
127f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
128f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void invalidateGlyphCache();
129f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch};
130f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // ENABLE(SVG_FONTS)
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
135