[Font Loading] Implement FontFaceSet
[WebKit-https.git] / Source / WebCore / css / CSSFontFace.h
1 /*
2  * Copyright (C) 2007, 2008, 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef CSSFontFace_h
27 #define CSSFontFace_h
28
29 #include "CSSFontFaceRule.h"
30 #include "CSSFontFaceSource.h"
31 #include "FontFeatureSettings.h"
32 #include "TextFlags.h"
33 #include <memory>
34 #include <wtf/Forward.h>
35 #include <wtf/HashSet.h>
36 #include <wtf/PassRefPtr.h>
37 #include <wtf/RefCounted.h>
38 #include <wtf/Vector.h>
39
40 namespace WebCore {
41
42 class CSSSegmentedFontFace;
43 class CSSValue;
44 class CSSValueList;
45 class FontDescription;
46 class Font;
47 class FontFace;
48
49 // FIXME: This class does not need to be reference counted.
50 class CSSFontFace final : public RefCounted<CSSFontFace> {
51 public:
52     static Ref<CSSFontFace> create(CSSFontSelector& fontSelector, FontFace* wrapper = nullptr, bool isLocalFallback = false)
53     {
54         return adoptRef(*new CSSFontFace(fontSelector, wrapper, isLocalFallback));
55     }
56     virtual ~CSSFontFace();
57
58     bool setFamilies(CSSValue&);
59     bool setStyle(CSSValue&);
60     bool setWeight(CSSValue&);
61     bool setUnicodeRange(CSSValue&);
62     bool setVariantLigatures(CSSValue&);
63     bool setVariantPosition(CSSValue&);
64     bool setVariantCaps(CSSValue&);
65     bool setVariantNumeric(CSSValue&);
66     bool setVariantAlternates(CSSValue&);
67     bool setVariantEastAsian(CSSValue&);
68     bool setFeatureSettings(CSSValue&);
69
70     enum class Status;
71     struct UnicodeRange;
72     const CSSValueList* families() const { return m_families.get(); }
73     FontTraitsMask traitsMask() const { return m_traitsMask; }
74     const Vector<UnicodeRange>& ranges() const { return m_ranges; }
75     const FontFeatureSettings& featureSettings() const { return m_featureSettings; }
76     const FontVariantSettings& variantSettings() const { return m_variantSettings; }
77     void setVariantSettings(const FontVariantSettings& variantSettings) { m_variantSettings = variantSettings; }
78     void setTraitsMask(FontTraitsMask traitsMask) { m_traitsMask = traitsMask; }
79     bool isLocalFallback() const { return m_isLocalFallback; }
80     Status status() const { return m_status; }
81
82     class Client;
83     void addClient(Client&);
84     void removeClient(Client&);
85
86     bool allSourcesFailed() const;
87
88     void adoptSource(std::unique_ptr<CSSFontFaceSource>&&);
89     void sourcesPopulated() { m_sourcesPopulated = true; }
90
91     void fontLoaded(CSSFontFaceSource&);
92
93     void load();
94     RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic);
95
96     class Client {
97     public:
98         virtual ~Client() { }
99         virtual void fontLoaded(CSSFontFace&) { };
100         virtual void stateChanged(CSSFontFace&, Status oldState, Status newState) { UNUSED_PARAM(oldState); UNUSED_PARAM(newState); };
101     };
102
103     // Pending => Loading  => TimedOut
104     //              ||  \\    //  ||
105     //              ||   \\  //   ||
106     //              ||    \\//    ||
107     //              ||     //     ||
108     //              ||    //\\    ||
109     //              ||   //  \\   ||
110     //              \/  \/    \/  \/
111     //             Success    Failure
112     enum class Status {
113         Pending,
114         Loading,
115         TimedOut,
116         Success,
117         Failure
118     };
119
120     struct UnicodeRange {
121         UnicodeRange(UChar32 from, UChar32 to)
122             : m_from(from)
123             , m_to(to)
124         {
125         }
126
127         UChar32 from() const { return m_from; }
128         UChar32 to() const { return m_to; }
129
130     private:
131         UChar32 m_from;
132         UChar32 m_to;
133     };
134
135     FontFace* wrapper() const { return m_wrapper; }
136
137 #if ENABLE(SVG_FONTS)
138     bool hasSVGFontFaceSource() const;
139 #endif
140
141 private:
142     CSSFontFace(CSSFontSelector&, FontFace*, bool isLocalFallback);
143
144     size_t pump();
145     void setStatus(Status);
146
147     RefPtr<CSSValueList> m_families;
148     FontTraitsMask m_traitsMask { static_cast<FontTraitsMask>(FontStyleNormalMask | FontWeight400Mask) };
149     Vector<UnicodeRange> m_ranges;
150     HashSet<Client*> m_clients;
151     Ref<CSSFontSelector> m_fontSelector;
152     FontFace* m_wrapper;
153     FontFeatureSettings m_featureSettings;
154     FontVariantSettings m_variantSettings;
155     Vector<std::unique_ptr<CSSFontFaceSource>> m_sources;
156     Status m_status { Status::Pending };
157     bool m_isLocalFallback { false };
158     bool m_sourcesPopulated { false };
159 };
160
161 }
162
163 #endif