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.
19 * @file FGrp_CoordinateSystemImpl.cpp
20 * @brief This is the implementation file for _CoordinateSystemImpl class.
26 #include <FBaseResult.h>
27 #include <FBaseString.h>
29 #include <FBaseInternalTypes.h>
30 #include <FApp_AppInfo.h>
31 #include <FBaseSysLog.h>
32 #include <FSys_SystemInfoImpl.h>
34 #include "FGrp_Screen.h"
35 #include "FGrp_CoordinateSystemImpl.h"
38 using namespace Tizen::Base;
40 ////////////////////////////////////////////////////////////////////////////////
42 namespace Tizen { namespace Graphics
44 result _CreateCoordinateTransformer(_ICoordinateSystemTransformer*& pTransformer, const Dimension& srcDim, const Dimension& trgDim);
45 result _CreateCoordinateTransformer(_ICoordinateSystemTransformer*& pTransformer, _LogicalResolution sourceLogicalResolution, _BaseScreenSize sourceLogicalBaseScreenSize, _PhysicalResolution destPhysicalResolution, _BaseScreenSize destPhysicalBaseScreenSize);
46 result _CreateCoordinateTransformer(_ICoordinateSystemTransformer*& pTransformer, _PhysicalResolution sourcePhysicalResolution, _BaseScreenSize sourcePhysicalBaseScreenSize, _LogicalResolution destLogicalResolution, _BaseScreenSize destLogicalBaseScreenSize);
47 result _CreateCoordinateTransformer(_ICoordinateSystemTransformer*& pTransformer, _LogicalResolution sourceLogicalResolution, _BaseScreenSize sourceLogicalBaseScreenSize, _LogicalResolution destLogicalResolution, _BaseScreenSize destLogicalBaseScreenSize);
48 result _CreateCoordinateTransformer(_ICoordinateSystemTransformer*& pTransformer, int srcResolution, _BaseScreenSize srcBaseScreenSize, Dimension destResolution, _BaseScreenSize destBaseScreenSize);
50 bool _WillNotTransform(_LogicalResolution logicalResolution, _BaseScreenSize logicalBaseScreenSize, _PhysicalResolution physicalResolution, _BaseScreenSize physicalBaseScreenSize);
51 bool _WillNotTransform(int srcResolution, _BaseScreenSize srcBaseScreenSize, Dimension destResolution, _BaseScreenSize destBaseScreenSize);
52 const char* _GetStringResolution(_LogicalResolution res);
53 const char* _GetStringResolution(_PhysicalResolution res);
57 ////////////////////////////////////////////////////////////////////////////////
59 namespace Tizen { namespace Graphics
62 class _CoordinateSystem::_CoordinateSystemImpl::__CoordinateTransformer
63 : public _ICoordinateSystemTransformer
66 __CoordinateTransformer(_ICoordinateSystemTransformer* pXformer)
68 , __pXformer(pXformer)
69 , __defaultTransformer()
70 , __usingDefault(false)
72 if (__pXformer == null)
74 __pXformer = &__defaultTransformer;
75 __usingDefault = true;
79 virtual ~__CoordinateTransformer()
87 void SetEnabled(bool enabled)
92 bool IsEnabled(void) const
97 virtual Rectangle Transform(const Rectangle& rect) const
99 return IsEnabled() ? __pXformer->Transform(rect) : rect;
102 virtual Dimension Transform(const Dimension& dim) const
104 return IsEnabled() ? __pXformer->Transform(dim) : dim;
107 virtual Point Transform(const Point& point) const
109 return IsEnabled() ? __pXformer->Transform(point) : point;
112 virtual int Transform(int scalar) const
114 return IsEnabled() ? __pXformer->Transform(scalar) : scalar;
117 virtual int TransformHorizontal(int scalar) const
119 return IsEnabled() ? __pXformer->TransformHorizontal(scalar) : scalar;
122 virtual int TransformVertical(int scalar) const
124 return IsEnabled() ? __pXformer->TransformVertical(scalar) : scalar;
127 virtual float Transform(float scalar) const
129 return IsEnabled() ? __pXformer->Transform(scalar) : scalar;
132 virtual float TransformHorizontal(float scalar) const
134 return IsEnabled() ? __pXformer->TransformHorizontal(scalar) : scalar;
137 virtual float TransformVertical(float scalar) const
139 return IsEnabled() ? __pXformer->TransformVertical(scalar) : scalar;
142 virtual int TransformFloatToInt(float scalar) const
144 return IsEnabled() ? __pXformer->Transform(static_cast<int>(scalar)) : static_cast<int>(scalar);
147 virtual int TransformHorizontalFloatToInt(float scalar) const
149 return IsEnabled() ? __pXformer->TransformHorizontal(static_cast<int>(scalar)) : static_cast<int>(scalar);
152 virtual int TransformVerticalFloatToInt(float scalar) const
154 return IsEnabled() ? __pXformer->TransformVertical(static_cast<int>(scalar)) : static_cast<int>(scalar);
157 virtual float GetHorizontalScaleFactor(void) const
159 return IsEnabled() ? __pXformer->GetHorizontalScaleFactor() : 1.0f;
162 virtual float GetVerticalScaleFactor(void) const
164 return IsEnabled() ? __pXformer->GetVerticalScaleFactor() : 1.0f;
168 __CoordinateTransformer(const __CoordinateTransformer&);
169 __CoordinateTransformer& operator =(const __CoordinateTransformer&);
173 _ICoordinateSystemTransformer* __pXformer;
174 _NullCoordinateSystemTransformer __defaultTransformer;
176 }; // _CoordinateSystem
179 _CoordinateSystem::_CoordinateSystemImpl::GetNativeLogicalResolution(void) const
181 return __nativeLogicalResolution;
185 _CoordinateSystem::_CoordinateSystemImpl::GetNativeLogicalBaseScreenSize(void) const
187 return __nativeLogicalBaseScreenSize;
191 _CoordinateSystem::_CoordinateSystemImpl::GetLogicalBaseScreenSize(void) const
193 return __logicalBaseScreenSize;
197 _CoordinateSystem::_CoordinateSystemImpl::GetLogicalResolutionInt(void) const
199 return __logicalResolutionInt;
203 _CoordinateSystem::_CoordinateSystemImpl::GetLogicalResolution(void) const
205 return __logicalResolution;
209 _CoordinateSystem::_CoordinateSystemImpl::GetPhysicalResolution(void) const
211 if (__physicalResolution == RESOLUTION_PHYSICAL_NONE)
213 static Tizen::Graphics::_PhysicalResolution cachedResolution = RESOLUTION_PHYSICAL_NONE;
215 if (cachedResolution == RESOLUTION_PHYSICAL_NONE)
217 int screenWidth = _Screen::GetWidth();
218 int screenHeight = _Screen::GetHeight();
220 if ((screenWidth == 480 && screenHeight == 800) || (screenWidth == 800 && screenHeight == 480))
222 cachedResolution = RESOLUTION_PHYSICAL_WVGA;
224 else if ((screenWidth == 240 && screenHeight == 400) || (screenWidth == 400 && screenHeight == 240))
226 cachedResolution = RESOLUTION_PHYSICAL_WQVGA;
228 else if ((screenWidth == 320 && screenHeight == 480) || (screenWidth == 480 && screenHeight == 320))
230 cachedResolution = RESOLUTION_PHYSICAL_HVGA;
232 else if ((screenWidth == 720 && screenHeight == 1280) || (screenWidth == 1280 && screenHeight == 720))
234 cachedResolution = RESOLUTION_PHYSICAL_HD;
236 else if ((screenWidth == 1280 && screenHeight == 800) || (screenWidth == 800 && screenHeight == 1280))
238 cachedResolution = RESOLUTION_PHYSICAL_WXGA;
240 else if ((screenWidth == 1080 && screenHeight == 1920) || (screenWidth == 1920 && screenHeight == 1080))
242 cachedResolution = RESOLUTION_PHYSICAL_HD1080;
244 else if ((screenWidth == 1600 && screenHeight == 2560) || (screenWidth == 2560 && screenHeight == 1600))
246 cachedResolution = RESOLUTION_PHYSICAL_WQXGA;
250 cachedResolution = RESOLUTION_PHYSICAL_NONE;
254 return cachedResolution;
257 return __physicalResolution;
261 _CoordinateSystem::_CoordinateSystemImpl::GetPhysicalResolutionDim(void) const
263 return __physicalResolutionDim;
267 _CoordinateSystem::_CoordinateSystemImpl::GetPhysicalBaseScreenSize(void) const
269 if (__physicalBaseScreenSize == BASE_SCREEN_SIZE_NONE || __physicalBaseScreenSize == BASE_SCREEN_SIZE_DEFAULT)
271 static Tizen::Graphics::_BaseScreenSize physicalBaseScreenSize = BASE_SCREEN_SIZE_NONE;
273 bool isLargeDeviceScreenSize = false;
275 Tizen::System::_SystemInfoImpl::GetSysInfo(L"http://tizen.org/feature/screen.size.large", isLargeDeviceScreenSize);
277 if (isLargeDeviceScreenSize)
279 physicalBaseScreenSize = BASE_SCREEN_SIZE_LARGE;
283 physicalBaseScreenSize = BASE_SCREEN_SIZE_NORMAL;
286 return physicalBaseScreenSize;
289 return __physicalBaseScreenSize;
293 _CoordinateSystem::_CoordinateSystemImpl::SetTransformEnabled(bool enabled)
295 __pTransformer->SetEnabled(enabled);
296 __pInverseTransformer->SetEnabled(enabled);
300 _CoordinateSystem::_CoordinateSystemImpl::IsTransformEnabled(void) const
302 return __pTransformer->IsEnabled();
306 _ICoordinateSystemTransformer*
307 _CoordinateSystem::_CoordinateSystemImpl::GetTransformer(void)
309 return __pTransformer;
312 _ICoordinateSystemTransformer*
313 _CoordinateSystem::_CoordinateSystemImpl::GetInverseTransformer(void)
315 return __pInverseTransformer;
318 _ICoordinateSystemTransformer*
319 _CoordinateSystem::_CoordinateSystemImpl::GetTransformerN(const Dimension& srcDim, const Dimension& trgDim)
323 _ICoordinateSystemTransformer* pXFormer = null;
325 result r = _CreateCoordinateTransformer(pXFormer, srcDim, trgDim);
329 SysLog(NID_GRP, "[%s] Propagating.", GetErrorMessage(r));
337 _ICoordinateSystemTransformer*
338 _CoordinateSystem::_CoordinateSystemImpl::GetTransformerN(_LogicalResolution logicalResolution, _BaseScreenSize logicalBaseScreenSize, _PhysicalResolution physicalResolution, _BaseScreenSize physicalBaseScreenSize)
342 _ICoordinateSystemTransformer* pXFormer = null;
344 result r = _CreateCoordinateTransformer(pXFormer, logicalResolution, logicalBaseScreenSize, physicalResolution, physicalBaseScreenSize);
348 SysLog(NID_GRP, "[%s] Propagating.", GetErrorMessage(r));
356 _ICoordinateSystemTransformer*
357 _CoordinateSystem::_CoordinateSystemImpl::GetTransformerN(int srcResolution, _BaseScreenSize srcBaseScreenSize, Dimension destResolution, _BaseScreenSize destBaseScreenSize)
361 _ICoordinateSystemTransformer* pXFormer = null;
363 result r = _CreateCoordinateTransformer(pXFormer, srcResolution, srcBaseScreenSize, destResolution, destBaseScreenSize);
367 SysLog(NID_GRP, "[%s] Propagating.", GetErrorMessage(r));
376 _CoordinateSystem::_CoordinateSystemImpl::Initialize(_LogicalResolution logicalResolution, _BaseScreenSize logicalBaseScreenSize)
378 SysAssert(__pTransformer == null && __pInverseTransformer == null);
380 result r = E_SUCCESS;
382 __physicalBaseScreenSize = GetPhysicalBaseScreenSize();
384 SysAssert(__physicalBaseScreenSize != BASE_SCREEN_SIZE_DEFAULT);
386 __physicalResolution = GetPhysicalResolution();
388 SysAssert(__physicalResolution != RESOLUTION_PHYSICAL_DEFAULT);
390 if (logicalResolution == RESOLUTION_LOGICAL_DEFAULT)
392 switch (__physicalResolution)
394 case RESOLUTION_PHYSICAL_WVGA:
395 logicalResolution = RESOLUTION_LOGICAL_480;
397 case RESOLUTION_PHYSICAL_WQVGA:
398 logicalResolution = RESOLUTION_LOGICAL_240;
400 case RESOLUTION_PHYSICAL_HVGA:
401 logicalResolution = RESOLUTION_LOGICAL_320;
403 case RESOLUTION_PHYSICAL_HD:
404 logicalResolution = RESOLUTION_LOGICAL_720;
406 case RESOLUTION_PHYSICAL_WXGA:
407 logicalResolution = RESOLUTION_LOGICAL_800;
409 case RESOLUTION_PHYSICAL_HD1080:
410 logicalResolution = RESOLUTION_LOGICAL_1080;
412 case RESOLUTION_PHYSICAL_WQXGA:
413 logicalResolution = RESOLUTION_LOGICAL_1600;
421 __logicalResolution = logicalResolution;
423 if (logicalBaseScreenSize == BASE_SCREEN_SIZE_DEFAULT)
425 logicalBaseScreenSize = BASE_SCREEN_SIZE_NORMAL;
428 __logicalBaseScreenSize = logicalBaseScreenSize;
430 _ICoordinateSystemTransformer* pXformer = null;
431 _ICoordinateSystemTransformer* pInvXFormer = null;
433 r = _CreateCoordinateTransformer(pXformer, __logicalResolution, __logicalBaseScreenSize, __physicalResolution, __physicalBaseScreenSize);
437 SysLog(NID_GRP, "[%s] Propagating.", GetErrorMessage(r));
442 __pTransformer = new (std::nothrow) __CoordinateTransformer(pXformer);
444 if (__pTransformer == null)
448 SysLog(NID_GRP, "[%s] Failed to create a coordinate transformer.", GetErrorMessage(r));
453 r = _CreateCoordinateTransformer(pInvXFormer, __physicalResolution, __physicalBaseScreenSize, __logicalResolution, __logicalBaseScreenSize);
457 SysLog(NID_GRP, "[%s] Propagating.", GetErrorMessage(r));
462 __pInverseTransformer = new (std::nothrow) __CoordinateTransformer(pInvXFormer);
464 if (__pInverseTransformer == null)
468 SysLog(NID_GRP, "[%s] Failed to create an inverse coordinate transformer.", GetErrorMessage(r));
473 SysAssert(__pTransformer && __pInverseTransformer);
474 SetTransformEnabled(!_WillNotTransform(__logicalResolution, __logicalBaseScreenSize, __physicalResolution, __physicalBaseScreenSize));
477 __nativeLogicalResolution = logicalResolution;
478 __nativeLogicalBaseScreenSize = logicalBaseScreenSize;
480 if (__nativeLogicalBaseScreenSize != __physicalBaseScreenSize)
482 __nativeLogicalBaseScreenSize = __physicalBaseScreenSize;
484 if (__nativeLogicalBaseScreenSize == BASE_SCREEN_SIZE_NORMAL)
486 switch (__nativeLogicalResolution)
488 case RESOLUTION_LOGICAL_1600:
489 __nativeLogicalResolution = RESOLUTION_LOGICAL_800;
491 case RESOLUTION_LOGICAL_1440:
492 __nativeLogicalResolution = RESOLUTION_LOGICAL_720;
494 case RESOLUTION_LOGICAL_960:
495 __nativeLogicalResolution = RESOLUTION_LOGICAL_480;
497 case RESOLUTION_LOGICAL_720:
498 __nativeLogicalResolution = RESOLUTION_LOGICAL_360;
500 case RESOLUTION_LOGICAL_480:
501 __nativeLogicalResolution = RESOLUTION_LOGICAL_240;
508 else if (__nativeLogicalBaseScreenSize == BASE_SCREEN_SIZE_LARGE)
510 switch (__nativeLogicalResolution)
512 case RESOLUTION_LOGICAL_800:
513 __nativeLogicalResolution = RESOLUTION_LOGICAL_1600;
515 case RESOLUTION_LOGICAL_720:
516 __nativeLogicalResolution = RESOLUTION_LOGICAL_1440;
518 case RESOLUTION_LOGICAL_480:
519 __nativeLogicalResolution = RESOLUTION_LOGICAL_960;
521 case RESOLUTION_LOGICAL_360:
522 __nativeLogicalResolution = RESOLUTION_LOGICAL_720;
524 case RESOLUTION_LOGICAL_240:
525 __nativeLogicalResolution = RESOLUTION_LOGICAL_480;
537 delete __pTransformer;
538 __pTransformer = null;
539 delete __pInverseTransformer;
540 __pInverseTransformer = null;
546 _CoordinateSystem::_CoordinateSystemImpl::Initialize(int srcResolution, _BaseScreenSize srcBaseScreenSize, Dimension destResolution, _BaseScreenSize destBaseScreenSize)
548 SysAssert(__pTransformer == null && __pInverseTransformer == null);
550 result r = E_SUCCESS;
552 if (srcBaseScreenSize == BASE_SCREEN_SIZE_DEFAULT)
554 srcBaseScreenSize = GetPhysicalBaseScreenSize();
557 __logicalBaseScreenSize = srcBaseScreenSize;
559 __physicalResolutionDim = destResolution;
561 if (srcResolution != 0)
563 __logicalResolutionInt = srcResolution;
567 __logicalResolutionInt = __physicalResolutionDim.width < __physicalResolutionDim.height ? __physicalResolutionDim.width : __physicalResolutionDim.height;
570 SysAssert(__logicalResolutionInt > 0);
572 if (destBaseScreenSize == BASE_SCREEN_SIZE_DEFAULT)
574 destBaseScreenSize = GetPhysicalBaseScreenSize();
577 __physicalBaseScreenSize = destBaseScreenSize;
579 if (srcResolution == 480 || srcResolution == 720)
581 _LogicalResolution logicalResolution = RESOLUTION_LOGICAL_NONE;
583 if (srcResolution == 480)
585 logicalResolution = RESOLUTION_LOGICAL_480;
589 logicalResolution = RESOLUTION_LOGICAL_720;
592 Dimension wvgaDim1 = Dimension(480, 800);
593 Dimension wvgaDim2 = Dimension(800, 480);
594 Dimension hdDim1 = Dimension(720, 1280);
595 Dimension hdDim2 = Dimension(1280, 720);
597 _PhysicalResolution physicalResolution = RESOLUTION_PHYSICAL_NONE;
599 if (destResolution == wvgaDim1 || destResolution == wvgaDim2 || destResolution == hdDim1 || destResolution == hdDim2)
601 if (destResolution == wvgaDim1 || destResolution == wvgaDim2)
603 physicalResolution = RESOLUTION_PHYSICAL_WVGA;
607 physicalResolution = RESOLUTION_PHYSICAL_HD;
611 if (physicalResolution == GetPhysicalResolution() && physicalResolution != RESOLUTION_PHYSICAL_NONE)
613 result r = Initialize(logicalResolution, srcBaseScreenSize);
615 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
621 _ICoordinateSystemTransformer* pXformer = null;
622 _ICoordinateSystemTransformer* pInvXFormer = null;
624 r = _CreateCoordinateTransformer(pXformer, __logicalResolutionInt, __logicalBaseScreenSize, __physicalResolutionDim, __physicalBaseScreenSize);
628 SysLog(NID_GRP, "[%s] Propagating.", GetErrorMessage(r));
633 __pTransformer = new (std::nothrow) __CoordinateTransformer(pXformer);
635 if (__pTransformer == null)
639 SysLog(NID_GRP, "[%s] Failed to create a coordinate transformer.", GetErrorMessage(r));
644 r = _CreateCoordinateTransformer(pInvXFormer, (__physicalResolutionDim.width < __physicalResolutionDim.height ? __physicalResolutionDim.width : __physicalResolutionDim.height), __physicalBaseScreenSize, Dimension(__logicalResolutionInt, __logicalResolutionInt), __logicalBaseScreenSize);
648 SysLog(NID_GRP, "[%s] Propagating.", GetErrorMessage(r));
653 __pInverseTransformer = new (std::nothrow) __CoordinateTransformer(pInvXFormer);
655 if (__pInverseTransformer == null)
659 SysLog(NID_GRP, "[%s] Failed to create an inverse coordinate transformer.", GetErrorMessage(r));
664 SysAssert(__pTransformer && __pInverseTransformer);
665 SetTransformEnabled(!_WillNotTransform(srcResolution, srcBaseScreenSize, destResolution, destBaseScreenSize));
670 delete __pTransformer;
671 __pTransformer = null;
672 delete __pInverseTransformer;
673 __pInverseTransformer = null;
678 _CoordinateSystem::_CoordinateSystemImpl::_CoordinateSystemImpl(void)
679 : __pTransformer(null)
680 , __pInverseTransformer(null)
681 , __nativeLogicalResolution(RESOLUTION_LOGICAL_NONE)
682 , __nativeLogicalBaseScreenSize(BASE_SCREEN_SIZE_NONE)
683 , __logicalResolution(RESOLUTION_LOGICAL_NONE)
684 , __logicalBaseScreenSize(BASE_SCREEN_SIZE_NONE)
685 , __physicalResolution(RESOLUTION_PHYSICAL_NONE)
686 , __physicalBaseScreenSize(BASE_SCREEN_SIZE_NONE)
687 , __logicalResolutionInt(0)
688 , __physicalResolutionDim(0, 0)
692 _CoordinateSystem::_CoordinateSystemImpl::~_CoordinateSystemImpl(void)
694 delete __pTransformer;
695 delete __pInverseTransformer;
698 }} // Tizen::Graphics