Rubber-stamped by Sam Weinig.
[WebKit-https.git] / WebCore / platform / graphics / SimpleFontData.h
1 /*
2  * This file is part of the internal font implementation.
3  *
4  * Copyright (C) 2006 Apple Computer, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  *
21  */
22
23 #ifndef SimpleFontData_h
24 #define SimpleFontData_h
25
26 #include "FontData.h"
27 #include "FontPlatformData.h"
28 #include "GlyphPageTreeNode.h"
29 #include "GlyphWidthMap.h"
30 #include <wtf/OwnPtr.h>
31 #if PLATFORM(MAC)
32 typedef struct OpaqueATSUStyle* ATSUStyle;
33 #endif
34
35 #if PLATFORM(WIN)
36 #include <usp10.h>
37 #endif
38
39 namespace WebCore {
40
41 class FontDescription;
42 class FontPlatformData;
43 class SharedBuffer;
44 class WidthMap;
45
46 #if ENABLE(SVG_FONTS)
47 class SVGFontFaceElement;
48
49 struct SVGFontData {
50     SVGFontData(SVGFontFaceElement*);
51
52     // Helper function
53     static float convertEmUnitToPixel(float fontSize, float unitsPerEm, float value);
54
55     // Hold pointer to our creator
56     RefPtr<SVGFontFaceElement> fontFaceElement;
57
58     // SVG Font specific metrics
59     float horizontalOriginX;
60     float horizontalOriginY;
61     float horizontalAdvanceX;
62
63     float verticalOriginX;
64     float verticalOriginY;
65     float verticalAdvanceY;
66 };
67 #endif
68
69 enum Pitch { UnknownPitch, FixedPitch, VariablePitch };
70
71 class SimpleFontData : public FontData {
72 public:
73     SimpleFontData(const FontPlatformData&, bool customFont = false, bool loading = false);
74     virtual ~SimpleFontData();
75
76 public:
77     const FontPlatformData& platformData() const { return m_font; }
78     SimpleFontData* smallCapsFontData(const FontDescription& fontDescription) const;
79
80     // vertical metrics
81     int ascent(float fontSize) const;
82     int descent(float fontSize) const;
83     int lineSpacing(float fontSize) const;
84     int lineGap(float fontSize) const;
85     float xHeight(float fontSize) const;
86     unsigned unitsPerEm() const { return m_unitsPerEm; }
87
88     float widthForGlyph(Glyph) const;
89     float platformWidthForGlyph(Glyph) const;
90
91     virtual const SimpleFontData* fontDataForCharacter(UChar32) const;
92     virtual bool containsCharacters(const UChar*, int length) const;
93
94     void determinePitch();
95     Pitch pitch() const { return m_treatAsFixedPitch ? FixedPitch : VariablePitch; }
96
97 #if ENABLE(SVG_FONTS)
98     bool isSVGFont() const { return m_svgFontData; }
99     SVGFontData* svgFontData() const { return m_svgFontData.get(); }
100 #endif
101
102     virtual bool isCustomFont() const { return m_isCustomFont; }
103     virtual bool isLoading() const { return m_isLoading; }
104     virtual bool isSegmented() const;
105
106     const GlyphData& missingGlyphData() const { return m_missingGlyphData; }
107
108 #if PLATFORM(MAC)
109     NSFont* getNSFont() const { return m_font.font(); }
110     void checkShapesArabic() const;
111     bool shapesArabic() const
112     {
113         if (!m_checkedShapesArabic)
114             checkShapesArabic();
115         return m_shapesArabic;
116     }
117 #endif
118
119 #if PLATFORM(WIN)
120     bool isSystemFont() const { return m_isSystemFont; }
121     SCRIPT_FONTPROPERTIES* scriptFontProperties() const;
122     SCRIPT_CACHE* scriptCache() const { return &m_scriptCache; }
123
124     static void setShouldApplyMacAscentHack(bool);
125 #endif
126
127 #if PLATFORM(GTK)
128     void setFont(cairo_t*) const;
129 #endif
130
131 #if PLATFORM(WX)
132     wxFont* getWxFont() const { return m_font.font(); }
133 #endif
134
135 private:
136     void platformInit();
137     void platformDestroy();
138     
139     void commonInit();
140
141 public:
142     int m_ascent;
143     int m_descent;
144     int m_lineSpacing;
145     int m_lineGap;
146     float m_xHeight;
147     unsigned m_unitsPerEm;
148
149     FontPlatformData m_font;
150
151     mutable GlyphWidthMap m_glyphToWidthMap;
152
153     bool m_treatAsFixedPitch;
154
155 #if ENABLE(SVG_FONTS)
156     OwnPtr<SVGFontData> m_svgFontData;
157 #endif
158
159     bool m_isCustomFont;  // Whether or not we are custom font loaded via @font-face
160     bool m_isLoading; // Whether or not this custom font is still in the act of loading.
161
162     Glyph m_spaceGlyph;
163     float m_spaceWidth;
164     float m_adjustedSpaceWidth;
165
166     GlyphData m_missingGlyphData;
167
168     mutable SimpleFontData* m_smallCapsFontData;
169
170 #if PLATFORM(CG)
171     float m_syntheticBoldOffset;
172 #endif
173
174 #if PLATFORM(MAC)
175     void* m_styleGroup;
176     mutable ATSUStyle m_ATSUStyle;
177     mutable bool m_ATSUStyleInitialized;
178     mutable bool m_ATSUMirrors;
179     mutable bool m_checkedShapesArabic;
180     mutable bool m_shapesArabic;
181 #endif
182
183 #if PLATFORM(WIN)
184     bool m_isSystemFont;
185     mutable SCRIPT_CACHE m_scriptCache;
186     mutable SCRIPT_FONTPROPERTIES* m_scriptFontProperties;
187 #endif
188 };
189
190 } // namespace WebCore
191
192 #endif // SimpleFontData_h