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_CanvasImplPrivate.h
20 * @brief This is the private header file for the _CanvasImpl class
24 #ifndef _FGRP_INTERNAL_CANVASIMPL_PRIVATE_H_
25 #define _FGRP_INTERNAL_CANVASIMPL_PRIVATE_H_
28 #include <FBaseSysLog.h>
30 #include "FGrp_CanvasImpl.h"
31 #include "util/FGrp_UtilType.h"
38 Tizen::Graphics::_Util::Rectangle<T>
39 _GetBoundsRelT(const Tizen::Graphics::_CanvasImpl& canvas)
41 Tizen::Graphics::Rectangle bounds = canvas.GetBounds();
43 Tizen::Graphics::_Util::Rectangle<T> rect =
56 _ExpandClippingAreaForLineWidth(Tizen::Graphics::_Util::Rectangle<T>& rtCanvas, T lineWidth)
60 Type lineWidthHalf = (lineWidth + Type(1)) / Type(2);
62 rtCanvas.x -= lineWidthHalf;
63 rtCanvas.y -= lineWidthHalf;
64 rtCanvas.w += lineWidthHalf * Type(2);
65 rtCanvas.h += lineWidthHalf * Type(2);
70 namespace Tizen { namespace Graphics
73 class _CanvasImplPrivate
75 friend class _CanvasImpl;
78 static result SetPixel(_CanvasImpl* pThis, const _Util::Point<T>& vcPoint)
80 _Util::Rectangle<T> rtCanvas = _GetBoundsRelT<T>(*pThis);
82 if (rtCanvas.w <= 0 || rtCanvas.h <= 0)
84 SysTryReturnResult(NID_GRP, 0, E_OPERATION_FAILED, "Cannot get the bounds of the canvas.");
87 result r = _Util::ValidateT(vcPoint, rtCanvas);
91 SysTryReturn(NID_GRP, 0, r, r, "[%s] Propagating.", GetErrorMessage(r));
94 if (_ResUtil::NeedToConvertCoord())
96 _Util::Point<T> pcPoint = _ResUtil::ConvertToPhyCoord(vcPoint);
98 return pThis->_pNativeCanvas->SetPixel(pcPoint);
102 return pThis->_pNativeCanvas->SetPixel(vcPoint);
106 template <typename T>
107 static result DrawRectangle(_CanvasImpl* pThis, const _Util::Rectangle<T>& vcRect)
111 if ((vcRect.w == Type(0)) || (vcRect.h == Type(0)))
116 _Util::Rectangle<T> rtCanvas = _GetBoundsRelT<T>(*pThis);
118 if (rtCanvas.w <= 0 || rtCanvas.h <= 0)
120 SysTryReturnResult(NID_GRP, 0, E_OPERATION_FAILED, "Cannot get the bounds of the canvas.");
123 _ExpandClippingAreaForLineWidth(rtCanvas, Type(pThis->GetLineWidth()));
125 result r = _Util::ValidateT(vcRect, rtCanvas);
129 SysTryReturn(NID_GRP, 0, r, r, "[%s] Propagating.", GetErrorMessage(r));
132 if (_ResUtil::NeedToConvertCoord())
134 _Util::Rectangle<T> pcRect = _ResUtil::ConvertToPhyCoord(vcRect);
136 return pThis->_pNativeCanvas->DrawRectangle(pcRect);
140 return pThis->_pNativeCanvas->DrawRectangle(vcRect);
144 template <typename T>
145 static result FillRectangle(_CanvasImpl* pThis, const Color& color, const _Util::Rectangle<T>& vcRect)
149 if ((vcRect.w == Type(0)) || (vcRect.h == Type(0)))
154 _Util::Rectangle<T> rtCanvas = _GetBoundsRelT<T>(*pThis);
156 if (rtCanvas.w <= 0 || rtCanvas.h <= 0)
158 SysTryReturnResult(NID_GRP, 0, E_OPERATION_FAILED, "Cannot get the bounds of the canvas.");
161 result r = _Util::ValidateT(vcRect, rtCanvas);
165 SysTryReturn(NID_GRP, 0, r, r, "[%s] Propagating.", GetErrorMessage(r));
168 if (_ResUtil::NeedToConvertCoord())
170 _Util::Rectangle<T> pcRect = _ResUtil::ConvertToPhyCoord(vcRect);
172 return pThis->_pNativeCanvas->FillRectangle(color, pcRect);
176 return pThis->_pNativeCanvas->FillRectangle(color, vcRect);
180 template <typename T>
181 static result DrawRoundRectangle(_CanvasImpl* pThis, const _Util::Rectangle<T>& vcRect, const _Util::Dimension<T>& vcArcDim)
185 if ((vcRect.w == Type(0)) || (vcRect.h == Type(0)))
190 if ((vcArcDim.w == Type(0)) || (vcArcDim.h == Type(0)))
192 return _CanvasImplPrivate::DrawRectangle(pThis, vcRect);
195 _Util::Rectangle<T> rtCanvas = _GetBoundsRelT<T>(*pThis);
197 if (rtCanvas.w <= 0 || rtCanvas.h <= 0)
199 SysTryReturnResult(NID_GRP, 0, E_OPERATION_FAILED, "Cannot get the bounds of the canvas.");
202 _ExpandClippingAreaForLineWidth(rtCanvas, Type(pThis->GetLineWidth()));
204 result r = _Util::ValidateT(vcRect, rtCanvas);
208 SysTryReturn(NID_GRP, 0, r, r, "[%s] Propagating.", GetErrorMessage(r));
211 if (_ResUtil::NeedToConvertCoord())
213 _Util::Rectangle<T> pcRect = _ResUtil::ConvertToPhyCoord(vcRect);
214 _Util::Dimension<T> pcArcDim = _ResUtil::ConvertToPhyCoord(vcArcDim);
216 return pThis->_pNativeCanvas->DrawRoundRectangle(pcRect, pcArcDim);
220 return pThis->_pNativeCanvas->DrawRoundRectangle(vcRect, vcArcDim);
224 template <typename T>
225 static result FillRoundRectangle(_CanvasImpl* pThis, const Color& color, const _Util::Rectangle<T>& vcRect, const _Util::Dimension<T>& vcArcDim)
229 if ((vcRect.w == Type(0)) || (vcRect.h == Type(0)))
234 _Util::Rectangle<T> rtCanvas = _GetBoundsRelT<T>(*pThis);
236 if (rtCanvas.w <= 0 || rtCanvas.h <= 0)
238 SysTryReturnResult(NID_GRP, 0, E_OPERATION_FAILED, "Cannot get the bounds of the canvas.");
241 result r = _Util::ValidateT(vcRect, rtCanvas);
245 SysTryReturn(NID_GRP, 0, r, r, "[%s] Propagating.", GetErrorMessage(r));
248 if (_ResUtil::NeedToConvertCoord())
250 _Util::Rectangle<T> pcRect = _ResUtil::ConvertToPhyCoord(vcRect);
251 _Util::Dimension<T> pcArcDim = _ResUtil::ConvertToPhyCoord(vcArcDim);
253 return pThis->_pNativeCanvas->FillRoundRectangle(color, pcRect, pcArcDim);
257 return pThis->_pNativeCanvas->FillRoundRectangle(color, vcRect, vcArcDim);
261 template <typename T>
262 static result DrawEllipse(_CanvasImpl* pThis, const _Util::Rectangle<T>& vcRect)
266 if ((vcRect.w == Type(0)) || (vcRect.h == Type(0)))
271 _Util::Rectangle<T> rtCanvas = _GetBoundsRelT<T>(*pThis);
273 if (rtCanvas.w <= 0 || rtCanvas.h <= 0)
275 SysTryReturnResult(NID_GRP, 0, E_OPERATION_FAILED, "Cannot get the bounds of the canvas.");
278 _ExpandClippingAreaForLineWidth(rtCanvas, Type(pThis->GetLineWidth()));
280 result r = _Util::ValidateT(vcRect, rtCanvas);
284 SysTryReturn(NID_GRP, 0, r, r, "[%s] Propagating.", GetErrorMessage(r));
287 if (_ResUtil::NeedToConvertCoord())
289 _Util::Rectangle<T> pcRect = _ResUtil::ConvertToPhyCoord(vcRect);
291 return pThis->_pNativeCanvas->DrawEllipse(pcRect);
295 return pThis->_pNativeCanvas->DrawEllipse(vcRect);
299 template <typename T>
300 static result FillEllipse(_CanvasImpl* pThis, const Color& color, const _Util::Rectangle<T>& vcRect)
304 if ((vcRect.w == Type(0)) || (vcRect.h == Type(0)))
309 _Util::Rectangle<T> rtCanvas = _GetBoundsRelT<T>(*pThis);
311 if (rtCanvas.w <= 0 || rtCanvas.h <= 0)
313 SysTryReturnResult(NID_GRP, 0, E_OPERATION_FAILED, "Cannot get the bounds of the canvas.");
316 result r = _Util::ValidateT(vcRect, rtCanvas);
320 SysTryReturn(NID_GRP, 0, r, r, "[%s] Propagating.", GetErrorMessage(r));
323 if (_ResUtil::NeedToConvertCoord())
325 _Util::Rectangle<T> pcRect = _ResUtil::ConvertToPhyCoord(vcRect);
327 return pThis->_pNativeCanvas->FillEllipse(color, pcRect);
331 return pThis->_pNativeCanvas->FillEllipse(color, vcRect);
335 template <typename T>
336 static result DrawArc(_CanvasImpl* pThis, const _Util::Rectangle<T>& vcRect, T startAngle, T endAngle, ArcStyle arcStyle)
340 if ((vcRect.w == Type(0)) || (vcRect.h == Type(0)))
345 _Util::Rectangle<T> rtCanvas = _GetBoundsRelT<T>(*pThis);
347 if (rtCanvas.w <= 0 || rtCanvas.h <= 0)
349 SysTryReturnResult(NID_GRP, 0, E_OPERATION_FAILED, "Cannot get the bounds of the canvas.");
352 _ExpandClippingAreaForLineWidth(rtCanvas, Type(pThis->GetLineWidth()));
354 result r = _Util::ValidateT(vcRect, rtCanvas);
358 SysTryReturn(NID_GRP, 0, r, r, "[%s] Propagating.", GetErrorMessage(r));
361 if (_ResUtil::NeedToConvertCoord())
363 _Util::Rectangle<T> pcRect = _ResUtil::ConvertToPhyCoord(vcRect);
365 return pThis->_pNativeCanvas->DrawArc(pcRect, startAngle, endAngle, arcStyle);
369 return pThis->_pNativeCanvas->DrawArc(vcRect, startAngle, endAngle, arcStyle);
373 template <typename T>
374 static result DrawTriangle(_CanvasImpl* pThis, const _Util::Point<T>& vcPoint1, const _Util::Point<T>& vcPoint2, const _Util::Point<T>& vcPoint3)
378 if (_ResUtil::NeedToConvertCoord())
380 _Util::Point<T> pcPoint1 = _ResUtil::ConvertToPhyCoord(vcPoint1);
381 _Util::Point<T> pcPoint2 = _ResUtil::ConvertToPhyCoord(vcPoint2);
382 _Util::Point<T> pcPoint3 = _ResUtil::ConvertToPhyCoord(vcPoint3);
384 return pThis->_pNativeCanvas->DrawTriangle(pcPoint1, pcPoint2, pcPoint3);
388 return pThis->_pNativeCanvas->DrawTriangle(vcPoint1, vcPoint2, vcPoint3);
392 template <typename T>
393 static result FillTriangle(_CanvasImpl* pThis, const Color& color, const _Util::Point<T>& vcPoint1, const _Util::Point<T>& vcPoint2, const _Util::Point<T>& vcPoint3)
397 if (_ResUtil::NeedToConvertCoord())
399 _Util::Point<T> pcPoint1 = _ResUtil::ConvertToPhyCoord(vcPoint1);
400 _Util::Point<T> pcPoint2 = _ResUtil::ConvertToPhyCoord(vcPoint2);
401 _Util::Point<T> pcPoint3 = _ResUtil::ConvertToPhyCoord(vcPoint3);
403 return pThis->_pNativeCanvas->FillTriangle(color, pcPoint1, pcPoint2, pcPoint3);
407 return pThis->_pNativeCanvas->FillTriangle(color, vcPoint1, vcPoint2, vcPoint3);
411 template <typename T>
412 static result DrawLine(_CanvasImpl* pThis, const _Util::Point<T>& vcPoint1, const _Util::Point<T>& vcPoint2)
416 if (_ResUtil::NeedToConvertCoord())
418 _Util::Point<T> pcPoint1 = _ResUtil::ConvertToPhyCoord(vcPoint1);
419 _Util::Point<T> pcPoint2 = _ResUtil::ConvertToPhyCoord(vcPoint2);
421 return pThis->_pNativeCanvas->DrawLine(pcPoint1, pcPoint2);
425 return pThis->_pNativeCanvas->DrawLine(vcPoint1, vcPoint2);
430 }} // Tizen::Graphics
432 #endif // _FGRP_INTERNAL_CANVASIMPL_PRIVATE_H_