Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / rendering / LayoutState.cpp
index b096c74..5a2ba58 100644 (file)
 #include "core/rendering/RenderView.h"
 #include "platform/Partitions.h"
 
-namespace WebCore {
-
-LayoutState::LayoutState(LayoutState* prev, RenderBox& renderer, const LayoutSize& offset, LayoutUnit pageLogicalHeight, bool pageLogicalHeightChanged, ColumnInfo* columnInfo)
-    : m_columnInfo(columnInfo)
-    , m_next(prev)
-#ifndef NDEBUG
-    , m_renderer(&renderer)
-#endif
+namespace blink {
+
+LayoutState::LayoutState(LayoutUnit pageLogicalHeight, bool pageLogicalHeightChanged, RenderView& view)
+    : m_isPaginated(pageLogicalHeight)
+    , m_pageLogicalHeightChanged(pageLogicalHeightChanged)
+    , m_containingBlockLogicalWidthChanged(false)
+    , m_columnInfo(0)
+    , m_next(0)
+    , m_pageLogicalHeight(pageLogicalHeight)
+    , m_renderer(view)
 {
-    ASSERT(m_next);
+    ASSERT(!view.layoutState());
+    view.pushLayoutState(*this);
+}
 
+LayoutState::LayoutState(RenderBox& renderer, const LayoutSize& offset, LayoutUnit pageLogicalHeight, bool pageLogicalHeightChanged, ColumnInfo* columnInfo, bool containingBlockLogicalWidthChanged)
+    : m_containingBlockLogicalWidthChanged(containingBlockLogicalWidthChanged)
+    , m_columnInfo(columnInfo)
+    , m_next(renderer.view()->layoutState())
+    , m_renderer(renderer)
+{
+    renderer.view()->pushLayoutState(*this);
     bool fixed = renderer.isOutOfFlowPositioned() && renderer.style()->position() == FixedPosition;
     if (fixed) {
         // FIXME: This doesn't work correctly with transforms.
         FloatPoint fixedOffset = renderer.view()->localToAbsolute(FloatPoint(), IsFixed);
-        m_paintOffset = LayoutSize(fixedOffset.x(), fixedOffset.y()) + offset;
-    } else
-        m_paintOffset = prev->m_paintOffset + offset;
+        m_layoutOffset = LayoutSize(fixedOffset.x(), fixedOffset.y()) + offset;
+    } else {
+        m_layoutOffset = m_next->m_layoutOffset + offset;
+    }
 
     if (renderer.isOutOfFlowPositioned() && !fixed) {
         if (RenderObject* container = renderer.container()) {
-            if (container->isInFlowPositioned() && container->isRenderInline())
-                m_paintOffset += toRenderInline(container)->offsetForInFlowPositionedInline(renderer);
-        }
-    }
-
-    m_layoutOffset = m_paintOffset;
-
-    if (renderer.isInFlowPositioned() && renderer.hasLayer())
-        m_paintOffset += renderer.layer()->offsetForInFlowPosition();
-
-    m_clipped = !fixed && prev->m_clipped;
-    if (m_clipped)
-        m_clipRect = prev->m_clipRect;
-
-    if (renderer.hasOverflowClip()) {
-        LayoutSize deltaSize = RuntimeEnabledFeatures::repaintAfterLayoutEnabled() ? LayoutSize() : renderer.view()->layoutDelta();
-
-        LayoutRect clipRect(toPoint(m_paintOffset) + deltaSize, renderer.cachedSizeForOverflowClip());
-        if (m_clipped)
-            m_clipRect.intersect(clipRect);
-        else {
-            m_clipRect = clipRect;
-            m_clipped = true;
+            if (container->style()->hasInFlowPosition() && container->isRenderInline())
+                m_layoutOffset += toRenderInline(container)->offsetForInFlowPositionedInline(renderer);
         }
-
-        m_paintOffset -= renderer.scrolledContentOffset();
     }
-
     // If we establish a new page height, then cache the offset to the top of the first page.
     // We can compare this later on to figure out what part of the page we're actually on,
     if (pageLogicalHeight || m_columnInfo || renderer.isRenderFlowThread()) {
@@ -108,52 +96,37 @@ LayoutState::LayoutState(LayoutState* prev, RenderBox& renderer, const LayoutSiz
     if (!m_columnInfo)
         m_columnInfo = m_next->m_columnInfo;
 
-    if (!RuntimeEnabledFeatures::repaintAfterLayoutEnabled()) {
-        m_layoutDelta = m_next->m_layoutDelta;
-#if !ASSERT_DISABLED
-        m_layoutDeltaXSaturated = m_next->m_layoutDeltaXSaturated;
-        m_layoutDeltaYSaturated = m_next->m_layoutDeltaYSaturated;
-#endif
-    }
-
     // FIXME: <http://bugs.webkit.org/show_bug.cgi?id=13443> Apply control clip if present.
 }
 
 LayoutState::LayoutState(RenderObject& root)
-    : m_clipped(false)
-    , m_isPaginated(false)
+    : m_isPaginated(false)
     , m_pageLogicalHeightChanged(false)
-#if !ASSERT_DISABLED
-    , m_layoutDeltaXSaturated(false)
-    , m_layoutDeltaYSaturated(false)
-#endif
+    , m_containingBlockLogicalWidthChanged(false)
     , m_columnInfo(0)
-    , m_next(0)
+    , m_next(root.view()->layoutState())
     , m_pageLogicalHeight(0)
-#ifndef NDEBUG
-    , m_renderer(&root)
-#endif
+    , m_renderer(root)
 {
-    RenderObject* container = root.container();
-    FloatPoint absContentPoint = container->localToAbsolute(FloatPoint(), UseTransforms);
-    m_paintOffset = LayoutSize(absContentPoint.x(), absContentPoint.y());
+    // FIXME: Why does RenderTableSection create this wonky LayoutState?
+    ASSERT(!m_next || root.isTableSection());
+    // We'll end up pushing in RenderView itself, so don't bother adding it.
+    if (root.isRenderView())
+        return;
 
-    if (container->hasOverflowClip()) {
-        m_clipped = true;
-        RenderBox* containerBox = toRenderBox(container);
-        m_clipRect = LayoutRect(toPoint(m_paintOffset), containerBox->cachedSizeForOverflowClip());
-        m_paintOffset -= containerBox->scrolledContentOffset();
-    }
-}
+    root.view()->pushLayoutState(*this);
 
-void* LayoutState::operator new(size_t sz)
-{
-    return partitionAlloc(Partitions::getRenderingPartition(), sz);
+    RenderObject* container = root.container();
+    FloatPoint absContentPoint = container->localToAbsolute(FloatPoint(), UseTransforms);
+    m_layoutOffset = LayoutSize(absContentPoint.x(), absContentPoint.y());
 }
 
-void LayoutState::operator delete(void* ptr)
+LayoutState::~LayoutState()
 {
-    partitionFree(ptr);
+    if (m_renderer.view()->layoutState()) {
+        ASSERT(m_renderer.view()->layoutState() == this);
+        m_renderer.view()->popLayoutState();
+    }
 }
 
 void LayoutState::clearPaginationInformation()
@@ -177,4 +150,4 @@ void LayoutState::addForcedColumnBreak(const RenderBox& child, const LayoutUnit&
     m_columnInfo->addForcedBreak(pageLogicalOffset(child, childLogicalOffset));
 }
 
-} // namespace WebCore
+} // namespace blink