Add media query support for wide gamut displays on Mac
[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 #import "Device.h"
30 #import "FloatRect.h"
31 #import "FloatSize.h"
32 #import "FrameView.h"
33 #import "HostWindow.h"
34 #import "IntRect.h"
35 #import "MobileGestaltSPI.h"
36 #import "SoftLinking.h"
37 #import "UIKitSPI.h"
38 #import "WAKWindow.h"
39 #import "WebCoreSystemInterface.h"
40 #import "Widget.h"
41
42 SOFT_LINK_FRAMEWORK(UIKit)
43 SOFT_LINK_CLASS(UIKit, UIApplication)
44 SOFT_LINK_CLASS(UIKit, UIScreen)
45 SOFT_LINK(UIKit, UIAccessibilityIsGrayscaleEnabled, BOOL, (void), ())
46 SOFT_LINK(UIKit, UIAccessibilityIsInvertColorsEnabled, BOOL, (void), ())
47
48 namespace WebCore {
49
50 int screenDepth(Widget*)
51 {
52     // Assume 32 bits per pixel. See <rdar://problem/9378829>.
53     return 32;
54 }
55
56 int screenDepthPerComponent(Widget*)
57 {
58     // Assume the screen depth is evenly divided into four color components. See <rdar://problem/9378829>.
59     return screenDepth(nullptr) / 4;
60 }
61
62 bool screenIsMonochrome(Widget*)
63 {
64     return UIAccessibilityIsGrayscaleEnabled();
65 }
66
67 bool screenHasInvertedColors()
68 {
69     return UIAccessibilityIsInvertColorsEnabled();
70 }
71
72 bool screenSupportsExtendedColor(Widget*)
73 {
74 #if PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90300
75     return MGGetBoolAnswer(kMGQHasExtendedColorDisplay);
76 #else
77     return false;
78 #endif
79 }
80
81 // These functions scale between screen and page coordinates because JavaScript/DOM operations
82 // assume that the screen and the page share the same coordinate system.
83 FloatRect screenRect(Widget* widget)
84 {
85     if (!widget)
86         return FloatRect();
87
88     if (NSView *platformWidget = widget->platformWidget()) {
89         // WebKit1
90         WAKWindow *window = [platformWidget window];
91         if (!window)
92             return [platformWidget frame];
93         CGRect screenRect = { CGPointZero, [window screenSize] };
94         return enclosingIntRect(screenRect);
95     }
96     return enclosingIntRect(FloatRect(FloatPoint(), widget->root()->hostWindow()->screenSize()));
97 }
98
99 FloatRect screenAvailableRect(Widget* widget)
100 {
101     if (!widget)
102         return FloatRect();
103
104     if (NSView *platformWidget = widget->platformWidget()) {
105         // WebKit1
106         WAKWindow *window = [platformWidget window];
107         if (!window)
108             return FloatRect();
109         CGRect screenRect = { CGPointZero, [window availableScreenSize] };
110         return enclosingIntRect(screenRect);
111     }
112     return enclosingIntRect(FloatRect(FloatPoint(), widget->root()->hostWindow()->availableScreenSize()));
113 }
114
115 float screenPPIFactor()
116 {
117     static float ppiFactor;
118
119     static dispatch_once_t onceToken;
120     dispatch_once(&onceToken, ^{
121         int pitch = MGGetSInt32Answer(kMGQMainScreenPitch, 0);
122         float scale = MGGetFloat32Answer(kMGQMainScreenScale, 0);
123
124         static const float originalIPhonePPI = 163;
125         float mainScreenPPI = (pitch && scale) ? pitch / scale : originalIPhonePPI;
126         ppiFactor = mainScreenPPI / originalIPhonePPI;
127     });
128     
129     return ppiFactor;
130 }
131
132 FloatSize screenSize()
133 {
134     if (deviceHasIPadCapability() && [[getUIApplicationClass() sharedApplication] _isClassic])
135         return { 320, 480 };
136     return FloatSize([[getUIScreenClass() mainScreen] _referenceBounds].size);
137 }
138
139 FloatSize availableScreenSize()
140 {
141     if (deviceHasIPadCapability() && [[getUIApplicationClass() sharedApplication] _isClassic])
142         return { 320, 480 };
143     return FloatSize([getUIScreenClass() mainScreen].bounds.size);
144 }
145
146 float screenScaleFactor(UIScreen *screen)
147 {
148     if (!screen)
149         screen = [getUIScreenClass() mainScreen];
150
151     CGFloat scale = screen.scale;
152
153     // We can remove this clamping once <rdar://problem/16395475> is fixed.
154     const CGFloat maximumClassicScreenScaleFactor = 2;
155     if ([[getUIApplicationClass() sharedApplication] _isClassic])
156         return std::min(scale, maximumClassicScreenScaleFactor);
157
158     return scale;
159 }
160
161 } // namespace WebCore