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

Unified Diff: Source/core/rendering/svg/RenderSVGRoot.cpp

Issue 211193002: Compute correct repaint rect for decorated RenderSVGRoots (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Make border tests less RAL/non-RAL sensitive. Created 6 years, 8 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
« no previous file with comments | « Source/core/rendering/svg/RenderSVGRoot.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/svg/RenderSVGRoot.cpp
diff --git a/Source/core/rendering/svg/RenderSVGRoot.cpp b/Source/core/rendering/svg/RenderSVGRoot.cpp
index f63f5f9a8c9583b583577bff16721aabd575d66e..5c2ae5ba4d3dca77b1627ee08d8520f472f543d4 100644
--- a/Source/core/rendering/svg/RenderSVGRoot.cpp
+++ b/Source/core/rendering/svg/RenderSVGRoot.cpp
@@ -29,6 +29,7 @@
#include "core/rendering/HitTestResult.h"
#include "core/rendering/LayoutRectRecorder.h"
#include "core/rendering/LayoutRepainter.h"
+#include "core/rendering/RenderLayer.h"
#include "core/rendering/RenderPart.h"
#include "core/rendering/RenderView.h"
#include "core/rendering/svg/RenderSVGResourceContainer.h"
@@ -50,6 +51,7 @@ RenderSVGRoot::RenderSVGRoot(SVGElement* node)
, m_objectBoundingBoxValid(false)
, m_isLayoutSizeChanged(false)
, m_needsBoundariesOrTransformUpdate(true)
+ , m_hasBoxDecorations(false)
{
}
@@ -221,10 +223,13 @@ void RenderSVGRoot::layout()
m_needsBoundariesOrTransformUpdate = false;
}
+ m_overflow.clear();
+ addVisualEffectOverflow();
updateLayerTransform();
+ m_hasBoxDecorations = isRoot() ? calculateHasBoxDecorations() : hasBoxDecorations();
+ invalidateBackgroundObscurationStatus();
repainter.repaintAfterLayout();
-
clearNeedsLayout();
}
@@ -293,6 +298,10 @@ void RenderSVGRoot::styleDidChange(StyleDifference diff, const RenderStyle* oldS
{
if (diff == StyleDifferenceLayout)
setNeedsBoundariesUpdate();
+ if (diff == StyleDifferenceRepaint) {
+ // Box decorations may have appeared/disappeared - recompute status.
+ m_hasBoxDecorations = calculateHasBoxDecorations();
+ }
RenderReplaced::styleDidChange(diff, oldStyle);
SVGResourcesCache::clientStyleChanged(this, diff, style());
@@ -355,7 +364,35 @@ const AffineTransform& RenderSVGRoot::localToParentTransform() const
LayoutRect RenderSVGRoot::clippedOverflowRectForRepaint(const RenderLayerModelObject* repaintContainer) const
{
- return SVGRenderSupport::clippedOverflowRectForRepaint(this, repaintContainer);
+ // This is an open-coded aggregate of SVGRenderSupport::clippedOverflowRectForRepaint,
+ // RenderSVGRoot::computeFloatRectForRepaint and RenderReplaced::clippedOverflowRectForRepaint.
+ // The reason for this is to optimize/minimize the repaint rect when the box is not "decorated"
+ // (does not have background/border/etc.)
+
+ // Return early for any cases where we don't actually paint.
+ if (style()->visibility() != VISIBLE && !enclosingLayer()->hasVisibleContent())
+ return LayoutRect();
+
+ // Compute the repaint rect of the content of the SVG in the border-box coordinate space.
+ FloatRect contentRepaintRect = repaintRectInLocalCoordinates();
+ contentRepaintRect = m_localToBorderBoxTransform.mapRect(contentRepaintRect);
+
+ // Apply initial viewport clip - not affected by overflow settings
+ contentRepaintRect.intersect(pixelSnappedBorderBoxRect());
+
+ LayoutRect repaintRect = enclosingLayoutRect(contentRepaintRect);
+ // If the box is decorated or is overflowing, extend it to include the border-box and overflow.
+ if (m_hasBoxDecorations || hasRenderOverflow()) {
+ // The selectionRect can project outside of the overflowRect, so take their union
+ // for repainting to avoid selection painting glitches.
+ LayoutRect decoratedRepaintRect = unionRect(localSelectionRect(false), visualOverflowRect());
+ repaintRect.unite(decoratedRepaintRect);
+ }
+
+ // Compute the repaint rect in the parent coordinate space.
+ LayoutRect rect = enclosingIntRect(repaintRect);
+ RenderReplaced::computeRectForRepaint(repaintContainer, rect);
+ return rect;
}
void RenderSVGRoot::computeFloatRectForRepaint(const RenderLayerModelObject* repaintContainer, FloatRect& repaintRect, bool fixed) const
@@ -392,7 +429,6 @@ void RenderSVGRoot::updateCachedBoundaries()
{
SVGRenderSupport::computeContainerBoundingBoxes(this, m_objectBoundingBox, m_objectBoundingBoxValid, m_strokeBoundingBox, m_repaintBoundingBox);
SVGRenderSupport::intersectRepaintRectWithResources(this, m_repaintBoundingBox);
- m_repaintBoundingBox.inflate(borderAndPaddingWidth().toFloat());
}
bool RenderSVGRoot::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
« no previous file with comments | « Source/core/rendering/svg/RenderSVGRoot.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698