Reviewed by Anders.
[WebKit-https.git] / WebCore / platform / FontData.h
1 /*
2  * This file is part of the internal font implementation.  It should not be included by anyone other than
3  * FontMac.cpp, FontWin.cpp and Font.cpp.
4  *
5  * Copyright (C) 2006 Apple Computer, Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  *
22  */
23
24 #if __APPLE__
25 typedef UInt16                          ATSGlyphRef;
26 typedef struct OpaqueATSUStyle*         ATSUStyle;
27
28 #if __OBJC__
29 @class NSColor;
30 #else
31 class NSColor;
32 #endif
33
34 #include "FloatPoint.h"
35 #include "FontPlatformData.h"
36 #include "GlyphBuffer.h"
37
38 // FIXME: Temporary.  Only needed to support API that's going to move.
39 #include <unicode/uchar.h>
40 #include <unicode/unorm.h>
41
42 namespace WebCore
43 {
44
45 class FloatRect;
46 class Color;
47 class FontDescription;
48
49 struct WebCoreTextStyle
50 {
51     NSColor *textColor;
52     NSColor *backgroundColor;
53     int letterSpacing;
54     int wordSpacing;
55     int padding;
56     int tabWidth;
57     int xpos;
58     NSString **families;
59     bool smallCaps;
60     bool rtl;
61     bool directionalOverride;
62     bool applyRunRounding;
63     bool applyWordRounding;
64     bool attemptFontSubstitution;
65 };
66
67 struct WebCoreTextRun
68 {
69     const UniChar *characters;
70     unsigned int length;
71     int from;
72     int to;
73 };
74
75 struct WebCoreTextGeometry
76 {
77     FloatPoint point;
78     float selectionY;
79     float selectionHeight;
80     bool useFontMetricsForSelectionYAndHeight;
81 };
82
83 void WebCoreInitializeTextRun(WebCoreTextRun *run, const UniChar *characters, unsigned int length, int from, int to);
84 void WebCoreInitializeEmptyTextStyle(WebCoreTextStyle *style);
85 void WebCoreInitializeEmptyTextGeometry(WebCoreTextGeometry *geometry);
86 void WebCoreInitializeFont(FontPlatformData *font);
87
88 typedef struct WidthMap WidthMap;
89 typedef struct GlyphMap GlyphMap;
90
91 class FontData
92 {
93 public:
94     FontData(const FontPlatformData& f);
95     ~FontData();
96
97 public:
98     const FontPlatformData& platformData() const { return m_font; }
99     FontData* smallCapsFontData() const;
100
101     // vertical metrics
102     int ascent() const { return m_ascent; }
103     int descent() const { return m_descent; }
104     int lineSpacing() const { return m_lineSpacing; }
105     int lineGap() const { return m_lineGap; }
106
107     float xHeight() const;
108
109     // horizontal metrics
110     float floatWidthForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style);
111
112     // drawing
113     void drawRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
114     FloatRect selectionRectForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
115     void drawHighlightForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
116     void drawLineForCharacters(const FloatPoint& point, float yOffset, int width, const Color& color, float thickness);
117     void drawLineForMisspelling(const FloatPoint& point, int width);
118     int misspellingLineThickness() const { return 3; }
119
120     // selection point check 
121     int pointToOffset(const WebCoreTextRun* run, const WebCoreTextStyle* style, int x, bool includePartialGlyphs);
122
123     // FIXME: These are temporary API and will eventually move to the fallback list.
124     Glyph glyphForCharacter(const FontData **renderer, unsigned c) const;
125     const FontData* findSubstituteFontData(const UChar* characters, unsigned numCharacters, const FontDescription&) const;
126     void updateGlyphMapEntry(UChar c, Glyph glyph, const FontData *substituteRenderer) const;
127     // End temporary API
128
129     float widthForGlyph(Glyph glyph) const;
130     
131 private:
132     int misspellingLinePatternWidth() const { return 4; }
133     int misspellingLinePatternGapWidth() const { return 1; } // the number of transparent pixels after the dot
134
135 public:
136     int m_ascent;
137     int m_descent;
138     int m_lineSpacing;
139     int m_lineGap;
140     
141     void* m_styleGroup;
142     
143     FontPlatformData m_font;
144     mutable GlyphMap* m_characterToGlyphMap;
145     mutable WidthMap* m_glyphToWidthMap;
146
147     bool m_treatAsFixedPitch;
148     ATSGlyphRef m_spaceGlyph;
149     float m_spaceWidth;
150     float m_adjustedSpaceWidth;
151     float m_syntheticBoldOffset;
152     
153     mutable FontData* m_smallCapsFontData;
154     mutable ATSUStyle m_ATSUStyle;
155     mutable bool m_ATSUStyleInitialized;
156     mutable bool m_ATSUMirrors;
157 };
158
159 }
160
161 #else
162
163 #include "FontPlatformData.h"
164
165 namespace WebCore {
166
167 class FontDescription;
168
169 class FontData
170 {
171 public:
172 #if WIN32
173     FontData(HFONT font, const FontDescription& fontDescription)
174         :m_platformData(font, fontDescription) {}
175 #endif
176
177     const FontPlatformData& platformData() const { return m_platformData; }
178
179     void setMetrics(int ascent, int descent, int xHeight, int lineSpacing)
180     {
181         m_ascent = ascent;
182         m_descent = descent;
183         m_xHeight = xHeight;
184         m_lineSpacing = lineSpacing;
185     }
186
187     int ascent() const { return m_ascent; }
188     int descent() const { return m_descent; }
189     int xHeight() const { return m_xHeight; }
190     int lineSpacing() const { return m_lineSpacing; }
191
192 private:
193     FontPlatformData m_platformData;
194     int m_ascent;
195     int m_descent;
196     int m_xHeight;
197     int m_lineSpacing;
198 };
199
200 }
201 #endif