Fix build.
[WebKit-https.git] / Source / WebCore / platform / mac / PlatformScreenMac.mm
1 /*
2  * Copyright (C) 2006 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 "FloatRect.h"
30 #import "FrameView.h"
31 #import "HostWindow.h"
32
33 extern "C" {
34 bool CGDisplayUsesInvertedPolarity(void);
35 bool CGDisplayUsesForceToGray(void);
36 }
37
38 namespace WebCore {
39
40 static PlatformDisplayID displayIDFromScreen(NSScreen *screen)
41 {
42     return (PlatformDisplayID)[[[screen deviceDescription] objectForKey:@"NSScreenNumber"] intValue];
43 }
44
45 // These functions scale between screen and page coordinates because JavaScript/DOM operations
46 // assume that the screen and the page share the same coordinate system.
47
48 static PlatformDisplayID displayFromWidget(Widget* widget)
49 {
50     if (!widget)
51         return 0;
52
53     FrameView* view = widget->root();
54     if (!view)
55         return 0;
56
57     return view->hostWindow()->displayID();
58 }
59
60 static NSScreen *screenForWidget(Widget* widget, NSWindow *window)
61 {
62     // Widget is in an NSWindow, use its screen.
63     if (window)
64         return screenForWindow(window);
65
66     // Didn't get an NSWindow; probably WebKit2. Try using the Widget's display ID.
67     if (NSScreen *screen = screenForDisplayID(displayFromWidget(widget)))
68         return screen;
69
70     // Widget's window is offscreen, or no screens. Fall back to the first screen if available.
71     return screenForWindow(nil);
72 }
73
74 int screenDepth(Widget* widget)
75 {
76     NSWindow *window = widget ? [widget->platformWidget() window] : nil;
77     NSScreen *screen = screenForWidget(widget, window);
78     return NSBitsPerPixelFromDepth(screen.depth);
79 }
80
81 int screenDepthPerComponent(Widget* widget)
82 {
83     NSWindow *window = widget ? [widget->platformWidget() window] : nil;
84     NSScreen *screen = screenForWidget(widget, window);
85     return NSBitsPerSampleFromDepth(screen.depth);
86 }
87
88 bool screenIsMonochrome(Widget*)
89 {
90     // At the moment this is a system-wide accessibility setting,
91     // so we don't need to check the screen we're using.
92     return CGDisplayUsesForceToGray();
93 }
94
95 bool screenHasInvertedColors()
96 {
97     // At the moment this is a system-wide accessibility setting,
98     // so we don't need to check the screen we're using.
99     return CGDisplayUsesInvertedPolarity();
100 }
101
102 FloatRect screenRect(Widget* widget)
103 {
104     NSWindow *window = widget ? [widget->platformWidget() window] : nil;
105     NSScreen *screen = screenForWidget(widget, window);
106     return toUserSpace([screen frame], window);
107 }
108
109 FloatRect screenAvailableRect(Widget* widget)
110 {
111     NSWindow *window = widget ? [widget->platformWidget() window] : nil;
112     NSScreen *screen = screenForWidget(widget, window);
113     return toUserSpace([screen visibleFrame], window);
114 }
115
116 NSScreen *screenForWindow(NSWindow *window)
117 {
118     NSScreen *screen = [window screen]; // nil if the window is off-screen
119     if (screen)
120         return screen;
121
122     NSArray *screens = [NSScreen screens];
123     if ([screens count] > 0)
124         return [screens objectAtIndex:0]; // screen containing the menubar
125
126     return nil;
127 }
128
129 NSScreen *screenForDisplayID(PlatformDisplayID displayID)
130 {
131     for (NSScreen *screen in [NSScreen screens]) {
132         if (displayIDFromScreen(screen) == displayID)
133             return screen;
134     }
135     return nil;
136 }
137
138 bool screenSupportsExtendedColor()
139 {
140     return false; // FIXME: Update this to detect extended color screens.
141 }
142
143 FloatRect toUserSpace(const NSRect& rect, NSWindow *destination)
144 {
145     FloatRect userRect = rect;
146     userRect.setY(NSMaxY([screenForWindow(destination) frame]) - (userRect.y() + userRect.height())); // flip
147     return userRect;
148 }
149
150 NSRect toDeviceSpace(const FloatRect& rect, NSWindow *source)
151 {
152     FloatRect deviceRect = rect;
153     deviceRect.setY(NSMaxY([screenForWindow(source) frame]) - (deviceRect.y() + deviceRect.height())); // flip
154     return deviceRect;
155 }
156
157 NSPoint flipScreenPoint(const NSPoint& screenPoint, NSScreen *screen)
158 {
159     NSPoint flippedPoint = screenPoint;
160     flippedPoint.y = NSMaxY([screen frame]) - flippedPoint.y;
161     return flippedPoint;
162 }
163
164 } // namespace WebCore