8a17c8be7bd7d32dad594d4e0b4ff818dbe24c23
[WebKit-https.git] / Source / WebCore / platform / graphics / FontPlatformData.h
1 /*
2  * Copyright (C) 2006-2018 Apple Inc. All rights reserved.
3  * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com
4  * Copyright (C) 2007 Holger Hans Peter Freyther
5  * Copyright (C) 2007 Pioneer Research Center USA, Inc.
6  * Copyright (C) 2010, 2011 Brent Fulgham <bfulgham@webkit.org>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #pragma once
26
27 #include "TextFlags.h"
28 #include <wtf/Forward.h>
29 #include <wtf/RetainPtr.h>
30
31
32 #if PLATFORM(WIN)
33 #include "COMPtr.h"
34 #include "SharedGDIObject.h"
35 #endif
36
37 #if USE(CAIRO)
38 #include "RefPtrCairo.h"
39 #endif
40
41 #if USE(FREETYPE)
42 #include "FcUniquePtr.h"
43 #include "HbUniquePtr.h"
44 #include "RefPtrFontconfig.h"
45 #include <memory>
46 #endif
47
48 #if USE(APPKIT)
49 OBJC_CLASS NSFont;
50 #endif
51
52 #if PLATFORM(COCOA)
53 typedef const struct __CTFont* CTFontRef;
54 #endif
55
56 #if USE(CG)
57 #include <CoreGraphics/CoreGraphics.h>
58 #endif
59
60 #if PLATFORM(WIN)
61 #include <wtf/win/GDIObject.h>
62 typedef struct HFONT__* HFONT;
63 interface IDWriteFont;
64 interface IDWriteFontFace;
65 #endif
66
67 #if USE(DIRECT2D)
68 #include <dwrite.h>
69 #endif
70
71 namespace WebCore {
72
73 class FontDescription;
74 class SharedBuffer;
75
76 // This class is conceptually immutable. Once created, no instances should ever change (in an observable way).
77 class FontPlatformData {
78     WTF_MAKE_FAST_ALLOCATED;
79 public:
80     FontPlatformData(WTF::HashTableDeletedValueType);
81     FontPlatformData();
82
83     FontPlatformData(const FontDescription&, const AtomicString& family);
84     FontPlatformData(float size, bool syntheticBold, bool syntheticOblique, FontOrientation = FontOrientation::Horizontal, FontWidthVariant = FontWidthVariant::RegularWidth, TextRenderingMode = TextRenderingMode::AutoTextRendering);
85
86 #if PLATFORM(COCOA)
87     WEBCORE_EXPORT FontPlatformData(CTFontRef, float size, bool syntheticBold = false, bool syntheticOblique = false, FontOrientation = FontOrientation::Horizontal, FontWidthVariant = FontWidthVariant::RegularWidth, TextRenderingMode = TextRenderingMode::AutoTextRendering);
88 #endif
89
90     static FontPlatformData cloneWithOrientation(const FontPlatformData&, FontOrientation);
91     static FontPlatformData cloneWithSyntheticOblique(const FontPlatformData&, bool);
92     static FontPlatformData cloneWithSize(const FontPlatformData&, float);
93
94 #if USE(CG) && PLATFORM(WIN)
95     FontPlatformData(CGFontRef, float size, bool syntheticBold, bool syntheticOblique, FontOrientation, FontWidthVariant, TextRenderingMode);
96 #endif
97
98 #if PLATFORM(WIN)
99     FontPlatformData(GDIObject<HFONT>, float size, bool syntheticBold, bool syntheticOblique, bool useGDI);
100 #endif
101
102 #if PLATFORM(WIN) && USE(CG)
103     FontPlatformData(GDIObject<HFONT>, CGFontRef, float size, bool syntheticBold, bool syntheticOblique, bool useGDI);
104 #endif
105
106 #if PLATFORM(WIN) && USE(DIRECT2D)
107     FontPlatformData(GDIObject<HFONT>, IDWriteFont*, float size, bool syntheticBold, bool syntheticOblique, bool useGDI);
108 #endif
109
110 #if PLATFORM(WIN) && USE(CAIRO)
111     FontPlatformData(GDIObject<HFONT>, cairo_font_face_t*, float size, bool bold, bool italic);
112 #endif
113
114 #if USE(FREETYPE)
115     FontPlatformData(cairo_font_face_t*, FcPattern*, float size, bool fixedWidth, bool syntheticBold, bool syntheticOblique, FontOrientation);
116     FontPlatformData(const FontPlatformData&);
117     FontPlatformData(FontPlatformData&&) = default;
118     FontPlatformData& operator=(const FontPlatformData&);
119     FontPlatformData& operator=(FontPlatformData&&) = default;
120     ~FontPlatformData();
121 #endif
122
123 #if PLATFORM(WIN)
124     HFONT hfont() const { return m_font ? m_font->get() : 0; }
125     bool useGDI() const { return m_useGDI; }
126 #endif
127
128 #if PLATFORM(COCOA)
129     CTFontRef font() const { return m_font.get(); }
130     WEBCORE_EXPORT CTFontRef registeredFont() const; // Returns nullptr iff the font is not registered, such as web fonts (otherwise returns font()).
131
132     CTFontRef ctFont() const;
133     static RetainPtr<CFTypeRef> objectForEqualityCheck(CTFontRef);
134     RetainPtr<CFTypeRef> objectForEqualityCheck() const;
135
136     bool hasCustomTracking() const { return isSystemFont(); }
137 #endif
138
139 #if PLATFORM(WIN) || PLATFORM(COCOA)
140     bool isSystemFont() const { return m_isSystemFont; }
141 #endif
142
143     bool hasVariations() const { return m_hasVariations; }
144
145 #if USE(CG) && PLATFORM(WIN)
146     CGFontRef cgFont() const { return m_cgFont.get(); }
147 #endif
148
149 #if USE(DIRECT2D)
150     IDWriteFont* dwFont() const { return m_dwFont.get(); }
151     IDWriteFontFace* dwFontFace() const { return m_dwFontFace.get(); }
152
153     static HRESULT createFallbackFont(const LOGFONT&, IDWriteFont**);
154 #endif
155
156     bool isFixedPitch() const;
157     float size() const { return m_size; }
158     bool syntheticBold() const { return m_syntheticBold; }
159     bool syntheticOblique() const { return m_syntheticOblique; }
160     bool isColorBitmapFont() const { return m_isColorBitmapFont; }
161     FontOrientation orientation() const { return m_orientation; }
162     FontWidthVariant widthVariant() const { return m_widthVariant; }
163     TextRenderingMode textRenderingMode() const { return m_textRenderingMode; }
164     bool isForTextCombine() const { return widthVariant() != FontWidthVariant::RegularWidth; } // Keep in sync with callers of FontDescription::setWidthVariant().
165
166 #if USE(CAIRO)
167     cairo_scaled_font_t* scaledFont() const { return m_scaledFont.get(); }
168 #endif
169
170 #if USE(FREETYPE)
171     HbUniquePtr<hb_font_t> createOpenTypeMathHarfBuzzFont() const;
172     bool hasCompatibleCharmap() const;
173     FcPattern* fcPattern() const;
174     bool isFixedWidth() const { return m_fixedWidth; }
175 #endif
176
177     unsigned hash() const;
178
179     bool operator==(const FontPlatformData& other) const
180     {
181         return platformIsEqual(other)
182             && m_isHashTableDeletedValue == other.m_isHashTableDeletedValue
183             && m_size == other.m_size
184             && m_syntheticBold == other.m_syntheticBold
185             && m_syntheticOblique == other.m_syntheticOblique
186             && m_isColorBitmapFont == other.m_isColorBitmapFont
187             && m_orientation == other.m_orientation
188             && m_widthVariant == other.m_widthVariant
189             && m_textRenderingMode == other.m_textRenderingMode;
190     }
191
192     bool isHashTableDeletedValue() const
193     {
194         return m_isHashTableDeletedValue;
195     }
196
197     bool isEmoji() const
198     {
199 #if PLATFORM(IOS_FAMILY)
200         return m_isEmoji;
201 #else
202         return false;
203 #endif
204     }
205
206 #if PLATFORM(COCOA) || PLATFORM(WIN) || USE(FREETYPE)
207     RefPtr<SharedBuffer> openTypeTable(uint32_t table) const;
208 #endif
209
210 #if !LOG_DISABLED
211     String description() const;
212 #endif
213
214 private:
215     bool platformIsEqual(const FontPlatformData&) const;
216
217 #if PLATFORM(COCOA)
218     CGFloat ctFontSize() const;
219 #endif
220
221 #if PLATFORM(WIN)
222     void platformDataInit(HFONT, float size, HDC, WCHAR* faceName);
223 #endif
224
225 #if USE(FREETYPE)
226     void buildScaledFont(cairo_font_face_t*);
227 #endif
228
229 #if PLATFORM(COCOA)
230     // FIXME: Get rid of one of these. These two fonts are subtly different, and it is not obvious which one to use where.
231     RetainPtr<CTFontRef> m_font;
232     mutable RetainPtr<CTFontRef> m_ctFont;
233 #elif PLATFORM(WIN)
234     RefPtr<SharedGDIObject<HFONT>> m_font;
235 #endif
236
237 #if USE(CG) && PLATFORM(WIN)
238     RetainPtr<CGFontRef> m_cgFont;
239 #endif
240
241 #if USE(DIRECT2D)
242     COMPtr<IDWriteFont> m_dwFont;
243     COMPtr<IDWriteFontFace> m_dwFontFace;
244 #endif
245
246 #if USE(CAIRO)
247     RefPtr<cairo_scaled_font_t> m_scaledFont;
248 #endif
249
250 #if USE(FREETYPE)
251     RefPtr<FcPattern> m_pattern;
252 #endif
253
254     // The values below are common to all ports
255     // FIXME: If they're common to all ports, they should move to Font
256     float m_size { 0 };
257
258     FontOrientation m_orientation { FontOrientation::Horizontal };
259     FontWidthVariant m_widthVariant { FontWidthVariant::RegularWidth };
260     TextRenderingMode m_textRenderingMode { TextRenderingMode::AutoTextRendering };
261
262     bool m_syntheticBold { false };
263     bool m_syntheticOblique { false };
264     bool m_isColorBitmapFont { false };
265     bool m_isHashTableDeletedValue { false };
266     bool m_isSystemFont { false };
267     bool m_hasVariations { false };
268     // The values above are common to all ports
269
270 #if PLATFORM(IOS_FAMILY)
271     bool m_isEmoji { false };
272 #endif
273
274 #if PLATFORM(WIN)
275     bool m_useGDI { false };
276 #endif
277
278 #if USE(FREETYPE)
279     bool m_fixedWidth { false };
280 #endif
281 };
282
283 #if USE(APPKIT) && defined(__OBJC__)
284
285 // NSFonts and CTFontRefs are toll-free-bridged.
286 inline CTFontRef toCTFont(NSFont *font)
287 {
288     return (__bridge CTFontRef)font;
289 }
290
291 inline NSFont *toNSFont(CTFontRef font)
292 {
293     return (__bridge NSFont *)font;
294 }
295
296 #endif
297
298 #if USE(CG)
299
300 class ScopedTextMatrix {
301 public:
302     ScopedTextMatrix(CGAffineTransform newMatrix, CGContextRef context)
303         : m_context(context)
304         , m_textMatrix(CGContextGetTextMatrix(context))
305     {
306         CGContextSetTextMatrix(m_context, newMatrix);
307     }
308
309     ~ScopedTextMatrix()
310     {
311         CGContextSetTextMatrix(m_context, m_textMatrix);
312     }
313
314     CGAffineTransform savedMatrix() const
315     {
316         return m_textMatrix;
317     }
318
319 private:
320     CGContextRef m_context;
321     CGAffineTransform m_textMatrix;
322 };
323
324 #endif
325
326 } // namespace WebCore