Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_OverlayPanel.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://floralicense.org/license/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 /**
18 * @file         FUiCtrl_OverlayPanel.cpp
19 * @brief        This file contains implementation of _OverlayPanel class
20 */
21
22 #include <new>
23
24 #include <Elementary.h>
25
26 #include <FGrpCanvas.h>
27 #include <FBaseString.h>
28 #include <FGrpFloatRectangle.h>
29
30 #include "FUi_CoordinateSystemUtils.h"
31 #include "FUiCtrl_OverlayPanel.h"
32 #include "FUiCtrl_OverlayAgent.h"
33 #include "FUiCtrl_Form.h"
34 #include "FUiCtrl_FormImpl.h"
35 #include "FUiAnim_ControlVisualElement.h"
36
37 using namespace Tizen::Base;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui;
40 using namespace Tizen::Ui::Controls;
41
42 namespace Tizen { namespace Ui { namespace Controls
43 {
44
45 _OverlayPanel*
46 _OverlayPanel::CreateOverlayPanelN(const Rectangle& bounds)
47 {
48         _OverlayPanel* pOverlayPanel = new (std::nothrow) _OverlayPanel(bounds);
49         SysTryReturn(NID_UI_CTRL, pOverlayPanel != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
50
51         result r = GetLastResult();
52         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
53
54         pOverlayPanel->AcquireHandle();
55
56         SetLastResult(E_SUCCESS);
57
58         return pOverlayPanel;
59
60 CATCH:
61         delete pOverlayPanel;
62
63         return null;
64 }
65
66 _OverlayPanel::_OverlayPanel(const Rectangle& bounds)
67         : __pOverlayAgent(null)
68 {
69         SetLastResult(E_SUCCESS);
70 }
71
72 _OverlayPanel::~_OverlayPanel(void)
73 {
74         SysLog(NID_UI_CTRL, "Destructor ~~~~~~");
75
76         if (__pOverlayAgent)
77         {
78                 delete __pOverlayAgent;
79                 __pOverlayAgent = null;
80         }
81 }
82
83 result
84 _OverlayPanel::SetInputBuffer(const Dimension& destDim, const ByteBuffer& srcBuffer, const Dimension& srcDim, OverlayPanel::BufferPixelFormat srcFormat)
85 {
86         result r = E_SYSTEM;
87
88         SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, r, "[E_SYSTEM] __pOverlayAgent is null.");
89
90         _OverlayAgentBufferPixelFormat format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888;
91         switch (srcFormat)
92         {
93         case OverlayPanel::BUFFER_PIXEL_FORMAT_ARGB8888:
94                 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888;
95                 break;
96         case OverlayPanel::BUFFER_PIXEL_FORMAT_RGB565:
97                 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_RGB565;
98                 break;
99         case OverlayPanel::BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR:
100                 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR;
101                 break;
102         default:
103                 SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "The specified pixel format is not supported.");
104                 return E_UNSUPPORTED_FORMAT;
105         }
106
107         r = __pOverlayAgent->SetInputBuffer(destDim, srcBuffer, srcDim, format);
108         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
109
110         r = __pOverlayAgent->Draw();
111         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
112
113         r = __pOverlayAgent->SetDestination(destDim);
114         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
115
116         return r;
117 }
118
119 result
120 _OverlayPanel::SetRendererRotation(OverlayPanel::Rotation rotation)
121 {
122         result r = E_SYSTEM;
123         SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, r, "[E_SYSTEM] __pOverlayAgent is null.");
124
125         r = __pOverlayAgent->SetRotation((_OverlayAgentRotation)rotation);
126         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
127
128         return r;
129 }
130
131 result
132 _OverlayPanel::SetRendererAspectRatio(bool aspectRatio)
133 {
134         result r = E_SYSTEM;
135         SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, r, "[E_SYSTEM] __pOverlayAgent is null.");
136
137         r = __pOverlayAgent->SetAspectRatio(aspectRatio);
138         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
139
140         return r;
141 }
142
143 result
144 _OverlayPanel::SetRendererSize(const Dimension& dimension)
145 {
146         result r = E_SYSTEM;
147         SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, r, "[E_SYSTEM] __pOverlayAgent is null.");
148
149         r = __pOverlayAgent->SetDestination(dimension);
150         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
151
152         return r;
153 }
154
155 result
156 _OverlayPanel::GetBackgroundBufferInfo(BufferInfo& info) const
157 {
158         SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, E_SYSTEM, "[E_SYSTEM] __pOverlayAgent is null.");
159
160         return __pOverlayAgent->GetBufferInfo(info);
161 }
162
163 Color
164 _OverlayPanel::GetMaskingColor(void) const
165 {
166 // Suspend
167         return Color(0x00000000);
168 // ---
169 }
170
171 void
172 _OverlayPanel::OnDraw(void)
173 {
174         SysTryReturnVoidResult(NID_UI_CTRL, __pOverlayAgent != null, E_SYSTEM, "[E_SYSTEM] __pOverlayAgent is null.");
175         __pOverlayAgent->AdjustImageObject();
176
177         return;
178 }
179
180 void
181 _OverlayPanel::OnVisibleStateChanged(void)
182 {
183         if (IsVisible())
184         {
185                 SysLog(NID_UI_CTRL, " visible true");
186         }
187         else
188         {
189                 SysLog(NID_UI_CTRL, " visible false");
190         }
191 }
192
193 result
194 _OverlayPanel::OnAttachedToMainTree(void)
195 {
196         byte* pBuf = null;
197
198         int maxCount = OverlayRegion::GetMaxCount();
199         SysTryReturn(NID_UI_CTRL, maxCount > 0, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] maxCount [%d] is invalid", maxCount);
200
201         // 1. check for overlayAgent maximum count
202         SysTryReturn(NID_UI_CTRL, _OverlayAgent::GetOverlayAgentCount() < maxCount, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] already used permitted maximum number of OverlayAgent!");
203
204         _Control* pParent = GetParent();
205         SysTryReturn(NID_UI_CTRL, pParent != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Parent is invalid");
206
207         _ControlImpl* pControlImpl = static_cast<_ControlImpl*>(pParent->GetUserData());
208         SysTryReturn(NID_UI_CTRL, pControlImpl != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pControlImpl is null");
209
210         _FormImpl* pFormImpl = dynamic_cast<_FormImpl*>(pControlImpl);
211         SysTryReturn(NID_UI_CTRL, pFormImpl != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pFormImpl is null");
212
213         // 2. check for using OverlayRegion simutaneously in the same form
214         _Form& form = pFormImpl->GetCore();
215         SysTryReturn(NID_UI_CTRL, form.GetOverlayRegionCount() == 0, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Using OverlayPanel mixed with OverlayRegion is not supported");
216
217         int idx, panelCount = 0;;
218         _OverlayPanel* pOverlayPanel = null;
219
220         // 3. check for overlayPanel maximum count
221         for (idx = 0 ; idx < form.GetChildCount() ; idx++)
222         {
223                 pOverlayPanel = dynamic_cast <_OverlayPanel*>(form.GetChild(idx));
224                 if(pOverlayPanel != null)
225                 {
226                         panelCount++;
227                         pOverlayPanel = null;
228                 }
229         }
230
231         SysTryReturn(NID_UI_CTRL, panelCount <= maxCount, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] already used permitted maximum number of OverlayPanel");
232
233         // 4. make OverlayPanel object
234         Rectangle clientRect = pParent->GetClientBounds();   //GetClientBounds();
235         Rectangle GeneralRect = GetBounds();
236         Rectangle overlayRect(clientRect.x + GeneralRect.x, clientRect.y + GeneralRect.y, GeneralRect.width, GeneralRect.height);
237
238         SysLog(NID_UI_CTRL,"clientRect is [%d, %d, %d, %d] userRect is [%d, %d, %d, %d]",
239                         clientRect.x, clientRect.y, clientRect.width, clientRect.height, GeneralRect.x, GeneralRect.y, GeneralRect.width, GeneralRect.height);
240         SysLog(NID_UI_CTRL,"logical overlayRect is [%d, %d, %d, %d]", overlayRect.x, overlayRect.y, overlayRect.width, overlayRect.height);
241
242         // 5. Adjust
243         Rectangle devBounds = _CoordinateSystemUtils::Transform(overlayRect);
244         if (devBounds.width % 2 != 0)
245         {
246                 SysLog(NID_UI_CTRL,"physical overlayRect width is revised [%d]->[%d]", devBounds.width, devBounds.width - 1);
247                 devBounds.width -= 1;
248         }
249         SysLog(NID_UI_CTRL, "physical overlayRect is [%d,%d,%d,%d]", devBounds.x, devBounds.y, devBounds.width, devBounds.height);
250
251         // 6. create OverlayAgent Instance
252         _OverlayAgentStyle overlayAgentType = _OVERLAY_AGENT_STYLE_PANEL_SW;
253         String preferredEngineConfig(elm_config_preferred_engine_get());
254         if(preferredEngineConfig.Equals("opengl_x11", true))
255         {
256                 overlayAgentType = _OVERLAY_AGENT_STYLE_PANEL_GL;
257                 SysLog(NID_UI_CTRL,"xml : HwAcceleration was set to On");
258         }
259         else if(preferredEngineConfig.Equals("software_x11", true))
260         {
261                 overlayAgentType = _OVERLAY_AGENT_STYLE_PANEL_SW;
262                 SysLog(NID_UI_CTRL,"xml : HwAcceleration was set to Off");
263         }
264         else
265         {
266                 String engineConfig(elm_config_engine_get());
267                 if(engineConfig.Equals("opengl_x11", true))
268                 {
269                         overlayAgentType = _OVERLAY_AGENT_STYLE_PANEL_GL;
270                         SysLog(NID_UI_CTRL,"dev setting option : gl backend");
271                 }
272         }
273
274         __pOverlayAgent = _OverlayAgent::CreateInstanceN(overlayAgentType, *this, devBounds);
275         result r = GetLastResult();
276         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS && __pOverlayAgent != null, r, r, "[%s] Propagating.", GetErrorMessage(r));
277
278         if (overlayAgentType == _OVERLAY_AGENT_STYLE_PANEL_GL)
279         {
280                 r = __pOverlayAgent->CreatePixmap();
281                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
282         }
283         else
284         {
285                 SysLog(NID_UI_CTRL, "not need to make a pixmap");
286
287                 int i, j;
288                 int size = devBounds.width * devBounds.height * 4;
289                 pBuf = new (std::nothrow) byte[size];
290                 SysTryCatch(NID_UI_CTRL, pBuf != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] pBuf is null.");
291
292                 unsigned long* pPos = (unsigned long*)pBuf;
293                 for(i=0; i<devBounds.height; i++)
294                 {
295                         for(j=0; j<devBounds.width; j++)
296                         {
297                                 *pPos = 0xFF000000;
298                                 pPos++;
299                         }
300                 }
301
302                 ByteBuffer buffer;
303
304                 r = buffer.Construct(size);
305                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
306                 buffer.SetArray(pBuf, 0, size);
307
308                 r = SetInputBuffer(Dimension(GeneralRect.width, GeneralRect.height), buffer, Dimension(devBounds.width, devBounds.height), OverlayPanel::BUFFER_PIXEL_FORMAT_ARGB8888);
309                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
310
311                 SysLog(NID_UI_CTRL,"initializes the origin image object buf");
312                 delete[] pBuf;
313         }
314
315         return E_SUCCESS;
316
317 CATCH:
318         delete[] pBuf;
319         delete __pOverlayAgent;
320         __pOverlayAgent = null;
321         return GetLastResult();
322 }
323
324 void
325 _OverlayPanel::OnBoundsChanged(void)
326 {
327         SysTryReturnVoidResult(NID_UI_CTRL, __pOverlayAgent != null, E_SYSTEM, "[E_SYSTEM] __pOverlayAgent is null.");
328
329         Rectangle clientRect = GetParent()->GetClientBounds();   //GetClientBounds();
330         Rectangle GeneralRect = GetBounds();
331         Rectangle overlayRect(clientRect.x + GeneralRect.x, clientRect.y + GeneralRect.y, GeneralRect.width, GeneralRect.height);
332
333         SetRendererSize(Dimension(overlayRect.width, overlayRect.height));
334
335         return;
336 }
337
338 void
339 _OverlayPanel::OnChildDetached(const _Control& child)
340 {
341         return;
342 }
343
344
345 }}} // Tizen::Ui::Controls
346