 Chromium Code Reviews
 Chromium Code Reviews Issue 482063005:
  Allow paint invalidation containers to cross frame boundaries. (re-land #2)  (Closed) 
  Base URL: svn://svn.chromium.org/blink/trunk
    
  
    Issue 482063005:
  Allow paint invalidation containers to cross frame boundaries. (re-land #2)  (Closed) 
  Base URL: svn://svn.chromium.org/blink/trunk| Index: Source/core/rendering/PaintInvalidationState.cpp | 
| diff --git a/Source/core/rendering/PaintInvalidationState.cpp b/Source/core/rendering/PaintInvalidationState.cpp | 
| index 12753da0aa22a6da7771cd721d2f3fc49216b18f..c5287961dc82d802a75f15b8ae830c2023f9a918 100644 | 
| --- a/Source/core/rendering/PaintInvalidationState.cpp | 
| +++ b/Source/core/rendering/PaintInvalidationState.cpp | 
| @@ -13,32 +13,25 @@ | 
| 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()) | 
| + , m_renderer(renderView) | 
| { | 
| bool establishesPaintInvalidationContainer = &m_renderer == &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) | 
| @@ -50,7 +43,7 @@ PaintInvalidationState::PaintInvalidationState(const PaintInvalidationState& nex | 
| { | 
| // 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 fixed = m_renderer.style()->position() == FixedPosition; | 
| if (establishesPaintInvalidationContainer) { | 
| // When we hit a new paint invalidation container, we don't need to | 
| @@ -61,12 +54,11 @@ 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; | 
| 
chrishtr
2014/08/19 21:18:02
Adding offset here was wrong, and resulted in the
 | 
| + FloatPoint fixedOffset = m_renderer.localToContainerPoint(FloatPoint(), &m_paintInvalidationContainer, TraverseDocumentBoundaries); | 
| + m_paintOffset = LayoutSize(fixedOffset.x(), fixedOffset.y()); | 
| } else { | 
| + LayoutSize offset = m_renderer.isBox() && !m_renderer.isTableRow() ? toRenderBox(renderer).locationOffset() : LayoutSize(); | 
| m_paintOffset = next.m_paintOffset + offset; | 
| } |