Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / rendering / PaintInvalidationState.cpp
index aef2345..96a6bf8 100644 (file)
 
 namespace blink {
 
-PaintInvalidationState::PaintInvalidationState(RenderObject& renderer)
+PaintInvalidationState::PaintInvalidationState(const RenderView& renderView)
     : m_clipped(false)
     , m_cachedOffsetsEnabled(true)
     , m_forceCheckForPaintInvalidation(false)
-    , m_paintInvalidationContainer(*renderer.containerForPaintInvalidation())
-    , m_renderer(renderer)
+    , m_paintInvalidationContainer(*renderView.containerForPaintInvalidation())
 {
-    bool establishesPaintInvalidationContainer = &m_renderer == &m_paintInvalidationContainer;
+    bool establishesPaintInvalidationContainer = renderView == m_paintInvalidationContainer;
     if (!establishesPaintInvalidationContainer) {
-        if (!renderer.supportsPaintInvalidationStateCachedOffsets()) {
+        if (!renderView.supportsPaintInvalidationStateCachedOffsets()) {
             m_cachedOffsetsEnabled = false;
             return;
         }
-        bool invalidationContainerSkipped;
-        RenderObject* container = renderer.container(&m_paintInvalidationContainer, &invalidationContainerSkipped);
-        if (container && !invalidationContainerSkipped) {
-            FloatPoint point = container->localToContainerPoint(FloatPoint(), &m_paintInvalidationContainer);
-            if (container->isTableRow())
-                point = FloatPoint(point.x() - toRenderBox(container)->x().toFloat(), point.y() - toRenderBox(container)->y().toFloat());
-            m_paintOffset = LayoutSize(point.x(), point.y());
-
-            applyClipIfNeeded(*container);
-        }
-    } else {
-        applyClipIfNeeded(m_renderer);
+        FloatPoint point = renderView.localToContainerPoint(FloatPoint(), &m_paintInvalidationContainer, TraverseDocumentBoundaries);
+        m_paintOffset = LayoutSize(point.x(), point.y());
     }
+    m_clipRect = renderView.viewRect();
+    m_clipRect.move(m_paintOffset);
+    m_clipped = true;
 }
 
 PaintInvalidationState::PaintInvalidationState(const PaintInvalidationState& next, RenderLayerModelObject& renderer, const RenderLayerModelObject& paintInvalidationContainer)
@@ -46,11 +38,10 @@ PaintInvalidationState::PaintInvalidationState(const PaintInvalidationState& nex
     , m_cachedOffsetsEnabled(true)
     , m_forceCheckForPaintInvalidation(next.m_forceCheckForPaintInvalidation)
     , m_paintInvalidationContainer(paintInvalidationContainer)
-    , m_renderer(renderer)
 {
     // FIXME: SVG could probably benefit from a stack-based optimization like html does. crbug.com/391054
-    bool establishesPaintInvalidationContainer = &m_renderer == &m_paintInvalidationContainer;
-    bool fixed = m_renderer.isOutOfFlowPositioned() && m_renderer.style()->position() == FixedPosition;
+    bool establishesPaintInvalidationContainer = renderer == m_paintInvalidationContainer;
+    bool fixed = renderer.style()->position() == FixedPosition;
 
     if (establishesPaintInvalidationContainer) {
         // When we hit a new paint invalidation container, we don't need to
@@ -61,23 +52,22 @@ PaintInvalidationState::PaintInvalidationState(const PaintInvalidationState& nex
         if (!renderer.supportsPaintInvalidationStateCachedOffsets() || !next.m_cachedOffsetsEnabled) {
             m_cachedOffsetsEnabled = false;
         } else {
-            LayoutSize offset = m_renderer.isBox() && !m_renderer.isTableRow() ? toRenderBox(renderer).locationOffset() : LayoutSize();
             if (fixed) {
-                // FIXME: This doesn't work correctly with transforms.
-                FloatPoint fixedOffset = m_renderer.view()->localToAbsolute(FloatPoint(), IsFixed);
-                m_paintOffset = LayoutSize(fixedOffset.x(), fixedOffset.y()) + offset;
+                FloatPoint fixedOffset = renderer.localToContainerPoint(FloatPoint(), &m_paintInvalidationContainer, TraverseDocumentBoundaries);
+                m_paintOffset = LayoutSize(fixedOffset.x(), fixedOffset.y());
             } else {
+                LayoutSize offset = renderer.isBox() && !renderer.isTableRow() ? toRenderBox(renderer).locationOffset() : LayoutSize();
                 m_paintOffset = next.m_paintOffset + offset;
             }
 
-            if (m_renderer.isOutOfFlowPositioned() && !fixed) {
-                if (RenderObject* container = m_renderer.container()) {
+            if (renderer.isOutOfFlowPositioned() && !fixed) {
+                if (RenderObject* container = renderer.container()) {
                     if (container->style()->hasInFlowPosition() && container->isRenderInline())
                         m_paintOffset += toRenderInline(container)->offsetForInFlowPositionedInline(toRenderBox(renderer));
                 }
             }
 
-            if (m_renderer.style()->hasInFlowPosition() && renderer.hasLayer())
+            if (renderer.style()->hasInFlowPosition() && renderer.hasLayer())
                 m_paintOffset += renderer.layer()->offsetForInFlowPosition();
         }