Apply Perforcemance improvement for GetRootWindow(), GetAbsoluteBounds() function
authorJaewon Cho <jaewon7.cho@samsung.com>
Thu, 27 Jun 2013 10:57:50 +0000 (19:57 +0900)
committerJaewon Cho <jaewon7.cho@samsung.com>
Thu, 27 Jun 2013 10:58:14 +0000 (19:58 +0900)
Change-Id: Ibdad75668f9ad91f1852f67804da6bf00e344911
Signed-off-by: Jaewon Cho <jaewon7.cho@samsung.com>
src/ui/FUi_Control.cpp
src/ui/inc/FUi_Control.h

index c69264d..f154744 100644 (file)
@@ -1052,6 +1052,44 @@ _Control::Accept(Visitor& visitor) const
 }
 
 void
+_Control::InvalidateHierarchyRootWindow(void)
+{
+       struct _Visitor
+               : public Visitor
+       {
+               virtual VisitType Visit(_Control& control)
+               {
+                       control.__needRecalcRootWindow = true;
+                       control.__pRootWindow = null;
+
+                       return VISIT_DOWNWARD;
+               }
+       };
+
+       _Visitor visitor;
+       Accept(visitor);
+}
+
+void
+_Control::InvalidateHierarchyAbsoluteBounds(void)
+{
+       struct _Visitor
+               : public Visitor
+       {
+               virtual VisitType Visit(_Control& control)
+               {
+                       control.__needRecalcAbsBounds = true;
+                       control.__needRecalcAbsBoundsF = true;
+
+                       return VISIT_DOWNWARD;
+               }
+       };
+
+       _Visitor visitor;
+       Accept(visitor);
+}
+
+void
 _Control::Draw(bool recursive)
 {
        ClearLastResult();
@@ -1777,6 +1815,8 @@ result
 _Control::EndAttaching(_Control& child)
 {
        child.SetParent(this);
+       child.InvalidateHierarchyRootWindow();
+       child.InvalidateHierarchyAbsoluteBounds();
 
        FloatRectangle floatBounds(child.GetBoundsF().x, child.GetBoundsF().y, child.GetBoundsF().width, child.GetBoundsF().height);
 
@@ -2054,6 +2094,8 @@ _Control::DetachChild(_Control& child)
 
        SysAssert(GetLastResult() == E_SUCCESS);
        UpdateFocusList();
+       child.InvalidateHierarchyRootWindow();
+
        return E_SUCCESS;
 }
 
@@ -2517,6 +2559,11 @@ _Control::GetRootWindow(void) const
 {
        ClearLastResult();
 
+       if (!__needRecalcRootWindow && __pRootWindow != this)
+       {
+               return __pRootWindow;
+       }
+
        struct _Visitor
                : public Visitor
        {
@@ -2541,6 +2588,10 @@ _Control::GetRootWindow(void) const
        Accept(visitor);
 
        SysAssert(GetLastResult() == E_SUCCESS);
+
+       const_cast<_Control*>(this)->__pRootWindow = visitor.pRoot;
+       const_cast<_Control*>(this)->__needRecalcRootWindow = false;
+
        return visitor.pRoot;
 }
 
@@ -3231,6 +3282,11 @@ _Control::SetBoundsFinal(const FloatRectangle& newBounds, bool changeLayoutBaseR
                }
        }
 
+       if (moved || resized)
+       {
+               InvalidateHierarchyAbsoluteBounds();
+       }
+
        ClearLastResult();
        return E_SUCCESS;
 }
@@ -3624,6 +3680,9 @@ _Control::GetClientBoundsF(const Tizen::Graphics::FloatDimension& size) const
 Rectangle
 _Control::GetAbsoluteBounds(void) const
 {
+       if (!__needRecalcAbsBounds)
+               return __absoluteBounds;
+
        Point accumPoint;
        Rectangle absoluteBounds;
        Rectangle clientBounds;
@@ -3661,12 +3720,18 @@ _Control::GetAbsoluteBounds(void) const
        absoluteBounds.width = __bounds.width;
        absoluteBounds.height = __bounds.height;
 
+       const_cast<_Control*>(this)->__absoluteBounds = absoluteBounds;
+       const_cast<_Control*>(this)->__needRecalcAbsBounds = false;
+
        return absoluteBounds;
 }
 
 FloatRectangle
 _Control::GetAbsoluteBoundsF(void) const
 {
+       if (!__needRecalcAbsBoundsF)
+               return __absoluteBoundsF;
+
        FloatPoint accumPoint;
        FloatRectangle absoluteBounds;
        FloatRectangle clientBounds;
@@ -3704,6 +3769,9 @@ _Control::GetAbsoluteBoundsF(void) const
        absoluteBounds.width = __bounds.width;
        absoluteBounds.height = __bounds.height;
 
+       const_cast<_Control*>(this)->__absoluteBoundsF = absoluteBounds;
+       const_cast<_Control*>(this)->__needRecalcAbsBoundsF = false;
+
        return absoluteBounds;
 }
 
@@ -3873,14 +3941,19 @@ _Control::DisposeControl(void)
 // E_OUT_OF_MEMORY
 // E_SYSTEM
 _Control::_Control(void)
-       : __name(L"")
+       : __needRecalcRootWindow(true)
+       , __needRecalcAbsBounds(true)
+       , __needRecalcAbsBoundsF(true)
+       , __pRootWindow(null)
+       , __name(L"")
        , __pParent(null)
        , __pChildren(null)
        , __pOwnees(null)
        , __bounds(0.0f, 0.0f, 0.0f, 0.0f)
        , __contentAreaBounds(0.0f, 0.0f, 0.0f, 0.0f)
        , __clientBounds(0.0f, 0.0f, 0.0f, 0.0f)
-       , __absoluteBounds(0.0f, 0.0f, 0.0f, 0.0f)
+       , __absoluteBounds(0, 0, 0, 0)
+       , __absoluteBoundsF(0.0f, 0.0f, 0.0f, 0.0f)
        , __invalidatedBounds(0.0f, 0.0f, 0.0f, 0.0f)
        , __minSize(FloatDimension(0.0f, 0.0f))
        , __maxSize(FloatDimension(MAX_LENGTH, MAX_LENGTH))
index f12d80c..4a5e240 100644 (file)
@@ -289,6 +289,7 @@ public:
        bool IsAncestorOf(const _Control& control) const;
        bool IsAttachedToMainTree(void) const;
        _Window* GetRootWindow(void) const;
+       void InvalidateHierarchyRootWindow(void);
 
        void Accept(Visitor& visitor);
        void Accept(Visitor& visitor) const;
@@ -477,6 +478,7 @@ public:
        Tizen::Graphics::FloatRectangle GetClientBoundsF(const Tizen::Graphics::FloatDimension& size) const;
        Tizen::Graphics::Rectangle GetAbsoluteBounds(void) const;
        Tizen::Graphics::FloatRectangle GetAbsoluteBoundsF(void) const;
+       void InvalidateHierarchyAbsoluteBounds(void);
        result SetClientBounds(const Tizen::Graphics::Rectangle& bounds);
        result SetClientBounds(const Tizen::Graphics::FloatRectangle& bounds);
        bool IsCalledSetClientBounds(void);
@@ -631,6 +633,11 @@ private:
        void UpdateFocusList(void);
 
 private:
+       bool __needRecalcRootWindow;
+       bool __needRecalcAbsBounds;
+       bool __needRecalcAbsBoundsF;
+       _Window* __pRootWindow;
+
        _ControlHandle __controlHandle;
        Tizen::Base::String __name;
 
@@ -641,7 +648,8 @@ private:
        Tizen::Graphics::FloatRectangle __bounds;
        Tizen::Graphics::FloatRectangle __contentAreaBounds;
        Tizen::Graphics::FloatRectangle __clientBounds;
-       Tizen::Graphics::FloatRectangle __absoluteBounds;
+       Tizen::Graphics::Rectangle __absoluteBounds;
+       Tizen::Graphics::FloatRectangle __absoluteBoundsF;
        Tizen::Graphics::FloatRectangle __invalidatedBounds;
        Tizen::Graphics::FloatDimension __minSize;
        Tizen::Graphics::FloatDimension __maxSize;