2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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
9 // http://floralicense.org/license/
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.
18 * @file FUiCtrl_OverlayPanel.cpp
19 * @brief This file contains implementation of _OverlayPanel class
24 #include <Elementary.h>
26 #include <FGrpCanvas.h>
27 #include <FBaseString.h>
28 #include <FGrpFloatRectangle.h>
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"
37 using namespace Tizen::Base;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui;
40 using namespace Tizen::Ui::Controls;
42 namespace Tizen { namespace Ui { namespace Controls
46 _OverlayPanel::CreateOverlayPanelN(const Rectangle& bounds)
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.");
51 result r = GetLastResult();
52 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
54 pOverlayPanel->AcquireHandle();
56 SetLastResult(E_SUCCESS);
66 _OverlayPanel::_OverlayPanel(const Rectangle& bounds)
67 : __pOverlayAgent(null)
69 SetLastResult(E_SUCCESS);
72 _OverlayPanel::~_OverlayPanel(void)
74 SysLog(NID_UI_CTRL, "Destructor ~~~~~~");
78 delete __pOverlayAgent;
79 __pOverlayAgent = null;
84 _OverlayPanel::SetInputBuffer(const Dimension& destDim, const ByteBuffer& srcBuffer, const Dimension& srcDim, OverlayPanel::BufferPixelFormat srcFormat)
88 SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, r, "[E_SYSTEM] __pOverlayAgent is null.");
90 _OverlayAgentBufferPixelFormat format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888;
93 case OverlayPanel::BUFFER_PIXEL_FORMAT_ARGB8888:
94 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888;
96 case OverlayPanel::BUFFER_PIXEL_FORMAT_RGB565:
97 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_RGB565;
99 case OverlayPanel::BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR:
100 format = _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR;
103 SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "The specified pixel format is not supported.");
104 return E_UNSUPPORTED_FORMAT;
107 r = __pOverlayAgent->SetInputBuffer(destDim, srcBuffer, srcDim, format);
108 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
110 r = __pOverlayAgent->Draw();
111 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
113 r = __pOverlayAgent->SetDestination(destDim);
114 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
120 _OverlayPanel::SetRendererRotation(OverlayPanel::Rotation rotation)
123 SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, r, "[E_SYSTEM] __pOverlayAgent is null.");
125 r = __pOverlayAgent->SetRotation((_OverlayAgentRotation)rotation);
126 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
132 _OverlayPanel::SetRendererAspectRatio(bool aspectRatio)
135 SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, r, "[E_SYSTEM] __pOverlayAgent is null.");
137 r = __pOverlayAgent->SetAspectRatio(aspectRatio);
138 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
144 _OverlayPanel::SetRendererSize(const Dimension& dimension)
147 SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, r, "[E_SYSTEM] __pOverlayAgent is null.");
149 r = __pOverlayAgent->SetDestination(dimension);
150 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
156 _OverlayPanel::GetBackgroundBufferInfo(BufferInfo& info) const
158 SysTryReturnResult(NID_UI_CTRL, __pOverlayAgent != null, E_SYSTEM, "[E_SYSTEM] __pOverlayAgent is null.");
160 return __pOverlayAgent->GetBufferInfo(info);
164 _OverlayPanel::GetMaskingColor(void) const
167 return Color(0x00000000);
172 _OverlayPanel::OnDraw(void)
174 SysTryReturnVoidResult(NID_UI_CTRL, __pOverlayAgent != null, E_SYSTEM, "[E_SYSTEM] __pOverlayAgent is null.");
175 __pOverlayAgent->AdjustImageObject();
181 _OverlayPanel::OnVisibleStateChanged(void)
185 SysLog(NID_UI_CTRL, " visible true");
189 SysLog(NID_UI_CTRL, " visible false");
194 _OverlayPanel::OnAttachedToMainTree(void)
198 int maxCount = OverlayRegion::GetMaxCount();
199 SysTryReturn(NID_UI_CTRL, maxCount > 0, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] maxCount [%d] is invalid", maxCount);
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!");
204 _Control* pParent = GetParent();
205 SysTryReturn(NID_UI_CTRL, pParent != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Parent is invalid");
207 _ControlImpl* pControlImpl = static_cast<_ControlImpl*>(pParent->GetUserData());
208 SysTryReturn(NID_UI_CTRL, pControlImpl != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pControlImpl is null");
210 _FormImpl* pFormImpl = dynamic_cast<_FormImpl*>(pControlImpl);
211 SysTryReturn(NID_UI_CTRL, pFormImpl != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pFormImpl is null");
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");
217 int idx, panelCount = 0;;
218 _OverlayPanel* pOverlayPanel = null;
220 // 3. check for overlayPanel maximum count
221 for (idx = 0 ; idx < form.GetChildCount() ; idx++)
223 pOverlayPanel = dynamic_cast <_OverlayPanel*>(form.GetChild(idx));
224 if(pOverlayPanel != null)
227 pOverlayPanel = null;
231 SysTryReturn(NID_UI_CTRL, panelCount <= maxCount, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] already used permitted maximum number of OverlayPanel");
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);
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);
243 Rectangle devBounds = _CoordinateSystemUtils::Transform(overlayRect);
244 if (devBounds.width % 2 != 0)
246 SysLog(NID_UI_CTRL,"physical overlayRect width is revised [%d]->[%d]", devBounds.width, devBounds.width - 1);
247 devBounds.width -= 1;
249 SysLog(NID_UI_CTRL, "physical overlayRect is [%d,%d,%d,%d]", devBounds.x, devBounds.y, devBounds.width, devBounds.height);
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))
256 overlayAgentType = _OVERLAY_AGENT_STYLE_PANEL_GL;
257 SysLog(NID_UI_CTRL,"xml : HwAcceleration was set to On");
259 else if(preferredEngineConfig.Equals("software_x11", true))
261 overlayAgentType = _OVERLAY_AGENT_STYLE_PANEL_SW;
262 SysLog(NID_UI_CTRL,"xml : HwAcceleration was set to Off");
266 String engineConfig(elm_config_engine_get());
267 if(engineConfig.Equals("opengl_x11", true))
269 overlayAgentType = _OVERLAY_AGENT_STYLE_PANEL_GL;
270 SysLog(NID_UI_CTRL,"dev setting option : gl backend");
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));
278 if (overlayAgentType == _OVERLAY_AGENT_STYLE_PANEL_GL)
280 r = __pOverlayAgent->CreatePixmap();
281 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
285 SysLog(NID_UI_CTRL, "not need to make a pixmap");
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.");
292 unsigned long* pPos = (unsigned long*)pBuf;
293 for(i=0; i<devBounds.height; i++)
295 for(j=0; j<devBounds.width; j++)
304 r = buffer.Construct(size);
305 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
306 buffer.SetArray(pBuf, 0, size);
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));
311 SysLog(NID_UI_CTRL,"initializes the origin image object buf");
319 delete __pOverlayAgent;
320 __pOverlayAgent = null;
321 return GetLastResult();
325 _OverlayPanel::OnBoundsChanged(void)
327 SysTryReturnVoidResult(NID_UI_CTRL, __pOverlayAgent != null, E_SYSTEM, "[E_SYSTEM] __pOverlayAgent is null.");
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);
333 SetRendererSize(Dimension(overlayRect.width, overlayRect.height));
339 _OverlayPanel::OnChildDetached(const _Control& child)
345 }}} // Tizen::Ui::Controls