Fixed Coding Idioms Violations
[platform/framework/native/uifw.git] / src / ui / controls / FUiCtrl_OverlayAgent.cpp
index e93bce1..6b79b75 100644 (file)
@@ -9,7 +9,7 @@
 //     http://www.apache.org/licenses/LICENSE-2.0/
 //
 // Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an ”AS IS” BASIS,
+// distributed under the License is distributed on an "AS IS" BASIS,
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
 #include <new>
 #include <sys/shm.h>
 #include <unique_ptr.h>
-
-#define OVERLAY_PIXMAP_DUMP 0
-
-#if OVERLAY_PIXMAP_DUMP
-extern "C"{
-#include <stdio.h>
-#include <stdlib.h>
-#include <X11/Xproto.h>
-
-#include <fcntl.h>
-#include <unistd.h>
-#include <dri2.h>
-#include <tbm_bufmgr.h>
-#include <xf86drm.h>
-}
-#endif //OVERLAY_PIXMAP_DUMP
-
 #include <Ecore_Evas.h>
 
 #include <FBaseResult.h>
 #include <FUiIOrientationEventListener.h>
+#include <FUiAnimDisplayContext.h>
 #include <FGrp_BufferInfoImpl.h>
 #include <FGrp_Screen.h>
 #include <FIo_RegistryImpl.h>
@@ -52,6 +36,7 @@ extern "C"{
 #include "FUi_CoordinateSystemUtils.h"
 #include "FUi_EcoreEvas.h"
 #include "FUi_EcoreEvasMgr.h"
+#include "FUi_Window.h"
 #include "FUiAnim_EflNode.h"
 #include "FUiAnim_ControlVisualElement.h"
 #include "FUiAnim_VisualElementSurfaceImpl.h"
@@ -64,6 +49,7 @@ extern "C"{
 using namespace std;
 using namespace Tizen::Base;
 using namespace Tizen::Base::Collection;
+using namespace Tizen::Base::Runtime;
 using namespace Tizen::Graphics;
 using namespace Tizen::Io;
 using namespace Tizen::Media;
@@ -73,205 +59,8 @@ using namespace Tizen::Ui::Animations;
 
 namespace
 {
-const int _ROTATION_0 = 0;
-const int _ROTATION_90 = 90;
-const int _ROTATION_180 = 180;
-const int _ROTATION_270 = 270;
-const int _ROTATION_360 = 360;
-
-#if OVERLAY_PIXMAP_DUMP
-
-tbm_bufmgr gTbmBufmgr = null;
-int gFileCount = 0;
-int gDrmFd = -1;
-
-void
-dump_bmp(const char* pFileName, const void* pData, int width, int height)
-{
-       FILE* pFile = null;
-
-       struct
-       {
-               unsigned char magic[2];
-       } bmpfile_magic = { {'B', 'M'} };
-
-       struct
-       {
-               unsigned int filesz;
-               unsigned short creator1;
-               unsigned short creator2;
-               unsigned int bmp_offset;
-       } bmpfile_header = { 0, 0, 0, 0x36 };
-
-       struct
-       {
-               unsigned int header_sz;
-               unsigned int width;
-               unsigned int height;
-               unsigned short nplanes;
-               unsigned short bitspp;
-               unsigned int compress_type;
-               unsigned int bmp_bytesz;
-               unsigned int hres;
-               unsigned int vres;
-               unsigned int ncolors;
-               unsigned int nimpcolors;
-       } bmp_dib_v3_header_t = { 0x28, 0, 0, 1, 24, 0, 0, 0, 0, 0, 0 };
-
-       if (pFileName != null)
-       {
-               pFile = fopen(pFileName, "w+");
-       }
-
-       if (pFile == null)
-       {
-               SysSecureLog(NID_UI_CTRL,"Failed to open %s", pFileName);
-               return;
-       }
-
-       bmpfile_header.filesz = sizeof(bmpfile_magic) + sizeof(bmpfile_header) + sizeof(bmp_dib_v3_header_t) + width * height * 3;
-       bmp_dib_v3_header_t.header_sz = sizeof(bmp_dib_v3_header_t);
-       bmp_dib_v3_header_t.width = width;
-       bmp_dib_v3_header_t.height = -height;
-       bmp_dib_v3_header_t.nplanes = 1;
-       bmp_dib_v3_header_t.bmp_bytesz = width * height * 3;
-
-       fwrite(&bmpfile_magic, sizeof(bmpfile_magic), 1, pFile);
-       fwrite(&bmpfile_header, sizeof(bmpfile_header), 1, pFile);
-       fwrite(&bmp_dib_v3_header_t, sizeof(bmp_dib_v3_header_t), 1, pFile);
-
-       unsigned int* pBlocks = (unsigned int*)pData;
-
-       for (int i = 0; i < (height * width); i++)
-       {
-               fwrite(&pBlocks[i], 3, 1, pFile);
-       }
-       fclose(pFile);
-
-       return;
-}
-
-tbm_bufmgr
-bufmgr_get(Display* pDisplay, Pixmap pixmap)
-{
-       int screen = DefaultScreen(pDisplay);
-
-       // DRI2
-       int eventBase = 0;
-       int errorBase = 0;
-       if (!DRI2QueryExtension(pDisplay, &eventBase, &errorBase))
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2QueryExtension.");
-               return null;
-       }
-
-       int dri2Major = 0;
-       int dri2Minor = 0;
-       if (!DRI2QueryVersion(pDisplay, &dri2Major, &dri2Minor))
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2QueryVersion.");
-               return null;
-       }
-
-       char* pDriverName = null;
-       char* pDeviceName = null;
-       if (!DRI2Connect(pDisplay, RootWindow(pDisplay, screen), &pDriverName, &pDeviceName))
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2Connect.");
-               return null;
-       }
-
-       SysSecureLog(NID_UI_CTRL, "The current name of open drm device is %s.", pDeviceName);
-
-       // Get the drm_fd though opening the deviceName
-       gDrmFd = open(pDeviceName, O_RDWR);
-       if (gDrmFd < 0)
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to open drm device (%s)", pDeviceName);
-               return null;
-       }
-
-       // Get the drm magic
-       drm_magic_t magic;
-       drmGetMagic(gDrmFd, &magic);
-       if (!DRI2Authenticate(pDisplay, RootWindow(pDisplay, screen), magic))
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to get value of DRI2Authenticate.");
-               close(gDrmFd);
-               gDrmFd = -1;
-               return null;
-       }
-
-       // tbm buffer manager init
-       tbm_bufmgr bufmgr = tbm_bufmgr_init(gDrmFd);
-       if (!bufmgr)
-       {
-               SysSecureLog(NID_UI_CTRL, "Failed to initialize buffer manager.");
-               close(gDrmFd);
-               gDrmFd = -1;
-               return null;
-       }
-
-       DRI2CreateDrawable(pDisplay, pixmap);
-
-       return bufmgr;
-}
-
-static void
-pixmap_update (Display* pDisplay, tbm_bufmgr bufmgr, Pixmap pixmap, int x, int y, int width, int height)
-{
-       int dri2_width = 0;
-       int dri2_height = 0;
-       unsigned int attachments[1] = { DRI2BufferFrontLeft };
-       int dri2_count = 1;
-       int dri2_out_count = 0;
-
-       int opt = TBM_OPTION_READ|TBM_OPTION_WRITE;
-       char imgFile[100] = {0,};
-
-       tbm_bo bo;
-       tbm_bo_handle bo_handle;
-
-       DRI2Buffer* pDri2_buffers = DRI2GetBuffers (pDisplay, pixmap, &dri2_width, &dri2_height, attachments, dri2_count, &dri2_out_count);
-       SysTryLogCatch(NID_UI_CTRL, pDri2_buffers != null, , "Failed to get buffers.");
-       SysTryLogCatch(NID_UI_CTRL, pDri2_buffers[0].name != null, , "Failed to get a handle of the dri2 buffer.");
-
-       SysSecureLog(NID_UI_CTRL, "The current name of Dri2_buffers[0] is %d.", pDri2_buffers[0].name);
-
-       bo = tbm_bo_import(bufmgr, pDri2_buffers[0].name);
-       SysTryLogCatch(NID_UI_CTRL, bo != null, , "Failed to import bo (key : %d).", pDri2_buffers[0].name);
-
-       bo_handle = tbm_bo_map(bo, TBM_DEVICE_CPU, opt);
-       SysTryLogCatch(NID_UI_CTRL, bo_handle.ptr != null, , "Failed to get map.");
-
-       memset(imgFile, 0, sizeof(imgFile));
-       sprintf(imgFile,"./dump%d.bmp", gFileCount++);
-
-       if (gFileCount == 5 || gFileCount == 20)
-       {
-               dump_bmp(imgFile, bo_handle.ptr, dri2_width, dri2_height);
-       }
-
-CATCH:
-       if (bo_handle.ptr)
-       {
-               tbm_bo_unmap(bo);
-       }
-
-       if (bo)
-       {
-               tbm_bo_unref(bo);
-       }
-
-       if (pDri2_buffers)
-       {
-               free(pDri2_buffers);
-       }
-}
-#endif // OVERLAY_PIXMAP_DUMP
-
 bool
-_CheckXvExtension(Display* pDisplay, int* pFirstPort, int* pCountPort)
+CheckXvExtension(Display* pDisplay, int* pFirstPort, int* pCountPort)
 {
        unsigned int version = 0;
        unsigned int release = 0;
@@ -299,15 +88,6 @@ _CheckXvExtension(Display* pDisplay, int* pFirstPort, int* pCountPort)
                return false;
        }
 
-//     SysLog(NID_UI_CTRL, "========================================");
-//     SysLog(NID_UI_CTRL, "XvQueryExtension returned the following:");
-//     SysLog(NID_UI_CTRL, "version      : %u", version);
-//     SysLog(NID_UI_CTRL, "release      : %u", release);
-//     SysLog(NID_UI_CTRL, "request_base : %u", requestBase);
-//     SysLog(NID_UI_CTRL, "event_base   : %u", eventBase);
-//     SysLog(NID_UI_CTRL, "error_base   : %u", errorBase);
-//     SysLog(NID_UI_CTRL, "========================================");
-
        unsigned int adaptors = 0;
        XvAdaptorInfo* pAdaptorInfo = null;
        returnValue = XvQueryAdaptors(pDisplay, DefaultRootWindow(pDisplay), &adaptors, &pAdaptorInfo);
@@ -334,32 +114,14 @@ _CheckXvExtension(Display* pDisplay, int* pFirstPort, int* pCountPort)
                return false;
        }
 
-//     SysLog(NID_UI_CTRL, "XvQueryAdaptors returned the following:");
-//     SysLog(NID_UI_CTRL, "%d adaptors available.", adaptors);
-
        int port = -1;
        if (adaptors > 0 && pAdaptorInfo != null)
        {
                for (unsigned int i = 0; i < adaptors; i++)
                {
-       //              SysLog(NID_UI_CTRL, " name:        %s"
-       //                                                              " type:        %s%s%s%s%s"
-       //                                                              " first port:  %ld"
-       //                                                              " ports:       %ld",
-       //                                      pAdaptorInfo[i].name,
-       //                                      (pAdaptorInfo[i].type & XvInputMask) ? "input | " : "",
-       //                                      (pAdaptorInfo[i].type & XvOutputMask) ? "output | " : "",
-       //                                      (pAdaptorInfo[i].type & XvVideoMask) ? "video | " : "",
-       //                                      (pAdaptorInfo[i].type & XvStillMask) ? "still | " : "",
-       //                                      (pAdaptorInfo[i].type & XvImageMask) ? "image | " : "",
-       //                                      pAdaptorInfo[i].base_id,
-       //                                      pAdaptorInfo[i].num_ports);
-       //              SysLog(NID_UI_CTRL, " format list: %d", i);
-
                        for (unsigned int j = 0; j < pAdaptorInfo[i].num_formats; j++)
                        {
-                               SysSecureLog(NID_UI_CTRL, "The current value of depth is %d and visual is %ld.",
-                                       pAdaptorInfo[i].formats[j].depth, pAdaptorInfo[i].formats[j].visual_id);
+                               SysSecureLog(NID_UI_CTRL, "The current value of depth is %d and visual is %ld.", pAdaptorInfo[i].formats[j].depth, pAdaptorInfo[i].formats[j].visual_id);
                        }
                }
 
@@ -386,116 +148,205 @@ _CheckXvExtension(Display* pDisplay, int* pFirstPort, int* pCountPort)
 Eina_Bool
 OnPixmapDamaged(void* pData, int type, void* pEvent)
 {
-       Tizen::Ui::Controls::_OverlayAgent* pOverlayAgent = static_cast<Tizen::Ui::Controls::_OverlayAgent*>(pData);
-
        Ecore_X_Event_Damage* pDamageEvent = (Ecore_X_Event_Damage*)pEvent;
-       SysTryReturn(NID_UI_CTRL, pDamageEvent != null, ECORE_CALLBACK_PASS_ON, E_INVALID_DATA, "[E_INVALID_DATA] The current value of DamageEvent is an invalid.");
+       SysTryReturn(NID_UI_CTRL, pDamageEvent != null, ECORE_CALLBACK_PASS_ON, E_INVALID_DATA, "[E_INVALID_DATA] The current value of DamageEvent is invalid.");
 
-       Pixmap pixmap = pOverlayAgent->GetPixmap();
-       if (pDamageEvent->drawable != pixmap)
+       Tizen::Ui::Controls::_OverlayAgent* pOverlayAgent = static_cast<Tizen::Ui::Controls::_OverlayAgent*>(pData);
+       SysTryReturn(NID_UI_CTRL, pOverlayAgent != null, ECORE_CALLBACK_PASS_ON, E_INVALID_DATA, "[E_INVALID_DATA] Failed to get OverlayAgent from DamagedEvent.");
+
+       if (pDamageEvent->drawable != pOverlayAgent->GetPixmap())
        {
-               SysSecureLog(NID_UI_CTRL, "The current drawable[%d] is not for this overlay agent's pixmap[%d]", pDamageEvent->drawable, pixmap);
                return ECORE_CALLBACK_PASS_ON;
        }
 
-       Evas_Object* pImageObject = pOverlayAgent->GetPixmapImageObject();
-       SysTryReturn(NID_UI_CTRL, pImageObject != null, ECORE_CALLBACK_PASS_ON, E_INVALID_DATA, "[E_INVALID_DATA] The current value of ImageObject is an invalid.");
+       pOverlayAgent->SetRendererFlushNeeded();
+
+       return ECORE_CALLBACK_DONE;
+}
 
-       int w = 0;
-       int h = 0;
-       evas_object_geometry_get(pImageObject, null, null, &w, &h);
-       //evas_object_image_pixels_dirty_set(pImageObject, 1);
-       //evas_object_image_fill_set(pImageObject, 0, 0, w, h);
-       evas_object_image_filled_set(pImageObject, EINA_TRUE);
-       evas_object_image_data_update_add(pImageObject, 0, 0, w, h);
+void
+OnEvasImageDamaged(void* pData, Evas_Object* pImageObject)
+{
+       Tizen::Ui::Controls::_OverlayAgent* pOverlayAgent = static_cast<Tizen::Ui::Controls::_OverlayAgent*>(pData);
+       SysTryReturnVoidResult(NID_UI_CTRL, pOverlayAgent != null, E_INVALID_DATA, "[E_INVALID_DATA] Failed to get OverlayAgent from DamagedEvent.");
 
-#if OVERLAY_PIXMAP_DUMP
+       Evas_Object* pRendererImageObject = pOverlayAgent->GetRendererImageObject();
+       SysTryReturnVoidResult(NID_UI_CTRL, pRendererImageObject != null, E_INVALID_DATA, "[E_INVALID_DATA] Failed to get Renderer ImageObject of OverlayAgent.");
 
-       if (gDrmFd > -1)
+       if (pRendererImageObject != pImageObject)
        {
-               close(gDrmFd);
-               gDrmFd = -1;
+               return;
        }
 
-       if (gTbmBufmgr)
+       Dimension newImageSize(0,0);
+       evas_object_image_size_get(pImageObject, &newImageSize.width, &newImageSize.height);
+
+       Dimension rendererImageSize(0,0);
+       evas_object_image_size_get(pRendererImageObject, &rendererImageSize.width, &rendererImageSize.height);
+
+       //pOverlayAgent->SetRendererFlushNeeded();
+
+       if (!newImageSize.Equals(rendererImageSize))
        {
-               tbm_bufmgr_deinit(gTbmBufmgr);
-               gTbmBufmgr = null;
+               SysSecureLog(NID_UI_CTRL,"newImageSize [%d, %d] rendererImageSize [%d, %d]", newImageSize.width, newImageSize.height, rendererImageSize.width, rendererImageSize.height);
+               pOverlayAgent->SetDestination(FloatDimension(static_cast<float>(newImageSize.width), static_cast<float>(newImageSize.height)));
        }
+}
+} // Anonymous
+
+namespace Tizen { namespace Ui { namespace Controls
+{
+
+int _OverlayAgent::__baseXvPort = 0;
+bool _OverlayAgent::__isPortGrabbed[]={false,};
+
+int _OverlayAgent::__overlayAgentCount = 0;
+int _OverlayAgent::__dstRectMinWidth = -1;
+int _OverlayAgent::__dstRectMinHegith = -1;
+int _OverlayAgent::__srcRectMinWidth = -1;
+int _OverlayAgent::__srcRectMinHegith = -1;
+int _OverlayAgent::__overlayWidthUnit = -1;
+int _OverlayAgent::__overlayHeightUnit = -1;
+int _OverlayAgent::__overlayMaxCount = -1;
+bool _OverlayAgent::__OverlayAgentBufferPixelFormat[] = {false, };
 
-       if (gTbmBufmgr == null)
+struct visualElementDeleter
+{
+       void operator()(_VisualElement* pVisualElement)
        {
-               gTbmBufmgr = bufmgr_get((Display*)ecore_x_display_get(), pixmap);
+               pVisualElement->Destroy();
        }
+};
+
+_OverlayAgent::_OverlayVisualElement::_OverlayVisualElement(void)
+       : __pOverlayTimer(null)
+       , __pImageObject(null)
+       , __showStateChanged(false)
+{
+}
+
+_OverlayAgent::_OverlayVisualElement::_OverlayVisualElement(const _OverlayVisualElement& rhs)
+       : _VisualElement(rhs)
+       , __pOverlayTimer(null)
+       , __pImageObject(rhs.__pImageObject)
+       , __showStateChanged(rhs.__showStateChanged)
+{
+}
 
-       if (gTbmBufmgr != null)
+_OverlayAgent::_OverlayVisualElement::~_OverlayVisualElement(void)
+{
+       if (__pOverlayTimer)
        {
-               pixmap_update((Display*)ecore_x_display_get(), gTbmBufmgr, pixmap, 0, 0, w, h);
+               __pOverlayTimer->Cancel();
+               delete __pOverlayTimer;
+               __pOverlayTimer = null;
        }
-       else
+
+       if (__pImageObject)
        {
-               SysSecureLog(NID_UI_CTRL, "can't get pixmap gBufmgr");
+               evas_object_event_callback_del(__pImageObject, EVAS_CALLBACK_SHOW, OnImageObjectShown);
+               evas_object_event_callback_del(__pImageObject, EVAS_CALLBACK_HIDE, OnImageObjectHidden);
        }
+}
 
-       SysSecureLog(NID_UI_CTRL, "dump pixmap[%d]", pixmap);
+result
+_OverlayAgent::_OverlayVisualElement::Construct(void)
+{
+       if (!__pOverlayTimer)
+       {
+               __pOverlayTimer = new (nothrow) Timer();
+               __pOverlayTimer->Construct(*this);
+       }
 
-#endif // OVERLAY_PIXMAP_DUMP
+       return _VisualElement::Construct();
+}
 
-       return ECORE_CALLBACK_DONE;
+Evas_Object*
+_OverlayAgent::_OverlayVisualElement::GetImageObject(void) const
+{
+       return __pImageObject;
 }
 
 void
-OnEvasImageDamaged(void* pData, Evas_Object* pImageObject)
+_OverlayAgent::_OverlayVisualElement::SetImageObject(Evas_Object* pImageObject)
 {
-       Tizen::Ui::Controls::_OverlayAgent* pOverlayAgent = static_cast<Tizen::Ui::Controls::_OverlayAgent*>(pData);
+       if (__pImageObject)
+       {
+               evas_object_event_callback_del(__pImageObject, EVAS_CALLBACK_SHOW, OnImageObjectShown);
+               evas_object_event_callback_del(__pImageObject, EVAS_CALLBACK_HIDE, OnImageObjectHidden);
+       }
 
-       Evas_Object* pMyImageObject = pOverlayAgent->GetPixmapImageObject();
-       SysTryReturn(NID_UI_CTRL, pMyImageObject != null, , E_INVALID_DATA, "[E_INVALID_DATA] The current value of ImageObject is an invalid.");
+       __pImageObject = pImageObject;
 
-       if (pMyImageObject == pImageObject)
+       if (__pImageObject)
        {
-               Dimension curImgDim(0,0);
-               evas_object_image_size_get(pImageObject, &curImgDim.width, &curImgDim.height);
+               evas_object_event_callback_add(__pImageObject, EVAS_CALLBACK_SHOW, OnImageObjectShown, this);
+               evas_object_event_callback_add(__pImageObject, EVAS_CALLBACK_HIDE, OnImageObjectHidden, this);
+       }
+}
 
-               Dimension orgImgDim = pOverlayAgent->GetPrevCbImageDimension();
-               if (!orgImgDim.Equals(curImgDim))
-               {
-                       SysSecureLog(NID_UI_CTRL,"org[%d, %d] cur[%d, %d]", orgImgDim.width, orgImgDim.height, curImgDim.width, curImgDim.height);
-                       pOverlayAgent->SetPrevCbImageDimension(curImgDim);
-                       pOverlayAgent->SetEvasImageDirtyFlag(false);
-               }
+void
+_OverlayAgent::_OverlayVisualElement::SetImageObjectShowStateChanged(void)
+{
+       __showStateChanged = true;
 
-               if(!(pOverlayAgent->GetEvasImageDirtyFlag()))
-               {
-                       pOverlayAgent->AdjustImageObject();
-                       pOverlayAgent->SetEvasImageDirtyFlag(true);
-               }
+       if (IsFailed(__pOverlayTimer->Start(0)))
+       {
+               __pOverlayTimer->Cancel();
+               __pOverlayTimer->Start(0);
+               SysSecureLog(NID_UI_CTRL, "The timer is restarted.");
+               ClearLastResult();
        }
 }
 
-} // Anonymous
+void
+_OverlayAgent::_OverlayVisualElement::OnImageObjectShown(void* pData, Evas *pEvas, Evas_Object *pImageObject, void *event_info)
+{
+       _OverlayVisualElement* pOverlayVE = reinterpret_cast<_OverlayVisualElement*>(pData);
+       if (pOverlayVE)
+       {
+               pOverlayVE->SetImageObjectShowStateChanged();
+               SysSecureLog(NID_UI_CTRL, "The show state of Renderer VisualElement is set to SHOW");
+       }
+}
 
-namespace Tizen { namespace Ui { namespace Controls
+void
+_OverlayAgent::_OverlayVisualElement::OnImageObjectHidden(void* pData, Evas *pEvas, Evas_Object *pImageObject, void *event_info)
 {
-int _OverlayAgent::__overlayAgentXvPortCount = 0;
-int _OverlayAgent::__baseXvPort = 0;
-bool _OverlayAgent::__isPortGrapped[]={false,};
+       _OverlayVisualElement* pOverlayVE = reinterpret_cast<_OverlayVisualElement*>(pData);
+       if (pOverlayVE)
+       {
+               pOverlayVE->SetImageObjectShowStateChanged();
+               SysSecureLog(NID_UI_CTRL, "The show state of Renderer VisualElement is set to HIDE");
+       }
+}
 
-int _OverlayAgent::__overlayAgentcount = 0;
-int _OverlayAgent::__dstRectMinWidth = -1;
-int _OverlayAgent::__dstRectMinHegith = -1;
-int _OverlayAgent::__srcRectMinWidth = -1;
-int _OverlayAgent::__srcRectMinHegith = -1;
-int _OverlayAgent::__overlayWidthUnit = -1;
-int _OverlayAgent::__overlayHeightUnit = -1;
-int _OverlayAgent::__overlayMaxCount = -1;
-bool _OverlayAgent::__OverlayAgentBufferPixelFormat[] = {false, };
+VisualElement*
+_OverlayAgent::_OverlayVisualElement::CloneN(void) const
+{
+       return new (nothrow) _OverlayVisualElement(*this);
+}
+
+void
+_OverlayAgent::_OverlayVisualElement::OnTimerExpired(Timer& timer)
+{
+       if (&timer == __pOverlayTimer && __showStateChanged && __pImageObject)
+       {
+               SetShowState(evas_object_visible_get(__pImageObject));
+               __showStateChanged = false;
+               SysSecureLog(NID_UI_CTRL, "Updates show state of Renderer VisualElement");
+       }
+       else
+       {
+               SysSecureLog(NID_UI_CTRL, "The state of timer is invalid.");
+       }
+}
 
 _OverlayAgent*
-_OverlayAgent::CreateInstanceN(_OverlayAgentStyle style, const _Control& control, const FloatRectangle& logBounds, const Rectangle& phyBounds)
+_OverlayAgent::CreateInstanceN(_OverlayAgentStyle style, const _Control& parentControl, const FloatRectangle& logicalBounds, const Rectangle& physicalBounds)
 {
-       unique_ptr<_OverlayAgent> pOverlayAgent(new (std::nothrow) _OverlayAgent(style, control, logBounds, phyBounds));
-       SysTryReturn(NID_UI_CTRL, pOverlayAgent, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
+       unique_ptr<_OverlayAgent> pOverlayAgent(new (nothrow) _OverlayAgent(style, parentControl, logicalBounds, physicalBounds));
+       SysTryReturn(NID_UI_CTRL, pOverlayAgent != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
 
        result r = GetLastResult();
        SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
@@ -503,71 +354,46 @@ _OverlayAgent::CreateInstanceN(_OverlayAgentStyle style, const _Control& control
        return pOverlayAgent.release();
 }
 
-_OverlayAgent::_OverlayAgent(_OverlayAgentStyle style, const _Control& control, const FloatRectangle& logBounds, const Rectangle& bounds)
-       : __pImageObject(null)
-       , __pRenderImageObject(null)
-       , __pSmartObject(null)
+_OverlayAgent::_OverlayAgent(_OverlayAgentStyle style, const _Control& parentControl, const FloatRectangle& logicalBounds, const Rectangle& physicalBounds)
+       : __pRendererVE(null)
+       , __pParentVE(null)
+       , __pImageObject(null)
+       , __style(style)
+       , __currentRotation(_OVERLAY_AGENT_ROTATION_NONE)
+       , __savedColorFormat(FOURCC('R','G','B','4'))
+       , __currentColorFormat(_OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888)
+       , __currentSourceBufferSize(0,0)
+       , __standardRendererBounds(0.0f, 0.0f, 0.0f, 0.0f)
+       , __standardParentBounds(0.0f, 0.0f, 0.0f, 0.0f)
+       , __needToRellaocImage(false)
+       , __pCurrentSourceBuffer(null)
+       , __pConvertedSourceBuffer(null)
        , __pixmapDamageHandle(0)
        , __pPixmapEventHandler(null)
        , __pixmap(0)
-       , __pVisualElement(null)
-       , __bgColor(0xff000000)
        , __xvPort(-1)
-       , __grabXvPort(false)
-       , __colorFormat(0)
-       , __userRotation(_ROTATION_0)
-       , __flushRotate(false)
-       , __udMirroring(0)
-       , __lrMirroring(0)
-       , __aspectRatio(false)
-       , __srcDimension(0, 0)
-       , __pixmapPhyRect(0, 0, 0, 0)
-       , __resizeRect(0, 0, 0, 0)
-       , __style(style)
        , __pXvImage(null)
-       , __newColorFormat(0)
        , __pShmInfo(null)
-       , __overlayAgentColorFormat(_OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888)
-       , __pRefUserByteBuffer(null)
-       , __pOrgUserByteBuffer(null)
-       , __orgUsrImgDimension(0, 0)
-       , __orgCbImgDimension(0, 0)
-       , __logicalOverlayRect(logBounds)
-       , __evasImageDamaged(false)
 {
-       result r = E_SUCCESS;
-
-       switch(style)
-       {
-       case _OVERLAY_AGENT_STYLE_REGION_SW:
-               //fall through
-       case _OVERLAY_AGENT_STYLE_REGION_GL:
-               r = CreateImageObjectForOverlayRegion(control, bounds);
-               break;
-
-       case _OVERLAY_AGENT_STYLE_PANEL_GL:
-               //fall through
-       case _OVERLAY_AGENT_STYLE_PANEL_SW:
-               r = CreateImageObject(control, bounds);
-               break;
-
-       default:
-               r = E_INVALID_ARG;
-       }
+       result r = CreateRendererVisualElement(parentControl, logicalBounds, physicalBounds);
 
        SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-       SysTryReturnVoidResult(NID_UI_CTRL, __pVisualElement != null, E_SYSTEM, "[E_SYSTEM] The VisualElement is null.");
+       SysTryReturnVoidResult(NID_UI_CTRL, __pRendererVE != null, E_SYSTEM, "[E_SYSTEM] The Renderer VisualElement is null.");
+       SysTryReturnVoidResult(NID_UI_CTRL, __pImageObject!= null, E_SYSTEM, "[E_SYSTEM] The Renderder ImageObject is null.");
 
-       __overlayAgentcount++;
-       SysLog(NID_UI_CTRL, "The overlayAgentcount in Constructor is [%d]", __overlayAgentcount);
+       __overlayAgentCount++;
+       SysLog(NID_UI_CTRL, "The current count of OverlayAgent is %d", __overlayAgentCount);
 }
 
 _OverlayAgent::~_OverlayAgent(void)
 {
-       SysLog(NID_UI_CTRL, "The overlayAgentcount in Destructor is [%d] and deleted.", __overlayAgentcount);
-       __overlayAgentcount--;
+       SysLog(NID_UI_CTRL, "The %dth OverlayAgent is deleted.", __overlayAgentCount);
+       __overlayAgentCount--;
 
-       UngrabXvPort();
+       if (__xvPort > 0)
+       {
+               UngrabXvPort();
+       }
 
        if (__pPixmapEventHandler)
        {
@@ -601,57 +427,133 @@ _OverlayAgent::~_OverlayAgent(void)
                __pXvImage = null;
        }
 
-       if (__pOrgUserByteBuffer)
+       if (__pConvertedSourceBuffer)
+       {
+               delete __pConvertedSourceBuffer;
+               __pConvertedSourceBuffer = null;
+       }
+
+       if (__pCurrentSourceBuffer)
+       {
+               delete __pCurrentSourceBuffer;
+               __pCurrentSourceBuffer = null;
+       }
+
+       if (__pRendererVE != null)
        {
-               delete __pOrgUserByteBuffer;
-               __pOrgUserByteBuffer = null;
+               __pRendererVE->SetSurface(null);
+               __pRendererVE->Destroy();
+               __pRendererVE = null;
        }
 
        if (__pImageObject)
        {
-               evas_object_smart_member_del(__pImageObject);
                evas_object_del(__pImageObject);
                __pImageObject = null;
        }
+}
+
+result
+_OverlayAgent::GetBufferInfo(BufferInfo& bufferInfo) const
+{
+       SysTryReturnResult(NID_UI_CTRL, __pImageObject != null, E_SYSTEM, "The Renderer ImageObject is null.");
+       SysTryReturnResult(NID_UI_CTRL, __pRendererVE != null, E_SYSTEM, "The Renderer Visual Element is null.");
+
+       int width = 0;
+       int height = 0;
+       evas_object_geometry_get(__pImageObject, NULL, NULL, &width, &height);
+
+       bufferInfo.width = width;
+       bufferInfo.pitch = width;
+       bufferInfo.height = height;
+       bufferInfo.bitsPerPixel = 32;
+       bufferInfo.pixelFormat = PIXEL_FORMAT_ARGB8888;
+
+       _BufferInfoImpl* pBufferInfoImpl = _BufferInfoImpl::GetInstance(bufferInfo);
+       SysTryReturnResult(NID_UI_CTRL, pBufferInfoImpl != null, E_SYSTEM, "Failed to get instance of buffer info.");
+
+       result r = E_SUCCESS;
 
-       if (__pRenderImageObject)
+       if(__style == _OVERLAY_AGENT_STYLE_REGION_SW || __style == _OVERLAY_AGENT_STYLE_PANEL_SW)
        {
-               evas_object_smart_member_del(__pRenderImageObject);
-               evas_object_del(__pRenderImageObject);
-               __pRenderImageObject = null;
+               pBufferInfoImpl->SetHandle(_BufferInfoImpl::HANDLE_TYPE_VE_SURFACE, reinterpret_cast<Handle>(__pImageObject));
+               SysSecureLog(NID_UI_CTRL,"The returned handle of BufferInfo is a evas image object (HANDLE_TYPE_VE_SURFACE)");
        }
-
-       if ((__style == _OVERLAY_AGENT_STYLE_REGION_SW || __style == _OVERLAY_AGENT_STYLE_REGION_GL)
-                       && (__pVisualElement != null))
+       else
        {
-               __pVisualElement->Destroy();
-               __pVisualElement = null;
+               pBufferInfoImpl->SetHandle(_BufferInfoImpl::HANDLE_TYPE_OVERLAY_REGION, __pixmap);
+               SysSecureLog(NID_UI_CTRL,"The returned handle of BufferInfo is a pixmap (HANDLE_TYPE_OVERLAY_REGION)");
        }
 
-#if OVERLAY_PIXMAP_DUMP
+       pBufferInfoImpl->SetBounds(Rectangle(0, 0, width, height));
+
+       return r;
+}
+
+result
+_OverlayAgent::SetInputBuffer(const ByteBuffer& srcBuffer, const Dimension& srcDim, _OverlayAgentBufferPixelFormat srcFormat)
+{
+       SysTryReturnResult(NID_UI_CTRL, srcBuffer.GetPointer() != null, E_INVALID_ARG, "The current value of input source buffer is invalid.");
+       SysTryReturnResult(NID_UI_CTRL, srcBuffer.GetCapacity() > 0, E_INVALID_ARG, "The current size of input source buffer is invalid.");
+       SysTryReturnResult(NID_UI_CTRL, srcDim.width >= GetSrcRectMinWidth(), E_INVALID_ARG, "The width of dimension [%d] is under the minimum size.", srcDim.width);
+       SysTryReturnResult(NID_UI_CTRL, srcDim.height >= GetSrcRectMinHeight(), E_INVALID_ARG, "The height of dimension [%d] is under the minimum size.", srcDim.height);
 
-       if (gDrmFd > -1)
+       if (__currentColorFormat != srcFormat)
        {
-               close(gDrmFd);
-               gDrmFd = -1;
+               unsigned int colorFormat = 0;
+
+               switch (srcFormat)
+               {
+               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888:
+                       colorFormat = FOURCC('R','G','B','4');
+                       break;
+               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_RGB565:
+                       colorFormat = FOURCC('R','G','B','P');
+                       break;
+               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR:
+                       colorFormat = FOURCC('I','4','2','0');
+                       break;
+               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_NV12:
+                       colorFormat = FOURCC('N','V','1','2');
+                       break;
+               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_UYVY:
+                       colorFormat = FOURCC('U','Y','V','Y');
+                       break;
+               default:
+                       SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "The specified pixel format is not supported.");
+                       return E_UNSUPPORTED_FORMAT;
+               }
+
+               __savedColorFormat = colorFormat;
+               __currentColorFormat = srcFormat;
+               __needToRellaocImage = true;
        }
 
-       if (gTbmBufmgr)
+       if (!srcDim.Equals(__currentSourceBufferSize))
        {
-               tbm_bufmgr_deinit(gTbmBufmgr);
-               gTbmBufmgr = null;
+               __currentSourceBufferSize.width = srcDim.width;
+               __currentSourceBufferSize.height = srcDim.height;
+               __needToRellaocImage = true;
        }
 
-#endif //OVERLAY_PIXMAP_DUMP
+       __pCurrentSourceBuffer = &srcBuffer;
+
+       if (__needToRellaocImage)
+       {
+               SysSecureLog(NID_UI_CTRL,"The current buffer pointer is %x, size is %d, color format is %d",
+                       __pCurrentSourceBuffer->GetPointer(), __pCurrentSourceBuffer->GetCapacity(), __savedColorFormat);
+       }
 
+       return E_SUCCESS;
 }
 
 result
 _OverlayAgent::Draw(void)
 {
-       SysTryReturnResult(NID_UI_CTRL, __pRefUserByteBuffer->GetPointer() != null, E_SYSTEM, "The current user buffer is null. (nothing to draw)");
+       SysTryReturnResult(NID_UI_CTRL, __pCurrentSourceBuffer->GetPointer() != null, E_SYSTEM, "The current input user buffer is null. (nothing to draw)");
 
        result r = E_SUCCESS;
+
        if(__style == _OVERLAY_AGENT_STYLE_REGION_SW || __style == _OVERLAY_AGENT_STYLE_PANEL_SW)
        {
                r = PutEvasImage();
@@ -660,573 +562,92 @@ _OverlayAgent::Draw(void)
        {
                r = PutXvImage();
        }
-       SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r) );
+
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, "Propagating.");
 
        return r;
 }
 
+
 result
-_OverlayAgent::GetBufferInfo(BufferInfo& bufferInfo) const
+_OverlayAgent::GrabXvPort(void)
 {
-       int w = 0, h = 0;
-       evas_object_geometry_get(__pImageObject, NULL, NULL, &w, &h);
+       Display* pDisplay = (Display*)ecore_x_display_get();
+       SysTryReturnResult(NID_UI_CTRL, pDisplay != null, E_SYSTEM, "The current value of Display is null");
 
-       bufferInfo.width = w;
-       bufferInfo.pitch = w;
-       bufferInfo.height = h;
-       bufferInfo.bitsPerPixel = 32;
-       bufferInfo.pixelFormat = PIXEL_FORMAT_ARGB8888;
+       int baseXvPort = -1;
+       int portCount = -1;
+       if (!CheckXvExtension(pDisplay, &baseXvPort, &portCount))
+       {
+               SysTryReturnResult(NID_UI_CTRL, false, E_SYSTEM, "Failed to check XvExtension");
+       }
 
-       _BufferInfoImpl* pBufferInfoImpl = _BufferInfoImpl::GetInstance(bufferInfo);
-
-       if(__style == _OVERLAY_AGENT_STYLE_REGION_SW || __style == _OVERLAY_AGENT_STYLE_PANEL_SW)
-       {
-               pBufferInfoImpl->SetHandle(_BufferInfoImpl::HANDLE_TYPE_VE_SURFACE, reinterpret_cast<Handle>(__pImageObject));
-               SysSecureLog(NID_UI_CTRL,"return evas image object");
-       }
-       else
-       {
-               pBufferInfoImpl->SetHandle(_BufferInfoImpl::HANDLE_TYPE_OVERLAY_REGION, __pixmap);
-               SysSecureLog(NID_UI_CTRL,"return pixmap ID");
-       }
-
-       pBufferInfoImpl->SetBounds(Rectangle(0, 0, w, h));
-
-       return E_SUCCESS;
-}
-
-result
-_OverlayAgent::SetInputBuffer(const ByteBuffer& srcBuffer, const Dimension& srcDim, _OverlayAgentBufferPixelFormat srcFormat)
-{
-       SysTryReturn(NID_UI_CTRL, srcBuffer.GetPointer() != null, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The srcBuffer which is input parameter is invalid.");
-       SysTryReturn(NID_UI_CTRL, srcBuffer.GetCapacity() > 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The srcBuffer which is input parameter is invalid.");
-       SysTryReturn(NID_UI_CTRL, IsValidSourceDimension(srcDim), E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The srcDim which is input parameter is invalid.");
-
-       switch (srcFormat)
-       {
-       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888:
-               __newColorFormat = FOURCC('R','G','B','4');
-               break;
-       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_RGB565:
-               __newColorFormat = FOURCC('R','G','B','P');
-               break;
-       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR:
-               __newColorFormat = FOURCC('I','4','2','0');
-               break;
-       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_NV12:
-               __newColorFormat = FOURCC('N','V','1','2');
-               break;
-       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_UYVY:
-               __newColorFormat = FOURCC('U','Y','V','Y');
-               break;
-       default:
-               SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "The specified pixel format is not supported.");
-               return E_UNSUPPORTED_FORMAT;
-       }
-
-       __srcDimension.width = srcDim.width;
-       __srcDimension.height = srcDim.height;
-
-       __overlayAgentColorFormat = srcFormat;
-       __pRefUserByteBuffer = &srcBuffer;
-
-       SysLog(NID_UI_CTRL,"The current value of buffer is %x, size is %d, new color format is %x",
-               __pRefUserByteBuffer->GetPointer(), __pRefUserByteBuffer->GetCapacity(), __newColorFormat);
-
-       return E_SUCCESS;
-}
-
-result
-_OverlayAgent::SetRotation(_OverlayAgentRotation rotation)
-{
-       SysTryReturnResult(NID_UI_CTRL, (rotation < _OVERLAY_AGENT_ROTATION_MAX), E_INVALID_ARG,
-                                               "[E_INVALID_ARG)] The rotation which is input parameter(%d) is invalid.", rotation);
-
-       int rotate = _ROTATION_0;
-
-       switch (rotation)
-       {
-       case _OVERLAY_AGENT_ROTATION_NONE:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_NONE_LR:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_NONE_UD:
-               rotate = _ROTATION_0;
-               break;
-
-       case _OVERLAY_AGENT_ROTATION_90:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_90_LR:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_90_UD:
-               rotate = _ROTATION_90;
-               break;
+       SysTryReturnResult(NID_UI_CTRL, baseXvPort > 0, E_SYSTEM, "The current value of base XvPort is invalid.");
+       SysTryReturnResult(NID_UI_CTRL, portCount >= 1 && portCount <= _OVERLAYAGENT_XV_PORT, E_SYSTEM, "The current count of available XvPort[%d] is invalid.", portCount);
 
-       case _OVERLAY_AGENT_ROTATION_180:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_180_LR:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_180_UD:
-               rotate = _ROTATION_180;
-               break;
+       _OverlayAgent::__baseXvPort = baseXvPort;
 
-       case _OVERLAY_AGENT_ROTATION_270:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_270_LR:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_270_UD:
-               rotate = _ROTATION_270;
-               break;
-
-       default:
-               rotate = _ROTATION_0;
-               break;
-       }
-
-       int udMirroring = 0;
-       int lrMirroring = 0;
-
-       switch (rotation)
+       for (int index = 0; index < portCount; index++)
        {
-       case _OVERLAY_AGENT_ROTATION_NONE_UD:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_90_UD:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_180_UD:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_270_UD:
-               udMirroring = 1;
-               lrMirroring = 0;
-               break;
-       case _OVERLAY_AGENT_ROTATION_NONE_LR:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_90_LR:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_180_LR:
-               // fall through
-       case _OVERLAY_AGENT_ROTATION_270_LR:
-               udMirroring = 0;
-               lrMirroring = 1;
-               break;
-       default:
-               udMirroring = 0;
-               lrMirroring = 0;
-               break;
-       }
-
-       __userRotation = rotate;
-       __udMirroring = udMirroring;
-       __lrMirroring = lrMirroring;
-       __flushRotate = true;
-
-       result r = AdjustImageObject();
-       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-       SysLog(NID_UI_CTRL, "The current value of userRotation is %d, udMirroring is %d, lrMirroring is %d", __userRotation, __udMirroring, __lrMirroring);
-
-       return E_SUCCESS;
-}
-
-result
-_OverlayAgent::SetDestination(const FloatDimension& dimension)
-{
-       FloatDimension phyDimF = _CoordinateSystemUtils::Transform(dimension);
-       Dimension phyDim = _CoordinateSystemUtils::ConvertToInteger(phyDimF);
-
-       __resizeRect.width = phyDim.width;
-       __resizeRect.height = phyDim.height;
-       SysSecureLog(NID_UI_CTRL, "The current value of resizeRect is (%d, %d, %d, %d)",__resizeRect.x, __resizeRect.y, __resizeRect.width, __resizeRect.height);
-
-       result r = AdjustImageObject();
-       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
-
-       return r;
-}
-
-result
-_OverlayAgent::SetAspectRatio(bool enable)
-{
-       __aspectRatio = enable;
-
-       return E_SUCCESS;
-}
-
-result
-_OverlayAgent::CreateImageObjectForOverlayRegion(const _Control& control, const Rectangle& phyBounds)
-{
-       _EflNode* pEflNode = null;
-       Evas_Object* pSmartObject = null;
-       Evas* pEvas = null;
-       Ecore_Evas* pEcoreEvas = null;
-       VisualElementSurface* pVisualElementSurface = null;
-       _VisualElementSurfaceImpl* pVisualElementSurfaceImpl = null;
-       Evas_Object* pTemp = null;
-
-       // 1. make VE for OR
-       _VisualElement* pParentVE = control.GetVisualElement();
-       SysTryReturn(NID_UI_CTRL, pParentVE != null, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] pParentVE is null.");
-
-       _VisualElementImpl* pVisualElementImpl = null;
-       _VisualElement* pVisualElement = new (std::nothrow) _VisualElement();
-
-       SysTryReturn(NID_UI_CTRL, pVisualElement != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] pVisualElement : Memory shortage.");
-
-       result r = pVisualElement->Construct();
-       SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r) );
-
-       pVisualElement->SetName("OverlayRegion");
-       pVisualElement->SetShowState(true);
-//     pVisualElement->SetOpacity(1.0f);
-       pVisualElement->SetImplicitAnimationEnabled(false);
-//     pVisualElement->SetBackgroundColor(_Colorf(0.0f, 0.0f, 0.0f, 0.0f));
-
-       pVisualElementImpl = _VisualElementImpl::GetInstance(*pVisualElement);
-
-       pVisualElementImpl->SetZOrderGroup(_CONTROL_LAYER_OVERLAY);
-       r = pParentVE->InsertChild(*pVisualElement, null, true);
-
-       pVisualElement->SetBounds(__logicalOverlayRect);
-
-       // 2. remove origin VE image object buffer
-       pVisualElementSurface = pVisualElementImpl->GetSurfaceN();
-       SysTryCatch(NID_UI_CTRL, pVisualElementSurface != null, , E_SYSTEM, "[E_SYSTEM] pVisualElementSurface is null" );
-
-       pVisualElementSurfaceImpl = _VisualElementSurfaceImpl::GetInstance(*pVisualElementSurface);
-       SysTryCatch(NID_UI_CTRL, pVisualElementSurfaceImpl != null, , E_SYSTEM, "[E_SYSTEM] pVisualElementSurfaceImpl is null" );
-
-       pTemp = (Evas_Object*)pVisualElementSurfaceImpl->GetNativeHandle();
-       SysTryCatch(NID_UI_CTRL, pTemp != null, , E_SYSTEM, "[E_SYSTEM] pTemp is null" );
-
-       evas_object_image_data_set(pTemp, NULL);
-       delete pVisualElementSurface;
-
-       // 3. create image object
-       pEflNode = dynamic_cast<_EflNode*>(pVisualElement->GetNativeNode());
-       SysTryCatch(NID_UI_CTRL, pEflNode != null, , E_SYSTEM, "[E_SYSTEM] pEflNode is null" );
-
-       pSmartObject = (Evas_Object*)pEflNode->GetGroupContainer();
-       SysTryCatch(NID_UI_CTRL, pSmartObject != null, , E_SYSTEM, "[E_SYSTEM] pSmartObject is null" );
-
-       __pSmartObject = pSmartObject;
-
-       pEvas = evas_object_evas_get(pSmartObject);
-       SysTryCatch(NID_UI_CTRL, pEvas != null, , E_SYSTEM, "[E_SYSTEM] pEvas is null" );
-
-       pEcoreEvas = ecore_evas_ecore_evas_get(pEvas);
-       SysTryCatch(NID_UI_CTRL, pEcoreEvas != null, , E_SYSTEM, "[E_SYSTEM] pEcoreEvas is null" );
-
-       __pImageObject = evas_object_image_add(pEvas);
-       SysTryCatch(NID_UI_CTRL, __pImageObject != null, , E_SYSTEM, "[E_SYSTEM] __pImageObject is null" );
-       evas_object_name_set(__pImageObject, "OverlayRegionImageObj");
-
-       // 4. add image obj to smart object
-       evas_object_smart_member_add(__pImageObject, pSmartObject);
-       //evas_object_lower(__pImageObject);
-
-       SysSecureLog(NID_UI_CTRL, "phyBounds [%d, %d, %d, %d]", phyBounds.x, phyBounds.y, phyBounds.width, phyBounds.height);
-
-       evas_object_image_size_set(__pImageObject, phyBounds.width, phyBounds.height);
-       evas_object_image_filled_set(__pImageObject, EINA_TRUE);
-       evas_object_image_alpha_set(__pImageObject, false);
-       evas_object_resize(__pImageObject, phyBounds.width, phyBounds.height);
-       evas_object_move(__pImageObject, phyBounds.x, phyBounds.y);
-       evas_object_show(__pImageObject);
-
-       r = pVisualElement->SetFlushNeeded();
-       SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
-
-       __pVisualElement = pVisualElement;
-
-       SysSecureLog(NID_UI_CTRL, "ImageObjectForOverlayRegion SUCCESS  __pImageObject : %x, pSmartObject : %x", __pImageObject, pSmartObject);
-
-       return E_SUCCESS;
-
-CATCH:
-       if (__pImageObject)
-       {
-               evas_object_del(__pImageObject);
-               __pImageObject = null;
-       }
-
-       if (pVisualElementSurface)
-       {
-               delete pVisualElementSurface;
-               pVisualElementSurface = null;
-       }
-
-       if (pVisualElement)
-       {
-               pVisualElement->Destroy();
-               pVisualElement = null;
-       }
-
-       return E_SYSTEM;
-}
-
-result
-_OverlayAgent::CreateImageObject(const _Control& control, const Rectangle& phyBounds)
-{
-       VisualElementSurface* pVisualElementSurface = null;
-       _VisualElementSurfaceImpl* pVisualElementSurfaceImpl = null;
-       _VisualElement* pVisualElement = null;
-       _VisualElementImpl* pVisualElementImpl = null;
-       Evas* pEvas = null;
-       Evas_Object* pTemp = null;
-
-       _EflNode* pEflNode = dynamic_cast<_EflNode*>(control.GetVisualElement()->GetNativeNode());
-       SysTryReturn(NID_UI_CTRL, pEflNode != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pEflNode is null.");
-
-       Evas_Object* pSmartObject = (Evas_Object*)pEflNode->GetGroupContainer();
-       SysTryReturn(NID_UI_CTRL, pSmartObject != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pSmartObject is null.");
-       __pSmartObject = pSmartObject;
-
-       pVisualElement = control.GetVisualElement();
-       SysTryReturn(NID_UI_CTRL, pVisualElement != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pVisualElement is null.");
-
-       pVisualElementImpl = _VisualElementImpl::GetInstance(*pVisualElement);
-       SysTryReturn(NID_UI_CTRL, pVisualElementImpl != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pVisualElementImpl is null.");
-
-       pVisualElementSurface = pVisualElementImpl->GetSurfaceN();
-       SysTryCatch(NID_UI_CTRL, pVisualElementSurface != null, , E_SYSTEM, "[E_SYSTEM] pVisualElementSurface is null" );
-
-       pVisualElementSurfaceImpl = _VisualElementSurfaceImpl::GetInstance(*pVisualElementSurface);
-       SysTryCatch(NID_UI_CTRL, pVisualElementSurfaceImpl != null, , E_SYSTEM, "[E_SYSTEM] pVisualElementSurfaceImpl is null" );
-
-       pTemp = (Evas_Object*)pVisualElementSurfaceImpl->GetNativeHandle();
-       SysTryCatch(NID_UI_CTRL, pTemp != null, , E_SYSTEM, "[E_SYSTEM] pTemp is null" );
-
-       evas_object_image_data_set(pTemp, NULL);
-       delete pVisualElementSurface;
-       pVisualElementSurface = null;
-
-       pEvas = evas_object_evas_get(pSmartObject);
-       SysTryReturn(NID_UI_CTRL, pEvas != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pEvas is null" );
-
-       // create renderRect object
-       __pRenderImageObject = evas_object_rectangle_add(pEvas);
-       evas_object_name_set(__pRenderImageObject, "OverlayPanelRenderRect");
-       SysTryReturn(NID_UI_CTRL, __pRenderImageObject != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] __pRenderImageObject is null");
-       evas_object_smart_member_add(__pRenderImageObject, pSmartObject);
-       evas_object_color_set(__pRenderImageObject, 0, 0, 0, 255); // 100% opaque black
-       evas_object_resize(__pRenderImageObject, phyBounds.width, phyBounds.height);
-       evas_object_move(__pRenderImageObject, phyBounds.x, phyBounds.y);
-       evas_object_show(__pRenderImageObject);
-
-       // create image object
-       __pImageObject = evas_object_image_add(pEvas);
-       //__pImageObject = evas_object_image_filled_add(pEvas);
-       SysTryCatch(NID_UI_CTRL, __pImageObject != null, , E_SYSTEM, "[E_SYSTEM] __pImageObject is null");
-
-       evas_object_smart_member_add(__pImageObject, pSmartObject);
-       evas_object_name_set(__pImageObject, "OverlayPanelImageObj");
-       evas_object_image_size_set(__pImageObject, phyBounds.width, phyBounds.height);
-       //evas_object_image_fill_set(__pImageObject, 0, 0, phyBounds.width, phyBounds.height);
-       evas_object_image_alpha_set(__pImageObject, false);
-       evas_object_image_filled_set(__pImageObject, EINA_TRUE);
-       evas_object_resize(__pImageObject, phyBounds.width, phyBounds.height);
-       evas_object_move(__pImageObject, phyBounds.x, phyBounds.y);
-       evas_object_show(__pImageObject);
-
-       __pVisualElement = control.GetVisualElement();
-
-       return E_SUCCESS;
-
-CATCH:
-
-       if (pVisualElementSurface)
-       {
-               delete pVisualElementSurface;
-               pVisualElementSurface = null;
-       }
-
-       if (__pRenderImageObject)
-       {
-               evas_object_del(__pRenderImageObject);
-               __pRenderImageObject = null;
-       }
-
-       return E_SYSTEM;
-}
-
-result
-_OverlayAgent::CreatePixmap(void)
-{
-       SysTryReturnResult(NID_UI_CTRL, __pImageObject != null, E_SYSTEM, "[E_SYSTEM] __pImageObject is null");
-
-       int x = 0;
-       int y = 0;
-       int w = 0;
-       int h = 0;
-
-       evas_object_geometry_get(__pImageObject, &x, &y, &w, &h);
-       SysSecureLog(NID_UI_CTRL,"__pImageObject rect is [%d, %d, %d, %d]", x, y, w, h);
-
-       Rectangle phyRect(x, y, w, h);
-       SysTryReturnResult(NID_UI_CTRL, (phyRect.width >= GetDstRectMinWidth()) && (phyRect.height >= GetDstRectMinHeight()), E_SYSTEM, "[E_SYSTEM] can't make a pixmap. dimension[%d, %d] is not proper",phyRect.width, phyRect.height);
-
-// Create pixmap.
-       Display *pDisplay = (Display*)ecore_x_display_get();
-       SysTryReturnResult(NID_UI_CTRL, pDisplay != null, E_SYSTEM, "[E_SYSTEM] pDisplay is null");
-
-       __pixmap = XCreatePixmap(pDisplay, DefaultRootWindow(pDisplay), phyRect.width, phyRect.height, DefaultDepth(pDisplay, DefaultScreen(pDisplay)));
-       SysTryReturnResult(NID_UI_CTRL, __pixmap != 0, E_SYSTEM, "[E_SYSTEM] failed to create a pixmap");
-
-       GC gc = XCreateGC(pDisplay, __pixmap, 0,0);
-       SysTryReturnResult(NID_UI_CTRL, gc > 0, E_SYSTEM, "[E_SYSTEM] failed to create GC");
-
-       XSetForeground(pDisplay, gc, (long unsigned int)(__bgColor.GetRGB32()));
-       XFillRectangle(pDisplay, __pixmap, gc, 0, 0, phyRect.width, phyRect.height);
-       XSync(pDisplay, 0);
-       XFreeGC(pDisplay, gc);
-
-// Set native surface.
-       Evas_Native_Surface surf = {0,};
-
-       surf.version = EVAS_NATIVE_SURFACE_VERSION;
-       surf.type = EVAS_NATIVE_SURFACE_X11;
-       surf.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get());
-       surf.data.x11.pixmap = __pixmap;
-
-       evas_object_lower(__pImageObject);
-       if (__style == _OVERLAY_AGENT_STYLE_PANEL_SW || __style == _OVERLAY_AGENT_STYLE_PANEL_GL)
-       {
-               if(__pRenderImageObject)
+               if(!__isPortGrabbed[index])
                {
-                       evas_object_lower(__pRenderImageObject);
-               }
-       }
-
-       evas_object_image_native_surface_set(__pImageObject, &surf);
-
-// Create damage.
-       __pixmapDamageHandle = ecore_x_damage_new(__pixmap, ECORE_X_DAMAGE_REPORT_RAW_RECTANGLES);
-       SysTryCatch(NID_UI_CTRL, __pixmapDamageHandle != 0, , E_SYSTEM, "[E_SYSTEM] failed to create a damage object");
-
-       __pPixmapEventHandler = ecore_event_handler_add(ECORE_X_EVENT_DAMAGE_NOTIFY, OnPixmapDamaged, (void*)this);
-       SysTryCatch(NID_UI_CTRL, __pPixmapEventHandler != null, , E_SYSTEM, "[E_SYSTEM] failed to add a pixmap damage event handle");
-
-       __pixmapPhyRect = Rectangle(0, 0, phyRect.width, phyRect.height);
-
-       SysSecureLog(NID_UI_CTRL, "__pixmap : %d.", __pixmap);
-
-       return E_SUCCESS;
-
-CATCH:
-       if (__pPixmapEventHandler)
-       {
-               ecore_event_handler_del(__pPixmapEventHandler);
-               __pPixmapEventHandler = null;
-       }
-
-       if (__pixmapDamageHandle)
-       {
-               ecore_x_damage_free(__pixmapDamageHandle);
-               __pixmapDamageHandle = 0;
-       }
-
-       if (__pixmap)
-       {
-               XFreePixmap((Display*)ecore_x_display_get(), __pixmap);
-               __pixmap = 0;
-       }
-
-       return E_SYSTEM;
-}
-
-Pixmap
-_OverlayAgent::GetPixmap(void) const
-{
-       return __pixmap;
-}
-
-Evas_Object*
-_OverlayAgent::GetPixmapImageObject(void) const
-{
-       return __pImageObject;
-}
-
-result
-_OverlayAgent::Show(void) const
-{
-       return E_SUCCESS;
-}
-
-result
-_OverlayAgent::GrabXvPort(void)
-{
-       int firstXvPort = -1;
-       int portCount = -1;
-
-       Display* pDisplay = (Display*)ecore_x_display_get();
-       SysTryReturn(NID_UI_CTRL, pDisplay != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
-
-       if (!_CheckXvExtension(pDisplay, &firstXvPort, &portCount))
-       {
-               SysTryReturn(NID_UI_CTRL, false, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] _CheckXvExtension is failed.");
-       }
-
-       SysTryReturn(NID_UI_CTRL, firstXvPort != -1, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] first XvPort[%d] is invalid.", firstXvPort);
-       SysTryReturn(NID_UI_CTRL, portCount >= 1 && portCount <= _OVERLAYAGENT_XV_PORT , E_SYSTEM, E_SYSTEM, "[E_SYSTEM] portCount[%d] is invalid.", portCount);
-
-       _OverlayAgent::__baseXvPort = firstXvPort;
-
-       int i, tempPort = 0;
-       for (i = 0; i < portCount; i++)
-       {
-               if(!__isPortGrapped[i])
-               {
-                       tempPort = firstXvPort + i;
+                       int tempPort = __baseXvPort + index;
                        if (XvGrabPort(pDisplay, tempPort, 0) != Success)
                        {
-                               SysSecureLog(NID_UI_CTRL, "this port[%d] is alreadly used by another process", tempPort);
+                               SysSecureLog(NID_UI_CTRL, "The current XvPort[%d] has been alreadly used by another process", tempPort);
                        }
                        else
                        {
                                __xvPort = tempPort;
-                               __grabXvPort = true;
-                               __isPortGrapped[i] = true;
+                               __isPortGrabbed[index] = true;
                                break;
                        }
                }
        }
 
-       SysTryReturn(NID_UI_CTRL, __xvPort != -1 , E_SYSTEM, E_SYSTEM, "XvGrabPort fail for pixmap : %d", __pixmap);
+       SysTryReturnResult(NID_UI_CTRL, __xvPort > 0, E_SYSTEM, "Failed to grab pixmap[%d]", __pixmap);
+       SysSecureLog(NID_UI_CTRL, "The current value of grabbed XvPort is [%d] and pixmap is [%d]", __xvPort, __pixmap);
 
-       SysSecureLog(NID_UI_CTRL, "XvGrabPort port: %d pixmap: %d style: %d", __xvPort, __pixmap, __style);
+       return E_SUCCESS;
+}
 
-       __overlayAgentXvPortCount++;
+void
+_OverlayAgent::UngrabXvPort(void)
+{
+       ClearLastResult();
 
-       return E_SUCCESS;
+       if (__xvPort > 0 && (__xvPort - __baseXvPort) >= 0 && __isPortGrabbed[__xvPort - __baseXvPort])
+       {
+               Display* pDisplay = (Display*) ecore_x_display_get();
+               Atom atom = XInternAtom(pDisplay, "_USER_WM_PORT_ATTRIBUTE_STREAM_OFF", False);
+               XvSetPortAttribute(pDisplay, __xvPort, atom, 1);
+               XvUngrabPort(pDisplay, __xvPort, 0);
+
+               SysSecureLog(NID_UI_CTRL, "The current value of ungrabbed XvPort is %d, and pixmap is %d", __xvPort, __pixmap);
+
+               __isPortGrabbed[__xvPort - __baseXvPort] = false;
+               __xvPort = -1;
+       }
 }
 
 result
 _OverlayAgent::PutXvImage(void)
 {
-       SysTryReturnResult(NID_UI_CTRL, __pixmap != 0, E_SYSTEM, "[E_SYSTEM] __pixmap is invalid. something wrong!");
+       SysTryReturnResult(NID_UI_CTRL, __pixmap != 0, E_SYSTEM, "The current value of pixmap is null");
 
        Display* pDisplay = (Display*)ecore_x_display_get();
-       SysTryReturn(NID_UI_CTRL, pDisplay != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pDisplay is null.");
-
-       GC gc = DefaultGCOfScreen(DefaultScreenOfDisplay(pDisplay));
+       SysTryReturnResult(NID_UI_CTRL, pDisplay != null, E_SYSTEM, "The current value of Display is null");
 
-       bool needRealloc = false;
-       Dimension usrDim(__srcDimension.width,__srcDimension.height);
-       if (__pXvImage == null
-                       || __newColorFormat != __colorFormat
-                       || !usrDim.Equals(__orgUsrImgDimension) /*|| __pXvImage->data_size != __pRefUserByteBuffer->GetCapacity()*/)
+       if (__pXvImage == null || __needToRellaocImage)
+               //||(__pXvImage && __pXvImage->data_size != currentSourceBufferSize->GetCapacity()))
        {
-               needRealloc = true;
-
                if (__xvPort != -1)
                {
-                               SysSecureLog(NID_UI_CTRL, "Need to unGrap port[%d]!", __xvPort);
-                               UngrabXvPort();
+                       UngrabXvPort();
                }
 
-               if(__pXvImage != null)
+               if (__pXvImage != null)
                {
-                       SysSecureLog(NID_UI_CTRL,"pXvImage->data_size : %d, userBufferSize : %d", __pXvImage->data_size, __pRefUserByteBuffer->GetCapacity());
-                       SysSecureLog(NID_UI_CTRL,"__newColorFormat : %x, __colorFormat : %x", __newColorFormat, __colorFormat);
-
                        if (__pShmInfo)
                        {
                                XShmDetach(pDisplay, __pShmInfo);
@@ -1242,33 +663,21 @@ _OverlayAgent::PutXvImage(void)
                                __pXvImage = null;
                        }
                }
-               else
-               {
-                       SysSecureLog(NID_UI_CTRL, "__pXvImage is null!");
-               }
        }
 
        if (__xvPort == -1)
        {
-               SysSecureLog(NID_UI_CTRL, "port[%d] is invalid!", __xvPort);
                result r = GrabXvPort();
-               SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r) );
+               SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, "Propagating.");
        }
 
-       if (needRealloc)
+       if (__needToRellaocImage)
        {
-               XvImage* pXvImage = null;
-               XShmSegmentInfo* pShmInfo = null;
+               XShmSegmentInfo* pShmInfo = new (std::nothrow) XShmSegmentInfo();
+               SysTryReturnResult(NID_UI_CTRL, pShmInfo != null, E_SYSTEM, "Failed to create XShmSegmentInfo");
 
-               pShmInfo = new (std::nothrow) XShmSegmentInfo();
-               if (pShmInfo == null)
-               {
-                       SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM]pShmInfo is null.");
-                       return E_SYSTEM;
-               }
-
-               pXvImage = XvShmCreateImage(pDisplay, __xvPort, __newColorFormat, 0, __srcDimension.width, __srcDimension.height, pShmInfo);
-               SysTryReturn(NID_UI_CTRL, pXvImage != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] failed to create a XvImage.");
+               XvImage* pXvImage = XvShmCreateImage(pDisplay, __xvPort, __savedColorFormat, 0, __currentSourceBufferSize.width, __currentSourceBufferSize.height, pShmInfo);
+               SysTryReturnResult(NID_UI_CTRL, pXvImage != null, E_SYSTEM, "Failed to create XvImage");
 
                pShmInfo->shmid = shmget(IPC_PRIVATE, pXvImage->data_size, IPC_CREAT | 0777);
                pShmInfo->shmaddr = pXvImage->data = (char*)shmat(pShmInfo->shmid, 0, 0);
@@ -1277,526 +686,514 @@ _OverlayAgent::PutXvImage(void)
                if (!XShmAttach(pDisplay, pShmInfo))
                {
                        XFree(pXvImage);
-                       SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] failed to XShmAttach.");
+                       SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Failed to XShmAttach.");
                        return E_SYSTEM;
                }
 
                __pXvImage = pXvImage;
                __pShmInfo = pShmInfo;
-               __colorFormat = __newColorFormat;
        }
 
-       memcpy(__pXvImage->data, __pRefUserByteBuffer->GetPointer(), __pXvImage->data_size);
-       __pRefUserByteBuffer = null;
-       __orgUsrImgDimension = usrDim;
+       if (__pXvImage == null)
+       {
+               SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] Failed to get XvImage");
+               return E_SYSTEM;
+       }
+
+       memcpy(__pXvImage->data, __pCurrentSourceBuffer->GetPointer(), __pXvImage->data_size);
+       __pCurrentSourceBuffer = null;
 
-       XvShmPutImage(pDisplay, __xvPort, __pixmap, gc, __pXvImage, 0, 0, __srcDimension.width, __srcDimension.height,
-                       __pixmapPhyRect.x, __pixmapPhyRect.y, __pixmapPhyRect.width, __pixmapPhyRect.height, False);
+       int imageWidth = 0;
+       int imageHeight = 0;
+       evas_object_image_size_get(__pImageObject, &imageWidth, &imageHeight);
 
+       GC gc= DefaultGCOfScreen(DefaultScreenOfDisplay(pDisplay));
+       XvShmPutImage(pDisplay, __xvPort, __pixmap, gc, __pXvImage, 0, 0, __currentSourceBufferSize.width, __currentSourceBufferSize.height, 0, 0, imageWidth, imageHeight, False);
        XSync(pDisplay, 0);
 
-       SysSecureLog(NID_UI_CTRL, "colorFormat : %x, src[%d,%d,%d, %d], dst [%d,%d,%d,%d]", __colorFormat, 0, 0, __srcDimension.width, __srcDimension.height,__pixmapPhyRect.x, __pixmapPhyRect.y, __pixmapPhyRect.width, __pixmapPhyRect.height);
+       if (__needToRellaocImage)
+       {
+               SysSecureLog(NID_UI_CTRL, "The current value of source buffer size is [%d,%d]", __currentSourceBufferSize.width, __currentSourceBufferSize.height);
+               SysSecureLog(NID_UI_CTRL, "The current value of destination XvImage size is [%d,%d]", imageWidth, imageHeight);
+               __needToRellaocImage = false;
+       }
 
-       return E_SUCCESS;
+       result r = __pRendererVE->SetFlushNeeded();
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r,"[%s] Propagating.", GetErrorMessage(r));
+
+       return r;
 }
 
 result
 _OverlayAgent::PutEvasImage(void)
 {
-       SysTryReturn(NID_UI_CTRL, __pImageObject, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] __pImageObject is null.");
-       SysTryReturn(NID_UI_CTRL, __pRefUserByteBuffer->GetPointer(), E_SYSTEM, E_SYSTEM, "[E_SYSTEM] __pUserBuffer is null.");
+       SysTryReturnResult(NID_UI_CTRL, __pImageObject != null, E_SYSTEM, "The current value of Renderer ImageObject is null");
+       SysTryReturnResult(NID_UI_CTRL, __pCurrentSourceBuffer->GetPointer() != null, E_SYSTEM, "The current value of Renderer byte buffer is null");
 
-       result r = E_SYSTEM;
+       result r = E_SUCCESS;
 
-       Dimension usrDim(__srcDimension.width,__srcDimension.height);
-       if(!usrDim.Equals(__orgUsrImgDimension) || __pOrgUserByteBuffer == null)
+       // Create new buffer to convert pixel format
+       if (__needToRellaocImage || __pConvertedSourceBuffer == null ||
+               !(__pConvertedSourceBuffer && (__pConvertedSourceBuffer->GetCapacity() == __pCurrentSourceBuffer->GetCapacity())))
        {
-               if(__pOrgUserByteBuffer)
+               if (__pConvertedSourceBuffer != null)
                {
-                       __pOrgUserByteBuffer->SetPosition(0);
-                       delete __pOrgUserByteBuffer;
-                       __pOrgUserByteBuffer = null;
+                       __pConvertedSourceBuffer->SetPosition(0);
+                       delete __pConvertedSourceBuffer;
+                       __pConvertedSourceBuffer = null;
                }
 
-               int bufSize = __srcDimension.width *__srcDimension.height * 4;
-               __pOrgUserByteBuffer = new (std::nothrow) ByteBuffer;
-               SysTryReturn(NID_UI_CTRL, __pOrgUserByteBuffer != null, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] __pOrgUserByteBuffer is null.");
+               __pConvertedSourceBuffer = new (std::nothrow) ByteBuffer;
+               SysTryReturnResult(NID_UI_CTRL, __pConvertedSourceBuffer != null, E_OUT_OF_MEMORY, "Failed to create a ByteBuffer for Evas Image Object.");
 
-               r = __pOrgUserByteBuffer->Construct(bufSize);
-               if(r != E_SUCCESS)
+               r = __pConvertedSourceBuffer->Construct(__currentSourceBufferSize.width * __currentSourceBufferSize.height * 4);
+               if (r != E_SUCCESS)
                {
-                       SysLogException(NID_UI_CTRL, r, "[%s] Failed to construct a __pOrgUserByteBuffer.", GetErrorMessage(r));
-                       delete __pOrgUserByteBuffer;
-                       __pOrgUserByteBuffer = null;
+                       delete __pConvertedSourceBuffer;
+                       __pConvertedSourceBuffer = null;
+                       SysLogException(NID_UI_CTRL, r, "[%s] Failed to construct a byte buffer for EvasImageObject.", GetErrorMessage(r));
+
                        return r;
                }
        }
 
-       __pOrgUserByteBuffer->SetPosition(0);
-
-       void* pImg = null;
-       if(__overlayAgentColorFormat == _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888)
-       {
-               r = __pOrgUserByteBuffer->SetArray(__pRefUserByteBuffer->GetPointer(), 0, __pOrgUserByteBuffer->GetCapacity());
-               SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r,"[%s] Propagating.", GetErrorMessage(r));
+       __pConvertedSourceBuffer->SetPosition(0);
 
-               pImg = (void*)__pOrgUserByteBuffer->GetPointer();
-               //_ImageUtil::ConvertPixelFormat(srcBuffer, MEDIA_PIXEL_FORMAT_RGBA8888, __srcDimension.width, __srcDimension.height, *pDstbuf, MEDIA_PIXEL_FORMAT_RGBA8888);
-       }
-       else
+       switch (__currentColorFormat)
        {
-               switch (__overlayAgentColorFormat)
-               {
-               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_RGB565:
-                       r = _ImageUtil::ConvertPixelFormat(*__pRefUserByteBuffer, MEDIA_PIXEL_FORMAT_RGB565LE, __srcDimension.width, __srcDimension.height, *__pOrgUserByteBuffer, MEDIA_PIXEL_FORMAT_BGRA8888);
-                       break;
-               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR:
-                       r = _ImageUtil::ConvertPixelFormat(*__pRefUserByteBuffer, MEDIA_PIXEL_FORMAT_YUV420P, __srcDimension.width, __srcDimension.height, *__pOrgUserByteBuffer, MEDIA_PIXEL_FORMAT_BGRA8888);
-                       break;
-               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_NV12:
-                       r = _ImageUtil::ConvertPixelFormat(*__pRefUserByteBuffer, MEDIA_PIXEL_FORMAT_NV12, __srcDimension.width, __srcDimension.height, *__pOrgUserByteBuffer, MEDIA_PIXEL_FORMAT_BGRA8888);
-                       break;
-               case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_UYVY:
-                       r = _ImageUtil::ConvertPixelFormat(*__pRefUserByteBuffer, MEDIA_PIXEL_FORMAT_UYVY422, __srcDimension.width, __srcDimension.height, *__pOrgUserByteBuffer, MEDIA_PIXEL_FORMAT_BGRA8888);
-                       break;
-               default:
-                       SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "The specified pixel format is not supported.");
-                       return E_UNSUPPORTED_FORMAT;
-               }
-
-               SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r,"[%s] Propagating.", GetErrorMessage(r));
-
-               pImg = (void*)(__pOrgUserByteBuffer->GetPointer());
-
+       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_ARGB8888:
+               r = __pConvertedSourceBuffer->SetArray(__pCurrentSourceBuffer->GetPointer(), 0, __pConvertedSourceBuffer->GetCapacity());
+               break;
+       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_RGB565:
+               r = _ImageUtil::ConvertPixelFormat(*__pCurrentSourceBuffer, MEDIA_PIXEL_FORMAT_RGB565LE, __currentSourceBufferSize.width, __currentSourceBufferSize.height, *__pConvertedSourceBuffer, MEDIA_PIXEL_FORMAT_BGRA8888);
+               break;
+       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_YCbCr420_PLANAR:
+               r = _ImageUtil::ConvertPixelFormat(*__pCurrentSourceBuffer, MEDIA_PIXEL_FORMAT_YUV420P, __currentSourceBufferSize.width, __currentSourceBufferSize.height, *__pConvertedSourceBuffer, MEDIA_PIXEL_FORMAT_BGRA8888);
+               break;
+       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_NV12:
+               r = _ImageUtil::ConvertPixelFormat(*__pCurrentSourceBuffer, MEDIA_PIXEL_FORMAT_NV12, __currentSourceBufferSize.width, __currentSourceBufferSize.height, *__pConvertedSourceBuffer, MEDIA_PIXEL_FORMAT_BGRA8888);
+               break;
+       case _OVERLAY_AGENT_BUFFER_PIXEL_FORMAT_UYVY:
+               r = _ImageUtil::ConvertPixelFormat(*__pCurrentSourceBuffer, MEDIA_PIXEL_FORMAT_UYVY422, __currentSourceBufferSize.width, __currentSourceBufferSize.height, *__pConvertedSourceBuffer, MEDIA_PIXEL_FORMAT_BGRA8888);
+               break;
+       default:
+               SysLogException(NID_UI_CTRL, E_UNSUPPORTED_FORMAT, "[E_UNSUPPORTED_FORMAT] The specified pixel format is not supported.");
+               return E_UNSUPPORTED_FORMAT;
        }
 
-       SysTryReturnResult(NID_UI_CTRL, pImg != null, E_SYSTEM, "[E_SYSTEM] converted image data is invalid.");
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r,"Propagating.");
 
-//     SysLog(NID_UI_CTRL, "__pUserBuffer : %x, size : %d", __pRefUserByteBuffer->GetPointer(),  __pRefUserByteBuffer->GetCapacity());
-//     SysLog(NID_UI_CTRL, "__pOrgBuffer : %x, size : %d", __pOrgUserByteBuffer->GetPointer(),  __pOrgUserByteBuffer->GetCapacity());
-//     SysLog(NID_UI_CTRL, "__srcDimension[%d, %d]",__srcDimension.width, __srcDimension.height);
+       __pCurrentSourceBuffer = null;
+       void* pImageData = (void*)(__pConvertedSourceBuffer->GetPointer());
+       SysTryReturnResult(NID_UI_CTRL, pImageData != null, E_SYSTEM, "The converted image data for Overlay Renderer VisualElement is invalid.");
 
-       evas_object_image_size_set(__pImageObject, __srcDimension.width, __srcDimension.height);
-       evas_object_image_filled_set(__pImageObject, EINA_TRUE);
-       evas_object_image_alpha_set(__pImageObject, false);
-       evas_object_image_data_set(__pImageObject, pImg);
-       evas_object_image_data_update_add(__pImageObject, 0, 0, __srcDimension.width, __srcDimension.height);
+       evas_object_image_size_set(__pImageObject, __currentSourceBufferSize.width, __currentSourceBufferSize.height);
+       evas_object_image_data_set(__pImageObject, pImageData);
+       evas_object_image_data_update_add(__pImageObject, 0, 0, __currentSourceBufferSize.width, __currentSourceBufferSize.height);
        evas_object_show(__pImageObject);
 
-       AdjustImageObject();
+       if (__needToRellaocImage)
+       {
+               SysSecureLog(NID_UI_CTRL, "The current value of source buffer bounds is [%d,%d,%d, %d]", 0, 0, __currentSourceBufferSize.width, __currentSourceBufferSize.height);
+               __needToRellaocImage = false;
+       }
 
-       __pVisualElement->SetFlushNeeded();
+       r = __pRendererVE->SetFlushNeeded();
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r,"[%s] Propagating.", GetErrorMessage(r));
 
-       __orgUsrImgDimension = usrDim;
-       __pRefUserByteBuffer = null;
+       return r;
+}
 
-       return E_SUCCESS;
+result
+_OverlayAgent::SetRendererFlushNeeded(void)
+{
+       return __pRendererVE->SetFlushNeeded();
 }
 
-void
-_OverlayAgent::UngrabXvPort(void)
+result
+_OverlayAgent::SetRotation(_OverlayAgentRotation rotation)
 {
-       if (__grabXvPort)
+       SysTryReturnResult(NID_UI_CTRL, __pRendererVE != null, E_SYSTEM, "The Renderer Visual Element is null");
+       SysTryReturnResult(NID_UI_CTRL, rotation < _OVERLAY_AGENT_ROTATION_MAX, E_INVALID_ARG, "The value of input rotation [%d] is invalid.", rotation);
+
+       if (rotation == __currentRotation)
        {
-               Display* pDisplay = (Display*) ecore_x_display_get();
-               Atom atom = XInternAtom(pDisplay, "_USER_WM_PORT_ATTRIBUTE_STREAM_OFF", False);
-               XvSetPortAttribute(pDisplay, __xvPort, atom, 1);
-               XvUngrabPort(pDisplay, __xvPort, 0);
+               return E_SUCCESS;
+       }
+
+       float initialZAngle = __pRendererVE->GetProperty(L"transform.rotation.z").ToFloat();
+       float rotatedZAngle = initialZAngle;
+
+       switch (rotation)
+       {
+       case _OVERLAY_AGENT_ROTATION_NONE: // fall through
+       case _OVERLAY_AGENT_ROTATION_NONE_LR: // fall through
+       case _OVERLAY_AGENT_ROTATION_NONE_UD:
+               rotatedZAngle = 0.0f;
+               break;
+
+       case _OVERLAY_AGENT_ROTATION_90: // fall through
+       case _OVERLAY_AGENT_ROTATION_90_LR: // fall through
+       case _OVERLAY_AGENT_ROTATION_90_UD:
+               rotatedZAngle = 90.0f;
+               break;
 
-               SysSecureLog(NID_UI_CTRL, "The current value of UngrabXvPort port is %d, pixmap is %d and style is %d", __xvPort, __pixmap, __style);
+       case _OVERLAY_AGENT_ROTATION_180: // fall through
+       case _OVERLAY_AGENT_ROTATION_180_LR: // fall through
+       case _OVERLAY_AGENT_ROTATION_180_UD:
+               rotatedZAngle = 180.0f;
+               break;
+
+       case _OVERLAY_AGENT_ROTATION_270: // fall through
+       case _OVERLAY_AGENT_ROTATION_270_LR: // fall through
+       case _OVERLAY_AGENT_ROTATION_270_UD:
+               rotatedZAngle = 270.0f;
+               break;
+
+       default:
+               break;
+       }
 
-               __isPortGrapped[__xvPort-__baseXvPort] = false;
-               __xvPort = -1;
-               __grabXvPort = false;
-               __overlayAgentXvPortCount--;
+       //Set bounds of rotated renderer
+       FloatRectangle rendererBounds = __standardRendererBounds;
+       if (rotatedZAngle == 90.0f || rotatedZAngle == 270.0f)
+       {
+               rendererBounds.x = __standardRendererBounds.x - ((__standardRendererBounds.height - __standardRendererBounds.width) / 2.0f);
+               rendererBounds.y = __standardRendererBounds.y + ((__standardRendererBounds.height - __standardRendererBounds.width) / 2.0f);
+               std::swap(rendererBounds.height, rendererBounds.width);
        }
-}
 
-bool
-_OverlayAgent::IsValidSourceDimension(const Dimension& dimension) const
-{
-       SysTryReturn(NID_UI_CTRL, dimension.width >= GetSrcRectMinWidth(), false, E_INVALID_ARG, "[E_INVALID_ARG] The width of dimension [%d] is under the minimum size.", dimension.width);
-       SysTryReturn(NID_UI_CTRL, dimension.height >= GetSrcRectMinHeight(), false, E_INVALID_ARG, "[E_INVALID_ARG] The height of dimension [%d] is under the minimum size.", dimension.height);
+       result r = __pRendererVE->SetBounds(rendererBounds);
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
 
-       SetLastResult(E_SUCCESS);
+       r = __pRendererVE->SetProperty(L"transform.rotation.z", rotatedZAngle);
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
+       SysLog(NID_UI_CTRL, "The current Overlay Renderer is rotated (%d -> %d)", static_cast<int>(initialZAngle), static_cast<int>(rotatedZAngle));
 
-       return true;
-}
+       switch (rotation)
+       {
+       case _OVERLAY_AGENT_ROTATION_NONE: // fall through
+       case _OVERLAY_AGENT_ROTATION_90: // fall through
+       case _OVERLAY_AGENT_ROTATION_180: // fall through
+       case _OVERLAY_AGENT_ROTATION_270:
+               r = __pRendererVE->SetProperty(L"transform.rotation.x", 0.0f);
+               r = __pRendererVE->SetProperty(L"transform.rotation.y", 0.0f);
+               break;
 
-bool
-_OverlayAgent::IsValidDestinationDimension(const FloatDimension& dimension) const
-{
-       FloatDimension phyDimF = _CoordinateSystemUtils::Transform(dimension);
-       Dimension phyDim = _CoordinateSystemUtils::ConvertToInteger(phyDimF);
+       case _OVERLAY_AGENT_ROTATION_NONE_UD: // fall through
+       case _OVERLAY_AGENT_ROTATION_180_UD: // fall through
+       case _OVERLAY_AGENT_ROTATION_90_LR: // fall through
+       case _OVERLAY_AGENT_ROTATION_270_LR:
+               r = __pRendererVE->SetProperty(L"transform.rotation.x", 180.0f);
+               r = __pRendererVE->SetProperty(L"transform.rotation.y", 0.0f);
+               SysLog(NID_UI_CTRL, "The current Overlay Renderer is flipped over up side down.");
+               break;
 
-       SysTryReturn(NID_UI_CTRL, (phyDim.width >= GetDstRectMinWidth() && phyDim.height >= GetDstRectMinHeight()), false, E_INVALID_ARG,
-                       "[E_INVALID_ARG] Dimension L[%.3f, %.3f] P[%d,%d] is over minimun size.", dimension.width, dimension.height, phyDim.width, phyDim.height);
+       case _OVERLAY_AGENT_ROTATION_NONE_LR: // fall through
+       case _OVERLAY_AGENT_ROTATION_180_LR: // fall through
+       case _OVERLAY_AGENT_ROTATION_90_UD: // fall through
+       case _OVERLAY_AGENT_ROTATION_270_UD:
+               r = __pRendererVE->SetProperty(L"transform.rotation.x", 0.0f);
+               r = __pRendererVE->SetProperty(L"transform.rotation.y", 180.0f);
+               SysLog(NID_UI_CTRL, "The current Overlay Renderer is flipped over left side right.");
+               break;
 
-       SysTryReturn(NID_UI_CTRL, __pSmartObject != null, false, E_SYSTEM, "[E_SYSTEM] __pSmartObject is null");
+       default:
+               break;
+       }
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
 
-       FloatRectangle testRect = __pVisualElement->GetBounds();
-       FloatRectangle containerPhyRectF = _CoordinateSystemUtils::Transform(testRect);
-       Dimension containerDim = _CoordinateSystemUtils::ConvertToInteger(FloatDimension(containerPhyRectF.width, containerPhyRectF.height));
+       __currentRotation = rotation;
 
-       SysTryReturn(NID_UI_CTRL, (phyDim.width <= containerDim.width && phyDim.height <= containerDim.height), false, E_INVALID_ARG,
-                       "[E_INVALID_ARG] RenderRect L[%.3f, %.3f] P[%d,%d] is bigger than container size [%d, %d]", dimension.width, dimension.height, phyDim.width, phyDim.height, containerDim.width, containerDim.height);
+       r = __pRendererVE->SetFlushNeeded();
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
 
-       return true;
+       return r;
 }
 
 result
-_OverlayAgent::AdjustImageObject(void)
+_OverlayAgent::SetDestination(const FloatDimension& dimension)
 {
-       SysTryReturn(NID_UI_CTRL, __pSmartObject != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The SmartObject is null");
-       SysTryReturn(NID_UI_CTRL, __pImageObject != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The ImageObject is null");
-       SysTryReturn(NID_UI_CTRL, __pVisualElement != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] The VisualElement is null");
-
-       int x = 0;
-       int y = 0;
-       int w = 0;
-       int h = 0;
-       int resizeRectX = 0;
-       int resizeRectY = 0;
-       int resizeRectW = 0;
-       int resizeRectH = 0;
-       int noImage = false;
-       int imgWidth = 0, imgHeight = 0;
-       //int orgX, orgY, orgW, orgH;
+       SysTryReturnResult(NID_UI_CTRL, __pParentVE != null, E_SYSTEM, "The Renderer Visual Element is null");
+       SysTryReturnResult(NID_UI_CTRL, __pRendererVE != null, E_SYSTEM, "The Renderer Visual Element is null");
+       if (__standardRendererBounds.width == dimension.width && __standardRendererBounds.height == dimension.height &&
+               __standardParentBounds.width == __pParentVE->GetBounds().width && __standardParentBounds.height == __pParentVE->GetBounds().height)
+       {
+               return E_SUCCESS;
+       }
 
-       FloatRectangle curRectF = __pVisualElement->GetBounds();
-       FloatRectangle curPhyRectF = _CoordinateSystemUtils::Transform(curRectF);
-       Rectangle curPhyRect = _CoordinateSystemUtils::ConvertToInteger(curPhyRectF);
-       SysLog(NID_UI_CTRL, "The current value of curPhyRect [%d, %d]", curPhyRect.width, curPhyRect.height);
+       //Set bounds of saved renderer
+       FloatRectangle parentBounds= __pParentVE->GetBounds();
 
-       if (__srcDimension.width == 0 || __srcDimension.height == 0)
+       if (parentBounds.width >= dimension.width)
+       {
+               __standardRendererBounds.x = (parentBounds.width - dimension.width) / 2.0f;
+               __standardRendererBounds.width = dimension.width;
+       }
+       else
        {
-               SysSecureLog(NID_UI_CTRL, "src dimension[%d, %d] is an initialized state", __srcDimension.width, __srcDimension.height);
-               noImage = true;
+               __standardRendererBounds.x = 0.0f;
+               __standardRendererBounds.width = parentBounds.width;
        }
 
-       // 1. setting renderRect resize region
-       if(__resizeRect.width == 0 || __resizeRect.height == 0)
+       if (parentBounds.height >= dimension.height)
        {
-               if (__pRenderImageObject)
-               {
-                       evas_object_geometry_get(__pRenderImageObject, NULL, NULL, &resizeRectW, &resizeRectH);
-               }
-               else
-               {
-                       resizeRectW = curPhyRect.width;
-                       resizeRectH = curPhyRect.height;
-               }
+               __standardRendererBounds.y = (parentBounds.height - dimension.height) / 2.0f;
+               __standardRendererBounds.height = dimension.height;
        }
        else
        {
-               resizeRectW = __resizeRect.width;
-               resizeRectH = __resizeRect.height;
+               __standardRendererBounds.y = 0.0f;
+               __standardRendererBounds.height = parentBounds.height;
        }
 
-       // 2. adjust RenderRect
-       x = curPhyRect.x;
-       y = curPhyRect.y;
-       w = curPhyRect.width;
-       h = curPhyRect.height;
-       SysSecureLog(NID_UI_CTRL, "container [%d, %d, %d, %d]", x, y, w, h);
+       //Set bounds of resizing renderer
+       float parentWidth = parentBounds.width;
+       float parentHeight = parentBounds.height;
+       FloatDimension inputDimension(dimension.width, dimension.height);
 
-       if(__pRenderImageObject)
+       Variant rotationAngle = __pRendererVE->GetProperty(L"transform.rotation.z");
+       if(rotationAngle.ToFloat() == 90.0f || rotationAngle.ToFloat() == 270.0f)
        {
-//             evas_object_geometry_get(__pRenderImageObject, &orgX, &orgY, &orgW, &orgH);
-//             SysLog(NID_UI_CTRL, "renderRect before [%d, %d, %d, %d]", orgX, orgY, orgW, orgH);
-
-               evas_object_resize(__pRenderImageObject, resizeRectW, resizeRectH);
-
-               resizeRectX = x + ((w - resizeRectW)/2);
-               resizeRectY = y + ((h - resizeRectH)/2);
-               evas_object_move(__pRenderImageObject, resizeRectX, resizeRectY);
-               evas_object_show(__pRenderImageObject);
+               std::swap(parentWidth, parentHeight);
+               std::swap(inputDimension.width, inputDimension.height);
+       }
 
-               SysSecureLog(NID_UI_CTRL, "renderRect [%d, %d, %d, %d]", resizeRectX, resizeRectY, resizeRectW, resizeRectH);
+       FloatRectangle rendererBounds = __standardRendererBounds;
 
-//             evas_object_geometry_get(__pRenderImageObject, &orgX, &orgY, &orgW, &orgH);
-//             SysLog(NID_UI_CTRL, "renderRect after adjust [%d, %d, %d, %d]", orgX, orgY, orgW, orgH);
+       if (parentWidth >= inputDimension.width)
+       {
+               rendererBounds.x = (parentBounds.width - inputDimension.width) / 2.0f;
+               rendererBounds.width = inputDimension.width;
        }
        else
        {
-               //evas_object_geometry_get(__pImageObject, &orgX, &orgY, &orgW, &orgH);
-               //SysLog(NID_UI_CTRL, "__pImageObject rect [%d, %d, %d, %d]", orgX, orgY, orgW, orgH);
+               rendererBounds.x = 0.0f;
+               rendererBounds.width = parentBounds.width;
+       }
 
-               // set region base x, y
-               resizeRectX = x;
-               resizeRectY = y;
+       if (parentHeight >= inputDimension.height)
+       {
+               rendererBounds.y = (parentBounds.height - inputDimension.height) / 2.0f;
+               rendererBounds.height = inputDimension.height;
        }
+       else
+       {
+               rendererBounds.y = 0.0f;
+               rendererBounds.height = parentBounds.height;
+       }
+       SysLog(NID_UI_CTRL, "The current bounds of resized renderer is [%.3f, %.3f, %.3f, %.3f]",
+               __standardRendererBounds.x, __standardRendererBounds.y, __standardRendererBounds.width, __standardRendererBounds.height);
 
-       SysSecureLog(NID_UI_CTRL, "resizeRect is [%d, %d, %d, %d]", resizeRectX, resizeRectY, resizeRectW, resizeRectH);
+       result r = __pRendererVE->SetBounds(rendererBounds);
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
 
-       if (__flushRotate)
-       {
-               int finalX, finalY, finalW, finalH;
+       r = __pRendererVE->SetFlushNeeded();
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
 
-               SysSecureLog(NID_UI_CTRL, "for rotate status operation");
+       __standardParentBounds = __pParentVE->GetBounds();
 
-               // 3. image object rotate
-               Evas_Map* pMap = evas_map_new(4);
-               evas_map_util_points_populate_from_object(pMap, __pImageObject);
+       return r;
+}
+
+result
+_OverlayAgent::SetAspectRatio(bool enable)
+{
+       return E_SUCCESS;
+}
 
-               SysSecureLog(NID_UI_CTRL, "center [%d, %d]", resizeRectX + (resizeRectW/2), resizeRectY + (resizeRectH/2));
-               evas_map_util_rotate(pMap, __userRotation, resizeRectX + (resizeRectW/2), resizeRectY + (resizeRectH/2));
+FloatRectangle
+_OverlayAgent::GetBounds(void) const
+{
+       SysTryReturn(NID_UI_CTRL, __pRendererVE != null, FloatRectangle(0.0f, 0.0f, 0.1f, 0.1f), E_SYSTEM, "The Renderer Visual Element is null");
+       return __standardRendererBounds;
+}
 
-               evas_object_map_set(__pImageObject, pMap);
-               evas_object_map_enable_set(__pImageObject, EINA_TRUE);
+result
+_OverlayAgent::CreateRendererVisualElement(const _Control& parentControl, const FloatRectangle& logicalBounds, const Rectangle& physicalBounds)
+{
 
-               evas_object_image_filled_set(__pImageObject, EINA_TRUE);
-               evas_object_show(__pImageObject);
-               evas_map_free(pMap);
+       //Create new VisualElement and insert it to Parent's VisualElement
+       unique_ptr<_OverlayVisualElement, visualElementDeleter> pRendererVE(new (std::nothrow) _OverlayVisualElement());
+       SysTryReturnResult(NID_UI_CTRL, pRendererVE != null, E_OUT_OF_MEMORY, "Memory allocation failed.");
 
-               SysSecureLog(NID_UI_CTRL, "rotate value is [%d]",__userRotation);
+       result r = pRendererVE->Construct();
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 
-               // 4. reset map coordinate
-               if (!noImage && __aspectRatio && __pRenderImageObject != null)
-               {
-                       //  don't do anything for a Render Rect,  only adjust an image object coordination again
-                       Dimension srcDim(__srcDimension.width, __srcDimension.height);
-                       if (__userRotation == _ROTATION_90 || __userRotation == _ROTATION_270 )
-                       {
-                               int tmp = srcDim.width;
-                               srcDim.width = srcDim.height;
-                               srcDim.height = tmp;
-//                     SysLog(NID_UI_CTRL, "src dim is swapped");
-                       }
+       pRendererVE->SetName("OverlayRenderer");
+       pRendererVE->SetShowState(true);
+       //pRendererVE->SetImplicitAnimationEnabled(true);
+       pRendererVE->SetImplicitAnimationEnabled(false);
+       pRendererVE->SetZOrderGroup(_CONTROL_LAYER_OVERLAY);
 
-                       SysSecureLog(NID_UI_CTRL, "src dimension [%d, %d]", srcDim.width, srcDim.height);
+       FloatPoint logicalPoint(0.0f, 0.0f);
+       if(__style == _OVERLAY_AGENT_STYLE_REGION_SW || __style == _OVERLAY_AGENT_STYLE_REGION_GL)
+       {
+               logicalPoint.x = logicalBounds.x;
+               logicalPoint.y = logicalBounds.y;
+       }
+       pRendererVE->SetBounds(FloatRectangle(logicalPoint.x, logicalPoint.y, logicalBounds.width, logicalBounds.height));
 
-                       float srcRatio = ((float)srcDim.width) / ((float)srcDim.height);
 
-                       float tmpWidth = (float)resizeRectW;
-                       float tmpHeight = tmpWidth / srcRatio;
+       __pParentVE = parentControl.GetVisualElement();
+       SysTryReturnResult(NID_UI_CTRL, __pParentVE != null, E_SYSTEM, "[E_SYSTEM] The current value of OverlayPanel's VisualElement is null.");
 
-                       if (resizeRectH < (int)tmpHeight)
-                       {
-                               finalH = resizeRectH;
-                               finalW = (int)((float)finalH * srcRatio);
-                       }
-                       else
-                       {
-                               finalW = resizeRectW;
-                               finalH = (int)((float)finalW / srcRatio);
-                       }
+       __pParentVE->SetName("OverlayPanel");
+       r = __pParentVE->InsertChild(pRendererVE.get(), null, true);
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 
-                       finalX = resizeRectX + ((resizeRectW - finalW) / 2);
-                       finalY = resizeRectY + ((resizeRectH - finalH) / 2);
-               }
-               else
-               {
-                       finalX = resizeRectX;
-                       finalY = resizeRectY;
-                       finalW = resizeRectW;
-                       finalH = resizeRectH;
-               }
+       r = __pParentVE->SetSurfaceOpaque(true);
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
 
-               //int p1, p2, p3, p4;
-               //evas_object_geometry_get(__pImageObject, &p1, &p2, &p3, &p4);
-               //SysLog(NID_UI_CTRL, "__pImageObject after rotate [%d, %d, %d, %d]", p1, p2, p3, p4);
 
-               SysSecureLog(NID_UI_CTRL, "final image object [%d, %d, %d, %d]", finalX, finalY, finalW, finalH);
+       // Get and Set ImageObject of Renderer VisualElement
+       _EflNode* pEflNode = dynamic_cast<_EflNode*>(pRendererVE->GetNativeNode());
+       SysTryReturnResult(NID_UI_CTRL, pEflNode != null, E_SYSTEM, "Failed to get EflNode from Renderer VisualElement.");
 
-               pMap = evas_map_new(4);
-               evas_map_util_points_populate_from_object(pMap, __pImageObject);
+       Evas_Object* pSmartObject = (Evas_Object*) pEflNode->GetGroupContainer();
+       SysTryReturnResult(NID_UI_CTRL, pSmartObject != null, E_SYSTEM, "Failed to get Group Container of Renderer VisualElement.");
 
-               evas_object_image_size_get(__pImageObject, &imgWidth, &imgHeight);
-               SysSecureLog(NID_UI_CTRL, "image object size is [%d, %d]", imgWidth, imgHeight);
+       Evas* pEvas = evas_object_evas_get(pSmartObject);
+       SysTryReturnResult(NID_UI_CTRL, pEvas != null, E_SYSTEM, "Failed to get Evas of Renderer VisualElement.");
 
-               switch(__userRotation)
-               {
-               case _ROTATION_0:
-                       if(__lrMirroring)
-                       {
-                               evas_map_point_coord_set(pMap, 1, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX, finalY + finalH, 0);
-                       }
-                       else if(__udMirroring)
-                       {
-                               evas_map_point_coord_set(pMap, 3, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX, finalY + finalH, 0);
-                       }
-                       else
-                       {
-                               evas_map_point_coord_set(pMap, 0, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX, finalY + finalH, 0);
-                       }
-                       break;
-               case _ROTATION_90:
-                       if(__lrMirroring)
-                       {
-                               evas_map_point_coord_set(pMap, 2, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX, finalY + finalH, 0);
-                       }
-                       else if(__udMirroring)
-                       {
-                               evas_map_point_coord_set(pMap, 0, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX, finalY + finalH, 0);
-                       }
-                       else
-                       {
-                               evas_map_point_coord_set(pMap, 3, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX, finalY + finalH, 0);
-                       }
-                       break;
-               case _ROTATION_180:
-                       if(__lrMirroring)
-                       {
-                               evas_map_point_coord_set(pMap, 3, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX, finalY + finalH, 0);
-                       }
-                       else if(__udMirroring)
-                       {
-                               evas_map_point_coord_set(pMap, 1, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX, finalY + finalH, 0);
-                       }
-                       else
-                       {
-                               evas_map_point_coord_set(pMap, 2, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX, finalY + finalH, 0);
-                       }
-                       break;
-               case _ROTATION_270:
-                       if(__lrMirroring)
-                       {
-                               evas_map_point_coord_set(pMap, 0, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX, finalY + finalH, 0);
-                       }
-                       else if(__udMirroring)
-                       {
-                               evas_map_point_coord_set(pMap, 2, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 1, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX, finalY + finalH, 0);
-                       }
-                       else
-                       {
-                               evas_map_point_coord_set(pMap, 1, finalX, finalY, 0);
-                               evas_map_point_coord_set(pMap, 2, finalX + finalW, finalY, 0);
-                               evas_map_point_coord_set(pMap, 3, finalX + finalW, finalY + finalH, 0);
-                               evas_map_point_coord_set(pMap, 0, finalX, finalY + finalH, 0);
-                       }
-                       break;
-               default:
-                       SysSecureLog(NID_UI_CTRL, "__userRotation[%d] is invalid", __userRotation);
-                       break;
-               }
+       Ecore_Evas* pEcoreEvas = ecore_evas_ecore_evas_get(pEvas);
+       SysTryReturnResult(NID_UI_CTRL, pEcoreEvas != null, E_SYSTEM, "Failed to get Ecore Evas of Renderer VisualElement.");
 
-               if(imgWidth > 0 && imgHeight > 0)
-               {
-                       evas_map_point_image_uv_set(pMap, 0, 0, 0);
-                       evas_map_point_image_uv_set(pMap, 1, imgWidth, 0);
-                       evas_map_point_image_uv_set(pMap, 2, imgWidth, imgHeight);
-                       evas_map_point_image_uv_set(pMap, 3, 0, imgHeight);
-               }
+       __pImageObject = evas_object_image_add(pEvas);
+       SysTryReturnResult(NID_UI_CTRL, __pImageObject != null, E_SYSTEM, "Failed to get Renderer Image Object.");
 
-               evas_object_map_set(__pImageObject, pMap);
-               evas_object_map_enable_set(__pImageObject, EINA_TRUE);
-               evas_map_free(pMap);
+       evas_object_name_set(__pImageObject, "OverlayRenderer");
+       evas_object_image_size_set(__pImageObject, physicalBounds.width, physicalBounds.height);
+       evas_object_image_alpha_set(__pImageObject, false);
+       evas_object_image_filled_set(__pImageObject, EINA_TRUE);
+       evas_object_resize(__pImageObject, physicalBounds.width, physicalBounds.height);
+       evas_object_move(__pImageObject, physicalBounds.x, physicalBounds.y);
+       evas_object_hide(__pImageObject);
+       pRendererVE->SetImageObject(__pImageObject);
 
-               evas_object_image_filled_set(__pImageObject, EINA_TRUE);
-               evas_object_show(__pImageObject);
-       }
-       else
+
+       DisplayContext* pDisplayContext = parentControl.GetRootWindow()->GetDisplayContext();
+       SysTryReturnResult(NID_UI_CTRL, pDisplayContext != null, E_SYSTEM, "[E_SYSTEM] The current value of RootWindow's DisplayContext is null.");
+
+       unique_ptr<VisualElementSurface> pRendererSurface(_VisualElementSurfaceImpl::CreateSurfaceUsingExistingObjectN(*pDisplayContext, (Handle)__pImageObject, Dimension(physicalBounds.width, physicalBounds.height)));
+       SysTryReturnResult(NID_UI_CTRL, pRendererSurface != null, E_SYSTEM, "[E_SYSTEM] The current value of RootWindow's DisplayContext is null.");
+
+       r = pRendererVE->SetSurface(pRendererSurface.release());
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       r = pRendererVE->SetFlushNeeded();
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+
+       pRendererVE->SetAnchor(FloatPoint(0.5f, 0.5f));
+       __pRendererVE = pRendererVE.release();
+       __standardRendererBounds = __pRendererVE->GetBounds();
+
+       if (__style == _OVERLAY_AGENT_STYLE_REGION_SW || __style == _OVERLAY_AGENT_STYLE_PANEL_SW)
        {
-               SysSecureLog(NID_UI_CTRL, "not for rotate status operation");
+               evas_object_image_pixels_get_callback_set(__pImageObject, OnEvasImageDamaged,(void*)this);
+       }
 
-               if (!noImage && __aspectRatio && __pRenderImageObject != null)
-               {
-                       Dimension srcDim(__srcDimension.width, __srcDimension.height);
-                       SysSecureLog(NID_UI_CTRL, "src dimension is [%d, %d]", srcDim.width, srcDim.height);
+       return r;
+}
 
-                       float srcRatio = ((float)srcDim.width) / ((float)srcDim.height);
-                       float tmpWidth = (float)resizeRectW;
-                       float tmpHeight = tmpWidth / srcRatio;
+result
+_OverlayAgent::CreatePixmap(const Rectangle& physicalBounds)
+{
+       //Set size of pixmap
+       Dimension pixmapSize(physicalBounds.width, physicalBounds.height);
+       SysTryReturnResult(NID_UI_CTRL, (pixmapSize.width >= GetDstRectMinWidth()) && (pixmapSize.height >= GetDstRectMinHeight()),
+               E_SYSTEM, "input size (%d, %d) is too small to create a pixmap",pixmapSize.width, pixmapSize.height);
 
-                       Rectangle lastDst;
-                       if (resizeRectH < (int)tmpHeight)
-                       {
-                               lastDst.height = resizeRectH;
-                               lastDst.width = (int)((float)lastDst.height * srcRatio);
-                       }
-                       else
-                       {
-                               lastDst.width = resizeRectW;
-                               lastDst.height = (int)((float)lastDst.width / srcRatio);
-                       }
+       // Create pixmap
+       Display* pDisplay = (Display*)ecore_x_display_get();
+       SysTryReturnResult(NID_UI_CTRL, pDisplay != null, E_SYSTEM, "The current value of Display is null");
+
+       __pixmap = XCreatePixmap(pDisplay, DefaultRootWindow(pDisplay), pixmapSize.width, pixmapSize.height, DefaultDepth(pDisplay, DefaultScreen(pDisplay)));
+       SysTryReturnResult(NID_UI_CTRL, __pixmap != 0, E_SYSTEM, "Failed to create a pixmap of Overlay Agent");
 
-                       lastDst.x = resizeRectX + ((resizeRectW - lastDst.width) / 2);
-                       lastDst.y = resizeRectY + ((resizeRectH - lastDst.height) / 2);
+       GC gc = XCreateGC(pDisplay, __pixmap, 0,0);
+       SysTryReturnResult(NID_UI_CTRL, gc > 0, E_SYSTEM, "Failed to create Graphic Contexts");
 
-//                     evas_object_geometry_get(__pImageObject, &orgX, &orgY, &orgW, &orgH);
-//                     SysLog(NID_UI_CTRL, "__pImageObject before [%d, %d, %d, %d]", orgX, orgY, orgW, orgH);
+       //Set initial color
+       XSetForeground(pDisplay, gc, (long unsigned int)(Color(0xff000000).GetRGB32()));
+       XFillRectangle(pDisplay, __pixmap, gc, 0, 0, pixmapSize.width, pixmapSize.height);
+       XSync(pDisplay, 0);
+       XFreeGC(pDisplay, gc);
 
-                       evas_object_resize(__pImageObject, lastDst.width, lastDst.height);
-                       evas_object_move(__pImageObject, lastDst.x, lastDst.y);
+       //Set evas native surface
+       Evas_Native_Surface evasNativeSuface = {0,};
 
-//                     evas_object_geometry_get(__pImageObject, &orgX, &orgY, &orgW, &orgH);
-//                     SysLog(NID_UI_CTRL, "__pImageObject after [%d, %d, %d, %d]", orgX, orgY, orgW, orgH);
+       evasNativeSuface.version = EVAS_NATIVE_SURFACE_VERSION;
+       evasNativeSuface.type = EVAS_NATIVE_SURFACE_X11;
+       evasNativeSuface.data.x11.visual = ecore_x_default_visual_get(ecore_x_display_get(), ecore_x_default_screen_get());
+       evasNativeSuface.data.x11.pixmap = __pixmap;
 
-                       SysSecureLog(NID_UI_CTRL, "Ratio on / lastDst [%d, %d, %d, %d]",lastDst.x, lastDst.y, lastDst.width, lastDst.height);
-               }
-               else
-               {
-                       evas_object_image_size_get(__pImageObject, &imgWidth, &imgHeight);
-                       SysSecureLog(NID_UI_CTRL, "image object size is [%d, %d]", imgWidth, imgHeight);
+       evas_object_lower(__pImageObject);
+       evas_object_image_native_surface_set(__pImageObject, &evasNativeSuface);
 
-                       Evas_Map* pMap = evas_map_new(4);
-                       evas_map_util_points_populate_from_object(pMap, __pImageObject);
+       __pixmapDamageHandle = ecore_x_damage_new(__pixmap, ECORE_X_DAMAGE_REPORT_RAW_RECTANGLES);
+       SysTryCatch(NID_UI_CTRL, __pixmapDamageHandle != 0, , E_SYSTEM, "[E_SYSTEM] Failed to create a damage object");
 
-                       evas_map_point_coord_set(pMap, 0, resizeRectX, resizeRectY, 0);
-                       evas_map_point_coord_set(pMap, 1, resizeRectX+resizeRectW, resizeRectY, 0);
-                       evas_map_point_coord_set(pMap, 2, resizeRectX+resizeRectW, resizeRectY+resizeRectH, 0);
-                       evas_map_point_coord_set(pMap, 3, resizeRectX, resizeRectY+resizeRectH, 0);
+       __pPixmapEventHandler = ecore_event_handler_add(ECORE_X_EVENT_DAMAGE_NOTIFY, OnPixmapDamaged, (void*)this);
+       SysTryCatch(NID_UI_CTRL, __pPixmapEventHandler != null, , E_SYSTEM, "[E_SYSTEM] Failed to add a pixmap damage event handle");
 
-                       if(imgWidth > 0 && imgHeight > 0)
-                       {
-                               evas_map_point_image_uv_set(pMap, 0, 0, 0);
-                               evas_map_point_image_uv_set(pMap, 1, imgWidth, 0);
-                               evas_map_point_image_uv_set(pMap, 2, imgWidth, imgHeight);
-                               evas_map_point_image_uv_set(pMap, 3, 0, imgHeight);
-                       }
+       return E_SUCCESS;
 
-                       evas_object_map_set(__pImageObject, pMap);
-                       evas_object_map_enable_set(__pImageObject, EINA_TRUE);
-                       evas_map_free(pMap);
-               }
+CATCH:
+       if (__pPixmapEventHandler)
+       {
+               ecore_event_handler_del(__pPixmapEventHandler);
+               __pPixmapEventHandler = null;
+       }
+
+       if (__pixmapDamageHandle)
+       {
+               ecore_x_damage_free(__pixmapDamageHandle);
+               __pixmapDamageHandle = 0;
+       }
 
-               evas_object_image_filled_set(__pImageObject, EINA_TRUE);
-               evas_object_show(__pImageObject);
+       if (__pixmap)
+       {
+               XFreePixmap((Display*)ecore_x_display_get(), __pixmap);
+               __pixmap = 0;
        }
 
-       __pVisualElement->SetFlushNeeded();
+       return E_SYSTEM;
+}
 
-       return E_SUCCESS;
+Pixmap
+_OverlayAgent::GetPixmap(void) const
+{
+       return __pixmap;
+}
+
+Evas_Object*
+_OverlayAgent::GetRendererImageObject(void) const
+{
+       return __pImageObject;
+}
+
+bool
+_OverlayAgent::IsValidDestinationDimension(const FloatDimension& dimension) const
+{
+       FloatDimension physicalDimensionF = _CoordinateSystemUtils::Transform(dimension);
+       Dimension physicalDimension = _CoordinateSystemUtils::ConvertToInteger(physicalDimensionF);
+       SysTryReturn(NID_UI_CTRL, (physicalDimension.width >= GetDstRectMinWidth() && physicalDimension.height >= GetDstRectMinHeight()), false, E_INVALID_ARG,
+                       "[E_INVALID_ARG] The size of input dimension (logical size : [%.3f, %.3f], physical size : [%d,%d]) is under minimun size."
+                       ,dimension.width, dimension.height, physicalDimension.width, physicalDimension.height);
+
+       FloatRectangle parentBounds = __pParentVE->GetBounds();
+       SysTryReturn(NID_UI_CTRL, (dimension.width <= parentBounds.width || dimension.height <= parentBounds.height), false, E_INVALID_ARG,
+                       "[E_INVALID_ARG] The size of input dimension[%.3f, %.3f] is over maximum size[%.3f,%.3f]."
+                       ,dimension.width, dimension.height, parentBounds.width, parentBounds.height);
+
+       return true;
 }
 
 int
 _OverlayAgent::GetOverlayAgentCount(void)
 {
-       return __overlayAgentcount;
+       return __overlayAgentCount;
 }
 
 IListT<bool>*
@@ -1851,7 +1248,7 @@ _OverlayAgent::GetPixelFormatListN(void)
                __OverlayAgentBufferPixelFormat[0] = set;
        }
 
-       std::unique_ptr< ArrayListT<bool> > pFormatList( new (std::nothrow) ArrayListT<bool>());
+       std::unique_ptr< ArrayListT<bool> > pFormatList(new (std::nothrow) ArrayListT<bool>());
        SysTryReturn(NID_UI_CTRL, pFormatList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] failed to create a list instance");
 
        result r = pFormatList->Construct();
@@ -1867,16 +1264,33 @@ _OverlayAgent::GetPixelFormatListN(void)
 }
 
 result
-_OverlayAgent::EvaluateBounds(OverlayAgentEvaluationOption option, Rectangle& rect, bool& modified)
+_OverlayAgent::EvaluateBounds(OverlayAgentEvaluationOption option, FloatRectangle& rect, bool& modified)
 {
        modified = false;
-       SysTryReturnResult(NID_UI_CTRL, rect.width > 0 && rect.height > 0, E_INVALID_ARG, "[E_INVALID_ARG] The size of input rectangle(%d, %d) is invalid.", rect.width, rect.height);
+       SysTryReturnResult(NID_UI_CTRL, rect.width > 0.0f && rect.height > 0.0f,
+               E_INVALID_ARG, "The size of input rectangle(%.3f, %.3f) is invalid.", rect.width, rect.height);
+
+       Rectangle logicalEvaluatingBounds = _CoordinateSystemUtils::ConvertToInteger(rect);
+       SysTryReturnResult(NID_UI_CTRL, logicalEvaluatingBounds.width > 0 && logicalEvaluatingBounds.height > 0,
+               E_INVALID_ARG, "The size of logical rectangle(%d, %d) is invalid.", logicalEvaluatingBounds.width, logicalEvaluatingBounds.height);
+
+       Rectangle physicalRect(_CoordinateSystemUtils::Transform(logicalEvaluatingBounds));
+       SysTryReturnResult(NID_UI_CTRL, physicalRect.width > 0 && physicalRect.height > 0,
+               E_INVALID_ARG, "The size of physical rectangle(%d, %d) is invalid.", physicalRect.width, physicalRect.height);
+
+       int physicalMinWidth = GetDstRectMinWidth();
+       int physicalMinHeight = GetDstRectMinHeight();
+       SysTryReturnResult(NID_UI_CTRL, physicalMinWidth > 0 && physicalMinHeight > 0, E_SYSTEM, "The value of overlay control's Min width and Min height are invalid.");
+
+       const int widthUnit = GetWidthUnit();
+       const int heightUnit = GetHeightUnit();
+       SysTryReturnResult(NID_UI_CTRL, widthUnit > 0 && heightUnit > 0, E_SYSTEM, "The value of overlay control's width Unit and height Unit are invalid.");
 
        int screenWidth = _Screen::GetWidth();
        int screenHeight = _Screen::GetHeight();
-       SysTryReturnResult(NID_UI_CTRL, screenWidth > 0 && screenHeight > 0, E_INVALID_ARG, "[E_SYSTEM] The value of screen size is invalid.");
+       SysTryReturnResult(NID_UI_CTRL, screenWidth > 0 && screenHeight > 0, E_SYSTEM, "The value of screen size is invalid.");
 
-       // if orientation status of screen is landscape mode, swap width and height.
+       //If orientation status of screen is landscape mode, swap width and height.
        {
                _EcoreEvas* pEcoreEvas = GetEcoreEvasMgr()->GetEcoreEvas();
                int orientation = ecore_evas_rotation_get(pEcoreEvas->GetEcoreEvas());
@@ -1889,41 +1303,41 @@ _OverlayAgent::EvaluateBounds(OverlayAgentEvaluationOption option, Rectangle& re
                        SysSecureLog(NID_UI_CTRL, "The current value of device screen width is %d, device screen height is %d and orientation is %d", screenWidth, screenHeight, orientation);
                }
        }
-       const int widthUnit = GetWidthUnit();
-       const int heightUnit = GetHeightUnit();
-       SysTryReturnResult(NID_UI_CTRL, widthUnit > 0 && heightUnit > 0, E_SYSTEM, "[E_SYSTEM] The value of overlay control's width Unit and height Unit are invalid.");
 
        int physicalMaxWidth= screenWidth - (screenWidth % widthUnit);
        int physicalMaxHeight = screenHeight - (screenHeight % heightUnit);
        int logicalMaxWidth = _CoordinateSystemUtils::InverseHorizontalTransform(physicalMaxWidth);
        int logicalMaxHeight = _CoordinateSystemUtils::InverseVerticalTransform(physicalMaxHeight);
-       SysSecureLog(NID_UI_CTRL, "The physical Max size of overlay control is (%d, %d) and logical Max size of overlay control is (%d, %d)", physicalMaxWidth, physicalMaxHeight, logicalMaxWidth, logicalMaxHeight);
-
-       int dstMinWidth = GetDstRectMinWidth();
-       int dstMinHeight = GetDstRectMinHeight();
-       SysTryReturnResult(NID_UI_CTRL, dstMinWidth > 0 && dstMinHeight > 0, E_SYSTEM, "[E_SYSTEM] The value of overlay control's Min width and Min height are invalid.");
 
-       Rectangle physicalRect(_CoordinateSystemUtils::Transform(rect));
        int widthReminder = physicalRect.width % widthUnit;
        int heightReminder = physicalRect.height % heightUnit;
 
+       //Fix one pixel error when coordinate system transform
+       if (widthReminder == 1)
+       {
+               physicalRect.width -= 1;
+               widthReminder = physicalRect.width % widthUnit;
+       }
+
+       if (heightReminder == 1)
+       {
+               physicalRect.height -= 1;
+               heightReminder = physicalRect.height % heightUnit;
+       }
+
        switch (option)
        {
        case OVERLAY_AGENT_EVALUATION_OPTION_GREATER_THAN:
                {
-                       if (physicalRect.width > physicalMaxWidth || physicalRect.height > physicalMaxHeight)
+                       if (logicalEvaluatingBounds.width > logicalMaxWidth || logicalEvaluatingBounds.height > logicalMaxHeight)
                        {
-                               modified = false;
-                               SysLogException(NID_UI_CTRL, E_UNSUPPORTED_OPTION, "[E_UNSUPPORTED_OPTION] The size of input rect exceeds physical maximun size.");
-
+                               SysLogException(NID_UI_CTRL, E_UNSUPPORTED_OPTION, "[E_UNSUPPORTED_OPTION] The size of input rect exceeds logical maximun size.");
                                return E_UNSUPPORTED_OPTION;
                        }
 
-                       if (rect.width > logicalMaxWidth || rect.height > logicalMaxHeight)
+                       if (physicalRect.width > physicalMaxWidth || physicalRect.height > physicalMaxHeight)
                        {
-                               modified = false;
-                               SysLogException(NID_UI_CTRL, E_UNSUPPORTED_OPTION, "[E_UNSUPPORTED_OPTION] The size of input rect exceeds logical maximun size.");
-
+                               SysLogException(NID_UI_CTRL, E_UNSUPPORTED_OPTION, "[E_UNSUPPORTED_OPTION] The size of input rect exceeds physical maximun size.");
                                return E_UNSUPPORTED_OPTION;
                        }
 
@@ -1940,22 +1354,21 @@ _OverlayAgent::EvaluateBounds(OverlayAgentEvaluationOption option, Rectangle& re
                        physicalRect.width -= widthReminder;
                        physicalRect.height -= heightReminder;
 
-                       if (physicalRect.width < dstMinWidth)
+                       if (physicalRect.width < physicalMinWidth)
                        {
-                               physicalRect.width = dstMinWidth;
+                               physicalRect.width = physicalMinWidth;
                        }
 
-                       if (physicalRect.height < dstMinHeight)
+                       if (physicalRect.height < physicalMinHeight)
                        {
-                               physicalRect.height = dstMinHeight;
+                               physicalRect.height = physicalMinHeight;
                        }
                }
                break;
        case OVERLAY_AGENT_EVALUATION_OPTION_LESS_THAN:
                {
-                       if (physicalRect.width < dstMinWidth || physicalRect.height < dstMinHeight)
+                       if (physicalRect.width < physicalMinWidth || physicalRect.height < physicalMinHeight)
                        {
-                               modified = false;
                                SysLogException(NID_UI_CTRL, E_UNSUPPORTED_OPTION, "[E_UNSUPPORTED_OPTION] The size of input rect is under minimun size.");
 
                                return E_UNSUPPORTED_OPTION;
@@ -1977,28 +1390,32 @@ _OverlayAgent::EvaluateBounds(OverlayAgentEvaluationOption option, Rectangle& re
                break;
        default:
                {
-                       modified = false;
                        SysLogException(NID_UI_CTRL, E_UNSUPPORTED_OPTION, "[E_UNSUPPORTED_OPTION] The input option is an invalid.");
 
                        return E_UNSUPPORTED_OPTION;
                }
        }
 
-       Rectangle originalInputRect(rect);
-       rect = _CoordinateSystemUtils::InverseTransform(physicalRect);
+       FloatRectangle originalInputRect(rect);
+       rect = _CoordinateSystemUtils::ConvertToFloat(_CoordinateSystemUtils::InverseTransform(physicalRect));
+       rect.x = originalInputRect.x;
+       rect.y = originalInputRect.y;
 
        if (rect != originalInputRect)
        {
-               SysSecureLog(NID_UI_CTRL, "The rect as a input parameter is adjusted. original rect(%d, %d, %d, %d) is changed to (%d, %d, %d, %d)",
+               modified = true;
+               SysLog(NID_UI_CTRL, "The input bounds [%.3f, %.3f, %.3f, %.3f] is modified to [%.3f, %.3f, %.3f, %.3f]",
                                originalInputRect.x, originalInputRect.y, originalInputRect.width, originalInputRect.height,
                                rect.x, rect.y, rect.width, rect.height);
-               modified = true;
        }
-
-       SysLog(NID_UI_CTRL, "The current size of valid bounds that is evaluated is (%d, %d, %d, %d)", rect.x, rect.y, rect.width, rect.height);
+       else
+       {
+               SysLog(NID_UI_CTRL, "The evaluated bounds [%.3f, %.3f, %.3f, %.3f] is valid.",
+                       rect.x, rect.y, rect.width, rect.height);
+       }
 
        result r = GetLastResult();
-       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
+       SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
 
        return r;
 }
@@ -2033,6 +1450,7 @@ _OverlayAgent::GetDstRectMinWidth(void)
                SysTryReturn(NID_UI_CTRL, value > 0, -1, E_SYSTEM, "[E_SYSTEM] Failed to get Overlay info from registry");
 
                __dstRectMinWidth = value;
+               SysLog(NID_UI_CTRL, "The overlay control's minimum width of destination is [%d]", __dstRectMinWidth);
        }
 
        SetLastResult(E_SUCCESS);
@@ -2049,6 +1467,7 @@ _OverlayAgent::GetDstRectMinHeight(void)
                SysTryReturn(NID_UI_CTRL, value > 0, -1, E_SYSTEM, "[E_SYSTEM] Failed to get Overlay info from registry");
 
                __dstRectMinHegith = value;
+               SysLog(NID_UI_CTRL, "The overlay control's minimum height of destination is [%d]", __dstRectMinHegith);
        }
 
        SetLastResult(E_SUCCESS);
@@ -2065,6 +1484,7 @@ _OverlayAgent::GetSrcRectMinWidth(void)
                SysTryReturn(NID_UI_CTRL,  value > 0, -1, E_SYSTEM, "[E_SYSTEM] Failed to get Overlay info from registry");
 
                __srcRectMinWidth = value;
+               SysLog(NID_UI_CTRL, "The overlay control's minimum width of source buffer is [%d]", __srcRectMinWidth);
        }
 
        SetLastResult(E_SUCCESS);
@@ -2081,6 +1501,7 @@ _OverlayAgent::GetSrcRectMinHeight(void)
                SysTryReturn(NID_UI_CTRL,  value > 0, -1, E_SYSTEM, "[E_SYSTEM] Failed to get Overlay info from registry");
 
                __srcRectMinHegith = value;
+               SysLog(NID_UI_CTRL, "The overlay control's minimum height of source buffer is [%d]", __srcRectMinHegith);
        }
 
        SetLastResult(E_SUCCESS);
@@ -2097,6 +1518,7 @@ _OverlayAgent::GetWidthUnit(void)
                SysTryReturn(NID_UI_CTRL,  value > 0, -1, E_SYSTEM, "[E_SYSTEM] Failed to get Overlay info from registry");
 
                __overlayWidthUnit = value;
+               SysLog(NID_UI_CTRL, "The overlay control's unit width is [%d]", __overlayWidthUnit);
        }
 
        SetLastResult(E_SUCCESS);
@@ -2113,6 +1535,7 @@ _OverlayAgent::GetHeightUnit(void)
                SysTryReturn(NID_UI_CTRL,  value > 0, -1, E_SYSTEM, "[E_SYSTEM] Failed to get Overlay info from registry");
 
                __overlayHeightUnit = value;
+               SysLog(NID_UI_CTRL, "The overlay control's unit height is [%d]", __overlayHeightUnit);
        }
 
        SetLastResult(E_SUCCESS);
@@ -2129,66 +1552,12 @@ _OverlayAgent::GetMaxCount(void)
                SysTryReturn(NID_UI_CTRL,  value > 0, -1, E_SYSTEM, "[E_SYSTEM] Failed to get Overlay info from registry");
 
                __overlayMaxCount = value;
+               SysLog(NID_UI_CTRL, "The overlay control's maximum count is [%d]", __overlayMaxCount);
        }
 
        SetLastResult(E_SUCCESS);
 
        return __overlayMaxCount;
 }
-
-void
-_OverlayAgent::SetEvasImageDirtyCallback(void)
-{
-       if (__pImageObject)
-       {
-               evas_object_image_pixels_get_callback_set(__pImageObject, OnEvasImageDamaged,(void*)this);
-       }
-}
-
-bool
-_OverlayAgent::GetEvasImageDirtyFlag(void) const
-{
-       return __evasImageDamaged;
-}
-
-void
-_OverlayAgent::SetEvasImageDirtyFlag(bool dirty)
-{
-       __evasImageDamaged = dirty;
-}
-
-result
-_OverlayAgent::MoveChildToTop(const _Control& child)
-{
-       _EflNode* pEflNode = null;
-       Evas_Object* pSmartObject = null;
-
-       _VisualElement* pChildVE = child.GetVisualElement();
-       SysTryReturn(NID_UI_CTRL, pChildVE != null, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] pChildVE is null.");
-
-       pEflNode = dynamic_cast<_EflNode*>(pChildVE->GetNativeNode());
-       SysTryReturn(NID_UI_CTRL, pEflNode != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pEflNode is null" );
-
-       pSmartObject = (Evas_Object*)pEflNode->GetGroupContainer();
-       SysTryReturn(NID_UI_CTRL, pSmartObject != null, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] pSmartObject is null" );
-
-       evas_object_raise(pSmartObject);
-
-       return E_SUCCESS;
-}
-
-Dimension
-_OverlayAgent::GetPrevCbImageDimension(void) const
-{
-       return __orgCbImgDimension;
-}
-
-result
-_OverlayAgent::SetPrevCbImageDimension(const Dimension& imgDim)
-{
-       __orgCbImgDimension = imgDim;
-       return E_SUCCESS;
-}
-
 }}} // Tizen::Ui