5fa26edf176e076005c836db40cd0cfbb9a41316
[WebKit-https.git] / WebCore / platform / 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 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., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  *
24  */
25
26 #ifndef FONT_H
27 #define FONT_H
28
29 #include "Color.h"
30 #include "FontDescription.h"
31 #include "TextDirection.h"
32 #include "GlyphBuffer.h"
33
34 #if __APPLE__
35 // FIXME: Should not be necessary.
36 #include "FontPlatformData.h"
37 #endif
38
39 namespace WebCore {
40
41 class FontFallbackList;
42 class GraphicsContext;
43 class IntPoint;
44 class IntRect;
45 class FloatPoint;
46
47 enum Pitch { UnknownPitch, FixedPitch, VariablePitch };
48
49 class Font {
50 public:
51     Font();
52     Font(const FontDescription&, short letterSpacing, short wordSpacing);
53     ~Font();
54     
55     Font(const Font&);
56     Font& operator=(const Font&);
57
58     bool operator==(const Font& other) const {
59         // The renderer pointer doesn't have to be checked, since
60         // checking the font description will be fine.
61         return (m_fontDescription == other.m_fontDescription &&
62                 m_letterSpacing == other.m_letterSpacing &&
63                 m_wordSpacing == other.m_wordSpacing);
64     }
65
66     bool operator!=(const Font& other) const {
67         return !(*this == other);
68     }
69
70     const FontDescription& fontDescription() const { return m_fontDescription; }
71
72     int pixelSize() const { return fontDescription().computedPixelSize(); }
73     float size() const { return fontDescription().computedSize(); }
74     
75     void update() const;
76
77     void drawText(GraphicsContext*, const IntPoint&, int tabWidth, int xpos,
78                   const UChar*, int len, int from, int to, int toAdd, 
79                   TextDirection, bool visuallyOrdered) const;
80     void drawHighlightForText(GraphicsContext*, const IntPoint&, int h, int tabWidth, int xpos,
81                               const UChar*, int len, int from, int to, int toAdd, 
82                               TextDirection d, bool visuallyOrdered, const Color& backgroundColor) const;
83     void drawLineForText(GraphicsContext*, const IntPoint&, int yOffset, int width) const;
84     void drawLineForMisspelling(GraphicsContext*, const IntPoint&, int width) const;
85     int misspellingLineThickness(GraphicsContext*) const;
86
87     float floatWidth(const UChar*, int slen, int pos, int len, int tabWidth, int xpos, bool runRounding = true) const;
88     
89     int checkSelectionPoint(const UChar*, int slen, int pos, int len, int toAdd, int tabWidth, int xpos,
90         int x, TextDirection, bool visuallyOrdered, bool includePartialGlyphs) const;
91     IntRect selectionRectForText(const IntPoint&, int h, int tabWidth, int xpos, 
92         const UChar*, int slen, int pos, int len, int width,
93         bool rtl, bool visuallyOrdered = false, int from = -1, int to = -1) const;
94     
95     int width(const UChar*, int slen, int pos, int len, int tabWidth, int xpos) const;
96     int width(const UChar* chs, int slen, int tabWidth = 0, int xpos = 0) const { return width(chs, slen, 0, slen, tabWidth, xpos); }
97
98     bool isSmallCaps() const { return m_fontDescription.smallCaps(); }
99
100     short wordSpacing() const { return m_wordSpacing; }
101     short letterSpacing() const { return m_letterSpacing; }
102     void setWordSpacing(short s) { m_wordSpacing = s; }
103     void setLetterSpacing(short s) { m_letterSpacing = s; }
104
105     bool isFixedPitch() const;
106     bool isPrinterFont() const { return m_fontDescription.usePrinterFont(); }
107
108     FontFamily& firstFamily() { return m_fontDescription.firstFamily(); }
109     const FontFamily& family() const { return m_fontDescription.family(); }
110
111     bool italic() const { return m_fontDescription.italic(); }
112     unsigned weight() const { return m_fontDescription.weight(); }
113
114 #if __APPLE__
115     // FIXME: Shouldn't need to access FontPlatformData... should just need NSFont.
116     NSString* getNSFamily() const { return m_fontDescription.family().getNSFamily(); }    
117     NSFont* getNSFont() const { return platformFont().font; }
118     const FontPlatformData& platformFont() const;
119 #endif
120
121     // Metrics that we query the FontFallbackList for.
122     int ascent() const;
123     int descent() const;
124     int height() const { return ascent() + descent(); }
125     int lineSpacing() const;
126     float xHeight() const;
127
128     const FontData* primaryFont() const;
129
130 private:
131 #if __APPLE__
132     // FIXME: This will eventually be cross-platform, but we want to keep Windows compiling for now.
133     bool canUseGlyphCache(const UChar* str, int to) const;
134     void drawSimpleText(GraphicsContext*, const IntPoint&, int tabWidth, int xpos,
135                         const UChar*, int len, int from, int to, int toAdd, 
136                         TextDirection, bool visuallyOrdered) const;
137     void drawGlyphs(GraphicsContext*, const FontData*, const GlyphBuffer&, int from, int to, const FloatPoint&) const;
138     void drawComplexText(GraphicsContext*, const IntPoint&, int tabWidth, int xpos,
139                          const UChar*, int len, int from, int to, int toAdd, 
140                          TextDirection, bool visuallyOrdered) const;
141     float floatWidthForSimpleText(const UChar*, int len, int from, int to, 
142                                   int tabWidth, int xpos, int toAdd, 
143                                   TextDirection, bool visuallyOrdered, 
144                                   bool applyWordRounding, bool applyRunRounding,
145                                   const FontData* substituteFont,
146                                   float* startX, GlyphBuffer*) const;
147     float floatWidthForComplexText(const UChar*, int slen, int pos, int len, int tabWidth, int xpos, bool runRounding = true) const;
148
149     friend struct WidthIterator;
150     
151     // Useful for debugging the complex font rendering code path.
152 public:
153     static void setAlwaysUseComplexPath(bool);
154     static bool gAlwaysUseComplexPath;
155 #endif
156
157 private:
158     FontDescription m_fontDescription;
159     mutable RefPtr<FontFallbackList> m_fontList;
160     short m_letterSpacing;
161     short m_wordSpacing;
162 };
163
164 #if __APPLE__
165     // FIXME: This will eventually be cross-platform, but we want to keep Windows compiling for now.
166     bool isSpace(unsigned c);
167     bool isRoundingHackCharacter(UChar c);
168 #endif
169 }
170
171 #endif