Remove pre-Sierra-OS-specific code in WebCore
[WebKit-https.git] / Source / WebCore / platform / graphics / FontPlatformData.h
1 /*
2  * Copyright (C) 2006-2017 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 "HarfBuzzFace.h"
44 #endif
45
46 #if USE(APPKIT)
47 OBJC_CLASS NSFont;
48 #endif
49
50 #if PLATFORM(COCOA)
51 typedef const struct __CTFont* CTFontRef;
52 #endif
53
54 #if USE(CG)
55 #include <CoreGraphics/CoreGraphics.h>
56 #endif
57
58 #if PLATFORM(WIN)
59 #include <wtf/win/GDIObject.h>
60 typedef struct HFONT__* HFONT;
61 interface IDWriteFont;
62 interface IDWriteFontFace;
63 #endif
64
65 namespace WebCore {
66
67 class FontDescription;
68 class SharedBuffer;
69
70 // This class is conceptually immutable. Once created, no instances should ever change (in an observable way).
71 class FontPlatformData {
72     WTF_MAKE_FAST_ALLOCATED;
73 public:
74     FontPlatformData(WTF::HashTableDeletedValueType);
75     FontPlatformData();
76
77     FontPlatformData(const FontDescription&, const AtomicString& family);
78     FontPlatformData(float size, bool syntheticBold, bool syntheticOblique, FontOrientation = Horizontal, FontWidthVariant = RegularWidth, TextRenderingMode = AutoTextRendering);
79
80 #if PLATFORM(COCOA)
81     WEBCORE_EXPORT FontPlatformData(CTFontRef, float size, bool syntheticBold = false, bool syntheticOblique = false, FontOrientation = Horizontal, FontWidthVariant = RegularWidth, TextRenderingMode = AutoTextRendering);
82 #endif
83
84     static FontPlatformData cloneWithOrientation(const FontPlatformData&, FontOrientation);
85     static FontPlatformData cloneWithSyntheticOblique(const FontPlatformData&, bool);
86     static FontPlatformData cloneWithSize(const FontPlatformData&, float);
87
88 #if USE(CG) && PLATFORM(WIN)
89     FontPlatformData(CGFontRef, float size, bool syntheticBold, bool syntheticOblique, FontOrientation, FontWidthVariant, TextRenderingMode);
90 #endif
91
92 #if PLATFORM(WIN)
93     FontPlatformData(GDIObject<HFONT>, float size, bool syntheticBold, bool syntheticOblique, bool useGDI);
94 #endif
95
96 #if PLATFORM(WIN) && USE(CG)
97     FontPlatformData(GDIObject<HFONT>, CGFontRef, float size, bool syntheticBold, bool syntheticOblique, bool useGDI);
98 #endif
99
100 #if PLATFORM(WIN) && USE(DIRECT2D)
101     FontPlatformData(GDIObject<HFONT>, IDWriteFont*, float size, bool syntheticBold, bool syntheticOblique, bool useGDI);
102 #endif
103
104 #if PLATFORM(WIN) && USE(CAIRO)
105     FontPlatformData(GDIObject<HFONT>, cairo_font_face_t*, float size, bool bold, bool italic);
106 #endif
107
108 #if USE(FREETYPE)
109     FontPlatformData(FcPattern*, const FontDescription&);
110     FontPlatformData(cairo_font_face_t*, const FontDescription&, bool syntheticBold, bool syntheticOblique);
111     FontPlatformData(const FontPlatformData&);
112     FontPlatformData(FontPlatformData&&) = default;
113     FontPlatformData& operator=(const FontPlatformData&);
114     FontPlatformData& operator=(FontPlatformData&&) = default;
115     ~FontPlatformData();
116 #endif
117
118 #if PLATFORM(WIN)
119     HFONT hfont() const { return m_font ? m_font->get() : 0; }
120     bool useGDI() const { return m_useGDI; }
121 #endif
122
123 #if PLATFORM(COCOA)
124     CTFontRef font() const { return m_font.get(); }
125     WEBCORE_EXPORT CTFontRef registeredFont() const; // Returns nullptr iff the font is not registered, such as web fonts (otherwise returns font()).
126
127     CTFontRef ctFont() const;
128     static RetainPtr<CFTypeRef> objectForEqualityCheck(CTFontRef);
129     RetainPtr<CFTypeRef> objectForEqualityCheck() const;
130
131     bool hasCustomTracking() const { return isSystemFont(); }
132 #endif
133
134 #if PLATFORM(WIN) || PLATFORM(COCOA)
135     bool isSystemFont() const { return m_isSystemFont; }
136 #endif
137
138     bool hasVariations() const { return m_hasVariations; }
139
140 #if USE(CG) && PLATFORM(WIN)
141     CGFontRef cgFont() const { return m_cgFont.get(); }
142 #endif
143
144 #if USE(DIRECT2D)
145     IDWriteFont* dwFont() const { return m_dwFont.get(); }
146     IDWriteFontFace* dwFontFace() const { return m_dwFontFace.get(); }
147 #endif
148
149     bool isFixedPitch() const;
150     float size() const { return m_size; }
151     bool syntheticBold() const { return m_syntheticBold; }
152     bool syntheticOblique() const { return m_syntheticOblique; }
153     bool isColorBitmapFont() const { return m_isColorBitmapFont; }
154     FontOrientation orientation() const { return m_orientation; }
155     FontWidthVariant widthVariant() const { return m_widthVariant; }
156     TextRenderingMode textRenderingMode() const { return m_textRenderingMode; }
157     bool isForTextCombine() const { return widthVariant() != RegularWidth; } // Keep in sync with callers of FontDescription::setWidthVariant().
158
159 #if USE(CAIRO)
160     cairo_scaled_font_t* scaledFont() const { return m_scaledFont.get(); }
161 #endif
162
163 #if USE(FREETYPE)
164     HarfBuzzFace* harfBuzzFace() const;
165     bool hasCompatibleCharmap() const;
166     FcFontSet* fallbacks() const;
167 #endif
168
169     unsigned hash() const;
170
171     bool operator==(const FontPlatformData& other) const
172     {
173         return platformIsEqual(other)
174             && m_isHashTableDeletedValue == other.m_isHashTableDeletedValue
175             && m_size == other.m_size
176             && m_syntheticBold == other.m_syntheticBold
177             && m_syntheticOblique == other.m_syntheticOblique
178             && m_isColorBitmapFont == other.m_isColorBitmapFont
179             && m_orientation == other.m_orientation
180             && m_widthVariant == other.m_widthVariant
181             && m_textRenderingMode == other.m_textRenderingMode;
182     }
183
184     bool isHashTableDeletedValue() const
185     {
186         return m_isHashTableDeletedValue;
187     }
188
189     bool isEmoji() const
190     {
191 #if PLATFORM(IOS)
192         return m_isEmoji;
193 #else
194         return false;
195 #endif
196     }
197
198 #if PLATFORM(COCOA) || PLATFORM(WIN) || USE(FREETYPE)
199     RefPtr<SharedBuffer> openTypeTable(uint32_t table) const;
200 #endif
201
202 #ifndef NDEBUG
203     String description() const;
204 #endif
205
206 private:
207     bool platformIsEqual(const FontPlatformData&) const;
208
209 #if PLATFORM(COCOA)
210     CGFloat ctFontSize() const;
211 #endif
212
213 #if PLATFORM(WIN)
214     void platformDataInit(HFONT, float size, HDC, WCHAR* faceName);
215 #endif
216
217 #if USE(FREETYPE)
218     void buildScaledFont(cairo_font_face_t*);
219 #endif
220
221 #if PLATFORM(COCOA)
222     // FIXME: Get rid of one of these. These two fonts are subtly different, and it is not obvious which one to use where.
223     RetainPtr<CTFontRef> m_font;
224     mutable RetainPtr<CTFontRef> m_ctFont;
225 #elif PLATFORM(WIN)
226     RefPtr<SharedGDIObject<HFONT>> m_font;
227 #endif
228
229 #if USE(CG) && PLATFORM(WIN)
230     RetainPtr<CGFontRef> m_cgFont;
231 #endif
232
233 #if USE(DIRECT2D)
234     COMPtr<IDWriteFont> m_dwFont;
235     COMPtr<IDWriteFontFace> m_dwFontFace;
236 #endif
237
238 #if USE(CAIRO)
239     RefPtr<cairo_scaled_font_t> m_scaledFont;
240 #endif
241
242 #if USE(FREETYPE)
243     RefPtr<FcPattern> m_pattern;
244     mutable FcUniquePtr<FcFontSet> m_fallbacks;
245     mutable RefPtr<HarfBuzzFace> m_harfBuzzFace;
246 #endif
247
248     // The values below are common to all ports
249     // FIXME: If they're common to all ports, they should move to Font
250     float m_size { 0 };
251
252     FontOrientation m_orientation { Horizontal };
253     FontWidthVariant m_widthVariant { RegularWidth };
254     TextRenderingMode m_textRenderingMode { AutoTextRendering };
255
256     bool m_syntheticBold { false };
257     bool m_syntheticOblique { false };
258     bool m_isColorBitmapFont { false };
259     bool m_isHashTableDeletedValue { false };
260     bool m_isSystemFont { false };
261     bool m_hasVariations { false };
262     // The values above are common to all ports
263
264 #if PLATFORM(IOS)
265     bool m_isEmoji { false };
266 #endif
267
268 #if PLATFORM(WIN)
269     bool m_useGDI { false };
270 #endif
271
272 #if USE(FREETYPE)
273     bool m_fixedWidth { false };
274 #endif
275 };
276
277 #if USE(APPKIT) && defined(__OBJC__)
278
279 // NSFonts and CTFontRefs are toll-free-bridged.
280 inline CTFontRef toCTFont(NSFont *font)
281 {
282     return (CTFontRef)font;
283 }
284
285 inline NSFont *toNSFont(CTFontRef font)
286 {
287     return (NSFont *)font;
288 }
289
290 #endif
291
292 #if USE(CG)
293
294 class ScopedTextMatrix {
295 public:
296     ScopedTextMatrix(CGAffineTransform newMatrix, CGContextRef context)
297         : m_context(context)
298         , m_textMatrix(CGContextGetTextMatrix(context))
299     {
300         CGContextSetTextMatrix(m_context, newMatrix);
301     }
302
303     ~ScopedTextMatrix()
304     {
305         CGContextSetTextMatrix(m_context, m_textMatrix);
306     }
307
308     CGAffineTransform savedMatrix() const
309     {
310         return m_textMatrix;
311     }
312
313 private:
314     CGContextRef m_context;
315     CGAffineTransform m_textMatrix;
316 };
317
318 #endif
319
320 } // namespace WebCore