736ee690b1562b5eb66b19260795293c8f1764ef
[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
37 namespace WebCore
38 {
39
40 class FloatRect;
41 class Color;
42
43 struct WebCoreTextStyle
44 {
45     NSColor *textColor;
46     NSColor *backgroundColor;
47     int letterSpacing;
48     int wordSpacing;
49     int padding;
50     int tabWidth;
51     int xpos;
52     NSString **families;
53     bool smallCaps;
54     bool rtl;
55     bool directionalOverride;
56     bool applyRunRounding;
57     bool applyWordRounding;
58     bool attemptFontSubstitution;
59 };
60
61 struct WebCoreTextRun
62 {
63     const UniChar *characters;
64     unsigned int length;
65     int from;
66     int to;
67 };
68
69 struct WebCoreTextGeometry
70 {
71     FloatPoint point;
72     float selectionY;
73     float selectionHeight;
74     bool useFontMetricsForSelectionYAndHeight;
75 };
76
77 void WebCoreInitializeTextRun(WebCoreTextRun *run, const UniChar *characters, unsigned int length, int from, int to);
78 void WebCoreInitializeEmptyTextStyle(WebCoreTextStyle *style);
79 void WebCoreInitializeEmptyTextGeometry(WebCoreTextGeometry *geometry);
80 void WebCoreInitializeFont(FontPlatformData *font);
81
82 typedef struct WidthMap WidthMap;
83 typedef struct GlyphMap GlyphMap;
84
85 class FontData
86 {
87 public:
88     FontData(const FontPlatformData& f);
89     ~FontData();
90
91 public:
92     static void setAlwaysUseATSU(bool);
93     static bool gAlwaysUseATSU;
94
95     // vertical metrics
96     int ascent() const { return m_ascent; }
97     int descent() const { return m_descent; }
98     int lineSpacing() const { return m_lineSpacing; }
99     int lineGap() const { return m_lineGap; }
100
101     float xHeight() const;
102
103     // horizontal metrics
104     float floatWidthForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style);
105
106     // drawing
107     void drawRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
108     FloatRect selectionRectForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
109     void drawHighlightForRun(const WebCoreTextRun* run, const WebCoreTextStyle* style, const WebCoreTextGeometry* geometry);
110     void drawLineForCharacters(const FloatPoint& point, float yOffset, int width, const Color& color, float thickness);
111     void drawLineForMisspelling(const FloatPoint& point, int width);
112     int misspellingLineThickness() const { return 3; }
113
114     // selection point check 
115     int pointToOffset(const WebCoreTextRun* run, const WebCoreTextStyle* style, int x, bool includePartialGlyphs);
116
117 private:
118     int misspellingLinePatternWidth() const { return 4; }
119     int misspellingLinePatternGapWidth() const { return 1; } // the number of transparent pixels after the dot
120
121 public:
122     int m_ascent;
123     int m_descent;
124     int m_lineSpacing;
125     int m_lineGap;
126     
127     void* m_styleGroup;
128     
129     FontPlatformData m_font;
130     GlyphMap* m_characterToGlyphMap;
131     WidthMap* m_glyphToWidthMap;
132
133     bool m_treatAsFixedPitch;
134     ATSGlyphRef m_spaceGlyph;
135     float m_spaceWidth;
136     float m_adjustedSpaceWidth;
137     float m_syntheticBoldOffset;
138     
139     FontData* m_smallCapsRenderer;
140     ATSUStyle m_ATSUStyle;
141     bool m_ATSUStyleInitialized;
142     bool m_ATSUMirrors;
143 };
144
145 }
146
147 #else
148
149 #include "FontPlatformData.h"
150
151 namespace WebCore {
152
153 class FontDescription;
154
155 class FontData
156 {
157 public:
158 #if WIN32
159     FontData(HFONT font, const FontDescription& fontDescription)
160         :m_platformData(font, fontDescription) {}
161 #endif
162
163     const FontPlatformData& platformData() const { return m_platformData; }
164
165     void setMetrics(int ascent, int descent, int xHeight, int lineSpacing)
166     {
167         m_ascent = ascent;
168         m_descent = descent;
169         m_xHeight = xHeight;
170         m_lineSpacing = lineSpacing;
171     }
172
173     int ascent() const { return m_ascent; }
174     int descent() const { return m_descent; }
175     int xHeight() const { return m_xHeight; }
176     int lineSpacing() const { return m_lineSpacing; }
177
178 private:
179     FontPlatformData m_platformData;
180     int m_ascent;
181     int m_descent;
182     int m_xHeight;
183     int m_lineSpacing;
184 };
185
186 }
187 #endif