65817eb84235a9fa01c05b482226adcd846a0eee
[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(0) / 4;
60 }
61
62 bool screenIsMonochrome(Widget*)
63 {
64     return UIAccessibilityIsGrayscaleEnabled();
65 }
66
67 bool screenHasInvertedColors()
68 {
69     return UIAccessibilityIsInvertColorsEnabled();
70 }
71
72 // These functions scale between screen and page coordinates because JavaScript/DOM operations
73 // assume that the screen and the page share the same coordinate system.
74 FloatRect screenRect(Widget* widget)
75 {
76     if (!widget)
77         return FloatRect();
78
79     if (NSView *platformWidget = widget->platformWidget()) {
80         // WebKit1
81         WAKWindow *window = [platformWidget window];
82         if (!window)
83             return [platformWidget frame];
84         CGRect screenRect = { CGPointZero, [window screenSize] };
85         return enclosingIntRect(screenRect);
86     }
87     return enclosingIntRect(FloatRect(FloatPoint(), widget->root()->hostWindow()->screenSize()));
88 }
89
90 FloatRect screenAvailableRect(Widget* widget)
91 {
92     if (!widget)
93         return FloatRect();
94
95     if (NSView *platformWidget = widget->platformWidget()) {
96         // WebKit1
97         WAKWindow *window = [platformWidget window];
98         if (!window)
99             return FloatRect();
100         CGRect screenRect = { CGPointZero, [window availableScreenSize] };
101         return enclosingIntRect(screenRect);
102     }
103     return enclosingIntRect(FloatRect(FloatPoint(), widget->root()->hostWindow()->availableScreenSize()));
104 }
105
106 float screenPPIFactor()
107 {
108     static float ppiFactor;
109
110     static dispatch_once_t onceToken;
111     dispatch_once(&onceToken, ^{
112         int pitch = MGGetSInt32Answer(kMGQMainScreenPitch, 0);
113         float scale = MGGetFloat32Answer(kMGQMainScreenScale, 0);
114
115         static const float originalIPhonePPI = 163;
116         float mainScreenPPI = (pitch && scale) ? pitch / scale : originalIPhonePPI;
117         ppiFactor = mainScreenPPI / originalIPhonePPI;
118     });
119     
120     return ppiFactor;
121 }
122
123 FloatSize screenSize()
124 {
125     if (deviceHasIPadCapability() && [[getUIApplicationClass() sharedApplication] _isClassic])
126         return { 320, 480 };
127     return FloatSize([[getUIScreenClass() mainScreen] _referenceBounds].size);
128 }
129
130 FloatSize availableScreenSize()
131 {
132     if (deviceHasIPadCapability() && [[getUIApplicationClass() sharedApplication] _isClassic])
133         return { 320, 480 };
134     return FloatSize([getUIScreenClass() mainScreen].bounds.size);
135 }
136
137 float screenScaleFactor(UIScreen *screen)
138 {
139     if (!screen)
140         screen = [getUIScreenClass() mainScreen];
141
142     CGFloat scale = screen.scale;
143
144     // We can remove this clamping once <rdar://problem/16395475> is fixed.
145     const CGFloat maximumClassicScreenScaleFactor = 2;
146     if ([[getUIApplicationClass() sharedApplication] _isClassic])
147         return std::min(scale, maximumClassicScreenScaleFactor);
148
149     return scale;
150 }
151
152 } // namespace WebCore