WinCairo build fails to link.
[WebKit-https.git] / Source / WebKit / chromium / src / mac / WebScreenInfoFactory.mm
1 /*
2  * Copyright (C) 2009 Google 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 are
6  * met:
7  * 
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  * 
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32 #include "WebScreenInfoFactory.h"
33
34 #import <AppKit/AppKit.h>
35
36 #include "WebScreenInfo.h"
37
38 @interface NSWindow (LionAPI)
39 - (CGFloat)backingScaleFactor;
40 @end
41
42 @interface NSScreen (LionAPI)
43 - (CGFloat)backingScaleFactor;
44 @end
45
46 namespace WebKit {
47
48 static NSScreen* screenForWindow(NSWindow* window)
49 {
50     NSScreen* screen = [window screen];  // nil if the window is off-screen
51     if (screen)
52         return screen;
53
54     NSArray* screens = [NSScreen screens];
55     if ([screens count] > 0)
56         return [screens objectAtIndex:0];  // screen containing the menubar
57
58     return nil;
59 }
60
61 static WebRect convertRect(const NSRect& rect, NSWindow* destination)
62 {
63     CGRect userRect = NSRectToCGRect(rect);
64     userRect.origin.y =
65         NSMaxY([screenForWindow(destination) frame]) - NSMaxY(rect); // flip
66     return WebRect(userRect.origin.x,
67                    userRect.origin.y,
68                    userRect.size.width,
69                    userRect.size.height);
70 }
71
72 static float deviceScaleFactor(NSView* view)
73 {
74     NSWindow* window = [view window];
75     if (window)
76     {
77         if ([window respondsToSelector:@selector(backingScaleFactor)])
78             return [window backingScaleFactor];
79         return [window userSpaceScaleFactor];
80     }
81
82     NSArray* screens = [NSScreen screens];
83     if (![screens count])
84         return 1;
85
86     NSScreen* screen = [screens objectAtIndex:0];
87     if ([screen respondsToSelector:@selector(backingScaleFactor)])
88         return [screen backingScaleFactor];
89     return [screen userSpaceScaleFactor];
90 }
91
92 WebScreenInfo WebScreenInfoFactory::screenInfo(NSView* view)
93 {
94     NSScreen* screen = [NSScreen deepestScreen];
95
96     WebScreenInfo results;
97
98     results.deviceScaleFactor = static_cast<int>(deviceScaleFactor(view));
99     results.depth = NSBitsPerPixelFromDepth([screen depth]);
100     results.depthPerComponent = NSBitsPerSampleFromDepth([screen depth]);
101     results.isMonochrome =
102         [[screen colorSpace] colorSpaceModel] == NSGrayColorSpaceModel;
103     results.rect = convertRect([screenForWindow([view window]) frame], [view window]);
104     results.availableRect =
105         convertRect([screenForWindow([view window]) visibleFrame], [view window]);
106     return results;
107 }
108
109 } // namespace WebKit