16e78badb0c783f46fe49c605841ed61e67c3fdf
[WebKit-https.git] / Source / WebCore / platform / graphics / FontGlyphs.h
1 /*
2  * Copyright (C) 2006, 2010, 2013-2015 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20
21 #ifndef FontGlyphs_h
22 #define FontGlyphs_h
23
24 #include "FontSelector.h"
25 #include "GlyphPage.h"
26 #include "SimpleFontData.h"
27 #include "WidthCache.h"
28 #include <wtf/Forward.h>
29 #include <wtf/MainThread.h>
30
31 #if PLATFORM(IOS)
32 #include "WebCoreThread.h"
33 #endif
34
35 namespace WebCore {
36
37 class GraphicsContext;
38 class IntRect;
39 class FontDescription;
40 class FontPlatformData;
41 class FontSelector;
42
43 const int cAllFamiliesScanned = -1;
44
45 class FontGlyphs : public RefCounted<FontGlyphs> {
46     WTF_MAKE_NONCOPYABLE(FontGlyphs);
47 public:
48     static Ref<FontGlyphs> create(PassRefPtr<FontSelector> fontSelector) { return adoptRef(*new FontGlyphs(fontSelector)); }
49     static Ref<FontGlyphs> createForPlatformFont(const FontPlatformData& platformData) { return adoptRef(*new FontGlyphs(platformData)); }
50
51     ~FontGlyphs();
52
53     bool isForPlatformFont() const { return m_isForPlatformFont; }
54
55     GlyphData glyphDataForCharacter(UChar32, const FontDescription&, FontDataVariant);
56
57     bool isFixedPitch(const FontDescription&);
58     void determinePitch(const FontDescription&);
59
60     bool loadingCustomFonts() const { return m_loadingCustomFonts; }
61
62     FontSelector* fontSelector() { return m_fontSelector.get(); }
63     // FIXME: It should be possible to combine fontSelectorVersion and generation.
64     unsigned fontSelectorVersion() const { return m_fontSelectorVersion; }
65     unsigned generation() const { return m_generation; }
66
67     WidthCache& widthCache() { return m_widthCache; }
68     const WidthCache& widthCache() const { return m_widthCache; }
69
70     const SimpleFontData& primarySimpleFontData(const FontDescription&);
71     WEBCORE_EXPORT const FontData* realizeFontDataAt(const FontDescription&, unsigned index);
72
73 private:
74     FontGlyphs(PassRefPtr<FontSelector>);
75     FontGlyphs(const FontPlatformData&);
76
77     GlyphData glyphDataForSystemFallback(UChar32, const FontDescription&, FontDataVariant);
78     GlyphData glyphDataForNormalVariant(UChar32, const FontDescription&);
79     GlyphData glyphDataForVariant(UChar32, const FontDescription&, FontDataVariant, unsigned fallbackLevel);
80     
81     Vector<RefPtr<FontData>, 1> m_realizedFontData;
82
83     RefPtr<GlyphPage> m_cachedPageZero;
84     HashMap<int, RefPtr<GlyphPage>> m_cachedPages;
85
86     HashSet<RefPtr<SimpleFontData>> m_systemFallbackFontDataSet;
87
88     const SimpleFontData* m_cachedPrimarySimpleFontData;
89     RefPtr<FontSelector> m_fontSelector;
90     WidthCache m_widthCache;
91     unsigned m_fontSelectorVersion;
92     int m_familyIndex;
93     unsigned short m_generation;
94     unsigned m_pitch : 3; // Pitch
95     unsigned m_loadingCustomFonts : 1;
96     unsigned m_isForPlatformFont : 1;
97 };
98
99 inline bool FontGlyphs::isFixedPitch(const FontDescription& description)
100 {
101     if (m_pitch == UnknownPitch)
102         determinePitch(description);
103     return m_pitch == FixedPitch;
104 };
105
106 inline const SimpleFontData& FontGlyphs::primarySimpleFontData(const FontDescription& description)
107 {
108     ASSERT(isMainThread());
109     if (!m_cachedPrimarySimpleFontData) {
110         auto& fontData = *realizeFontDataAt(description, 0);
111         m_cachedPrimarySimpleFontData = fontData.simpleFontDataForCharacter(' ');
112         if (!m_cachedPrimarySimpleFontData)
113             m_cachedPrimarySimpleFontData = &fontData.simpleFontDataForFirstRange();
114     }
115     return *m_cachedPrimarySimpleFontData;
116 }
117
118 }
119
120 #endif