2 * Copyright (C) 2007, 2008, 2016 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
29 #include "CSSFontFaceRule.h"
30 #include "FontFeatureSettings.h"
31 #include "TextFlags.h"
33 #include <wtf/Forward.h>
34 #include <wtf/HashSet.h>
35 #include <wtf/PassRefPtr.h>
36 #include <wtf/RefCounted.h>
37 #include <wtf/Vector.h>
38 #include <wtf/WeakPtr.h>
46 class CSSFontFaceSource;
47 class CSSFontSelector;
48 class CSSSegmentedFontFace;
52 class FontDescription;
56 class CSSFontFace final : public RefCounted<CSSFontFace> {
58 static Ref<CSSFontFace> create(CSSFontSelector* fontSelector, StyleRuleFontFace* cssConnection = nullptr, FontFace* wrapper = nullptr, bool isLocalFallback = false)
60 return adoptRef(*new CSSFontFace(fontSelector, cssConnection, wrapper, isLocalFallback));
62 virtual ~CSSFontFace();
64 bool setFamilies(CSSValue&);
65 bool setStyle(CSSValue&);
66 bool setWeight(CSSValue&);
67 bool setUnicodeRange(CSSValue&);
68 bool setVariantLigatures(CSSValue&);
69 bool setVariantPosition(CSSValue&);
70 bool setVariantCaps(CSSValue&);
71 bool setVariantNumeric(CSSValue&);
72 bool setVariantAlternates(CSSValue&);
73 bool setVariantEastAsian(CSSValue&);
74 bool setFeatureSettings(CSSValue&);
78 const CSSValueList* families() const { return m_families.get(); }
79 FontTraitsMask traitsMask() const { return m_traitsMask; }
80 const Vector<UnicodeRange>& ranges() const { return m_ranges; }
81 const FontFeatureSettings& featureSettings() const { return m_featureSettings; }
82 const FontVariantSettings& variantSettings() const { return m_variantSettings; }
83 void setVariantSettings(const FontVariantSettings& variantSettings) { m_variantSettings = variantSettings; }
84 void setTraitsMask(FontTraitsMask traitsMask) { m_traitsMask = traitsMask; }
85 bool isLocalFallback() const { return m_isLocalFallback; }
86 Status status() const { return m_status; }
87 StyleRuleFontFace* cssConnection() const { return m_cssConnection.get(); }
89 static Optional<FontTraitsMask> calculateStyleMask(CSSValue& style);
90 static Optional<FontTraitsMask> calculateWeightMask(CSSValue& weight);
93 void addClient(Client&);
94 void removeClient(Client&);
96 bool allSourcesFailed() const;
98 void adoptSource(std::unique_ptr<CSSFontFaceSource>&&);
99 void sourcesPopulated() { m_sourcesPopulated = true; }
101 void fontLoaded(CSSFontFaceSource&);
104 RefPtr<Font> font(const FontDescription&, bool syntheticBold, bool syntheticItalic);
106 static void appendSources(CSSFontFace&, CSSValueList&, Document*, bool isInitiatingElementInUserAgentShadowTree);
110 virtual ~Client() { }
111 virtual void fontLoaded(CSSFontFace&) { }
112 virtual void fontStateChanged(CSSFontFace&, Status oldState, Status newState) { UNUSED_PARAM(oldState); UNUSED_PARAM(newState); }
113 virtual void fontPropertyChanged(CSSFontFace&, CSSValueList* oldFamilies = nullptr) { UNUSED_PARAM(oldFamilies); }
114 virtual void ref() = 0;
115 virtual void deref() = 0;
118 // Pending => Loading => TimedOut
135 struct UnicodeRange {
136 UnicodeRange(UChar32 from, UChar32 to)
142 UChar32 from() const { return m_from; }
143 UChar32 to() const { return m_to; }
150 // We don't guarantee that the FontFace wrapper will be the same every time you ask for it.
151 Ref<FontFace> wrapper(JSC::ExecState&);
153 #if ENABLE(SVG_FONTS)
154 bool hasSVGFontFaceSource() const;
158 CSSFontFace(CSSFontSelector*, StyleRuleFontFace*, FontFace*, bool isLocalFallback);
161 void setStatus(Status);
162 void notifyClientsOfFontPropertyChange();
164 RefPtr<CSSValueList> m_families;
165 FontTraitsMask m_traitsMask { static_cast<FontTraitsMask>(FontStyleNormalMask | FontWeight400Mask) };
166 Vector<UnicodeRange> m_ranges;
167 FontFeatureSettings m_featureSettings;
168 FontVariantSettings m_variantSettings;
169 Vector<std::unique_ptr<CSSFontFaceSource>> m_sources;
170 RefPtr<CSSFontSelector> m_fontSelector;
171 RefPtr<StyleRuleFontFace> m_cssConnection;
172 HashSet<Client*> m_clients;
173 WeakPtr<FontFace> m_wrapper;
174 Status m_status { Status::Pending };
175 bool m_isLocalFallback { false };
176 bool m_sourcesPopulated { false };