Fix uses of qRound on non-floating-point types.
[profile/ivi/qtbase.git] / src / gui / text / qfont.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the QtGui module of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 **
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 **
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
29 **
30 ** Other Usage
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QFONT_H
43 #define QFONT_H
44
45 #include <QtGui/qwindowdefs.h>
46 #include <QtCore/qstring.h>
47 #include <QtCore/qsharedpointer.h>
48
49 #if defined(Q_WS_X11) || defined(Q_WS_QWS)
50 typedef struct FT_FaceRec_* FT_Face;
51 #endif
52
53 QT_BEGIN_HEADER
54
55 QT_BEGIN_NAMESPACE
56
57 QT_MODULE(Gui)
58
59 class QFontPrivate;                                     /* don't touch */
60 class QStringList;
61 class QVariant;
62 class Q3TextFormatCollection;
63
64 class Q_GUI_EXPORT QFont
65 {
66     Q_GADGET
67     Q_ENUMS(StyleStrategy)
68 public:
69     enum StyleHint {
70         Helvetica,  SansSerif = Helvetica,
71         Times,      Serif = Times,
72         Courier,    TypeWriter = Courier,
73         OldEnglish, Decorative = OldEnglish,
74         System,
75         AnyStyle,
76         Cursive,
77         Monospace,
78         Fantasy
79     };
80
81     enum StyleStrategy {
82         PreferDefault       = 0x0001,
83         PreferBitmap        = 0x0002,
84         PreferDevice        = 0x0004,
85         PreferOutline       = 0x0008,
86         ForceOutline        = 0x0010,
87         PreferMatch         = 0x0020,
88         PreferQuality       = 0x0040,
89         PreferAntialias     = 0x0080,
90         NoAntialias         = 0x0100,
91         OpenGLCompatible    = 0x0200,
92         ForceIntegerMetrics = 0x0400,
93         NoFontMerging       = 0x8000
94     };
95
96     enum HintingPreference {
97         PreferDefaultHinting        = 0,
98         PreferNoHinting             = 1,
99         PreferVerticalHinting       = 2,
100         PreferFullHinting           = 3
101     };
102
103     enum Weight {
104         Light    = 25,
105         Normal   = 50,
106         DemiBold = 63,
107         Bold     = 75,
108         Black    = 87
109     };
110
111     enum Style {
112         StyleNormal,
113         StyleItalic,
114         StyleOblique
115     };
116
117     enum Stretch {
118         UltraCondensed =  50,
119         ExtraCondensed =  62,
120         Condensed      =  75,
121         SemiCondensed  =  87,
122         Unstretched    = 100,
123         SemiExpanded   = 112,
124         Expanded       = 125,
125         ExtraExpanded  = 150,
126         UltraExpanded  = 200
127     };
128
129     enum Capitalization {
130         MixedCase,
131         AllUppercase,
132         AllLowercase,
133         SmallCaps,
134         Capitalize
135     };
136
137     enum SpacingType {
138         PercentageSpacing,
139         AbsoluteSpacing
140     };
141
142     enum ResolveProperties {
143         FamilyResolved              = 0x0001,
144         SizeResolved                = 0x0002,
145         StyleHintResolved           = 0x0004,
146         StyleStrategyResolved       = 0x0008,
147         WeightResolved              = 0x0010,
148         StyleResolved               = 0x0020,
149         UnderlineResolved           = 0x0040,
150         OverlineResolved            = 0x0080,
151         StrikeOutResolved           = 0x0100,
152         FixedPitchResolved          = 0x0200,
153         StretchResolved             = 0x0400,
154         KerningResolved             = 0x0800,
155         CapitalizationResolved      = 0x1000,
156         LetterSpacingResolved       = 0x2000,
157         WordSpacingResolved         = 0x4000,
158         HintingPreferenceResolved   = 0x8000,
159         StyleNameResolved           = 0x10000,
160         AllPropertiesResolved       = 0x1ffff
161     };
162
163     QFont();
164     QFont(const QString &family, int pointSize = -1, int weight = -1, bool italic = false);
165     QFont(const QFont &, QPaintDevice *pd);
166     QFont(const QFont &);
167     ~QFont();
168
169     QString family() const;
170     void setFamily(const QString &);
171
172     QString styleName() const;
173     void setStyleName(const QString &);
174
175     int pointSize() const;
176     void setPointSize(int);
177     qreal pointSizeF() const;
178     void setPointSizeF(qreal);
179
180     int pixelSize() const;
181     void setPixelSize(int);
182
183     int weight() const;
184     void setWeight(int);
185
186     inline bool bold() const;
187     inline void setBold(bool);
188
189     void setStyle(Style style);
190     Style style() const;
191
192     inline bool italic() const;
193     inline void setItalic(bool b);
194
195     bool underline() const;
196     void setUnderline(bool);
197
198     bool overline() const;
199     void setOverline(bool);
200
201     bool strikeOut() const;
202     void setStrikeOut(bool);
203
204     bool fixedPitch() const;
205     void setFixedPitch(bool);
206
207     bool kerning() const;
208     void setKerning(bool);
209
210     StyleHint styleHint() const;
211     StyleStrategy styleStrategy() const;
212     void setStyleHint(StyleHint, StyleStrategy = PreferDefault);
213     void setStyleStrategy(StyleStrategy s);
214
215     int stretch() const;
216     void setStretch(int);
217
218     qreal letterSpacing() const;
219     SpacingType letterSpacingType() const;
220     void setLetterSpacing(SpacingType type, qreal spacing);
221
222     qreal wordSpacing() const;
223     void setWordSpacing(qreal spacing);
224
225     void setCapitalization(Capitalization);
226     Capitalization capitalization() const;
227
228     void setHintingPreference(HintingPreference hintingPreference);
229     HintingPreference hintingPreference() const;
230
231     // is raw mode still needed?
232     bool rawMode() const;
233     void setRawMode(bool);
234
235     // dupicated from QFontInfo
236     bool exactMatch() const;
237
238     QFont &operator=(const QFont &);
239     bool operator==(const QFont &) const;
240     bool operator!=(const QFont &) const;
241     bool operator<(const QFont &) const;
242     operator QVariant() const;
243     bool isCopyOf(const QFont &) const;
244 #ifdef Q_COMPILER_RVALUE_REFS
245     inline QFont &operator=(QFont &&other)
246     { qSwap(d, other.d); qSwap(resolve_mask, other.resolve_mask);  return *this; }
247 #endif
248
249 #ifdef Q_WS_WIN
250     HFONT handle() const;
251 #else // !Q_WS_WIN
252     Qt::HANDLE handle() const;
253 #endif // Q_WS_WIN
254 #ifdef Q_WS_MAC
255     quint32 macFontID() const;
256 #endif
257 #if defined(Q_WS_X11) || defined(Q_WS_QWS)
258     FT_Face freetypeFace() const;
259 #endif
260
261     // needed for X11
262     void setRawName(const QString &);
263     QString rawName() const;
264
265     QString key() const;
266
267     QString toString() const;
268     bool fromString(const QString &);
269
270     static QString substitute(const QString &);
271     static QStringList substitutes(const QString &);
272     static QStringList substitutions();
273     static void insertSubstitution(const QString&, const QString &);
274     static void insertSubstitutions(const QString&, const QStringList &);
275     static void removeSubstitution(const QString &);
276     static void initialize();
277     static void cleanup();
278 #ifndef Q_WS_QWS
279     static void cacheStatistics();
280 #endif
281
282     QString defaultFamily() const;
283     QString lastResortFamily() const;
284     QString lastResortFont() const;
285
286     QFont resolve(const QFont &) const;
287     inline uint resolve() const { return resolve_mask; }
288     inline void resolve(uint mask) { resolve_mask = mask; }
289
290 #ifdef QT3_SUPPORT
291     static QT3_SUPPORT QFont defaultFont();
292     static QT3_SUPPORT void setDefaultFont(const QFont &);
293     QT3_SUPPORT void setPixelSizeFloat(qreal);
294     QT3_SUPPORT qreal pointSizeFloat() const { return pointSizeF(); }
295     QT3_SUPPORT void setPointSizeFloat(qreal size) { setPointSizeF(size); }
296 #endif
297
298 private:
299     QFont(QFontPrivate *);
300
301     void detach();
302
303 #if defined(Q_WS_MAC)
304     void macSetFont(QPaintDevice *);
305 #elif defined(Q_WS_X11)
306     void x11SetScreen(int screen = -1);
307     int x11Screen() const;
308 #endif
309
310     friend class QFontPrivate;
311     friend class QFontDialogPrivate;
312     friend class QFontMetrics;
313     friend class QFontMetricsF;
314     friend class QFontInfo;
315     friend class QPainter;
316     friend class QPainterPrivate;
317     friend class QPSPrintEngineFont;
318     friend class QApplication;
319     friend class QWidget;
320     friend class QWidgetPrivate;
321     friend class Q3TextFormatCollection;
322     friend class QTextLayout;
323     friend class QTextEngine;
324     friend class QStackTextEngine;
325     friend class QTextLine;
326     friend struct QScriptLine;
327     friend class QGLContext;
328     friend class QWin32PaintEngine;
329     friend class QAlphaPaintEngine;
330     friend class QPainterPath;
331     friend class QTextItemInt;
332     friend class QPicturePaintEngine;
333     friend class QPainterReplayer;
334     friend class QPaintBufferEngine;
335     friend class QCommandLinkButtonPrivate;
336     friend class QFontEngine;
337
338 #ifndef QT_NO_DATASTREAM
339     friend Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QFont &);
340     friend Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QFont &);
341 #endif
342
343     QExplicitlySharedDataPointer<QFontPrivate> d;
344     uint resolve_mask;
345 };
346
347
348 inline bool QFont::bold() const
349 { return weight() > Normal; }
350
351
352 inline void QFont::setBold(bool enable)
353 { setWeight(enable ? Bold : Normal); }
354
355 inline bool QFont::italic() const
356 {
357     return (style() != StyleNormal);
358 }
359
360 inline void QFont::setItalic(bool b) {
361     setStyle(b ? StyleItalic : StyleNormal);
362 }
363
364
365 /*****************************************************************************
366   QFont stream functions
367  *****************************************************************************/
368
369 #ifndef QT_NO_DATASTREAM
370 Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QFont &);
371 Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QFont &);
372 #endif
373
374 #ifndef QT_NO_DEBUG_STREAM
375 Q_GUI_EXPORT QDebug operator<<(QDebug, const QFont &);
376 #endif
377
378 QT_END_NAMESPACE
379
380 QT_END_HEADER
381
382 #endif // QFONT_H