Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1704)

Unified Diff: Source/core/rendering/PaintInvalidationState.cpp

Issue 482063005: Allow paint invalidation containers to cross frame boundaries. (re-land #2) (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Made it work with position:fixed. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/PaintInvalidationState.cpp
diff --git a/Source/core/rendering/PaintInvalidationState.cpp b/Source/core/rendering/PaintInvalidationState.cpp
index 12753da0aa22a6da7771cd721d2f3fc49216b18f..0de879c92f7c72caf98791b19fd719a1e8520d0b 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
@@ -63,8 +56,7 @@ PaintInvalidationState::PaintInvalidationState(const PaintInvalidationState& nex
} else {
LayoutSize offset = m_renderer.isBox() && !m_renderer.isTableRow() ? toRenderBox(renderer).locationOffset() : LayoutSize();
if (fixed) {
- // FIXME: This doesn't work correctly with transforms.
chrishtr 2014/08/19 17:42:10 localToContainerPoint is supposed to work with tra
- FloatPoint fixedOffset = m_renderer.view()->localToAbsolute(FloatPoint(), IsFixed);
+ FloatPoint fixedOffset = m_renderer.localToContainerPoint(FloatPoint(), &m_paintInvalidationContainer, TraverseDocumentBoundaries);
chrishtr 2014/08/19 17:42:10 Map to the space of the invalidation container rat
leviw_travelin_and_unemployed 2014/08/19 17:52:12 We always stopped at the View boundary before. Can
chrishtr 2014/08/19 18:19:23 Done.
chrishtr 2014/08/19 18:19:23 Done. Also updated repaint-in-iframe.html to set a
m_paintOffset = LayoutSize(fixedOffset.x(), fixedOffset.y()) + offset;
} else {
m_paintOffset = next.m_paintOffset + offset;

Powered by Google App Engine
This is Rietveld 408576698