Delete WebMetal implementation in favor of WebGPU
[WebKit-https.git] / Source / WebCore / platform / ScreenProperties.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 #if PLATFORM(MAC)
29
30 #include "FloatRect.h"
31 #include "PlatformScreen.h"
32 #include <wtf/RetainPtr.h>
33 #include <wtf/text/WTFString.h>
34
35 typedef struct CGColorSpace *CGColorSpaceRef;
36
37 namespace WebCore {
38
39 struct ScreenData {
40     FloatRect screenAvailableRect;
41     FloatRect screenRect;
42     RetainPtr<CGColorSpaceRef> colorSpace;
43     int screenDepth { 0 };
44     int screenDepthPerComponent { 0 };
45     bool screenSupportsExtendedColor { false };
46     bool screenHasInvertedColors { false };
47     bool screenIsMonochrome { false };
48     uint32_t displayMask { 0 };
49     IORegistryGPUID gpuID { 0 };
50
51     enum EncodedColorSpaceDataType {
52         Null,
53         ColorSpaceName,
54         ColorSpaceData,
55     };
56
57     template<class Encoder> void encode(Encoder&) const;
58     template<class Decoder> static Optional<ScreenData> decode(Decoder&);
59 };
60
61 typedef HashMap<PlatformDisplayID, ScreenData> ScreenDataMap;
62     
63 struct ScreenProperties {
64     PlatformDisplayID primaryDisplayID { 0 };
65     ScreenDataMap screenDataMap;
66
67     template<class Encoder> void encode(Encoder&) const;
68     template<class Decoder> static Optional<ScreenProperties> decode(Decoder&);
69 };
70
71 template<class Encoder>
72 void ScreenProperties::encode(Encoder& encoder) const
73 {
74     encoder << primaryDisplayID;
75     encoder << screenDataMap;
76 }
77
78 template<class Decoder>
79 Optional<ScreenProperties> ScreenProperties::decode(Decoder& decoder)
80 {
81     Optional<PlatformDisplayID> primaryDisplayID;
82     decoder >> primaryDisplayID;
83     if (!primaryDisplayID)
84         return WTF::nullopt;
85
86     Optional<ScreenDataMap> screenDataMap;
87     decoder >> screenDataMap;
88     if (!screenDataMap)
89         return WTF::nullopt;
90
91     return { { *primaryDisplayID, WTFMove(*screenDataMap) } };
92 }
93
94 template<class Encoder>
95 void ScreenData::encode(Encoder& encoder) const
96 {
97     encoder << screenAvailableRect << screenRect << screenDepth << screenDepthPerComponent << screenSupportsExtendedColor << screenHasInvertedColors << screenIsMonochrome << displayMask << gpuID;
98
99     if (colorSpace) {
100         // Try to encode the name.
101         if (auto name = adoptCF(CGColorSpaceCopyName(colorSpace.get()))) {
102             encoder.encodeEnum(ColorSpaceName);
103             encoder << String(name.get());
104             return;
105         }
106
107         // Failing that, just encode the ICC data.
108         if (auto profileData = adoptCF(CGColorSpaceCopyICCData(colorSpace.get()))) {
109             encoder.encodeEnum(ColorSpaceData);
110
111             Vector<uint8_t> iccData;
112             iccData.append(CFDataGetBytePtr(profileData.get()), CFDataGetLength(profileData.get()));
113
114             encoder << iccData;
115             return;
116         }
117     }
118
119     // The color space was null or failed to be encoded.
120     encoder << Null;
121 }
122
123 template<class Decoder>
124 Optional<ScreenData> ScreenData::decode(Decoder& decoder)
125 {
126     Optional<FloatRect> screenAvailableRect;
127     decoder >> screenAvailableRect;
128     if (!screenAvailableRect)
129         return WTF::nullopt;
130
131     Optional<FloatRect> screenRect;
132     decoder >> screenRect;
133     if (!screenRect)
134         return WTF::nullopt;
135
136     Optional<int> screenDepth;
137     decoder >> screenDepth;
138     if (!screenDepth)
139         return WTF::nullopt;
140
141     Optional<int> screenDepthPerComponent;
142     decoder >> screenDepthPerComponent;
143     if (!screenDepthPerComponent)
144         return WTF::nullopt;
145
146     Optional<bool> screenSupportsExtendedColor;
147     decoder >> screenSupportsExtendedColor;
148     if (!screenSupportsExtendedColor)
149         return WTF::nullopt;
150
151     Optional<bool> screenHasInvertedColors;
152     decoder >> screenHasInvertedColors;
153     if (!screenHasInvertedColors)
154         return WTF::nullopt;
155
156     Optional<bool> screenIsMonochrome;
157     decoder >> screenIsMonochrome;
158     if (!screenIsMonochrome)
159         return WTF::nullopt;
160
161     Optional<uint32_t> displayMask;
162     decoder >> displayMask;
163     if (!displayMask)
164         return WTF::nullopt;
165
166     Optional<IORegistryGPUID> gpuID;
167     decoder >> gpuID;
168     if (!gpuID)
169         return WTF::nullopt;
170     
171     EncodedColorSpaceDataType dataType;
172     if (!decoder.decodeEnum(dataType))
173         return WTF::nullopt;
174
175     RetainPtr<CGColorSpaceRef> cgColorSpace;
176     switch (dataType) {
177     case Null:
178         break;
179     case ColorSpaceName: {
180         Optional<String> colorSpaceName;
181         decoder >> colorSpaceName;
182         ASSERT(colorSpaceName);
183         if (!colorSpaceName)
184             return WTF::nullopt;
185
186         cgColorSpace = adoptCF(CGColorSpaceCreateWithName(colorSpaceName->createCFString().get()));
187         break;
188     }
189     case ColorSpaceData: {
190         Optional<Vector<uint8_t>> iccData;
191         decoder >> iccData;
192         ASSERT(iccData);
193         if (!iccData)
194             return WTF::nullopt;
195
196         auto colorSpaceData = adoptCF(CFDataCreate(kCFAllocatorDefault, iccData->data(), iccData->size()));
197         // FIXME: <http://webkit.org/b/184358> We should switch to CGColorSpaceCreateICCBased.
198         ALLOW_DEPRECATED_DECLARATIONS_BEGIN
199         cgColorSpace = adoptCF(CGColorSpaceCreateWithICCProfile(colorSpaceData.get()));
200         ALLOW_DEPRECATED_DECLARATIONS_END
201         break;
202     }
203     }
204
205     return { { WTFMove(*screenAvailableRect), WTFMove(*screenRect), WTFMove(cgColorSpace), WTFMove(*screenDepth), WTFMove(*screenDepthPerComponent), WTFMove(*screenSupportsExtendedColor), WTFMove(*screenHasInvertedColors), WTFMove(*screenIsMonochrome), WTFMove(*displayMask), WTFMove(*gpuID) } };
206 }
207
208 } // namespace WebCore
209
210 #endif // PLATFORM(MAC)