WebCore:
[WebKit-https.git] / WebCore / platform / graphics / Font.h
1 /*
2  * This file is part of the html renderer for KDE.
3  *
4  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
5  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2000 Dirk Mueller (mueller@kde.org)
7  * Copyright (C) 2003, 2006, 2007 Apple Computer, Inc.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  *
24  */
25
26 #ifndef Font_h
27 #define Font_h
28
29 #include "FontDescription.h"
30 #include <wtf/HashMap.h>
31
32 #if PLATFORM(QT)
33 #include <QtGui/qfont.h>
34 #include <QtGui/qfontmetrics.h>
35 #endif
36
37 namespace WebCore {
38
39 class FloatPoint;
40 class FloatRect;
41 class FontData;
42 class FontFallbackList;
43 class FontPlatformData;
44 class FontSelector;
45 class GlyphBuffer;
46 class GlyphPageTreeNode;
47 class GraphicsContext;
48 class IntPoint;
49
50 struct GlyphData;
51
52 class TextRun {
53 public:
54     TextRun(const UChar* c, int len, bool allowTabs = false, int xpos = 0, int padding = 0, bool rtl = false, bool directionalOverride = false,
55               bool applyRunRounding = true, bool applyWordRounding = true)
56         : m_characters(c)
57         , m_len(len)
58         , m_allowTabs(allowTabs)
59         , m_xpos(xpos)
60         , m_padding(padding)
61         , m_rtl(rtl)
62         , m_directionalOverride(directionalOverride)
63         , m_applyRunRounding(applyRunRounding)
64         , m_applyWordRounding(applyWordRounding)
65         , m_disableSpacing(false)
66     {
67     }
68
69     TextRun(const String& s, bool allowTabs = false, int xpos = 0, int padding = 0, bool rtl = false, bool directionalOverride = false,
70               bool applyRunRounding = true, bool applyWordRounding = true)
71         : m_characters(s.characters())
72         , m_len(s.length())
73         , m_allowTabs(allowTabs)
74         , m_xpos(xpos)
75         , m_padding(padding)
76         , m_rtl(rtl)
77         , m_directionalOverride(directionalOverride)
78         , m_applyRunRounding(applyRunRounding)
79         , m_applyWordRounding(applyWordRounding)
80         , m_disableSpacing(false)
81     {
82     }
83
84     const UChar operator[](int i) const { return m_characters[i]; }
85     const UChar* data(int i) const { return &m_characters[i]; }
86
87     const UChar* characters() const { return m_characters; }
88     int length() const { return m_len; }
89
90     void setText(const UChar* c, int len) { m_characters = c; m_len = len; }
91
92     bool allowTabs() const { return m_allowTabs; }
93     int xPos() const { return m_xpos; }
94     int padding() const { return m_padding; }
95     bool rtl() const { return m_rtl; }
96     bool ltr() const { return !m_rtl; }
97     bool directionalOverride() const { return m_directionalOverride; }
98     bool applyRunRounding() const { return m_applyRunRounding; }
99     bool applyWordRounding() const { return m_applyWordRounding; }
100     bool spacingDisabled() const { return m_disableSpacing; }
101
102     void disableSpacing() { m_disableSpacing = true; }
103     void disableRoundingHacks() { m_applyRunRounding = m_applyWordRounding = false; }
104     void setRTL(bool b) { m_rtl = b; }
105     void setDirectionalOverride(bool override) { m_directionalOverride = override; }
106     
107 private:
108     const UChar* m_characters;
109     int m_len;
110
111     bool m_allowTabs;
112     int m_xpos;
113     int m_padding;
114     bool m_rtl;
115     bool m_directionalOverride;
116     bool m_applyRunRounding;
117     bool m_applyWordRounding;
118     bool m_disableSpacing;
119 };
120
121 class Font {
122 public:
123     Font();
124     Font(const FontDescription&, short letterSpacing, short wordSpacing);
125 #if !PLATFORM(QT)
126     Font(const FontPlatformData&, bool isPrinting); // This constructor is only used if the platform wants to start with a native font.
127 #endif
128     ~Font();
129     
130     Font(const Font&);
131     Font& operator=(const Font&);
132
133     bool operator==(const Font& other) const;
134     bool operator!=(const Font& other) const {
135         return !(*this == other);
136     }
137
138     const FontDescription& fontDescription() const { return m_fontDescription; }
139
140     int pixelSize() const { return fontDescription().computedPixelSize(); }
141     float size() const { return fontDescription().computedSize(); }
142     
143     void update(PassRefPtr<FontSelector>) const;
144
145     void drawText(GraphicsContext*, const TextRun&, const FloatPoint&, int from = 0, int to = -1) const;
146
147     int width(const TextRun&) const;
148     float floatWidth(const TextRun&) const;
149     
150     int offsetForPosition(const TextRun&, int position, bool includePartialGlyphs) const;
151     FloatRect selectionRectForText(const TextRun&, const IntPoint&, int h, int from = 0, int to = -1) const;
152
153     bool isSmallCaps() const { return m_fontDescription.smallCaps(); }
154
155     short wordSpacing() const { return m_wordSpacing; }
156     short letterSpacing() const { return m_letterSpacing; }
157     void setWordSpacing(short s) { m_wordSpacing = s; }
158     void setLetterSpacing(short s) { m_letterSpacing = s; }
159
160     bool isFixedPitch() const;
161     bool isPrinterFont() const { return m_fontDescription.usePrinterFont(); }
162
163     FontFamily& firstFamily() { return m_fontDescription.firstFamily(); }
164     const FontFamily& family() const { return m_fontDescription.family(); }
165
166     bool italic() const { return m_fontDescription.italic(); }
167     unsigned weight() const { return m_fontDescription.weight(); }
168     bool bold() const { return m_fontDescription.bold(); }
169
170 #if !PLATFORM(QT)
171     bool isPlatformFont() const { return m_isPlatformFont; }
172 #endif
173     
174 #if PLATFORM(QT)
175     inline const QFont &font() const { return m_font; }
176     inline const QFont &scFont() const { return m_scFont; }
177 #endif
178     
179     // Metrics that we query the FontFallbackList for.
180     int ascent() const;
181     int descent() const;
182     int height() const { return ascent() + descent(); }
183     int lineSpacing() const;
184     float xHeight() const;
185     unsigned unitsPerEm() const;
186     int spaceWidth() const;
187     int tabWidth() const { return 8 * spaceWidth(); }
188
189 #if !PLATFORM(QT)
190     const FontData* primaryFont() const;
191     const FontData* fontDataAt(unsigned) const;
192     const GlyphData& glyphDataForCharacter(UChar32, bool mirror, bool forceSmallCaps = false) const;
193     // Used for complex text, and does not utilize the glyph map cache.
194     const FontData* fontDataForCharacters(const UChar*, int length) const;
195
196 private:
197     bool canUseGlyphCache(const TextRun&) const;
198     void drawSimpleText(GraphicsContext*, const TextRun&, const FloatPoint&, int from, int to) const;
199     void drawGlyphs(GraphicsContext*, const FontData*, const GlyphBuffer&, int from, int to, const FloatPoint&) const;
200     void drawGlyphBuffer(GraphicsContext*, const GlyphBuffer&, const TextRun&, const FloatPoint&) const;
201     void drawComplexText(GraphicsContext*, const TextRun&, const FloatPoint&, int from, int to) const;
202     float floatWidthForSimpleText(const TextRun&, GlyphBuffer*) const;
203     float floatWidthForComplexText(const TextRun&) const;
204     int offsetForPositionForSimpleText(const TextRun&, int position, bool includePartialGlyphs) const;
205     int offsetForPositionForComplexText(const TextRun&, int position, bool includePartialGlyphs) const;
206     FloatRect selectionRectForSimpleText(const TextRun&, const IntPoint&, int h, int from, int to) const;
207     FloatRect selectionRectForComplexText(const TextRun&, const IntPoint&, int h, int from, int to) const;
208 #endif
209     friend struct WidthIterator;
210     
211     // Useful for debugging the different font rendering code paths.
212 public:
213 #if !PLATFORM(QT)
214     enum CodePath { Auto, Simple, Complex };
215     static void setCodePath(CodePath);
216     static CodePath codePath;
217     
218     static const uint8_t gRoundingHackCharacterTable[256];
219     static bool isRoundingHackCharacter(UChar32 c)
220     {
221         return (((c & ~0xFF) == 0 && gRoundingHackCharacterTable[c])); 
222     }
223 #endif
224     static bool treatAsSpace(UChar c) { return c == ' ' || c == '\t' || c == '\n' || c == 0x00A0; }
225     static bool treatAsZeroWidthSpace(UChar c) { return c < 0x20 || (c >= 0x7F && c < 0xA0) || c == 0x200e || c == 0x200f; }
226 private:
227     FontDescription m_fontDescription;
228 #if !PLATFORM(QT)
229     mutable RefPtr<FontFallbackList> m_fontList;
230     mutable HashMap<int, GlyphPageTreeNode*> m_pages;
231     mutable GlyphPageTreeNode* m_pageZero;
232 #endif
233     short m_letterSpacing;
234     short m_wordSpacing;
235 #if !PLATFORM(QT)
236     bool m_isPlatformFont;
237 #else
238     QFont m_font;
239     QFont m_scFont;
240     int m_spaceWidth;
241 #endif
242 };
243
244 }
245
246 #endif