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