[WebGL2] Teach WebGLRenderingContextBase about new texture internal formats
[WebKit-https.git] / Source / WebCore / platform / graphics / FontTaggedSettings.h
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  * Copyright (C) 2016 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #pragma once
28
29 #include <array>
30 #include <wtf/Vector.h>
31 #include <wtf/text/AtomicString.h>
32
33 namespace WebCore {
34
35 class TextStream;
36
37 typedef std::array<char, 4> FontTag;
38
39 inline FontTag fontFeatureTag(const char arr[4]) { return {{ arr[0], arr[1], arr[2], arr[3] }}; }
40
41 struct FourCharacterTagHash {
42     static unsigned hash(const FontTag& characters) { return (characters[0] << 24) | (characters[1] << 16) | (characters[2] << 8) | characters[3]; }
43     static bool equal(const FontTag& a, const FontTag& b) { return a == b; }
44     static const bool safeToCompareToEmptyOrDeleted = true;
45 };
46
47 struct FourCharacterTagHashTraits : WTF::GenericHashTraits<FontTag> {
48     static const bool emptyValueIsZero = true;
49     static void constructDeletedValue(FontTag& slot) { new (NotNull, std::addressof(slot)) FontTag({{ ff, ff, ff, ff }}); }
50     static bool isDeletedValue(const FontTag& value) { return value == FontTag({{ ff, ff, ff, ff }}); }
51
52 private:
53     const static char ff = static_cast<char>(0xFF);
54 };
55
56 template <typename T>
57 class FontTaggedSetting {
58 public:
59     FontTaggedSetting() = delete;
60     FontTaggedSetting(const FontTag&, T value);
61     FontTaggedSetting(FontTag&&, T value);
62
63     bool operator==(const FontTaggedSetting<T>& other) const;
64     bool operator!=(const FontTaggedSetting<T>& other) const { return !(*this == other); }
65     bool operator<(const FontTaggedSetting<T>& other) const;
66
67     const FontTag& tag() const { return m_tag; }
68     T value() const { return m_value; }
69     bool enabled() const { return value(); }
70
71 private:
72     FontTag m_tag;
73     T m_value;
74 };
75
76 template <typename T>
77 FontTaggedSetting<T>::FontTaggedSetting(const FontTag& tag, T value)
78     : m_tag(tag)
79     , m_value(value)
80 {
81 }
82
83 template <typename T>
84 FontTaggedSetting<T>::FontTaggedSetting(FontTag&& tag, T value)
85     : m_tag(WTFMove(tag))
86     , m_value(value)
87 {
88 }
89
90 template <typename T>
91 bool FontTaggedSetting<T>::operator==(const FontTaggedSetting<T>& other) const
92 {
93     return m_tag == other.m_tag && m_value == other.m_value;
94 }
95
96 template <typename T>
97 bool FontTaggedSetting<T>::operator<(const FontTaggedSetting<T>& other) const
98 {
99     return (m_tag < other.m_tag) || (m_tag == other.m_tag && m_value < other.m_value);
100 }
101
102 template <typename T>
103 class FontTaggedSettings {
104 public:
105     void insert(FontTaggedSetting<T>&&);
106     bool operator==(const FontTaggedSettings<T>& other) const { return m_list == other.m_list; }
107     bool operator!=(const FontTaggedSettings<T>& other) const { return !(*this == other); }
108
109     bool isEmpty() const { return !size(); }
110     size_t size() const { return m_list.size(); }
111     const FontTaggedSetting<T>& operator[](int index) const { return m_list[index]; }
112     const FontTaggedSetting<T>& at(size_t index) const { return m_list.at(index); }
113
114     typename Vector<FontTaggedSetting<T>>::const_iterator begin() const { return m_list.begin(); }
115     typename Vector<FontTaggedSetting<T>>::const_iterator end() const { return m_list.end(); }
116
117     unsigned hash() const;
118
119 private:
120     Vector<FontTaggedSetting<T>> m_list;
121 };
122
123 template <typename T>
124 void FontTaggedSettings<T>::insert(FontTaggedSetting<T>&& feature)
125 {
126     // This vector will almost always have 0 or 1 items in it. Don't bother with the overhead of a binary search or a hash set.
127     size_t i;
128     for (i = 0; i < m_list.size(); ++i) {
129         if (!(feature < m_list[i]))
130             break;
131     }
132     if (i < m_list.size() && feature.tag() == m_list[i].tag())
133         m_list.remove(i);
134     m_list.insert(i, WTFMove(feature));
135 }
136
137 typedef FontTaggedSetting<int> FontFeature;
138 typedef FontTaggedSettings<int> FontFeatureSettings;
139
140 #if ENABLE(VARIATION_FONTS)
141
142 typedef FontTaggedSettings<float> FontVariationSettings;
143 TextStream& operator<<(TextStream&, const FontVariationSettings&);
144
145 #else
146
147 struct FontVariationSettings {
148     bool isEmpty() const { return true; }
149 };
150
151 #endif
152
153 }