96df452f7e237284b3efb1180679e25458bc9ff1
[WebKit-https.git] / Source / WebCore / css / CSSFontFace.h
1 /*
2  * Copyright (C) 2007, 2008 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
48 class CSSFontFaceClient {
49 public:
50     virtual ~CSSFontFaceClient() { }
51     virtual void kick(CSSFontFace&) = 0;
52 };
53
54 class CSSFontFace : public RefCounted<CSSFontFace> {
55 public:
56     static Ref<CSSFontFace> create(CSSFontFaceClient& client, CSSFontSelector& fontSelector, bool isLocalFallback = false) { return adoptRef(*new CSSFontFace(client, fontSelector, isLocalFallback)); }
57     virtual ~CSSFontFace();
58
59     bool setFamilies(CSSValue&);
60     bool setStyle(CSSValue&);
61     bool setWeight(CSSValue&);
62     bool setUnicodeRange(CSSValue&);
63     bool setVariantLigatures(CSSValue&);
64     bool setVariantPosition(CSSValue&);
65     bool setVariantCaps(CSSValue&);
66     bool setVariantNumeric(CSSValue&);
67     bool setVariantAlternates(CSSValue&);
68     bool setVariantEastAsian(CSSValue&);
69     bool setFeatureSettings(CSSValue&);
70
71     enum class Status;
72     struct UnicodeRange;
73     const CSSValueList* families() const { return m_families.get(); }
74     FontTraitsMask traitsMask() const { return m_traitsMask; }
75     const Vector<UnicodeRange>& ranges() const { return m_ranges; }
76     const FontFeatureSettings& featureSettings() const { return m_featureSettings; }
77     const FontVariantSettings& variantSettings() const { return m_variantSettings; }
78     void setVariantSettings(const FontVariantSettings& variantSettings) { m_variantSettings = variantSettings; }
79     void setTraitsMask(FontTraitsMask traitsMask) { m_traitsMask = traitsMask; }
80     bool isLocalFallback() const { return m_isLocalFallback; }
81     Status status() const { return m_status; }
82
83     void addedToSegmentedFontFace(CSSSegmentedFontFace&);
84     void removedFromSegmentedFontFace(CSSSegmentedFontFace&);
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     // Pending => Loading  => TimedOut
97     //              ||  \\    //  ||
98     //              ||   \\  //   ||
99     //              ||    \\//    ||
100     //              ||     //     ||
101     //              ||    //\\    ||
102     //              ||   //  \\   ||
103     //              \/  \/    \/  \/
104     //             Success    Failure
105     enum class Status {
106         Pending,
107         Loading,
108         TimedOut,
109         Success,
110         Failure
111     };
112
113     struct UnicodeRange {
114         UnicodeRange(UChar32 from, UChar32 to)
115             : m_from(from)
116             , m_to(to)
117         {
118         }
119
120         UChar32 from() const { return m_from; }
121         UChar32 to() const { return m_to; }
122
123     private:
124         UChar32 m_from;
125         UChar32 m_to;
126     };
127
128 #if ENABLE(SVG_FONTS)
129     bool hasSVGFontFaceSource() const;
130 #endif
131
132 private:
133     CSSFontFace(CSSFontFaceClient&, CSSFontSelector&, bool isLocalFallback);
134
135     size_t pump();
136     void setStatus(Status);
137
138     RefPtr<CSSValueList> m_families;
139     FontTraitsMask m_traitsMask { static_cast<FontTraitsMask>(FontStyleNormalMask | FontWeight400Mask) };
140     Vector<UnicodeRange> m_ranges;
141     HashSet<CSSSegmentedFontFace*> m_segmentedFontFaces; // FIXME: Refactor this (in favor of CSSFontFaceClient) when implementing FontFaceSet.
142     Ref<CSSFontSelector> m_fontSelector;
143     CSSFontFaceClient& m_client;
144     FontFeatureSettings m_featureSettings;
145     FontVariantSettings m_variantSettings;
146     Vector<std::unique_ptr<CSSFontFaceSource>> m_sources;
147     Status m_status { Status::Pending };
148     bool m_isLocalFallback { false };
149     bool m_sourcesPopulated { false };
150 };
151
152 }
153
154 #endif