[iOS] Fix the open source iOS 12 build after r236445
[WebKit-https.git] / Source / WebCore / platform / ios / PlatformScreenIOS.mm
1 /*
2  * Copyright (C) 2006, 2014 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 #import "config.h"
27 #import "PlatformScreen.h"
28
29 #if PLATFORM(IOS)
30
31 #import "DeprecatedGlobalSettings.h"
32 #import "Device.h"
33 #import "FloatRect.h"
34 #import "FloatSize.h"
35 #import "FrameView.h"
36 #import "GraphicsContextCG.h"
37 #import "HostWindow.h"
38 #import "IntRect.h"
39 #import "WAKWindow.h"
40 #import "Widget.h"
41 #import <pal/ios/UIKitSoftLink.h>
42 #import <pal/spi/ios/MobileGestaltSPI.h>
43 #import <pal/spi/ios/UIKitSPI.h>
44
45 namespace WebCore {
46
47 int screenDepth(Widget*)
48 {
49     // Assume 32 bits per pixel. See <rdar://problem/9378829>.
50     return 32;
51 }
52
53 int screenDepthPerComponent(Widget*)
54 {
55     // Assume the screen depth is evenly divided into four color components. See <rdar://problem/9378829>.
56     return screenDepth(nullptr) / 4;
57 }
58
59 bool screenIsMonochrome(Widget*)
60 {
61     return PAL::softLinkUIKitUIAccessibilityIsGrayscaleEnabled();
62 }
63
64 bool screenHasInvertedColors()
65 {
66     return PAL::softLinkUIKitUIAccessibilityIsInvertColorsEnabled();
67 }
68
69 bool screenSupportsExtendedColor(Widget*)
70 {
71     return MGGetBoolAnswer(kMGQHasExtendedColorDisplay);
72 }
73
74 CGColorSpaceRef screenColorSpace(Widget* widget)
75 {
76     return screenSupportsExtendedColor(widget) ? extendedSRGBColorSpaceRef() : sRGBColorSpaceRef();
77 }
78
79 // These functions scale between screen and page coordinates because JavaScript/DOM operations
80 // assume that the screen and the page share the same coordinate system.
81 FloatRect screenRect(Widget* widget)
82 {
83     if (!widget)
84         return FloatRect();
85
86     if (NSView *platformWidget = widget->platformWidget()) {
87         // WebKit1
88         WAKWindow *window = [platformWidget window];
89         if (!window)
90             return [platformWidget frame];
91         CGRect screenRect = { CGPointZero, [window screenSize] };
92         return enclosingIntRect(screenRect);
93     }
94     return enclosingIntRect(FloatRect(FloatPoint(), widget->root()->hostWindow()->overrideScreenSize()));
95 }
96
97 FloatRect screenAvailableRect(Widget* widget)
98 {
99     if (!widget)
100         return FloatRect();
101
102     if (NSView *platformWidget = widget->platformWidget()) {
103         // WebKit1
104         WAKWindow *window = [platformWidget window];
105         if (!window)
106             return FloatRect();
107         CGRect screenRect = { CGPointZero, [window availableScreenSize] };
108         return enclosingIntRect(screenRect);
109     }
110     return enclosingIntRect(FloatRect(FloatPoint(), widget->root()->hostWindow()->availableScreenSize()));
111 }
112
113 float screenPPIFactor()
114 {
115     static float ppiFactor;
116
117     static dispatch_once_t onceToken;
118     dispatch_once(&onceToken, ^{
119         int pitch = MGGetSInt32Answer(kMGQMainScreenPitch, 0);
120         float scale = MGGetFloat32Answer(kMGQMainScreenScale, 0);
121
122         static const float originalIPhonePPI = 163;
123         float mainScreenPPI = (pitch && scale) ? pitch / scale : originalIPhonePPI;
124         ppiFactor = mainScreenPPI / originalIPhonePPI;
125     });
126     
127     return ppiFactor;
128 }
129
130 FloatSize screenSize()
131 {
132     if (deviceHasIPadCapability() && [[PAL::get_UIKit_UIApplicationClass() sharedApplication] _isClassic])
133         return { 320, 480 };
134     return FloatSize([[PAL::get_UIKit_UIScreenClass() mainScreen] _referenceBounds].size);
135 }
136
137 FloatSize availableScreenSize()
138 {
139     if (deviceHasIPadCapability() && [[PAL::get_UIKit_UIApplicationClass() sharedApplication] _isClassic])
140         return { 320, 480 };
141     return FloatSize([PAL::get_UIKit_UIScreenClass() mainScreen].bounds.size);
142 }
143
144 #if USE(APPLE_INTERNAL_SDK) && __has_include(<WebKitAdditions/PlatformScreenIOS.mm>)
145 #import <WebKitAdditions/PlatformScreenIOS.mm>
146 #else
147 FloatSize overrideScreenSize()
148 {
149     return screenSize();
150 }
151 #endif
152
153 float screenScaleFactor(UIScreen *screen)
154 {
155     if (!screen)
156         screen = [PAL::get_UIKit_UIScreenClass() mainScreen];
157
158     return screen.scale;
159 }
160
161 } // namespace WebCore
162
163 #endif // PLATFORM(IOS)