Rename AtomicString to AtomString
[WebKit-https.git] / Source / WebCore / platform / graphics / cocoa / SystemFontDatabaseCoreText.h
1 /*
2  * Copyright (C) 2018 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "FontCascadeDescription.h"
29 #include <pal/spi/cocoa/CoreTextSPI.h>
30 #include <wtf/HashMap.h>
31 #include <wtf/HashTraits.h>
32 #include <wtf/text/AtomString.h>
33 #include <wtf/text/AtomStringHash.h>
34
35 namespace WebCore {
36
37 class SystemFontDatabaseCoreText {
38 public:
39     struct CascadeListParameters {
40         CascadeListParameters()
41         {
42         }
43
44         CascadeListParameters(WTF::HashTableDeletedValueType)
45             : fontName(WTF::HashTableDeletedValue)
46         {
47         }
48
49         bool isHashTableDeletedValue() const
50         {
51             return fontName.isHashTableDeletedValue();
52         }
53
54         bool operator==(const CascadeListParameters& other) const
55         {
56             return fontName == other.fontName
57                 && locale == other.locale
58                 && weight == other.weight
59                 && size == other.size
60                 && allowUserInstalledFonts == other.allowUserInstalledFonts
61                 && italic == other.italic;
62         }
63
64         unsigned hash() const
65         {
66             IntegerHasher hasher;
67             ASSERT(!fontName.isNull());
68             hasher.add(locale.existingHash());
69             hasher.add(locale.isNull() ? 0 : locale.existingHash());
70             hasher.add(weight);
71             hasher.add(size);
72             hasher.add(static_cast<unsigned>(allowUserInstalledFonts));
73             hasher.add(italic);
74             return hasher.hash();
75         }
76
77         struct CascadeListParametersHash : WTF::PairHash<AtomString, float> {
78             static unsigned hash(const CascadeListParameters& parameters)
79             {
80                 return parameters.hash();
81             }
82             static bool equal(const CascadeListParameters& a, const CascadeListParameters& b)
83             {
84                 return a == b;
85             }
86             static const bool safeToCompareToEmptyOrDeleted = true;
87         };
88
89         AtomString fontName;
90         AtomString locale;
91         CGFloat weight { 0 };
92         float size { 0 };
93         AllowUserInstalledFonts allowUserInstalledFonts { AllowUserInstalledFonts::No };
94         bool italic { false };
95     };
96
97     static SystemFontDatabaseCoreText& singleton();
98
99     enum class ClientUse { ForSystemUI, ForTextStyle };
100
101     Vector<RetainPtr<CTFontDescriptorRef>> cascadeList(const FontCascadeDescription&, const AtomString& cssFamily, ClientUse, AllowUserInstalledFonts);
102
103     String serifFamily(const String& locale);
104     String sansSerifFamily(const String& locale);
105     String cursiveFamily(const String& locale);
106     String fantasyFamily(const String& locale);
107     String monospaceFamily(const String& locale);
108
109     void clear();
110
111 private:
112     SystemFontDatabaseCoreText();
113
114     Vector<RetainPtr<CTFontDescriptorRef>> cascadeList(const CascadeListParameters&, ClientUse);
115
116     static RetainPtr<CTFontRef> applyWeightItalicsAndFallbackBehavior(CTFontRef, CGFloat weight, bool italic, float size, AllowUserInstalledFonts);
117     static RetainPtr<CTFontDescriptorRef> removeCascadeList(CTFontDescriptorRef);
118     static Vector<RetainPtr<CTFontDescriptorRef>> computeCascadeList(CTFontRef, CFStringRef locale);
119     static CascadeListParameters systemFontParameters(const FontCascadeDescription&, const AtomString& familyName, ClientUse, AllowUserInstalledFonts);
120
121     HashMap<CascadeListParameters, Vector<RetainPtr<CTFontDescriptorRef>>, CascadeListParameters::CascadeListParametersHash, SimpleClassHashTraits<CascadeListParameters>> m_systemFontCache;
122
123     HashMap<String, String> m_serifFamilies;
124     HashMap<String, String> m_sansSeriferifFamilies;
125     HashMap<String, String> m_cursiveFamilies;
126     HashMap<String, String> m_fantasyFamilies;
127     HashMap<String, String> m_monospaceFamilies;
128 };
129
130 }