Fix orientation angle value
[framework/web/webkit-efl.git] / Source / WebCore / platform / efl / PlatformScreenEfl.cpp
1 /*
2  * Copyright (C) 2007 Apple Inc.  All rights reserved.
3  * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
4  * Copyright (C) 2008 Holger Hans Peter Freyther
5  * Copyright (C) 2008 INdT - Instituto Nokia de Tecnologia
6  * Copyright (C) 2009-2010 ProFUSION embedded systems
7  * Copyright (C) 2009-2010 Samsung Electronics
8  * Copyright (C) 2012 Intel Corporation. All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  * 1.  Redistributions of source code must retain the above copyright
15  *     notice, this list of conditions and the following disclaimer.
16  * 2.  Redistributions in binary form must reproduce the above copyright
17  *     notice, this list of conditions and the following disclaimer in the
18  *     documentation and/or other materials provided with the distribution.
19  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
20  *     its contributors may be used to endorse or promote products derived
21  *     from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
24  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
27  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #include "config.h"
36 #include "PlatformScreen.h"
37
38 #include "NotImplemented.h"
39 #include "PlatformString.h"
40 #include "Widget.h"
41
42 #include <Ecore_Evas.h>
43 #include <wtf/text/CString.h>
44
45 #ifdef HAVE_ECORE_X
46 #include <Ecore_X.h>
47 #endif
48
49 #if ENABLE(TIZEN_WEBKIT2)
50 #include "Frame.h"
51 #include "FrameView.h"
52 #include "Settings.h"
53 #endif
54
55 #if ENABLE(TIZEN_VIEWPORT_META_TAG)
56 #include "Chrome.h"
57 #include "ChromeClient.h"
58 #include "Frame.h"
59 #include "FrameView.h"
60 #include "Page.h"
61 #include "Settings.h"
62 #endif
63
64 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_X_WINDOW)
65 #include <EflScreenUtilities.h>
66 #endif
67
68 namespace WebCore {
69
70 int screenHorizontalDPI(Widget*)
71 {
72     notImplemented();
73     return 0;
74 }
75
76 int screenVerticalDPI(Widget*)
77 {
78     notImplemented();
79     return 0;
80 }
81
82 int screenDepth(Widget*)
83 {
84
85 #ifdef HAVE_ECORE_X
86     return ecore_x_default_depth_get(ecore_x_display_get(), ecore_x_default_screen_get());
87 #else
88    return 24;
89 #endif
90 }
91
92 int screenDepthPerComponent(Widget* widget)
93 {
94     if (!widget)
95         return 8;
96
97     int depth = screenDepth(widget);
98
99     switch (depth) {
100     // Special treat 0 as an error, and return 8 bit per component.
101     case 0:
102     case 24:
103     case 32:
104         return 8;
105    case 8:
106         return 2;
107     default:
108         return depth / 3;
109     }
110 }
111
112 bool screenIsMonochrome(Widget* widget)
113 {
114     return screenDepth(widget) < 2;
115 }
116
117 FloatRect screenRect(Widget* widget)
118 {
119 #ifdef HAVE_ECORE_X
120 #if !ENABLE(ORIENTATION_EVENTS)
121     UNUSED_PARAM(widget);
122 #endif
123     // Fallback to realistic values if the EcoreX call fails
124     // and we cannot accurately detect the screen size.
125     int width = 800;
126     int height = 600;
127     ecore_x_screen_size_get(ecore_x_default_screen_get(), &width, &height);
128
129 #if OS(TIZEN)
130 #if ENABLE(ORIENTATION_EVENTS)
131     // Getting orientation via Ecore_X_Window cannot be fully synced
132     // So, we use Frame::orientation() if we have widget here
133     if (widget) {
134         FrameView* frameView = static_cast<FrameView*>(widget);
135         Frame* frame = frameView->frame();
136         int orientation = frame ? frame->orientation() : 0;
137         // landscape orientation value is 90 or -90
138         // ref. ewk_view_orientation_send()
139         if (orientation == 90 || orientation == -90) {
140             int temp = width;
141             width = height;
142             height = temp;
143         }
144         return FloatRect(0, 0, width, height);
145     }
146 #endif
147
148     int count = 0;
149     unsigned char *prop_data = NULL;
150     Ecore_X_Window xWindow = ecore_x_window_root_first_get();
151 #if ENABLE(TIZEN_WEBKIT2_CONTEXT_X_WINDOW)
152     if (Ecore_X_Window applicationXWindow = getXWindow())
153         xWindow = applicationXWindow;
154 #endif
155     int ret = ecore_x_window_prop_property_get(xWindow, ECORE_X_ATOM_E_ILLUME_ROTATE_WINDOW_ANGLE, ECORE_X_ATOM_CARDINAL, 32, &prop_data, &count);
156
157     int angle = 0;
158     if (ret && prop_data)
159         memcpy(&angle, prop_data, sizeof(int));
160
161     if (prop_data)
162         free(prop_data);
163
164     // ecore_x_screen_size_get() doesn't return orientation applied size
165     // we can consider orientation with window's angle
166     if (angle == 90 || angle == 270) {
167         int temp = width;
168         width = height;
169         height = temp;
170     }
171 #endif
172
173     return FloatRect(0, 0, width, height);
174 #else
175     if (!widget || !widget->evas())
176         return FloatRect();
177
178     int x, y, w, h;
179     ecore_evas_screen_geometry_get(ecore_evas_ecore_evas_get(widget->evas()), &x, &y, &w, &h);
180     return FloatRect(x, y, w, h);
181 #endif
182 }
183
184 FloatRect screenAvailableRect(Widget* widget)
185 {
186     return screenRect(widget);
187 }
188
189 void screenColorProfile(ColorProfile&)
190 {
191     notImplemented();
192 }
193
194 }