[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
eric at webkit.org
eric at webkit.org
Wed Dec 22 12:49:18 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 4481f30c056763fda56932c2c9511f7df5a8aa96
Author: eric at webkit.org <eric at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Aug 31 03:44:23 2010 +0000
2010-08-30 Eric Seidel <eric at webkit.org>
Unreviewed, rolling out r66418.
http://trac.webkit.org/changeset/66418
https://bugs.webkit.org/show_bug.cgi?id=44896
Adam tried to roll this out with:
https://bugs.webkit.org/show_bug.cgi?id=44924
but we hit a commit-queue edgecase and it failed, trying again.
Causing test failures on multiple bots
* platform/mac-leopard/svg/css/composite-shadow-example-expected.checksum:
* platform/mac-leopard/svg/css/composite-shadow-example-expected.png:
* platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.checksum:
* platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.png:
* platform/mac/svg/css/composite-shadow-example-expected.txt:
* platform/mac/svg/css/composite-shadow-with-opacity-expected.txt:
2010-08-30 Eric Seidel <eric at webkit.org>
Unreviewed, rolling out r66418.
http://trac.webkit.org/changeset/66418
https://bugs.webkit.org/show_bug.cgi?id=44896
Adam tried to roll this out with:
https://bugs.webkit.org/show_bug.cgi?id=44924
but we hit a commit-queue edgecase and it failed, trying again.
Causing test failures on multiple bots
* rendering/RenderForeignObject.cpp:
(WebCore::RenderForeignObject::layout):
* rendering/RenderObject.cpp:
* rendering/RenderObject.h:
(WebCore::RenderObject::setNeedsBoundariesUpdate):
* rendering/RenderObjectChildList.cpp:
(WebCore::RenderObjectChildList::removeChildNode):
* rendering/RenderPath.cpp:
(WebCore::RenderPath::layout):
(WebCore::RenderPath::paint):
(WebCore::RenderPath::styleWillChange):
* rendering/RenderPath.h:
(WebCore::RenderPath::setNeedsBoundariesUpdate):
* rendering/RenderSVGBlock.cpp:
* rendering/RenderSVGBlock.h:
* rendering/RenderSVGContainer.cpp:
(WebCore::RenderSVGContainer::RenderSVGContainer):
(WebCore::RenderSVGContainer::layout):
(WebCore::RenderSVGContainer::paint):
(WebCore::RenderSVGContainer::objectBoundingBox):
(WebCore::RenderSVGContainer::strokeBoundingBox):
(WebCore::RenderSVGContainer::repaintRectInLocalCoordinates):
* rendering/RenderSVGContainer.h:
(WebCore::RenderSVGContainer::calculateLocalTransform):
* rendering/RenderSVGGradientStop.h:
* rendering/RenderSVGHiddenContainer.cpp:
(WebCore::RenderSVGHiddenContainer::clippedOverflowRectForRepaint):
(WebCore::RenderSVGHiddenContainer::objectBoundingBox):
(WebCore::RenderSVGHiddenContainer::repaintRectInLocalCoordinates):
* rendering/RenderSVGHiddenContainer.h:
* rendering/RenderSVGImage.cpp:
(WebCore::RenderSVGImage::layout):
* rendering/RenderSVGImage.h:
* rendering/RenderSVGInline.cpp:
* rendering/RenderSVGInline.h:
* rendering/RenderSVGModelObject.cpp:
* rendering/RenderSVGModelObject.h:
* rendering/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::RenderSVGRoot):
(WebCore::RenderSVGRoot::layout):
(WebCore::RenderSVGRoot::objectBoundingBox):
(WebCore::RenderSVGRoot::strokeBoundingBox):
(WebCore::RenderSVGRoot::repaintRectInLocalCoordinates):
* rendering/RenderSVGRoot.h:
* rendering/RenderSVGText.cpp:
(WebCore::RenderSVGText::layout):
* rendering/RenderSVGTransformableContainer.cpp:
(WebCore::RenderSVGTransformableContainer::calculateLocalTransform):
* rendering/RenderSVGTransformableContainer.h:
* rendering/RenderSVGViewportContainer.cpp:
(WebCore::RenderSVGViewportContainer::calcViewport):
* rendering/SVGRenderSupport.cpp:
(WebCore::SVGRenderSupport::computeContainerBoundingBox):
* rendering/SVGRenderSupport.h:
* rendering/style/SVGRenderStyle.cpp:
(WebCore::SVGRenderStyle::diff):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@66449 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 0d72274..6602e71 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,22 @@
+2010-08-30 Eric Seidel <eric at webkit.org>
+
+ Unreviewed, rolling out r66418.
+ http://trac.webkit.org/changeset/66418
+ https://bugs.webkit.org/show_bug.cgi?id=44896
+
+ Adam tried to roll this out with:
+ https://bugs.webkit.org/show_bug.cgi?id=44924
+ but we hit a commit-queue edgecase and it failed, trying again.
+
+ Causing test failures on multiple bots
+
+ * platform/mac-leopard/svg/css/composite-shadow-example-expected.checksum:
+ * platform/mac-leopard/svg/css/composite-shadow-example-expected.png:
+ * platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.checksum:
+ * platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.png:
+ * platform/mac/svg/css/composite-shadow-example-expected.txt:
+ * platform/mac/svg/css/composite-shadow-with-opacity-expected.txt:
+
2010-08-30 Adam Barth <abarth at webkit.org>
Reviewed by Eric Seidel.
diff --git a/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-example-expected.checksum b/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-example-expected.checksum
index 539cb39..41e0cbf 100644
--- a/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-example-expected.checksum
+++ b/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-example-expected.checksum
@@ -1 +1 @@
-8161131336b1925ffe396e63db173b6b
\ No newline at end of file
+85e4e03902685db9779422cee76a38b7
\ No newline at end of file
diff --git a/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-example-expected.png b/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-example-expected.png
index a6beabf..9f89758 100644
Binary files a/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-example-expected.png and b/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-example-expected.png differ
diff --git a/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.checksum b/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.checksum
index 470211b..044f90a 100644
--- a/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.checksum
+++ b/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.checksum
@@ -1 +1 @@
-87c3a71c83dd3602d760dc1558148679
\ No newline at end of file
+37ce6f48a37bde5464635bcc0926a03a
\ No newline at end of file
diff --git a/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.png b/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.png
index fcbd8b2..18e8426 100644
Binary files a/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.png and b/LayoutTests/platform/mac-leopard/svg/css/composite-shadow-with-opacity-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/css/composite-shadow-example-expected.txt b/LayoutTests/platform/mac/svg/css/composite-shadow-example-expected.txt
index ed0977f..074edbc 100644
--- a/LayoutTests/platform/mac/svg/css/composite-shadow-example-expected.txt
+++ b/LayoutTests/platform/mac/svg/css/composite-shadow-example-expected.txt
@@ -3,7 +3,7 @@ layer at (0,0) size 785x616
layer at (0,0) size 785x616
RenderBlock {HTML} at (0,0) size 785x616
RenderBody {BODY} at (8,8) size 769x600
- RenderSVGRoot {svg} at (40,36) size 446x160
+ RenderSVGRoot {svg} at (40,36) size 436x150
RenderSVGContainer {g} at (40,36) size 146x140
RenderPath {path} at (40,36) size 146x140 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,100.00)}] [stroke={[type=SOLID] [color=#000000] [stroke width=10.00]}] [fill={[type=SOLID] [color=#999999]}] [data="M0.00,30.00 L-35.27,48.54 L-28.53,9.27 L-57.06,-18.54 L-17.63,-24.27 L-0.00,-60.00 L17.63,-24.27 L57.06,-18.54 L28.53,9.27 L35.27,48.54 Z"]
RenderSVGContainer {g} at (200,46) size 128x125
diff --git a/LayoutTests/platform/mac/svg/css/composite-shadow-with-opacity-expected.txt b/LayoutTests/platform/mac/svg/css/composite-shadow-with-opacity-expected.txt
index 95fbf09..f741ef2 100644
--- a/LayoutTests/platform/mac/svg/css/composite-shadow-with-opacity-expected.txt
+++ b/LayoutTests/platform/mac/svg/css/composite-shadow-with-opacity-expected.txt
@@ -4,7 +4,7 @@ layer at (0,0) size 785x616
RenderBlock {HTML} at (0,0) size 785x616
RenderBody {BODY} at (8,8) size 769x600
layer at (8,8) size 769x600
- RenderSVGRoot {svg} at (40,36) size 446x160 [opacity=0.50]
+ RenderSVGRoot {svg} at (40,36) size 436x150 [opacity=0.50]
RenderSVGContainer {g} at (40,36) size 146x140
RenderPath {path} at (40,36) size 146x140 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,100.00)}] [stroke={[type=SOLID] [color=#000000] [stroke width=10.00]}] [fill={[type=SOLID] [color=#999999]}] [data="M0.00,30.00 L-35.27,48.54 L-28.53,9.27 L-57.06,-18.54 L-17.63,-24.27 L-0.00,-60.00 L17.63,-24.27 L57.06,-18.54 L28.53,9.27 L35.27,48.54 Z"]
RenderSVGContainer {g} at (200,46) size 128x125
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index f4aaaa0..e874cd3 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,72 @@
+2010-08-30 Eric Seidel <eric at webkit.org>
+
+ Unreviewed, rolling out r66418.
+ http://trac.webkit.org/changeset/66418
+ https://bugs.webkit.org/show_bug.cgi?id=44896
+
+ Adam tried to roll this out with:
+ https://bugs.webkit.org/show_bug.cgi?id=44924
+ but we hit a commit-queue edgecase and it failed, trying again.
+
+ Causing test failures on multiple bots
+
+ * rendering/RenderForeignObject.cpp:
+ (WebCore::RenderForeignObject::layout):
+ * rendering/RenderObject.cpp:
+ * rendering/RenderObject.h:
+ (WebCore::RenderObject::setNeedsBoundariesUpdate):
+ * rendering/RenderObjectChildList.cpp:
+ (WebCore::RenderObjectChildList::removeChildNode):
+ * rendering/RenderPath.cpp:
+ (WebCore::RenderPath::layout):
+ (WebCore::RenderPath::paint):
+ (WebCore::RenderPath::styleWillChange):
+ * rendering/RenderPath.h:
+ (WebCore::RenderPath::setNeedsBoundariesUpdate):
+ * rendering/RenderSVGBlock.cpp:
+ * rendering/RenderSVGBlock.h:
+ * rendering/RenderSVGContainer.cpp:
+ (WebCore::RenderSVGContainer::RenderSVGContainer):
+ (WebCore::RenderSVGContainer::layout):
+ (WebCore::RenderSVGContainer::paint):
+ (WebCore::RenderSVGContainer::objectBoundingBox):
+ (WebCore::RenderSVGContainer::strokeBoundingBox):
+ (WebCore::RenderSVGContainer::repaintRectInLocalCoordinates):
+ * rendering/RenderSVGContainer.h:
+ (WebCore::RenderSVGContainer::calculateLocalTransform):
+ * rendering/RenderSVGGradientStop.h:
+ * rendering/RenderSVGHiddenContainer.cpp:
+ (WebCore::RenderSVGHiddenContainer::clippedOverflowRectForRepaint):
+ (WebCore::RenderSVGHiddenContainer::objectBoundingBox):
+ (WebCore::RenderSVGHiddenContainer::repaintRectInLocalCoordinates):
+ * rendering/RenderSVGHiddenContainer.h:
+ * rendering/RenderSVGImage.cpp:
+ (WebCore::RenderSVGImage::layout):
+ * rendering/RenderSVGImage.h:
+ * rendering/RenderSVGInline.cpp:
+ * rendering/RenderSVGInline.h:
+ * rendering/RenderSVGModelObject.cpp:
+ * rendering/RenderSVGModelObject.h:
+ * rendering/RenderSVGRoot.cpp:
+ (WebCore::RenderSVGRoot::RenderSVGRoot):
+ (WebCore::RenderSVGRoot::layout):
+ (WebCore::RenderSVGRoot::objectBoundingBox):
+ (WebCore::RenderSVGRoot::strokeBoundingBox):
+ (WebCore::RenderSVGRoot::repaintRectInLocalCoordinates):
+ * rendering/RenderSVGRoot.h:
+ * rendering/RenderSVGText.cpp:
+ (WebCore::RenderSVGText::layout):
+ * rendering/RenderSVGTransformableContainer.cpp:
+ (WebCore::RenderSVGTransformableContainer::calculateLocalTransform):
+ * rendering/RenderSVGTransformableContainer.h:
+ * rendering/RenderSVGViewportContainer.cpp:
+ (WebCore::RenderSVGViewportContainer::calcViewport):
+ * rendering/SVGRenderSupport.cpp:
+ (WebCore::SVGRenderSupport::computeContainerBoundingBox):
+ * rendering/SVGRenderSupport.h:
+ * rendering/style/SVGRenderStyle.cpp:
+ (WebCore::SVGRenderStyle::diff):
+
2010-08-30 Adam Barth <abarth at webkit.org>
Reviewed by Eric Seidel.
diff --git a/WebCore/rendering/RenderForeignObject.cpp b/WebCore/rendering/RenderForeignObject.cpp
index bfcb940..50c1a42 100644
--- a/WebCore/rendering/RenderForeignObject.cpp
+++ b/WebCore/rendering/RenderForeignObject.cpp
@@ -102,20 +102,14 @@ void RenderForeignObject::layout()
LayoutRepainter repainter(*this, m_everHadLayout && checkForRepaintDuringLayout());
SVGForeignObjectElement* foreign = static_cast<SVGForeignObjectElement*>(node());
- bool updateCachedBoundariesInParents = false;
if (m_needsTransformUpdate) {
m_localTransform = foreign->animatedLocalTransform();
m_needsTransformUpdate = false;
- updateCachedBoundariesInParents = true;
}
- FloatRect oldViewport = m_viewport;
-
// Cache viewport boundaries
FloatPoint viewportLocation(foreign->x().value(foreign), foreign->y().value(foreign));
m_viewport = FloatRect(viewportLocation, FloatSize(foreign->width().value(foreign), foreign->height().value(foreign)));
- if (!updateCachedBoundariesInParents)
- updateCachedBoundariesInParents = oldViewport != m_viewport;
// Set box origin to the foreignObject x/y translation, so positioned objects in XHTML content get correct
// positions. A regular RenderBoxModelObject would pull this information from RenderStyle - in SVG those
@@ -128,10 +122,6 @@ void RenderForeignObject::layout()
RenderBlock::layout();
ASSERT(!needsLayout());
- // If our bounds changed, notify the parents.
- if (updateCachedBoundariesInParents)
- RenderSVGBlock::setNeedsBoundariesUpdate();
-
// Invalidate all resources of this client if our layout changed.
if (layoutChanged)
SVGResourcesCache::clientLayoutChanged(this);
diff --git a/WebCore/rendering/RenderObject.cpp b/WebCore/rendering/RenderObject.cpp
index d01b92d..576aad0 100644
--- a/WebCore/rendering/RenderObject.cpp
+++ b/WebCore/rendering/RenderObject.cpp
@@ -2692,12 +2692,6 @@ RenderSVGResourceContainer* RenderObject::toRenderSVGResourceContainer()
return 0;
}
-void RenderObject::setNeedsBoundariesUpdate()
-{
- if (RenderObject* renderer = parent())
- renderer->setNeedsBoundariesUpdate();
-}
-
FloatRect RenderObject::objectBoundingBox() const
{
ASSERT_NOT_REACHED();
diff --git a/WebCore/rendering/RenderObject.h b/WebCore/rendering/RenderObject.h
index 9fbaf91..34eba6d 100644
--- a/WebCore/rendering/RenderObject.h
+++ b/WebCore/rendering/RenderObject.h
@@ -327,7 +327,7 @@ public:
// Unfortunately we don't have such a class yet, because it's not possible for all renderers
// to inherit from RenderSVGObject -> RenderObject (some need RenderBlock inheritance for instance)
virtual void setNeedsTransformUpdate() { }
- virtual void setNeedsBoundariesUpdate();
+ virtual void setNeedsBoundariesUpdate() { }
// Per SVG 1.1 objectBoundingBox ignores clipping, masking, filter effects, opacity and stroke-width.
// This is used for all computation of objectBoundingBox relative units and by SVGLocateable::getBBox().
diff --git a/WebCore/rendering/RenderObjectChildList.cpp b/WebCore/rendering/RenderObjectChildList.cpp
index 96ec800..d8c7955 100644
--- a/WebCore/rendering/RenderObjectChildList.cpp
+++ b/WebCore/rendering/RenderObjectChildList.cpp
@@ -98,11 +98,6 @@ RenderObject* RenderObjectChildList::removeChildNode(RenderObject* owner, Render
if (oldChild->isPositioned() && owner->childrenInline())
owner->dirtyLinesFromChangedChild(oldChild);
-
-#if ENABLE(SVG)
- // Update cached boundaries in SVG renderers, if a child is removed.
- owner->setNeedsBoundariesUpdate();
-#endif
}
// If oldChild is the start or end of the selection, then clear the selection to
diff --git a/WebCore/rendering/RenderPath.cpp b/WebCore/rendering/RenderPath.cpp
index 0f31df1..86a12c8 100644
--- a/WebCore/rendering/RenderPath.cpp
+++ b/WebCore/rendering/RenderPath.cpp
@@ -101,39 +101,28 @@ void RenderPath::layout()
LayoutRepainter repainter(*this, m_everHadLayout && checkForRepaintDuringLayout());
SVGStyledTransformableElement* element = static_cast<SVGStyledTransformableElement*>(node());
- bool updateCachedBoundariesInParents = false;
-
bool needsPathUpdate = m_needsPathUpdate;
if (needsPathUpdate) {
m_path = element->toPathData();
m_needsPathUpdate = false;
- updateCachedBoundariesInParents = true;
}
if (m_needsTransformUpdate) {
m_localTransform = element->animatedLocalTransform();
m_needsTransformUpdate = false;
- updateCachedBoundariesInParents = true;
}
- if (m_needsBoundariesUpdate)
- updateCachedBoundariesInParents = true;
-
// Invalidate all resources of this client if our layout changed.
if (m_everHadLayout && selfNeedsLayout())
SVGResourcesCache::clientLayoutChanged(this);
// At this point LayoutRepainter already grabbed the old bounds,
- // recalculate them now so repaintAfterLayout() uses the new bounds.
+ // recalculate them now so repaintAfterLayout() uses the new bounds
if (needsPathUpdate || m_needsBoundariesUpdate) {
updateCachedBoundaries();
m_needsBoundariesUpdate = false;
}
- // If our bounds changed, notify the parents.
- if (updateCachedBoundariesInParents)
- RenderSVGModelObject::setNeedsBoundariesUpdate();
-
repainter.repaintAfterLayout();
setNeedsLayout(false);
}
@@ -183,7 +172,8 @@ void RenderPath::paint(PaintInfo& paintInfo, int, int)
return;
FloatRect boundingBox = repaintRectInLocalCoordinates();
- if (!SVGRenderSupport::paintInfoIntersectsRepaintRect(boundingBox, m_localTransform, paintInfo))
+ FloatRect nonLocalBoundingBox = m_localTransform.mapRect(boundingBox);
+ if (!nonLocalBoundingBox.intersects(paintInfo.rect))
return;
PaintInfo childPaintInfo(paintInfo);
@@ -280,6 +270,13 @@ FloatRect RenderPath::calculateMarkerBoundsIfNeeded()
return m_markerLayoutInfo.calculateBoundaries(markerStart, markerMid, markerEnd, svgStyle->strokeWidth().value(svgElement), m_path);
}
+void RenderPath::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
+{
+ if (diff == StyleDifferenceLayout)
+ setNeedsBoundariesUpdate();
+ RenderSVGModelObject::styleWillChange(diff, newStyle);
+}
+
void RenderPath::updateCachedBoundaries()
{
if (m_path.isEmpty()) {
diff --git a/WebCore/rendering/RenderPath.h b/WebCore/rendering/RenderPath.h
index 1d35a01..1bdac07 100644
--- a/WebCore/rendering/RenderPath.h
+++ b/WebCore/rendering/RenderPath.h
@@ -41,8 +41,8 @@ public:
RenderPath(SVGStyledTransformableElement*);
const Path& path() const { return m_path; }
+ void setNeedsBoundariesUpdate() { m_needsBoundariesUpdate = true; }
void setNeedsPathUpdate() { m_needsPathUpdate = true; }
- virtual void setNeedsBoundariesUpdate() { m_needsBoundariesUpdate = true; }
virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; }
private:
@@ -63,6 +63,7 @@ private:
virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
virtual bool nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint& pointInParent, HitTestAction);
+ virtual void styleWillChange(StyleDifference, const RenderStyle*);
FloatRect calculateMarkerBoundsIfNeeded();
void updateCachedBoundaries();
diff --git a/WebCore/rendering/RenderSVGBlock.cpp b/WebCore/rendering/RenderSVGBlock.cpp
index b2d727a..d6022b5 100644
--- a/WebCore/rendering/RenderSVGBlock.cpp
+++ b/WebCore/rendering/RenderSVGBlock.cpp
@@ -81,13 +81,6 @@ void RenderSVGBlock::destroy()
RenderBlock::destroy();
}
-void RenderSVGBlock::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
-{
- if (diff == StyleDifferenceLayout)
- setNeedsBoundariesUpdate();
- RenderBlock::styleWillChange(diff, newStyle);
-}
-
void RenderSVGBlock::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
{
RenderBlock::styleDidChange(diff, oldStyle);
diff --git a/WebCore/rendering/RenderSVGBlock.h b/WebCore/rendering/RenderSVGBlock.h
index c1379da..c4337cc 100644
--- a/WebCore/rendering/RenderSVGBlock.h
+++ b/WebCore/rendering/RenderSVGBlock.h
@@ -40,7 +40,6 @@ private:
virtual void absoluteRects(Vector<IntRect>&, int tx, int ty);
virtual void destroy();
- virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
virtual void updateFromElement();
};
diff --git a/WebCore/rendering/RenderSVGContainer.cpp b/WebCore/rendering/RenderSVGContainer.cpp
index 8c99270..bab07a4 100644
--- a/WebCore/rendering/RenderSVGContainer.cpp
+++ b/WebCore/rendering/RenderSVGContainer.cpp
@@ -39,7 +39,6 @@ namespace WebCore {
RenderSVGContainer::RenderSVGContainer(SVGStyledElement* node)
: RenderSVGModelObject(node)
, m_drawsContents(true)
- , m_needsBoundariesUpdate(true)
{
}
@@ -56,7 +55,7 @@ void RenderSVGContainer::layout()
LayoutRepainter repainter(*this, m_everHadLayout && checkForRepaintDuringLayout());
// Allow RenderSVGTransformableContainer to update its transform.
- bool updatedTransform = calculateLocalTransform();
+ calculateLocalTransform();
SVGRenderSupport::layoutChildren(this, selfNeedsLayout());
@@ -64,16 +63,6 @@ void RenderSVGContainer::layout()
if (m_everHadLayout && selfNeedsLayout())
SVGResourcesCache::clientLayoutChanged(this);
- // At this point LayoutRepainter already grabbed the old bounds,
- // recalculate them now so repaintAfterLayout() uses the new bounds.
- if (m_needsBoundariesUpdate || updatedTransform) {
- updateCachedBoundaries();
- m_needsBoundariesUpdate = false;
-
- // If our bounds changed, notify the parents.
- RenderSVGModelObject::setNeedsBoundariesUpdate();
- }
-
repainter.repaintAfterLayout();
setNeedsLayout(false);
}
@@ -97,10 +86,6 @@ void RenderSVGContainer::paint(PaintInfo& paintInfo, int, int)
if (!firstChild() && !selfWillPaint())
return;
- FloatRect repaintRect = repaintRectInLocalCoordinates();
- if (!SVGRenderSupport::paintInfoIntersectsRepaintRect(repaintRect, localToParentTransform(), paintInfo))
- return;
-
PaintInfo childPaintInfo(paintInfo);
childPaintInfo.context->save();
@@ -130,7 +115,7 @@ void RenderSVGContainer::paint(PaintInfo& paintInfo, int, int)
// FIXME: This means our focus ring won't share our rotation like it should.
// We should instead disable our clip during PaintPhaseOutline
if ((paintInfo.phase == PaintPhaseOutline || paintInfo.phase == PaintPhaseSelfOutline) && style()->outlineWidth() && style()->visibility() == VISIBLE) {
- IntRect paintRectInParent = enclosingIntRect(localToParentTransform().mapRect(repaintRect));
+ IntRect paintRectInParent = enclosingIntRect(localToParentTransform().mapRect(repaintRectInLocalCoordinates()));
paintOutline(paintInfo.context, paintRectInParent.x(), paintRectInParent.y(), paintRectInParent.width(), paintRectInParent.height());
}
}
@@ -143,14 +128,21 @@ void RenderSVGContainer::addFocusRingRects(Vector<IntRect>& rects, int, int)
rects.append(paintRectInParent);
}
-void RenderSVGContainer::updateCachedBoundaries()
+FloatRect RenderSVGContainer::objectBoundingBox() const
{
- m_objectBoundingBox = FloatRect();
- m_strokeBoundingBox = FloatRect();
- m_repaintBoundingBox = FloatRect();
+ return SVGRenderSupport::computeContainerBoundingBox(this, SVGRenderSupport::ObjectBoundingBox);
+}
- SVGRenderSupport::computeContainerBoundingBoxes(this, m_objectBoundingBox, m_strokeBoundingBox, m_repaintBoundingBox);
- SVGRenderSupport::intersectRepaintRectWithResources(this, m_repaintBoundingBox);
+FloatRect RenderSVGContainer::strokeBoundingBox() const
+{
+ return SVGRenderSupport::computeContainerBoundingBox(this, SVGRenderSupport::StrokeBoundingBox);
+}
+
+FloatRect RenderSVGContainer::repaintRectInLocalCoordinates() const
+{
+ FloatRect repaintRect = SVGRenderSupport::computeContainerBoundingBox(this, SVGRenderSupport::RepaintBoundingBox);
+ SVGRenderSupport::intersectRepaintRectWithResources(this, repaintRect);
+ return repaintRect;
}
bool RenderSVGContainer::nodeAtFloatPoint(const HitTestRequest& request, HitTestResult& result, const FloatPoint& pointInParent, HitTestAction hitTestAction)
diff --git a/WebCore/rendering/RenderSVGContainer.h b/WebCore/rendering/RenderSVGContainer.h
index b0c952f..0a122cd 100644
--- a/WebCore/rendering/RenderSVGContainer.h
+++ b/WebCore/rendering/RenderSVGContainer.h
@@ -43,7 +43,6 @@ public:
bool drawsContents() const { return m_drawsContents; }
virtual void paint(PaintInfo&, int parentX, int parentY);
- virtual void setNeedsBoundariesUpdate() { m_needsBoundariesUpdate = true; }
protected:
virtual RenderObjectChildList* virtualChildren() { return children(); }
@@ -56,14 +55,14 @@ protected:
virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
- virtual FloatRect objectBoundingBox() const { return m_objectBoundingBox; }
- virtual FloatRect strokeBoundingBox() const { return m_strokeBoundingBox; }
- virtual FloatRect repaintRectInLocalCoordinates() const { return m_repaintBoundingBox; }
+ virtual FloatRect objectBoundingBox() const;
+ virtual FloatRect strokeBoundingBox() const;
+ virtual FloatRect repaintRectInLocalCoordinates() const;
virtual bool nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint& pointInParent, HitTestAction);
// Allow RenderSVGTransformableContainer to hook in at the right time in layout()
- virtual bool calculateLocalTransform() { return false; }
+ virtual void calculateLocalTransform() { }
// Allow RenderSVGViewportContainer to hook in at the right times in layout(), paint() and nodeAtFloatPoint()
virtual void calcViewport() { }
@@ -71,15 +70,10 @@ protected:
virtual bool pointIsInsideViewportClip(const FloatPoint& /*pointInParent*/) { return true; }
bool selfWillPaint();
- void updateCachedBoundaries();
private:
RenderObjectChildList m_children;
- FloatRect m_objectBoundingBox;
- FloatRect m_strokeBoundingBox;
- FloatRect m_repaintBoundingBox;
bool m_drawsContents : 1;
- bool m_needsBoundariesUpdate : 1;
};
inline RenderSVGContainer* toRenderSVGContainer(RenderObject* object)
diff --git a/WebCore/rendering/RenderSVGGradientStop.h b/WebCore/rendering/RenderSVGGradientStop.h
index f06a9a5..45da7b4 100644
--- a/WebCore/rendering/RenderSVGGradientStop.h
+++ b/WebCore/rendering/RenderSVGGradientStop.h
@@ -46,7 +46,6 @@ public:
// https://bugs.webkit.org/show_bug.cgi?id=20400
virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject*) { return IntRect(); }
virtual FloatRect objectBoundingBox() const { return FloatRect(); }
- virtual FloatRect strokeBoundingBox() const { return FloatRect(); }
virtual FloatRect repaintRectInLocalCoordinates() const { return FloatRect(); }
protected:
diff --git a/WebCore/rendering/RenderSVGHiddenContainer.cpp b/WebCore/rendering/RenderSVGHiddenContainer.cpp
index ee1d214..0af4236 100644
--- a/WebCore/rendering/RenderSVGHiddenContainer.cpp
+++ b/WebCore/rendering/RenderSVGHiddenContainer.cpp
@@ -47,6 +47,11 @@ void RenderSVGHiddenContainer::paint(PaintInfo&, int, int)
// This subtree does not paint.
}
+IntRect RenderSVGHiddenContainer::clippedOverflowRectForRepaint(RenderBoxModelObject* /*repaintContainer*/)
+{
+ return IntRect();
+}
+
void RenderSVGHiddenContainer::absoluteQuads(Vector<FloatQuad>&)
{
// This subtree does not take up space or paint
@@ -57,6 +62,16 @@ bool RenderSVGHiddenContainer::nodeAtFloatPoint(const HitTestRequest&, HitTestRe
return false;
}
+FloatRect RenderSVGHiddenContainer::objectBoundingBox() const
+{
+ return FloatRect();
+}
+
+FloatRect RenderSVGHiddenContainer::repaintRectInLocalCoordinates() const
+{
+ return FloatRect();
+}
+
}
#endif // ENABLE(SVG)
diff --git a/WebCore/rendering/RenderSVGHiddenContainer.h b/WebCore/rendering/RenderSVGHiddenContainer.h
index 97800d4..e0daac1 100644
--- a/WebCore/rendering/RenderSVGHiddenContainer.h
+++ b/WebCore/rendering/RenderSVGHiddenContainer.h
@@ -47,9 +47,12 @@ namespace WebCore {
virtual void paint(PaintInfo&, int parentX, int parentY);
- virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject*) { return IntRect(); }
+ virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer);
virtual void absoluteQuads(Vector<FloatQuad>&);
+ virtual FloatRect objectBoundingBox() const;
+ virtual FloatRect repaintRectInLocalCoordinates() const;
+
virtual bool nodeAtFloatPoint(const HitTestRequest&, HitTestResult&, const FloatPoint& pointInParent, HitTestAction);
};
}
diff --git a/WebCore/rendering/RenderSVGImage.cpp b/WebCore/rendering/RenderSVGImage.cpp
index 5e30465..6214ffe 100644
--- a/WebCore/rendering/RenderSVGImage.cpp
+++ b/WebCore/rendering/RenderSVGImage.cpp
@@ -57,11 +57,9 @@ void RenderSVGImage::layout()
LayoutRepainter repainter(*this, m_everHadLayout && checkForRepaintDuringLayout());
SVGImageElement* image = static_cast<SVGImageElement*>(node());
- bool updateCachedBoundariesInParents = false;
if (m_needsTransformUpdate) {
m_localTransform = image->animatedLocalTransform();
m_needsTransformUpdate = false;
- updateCachedBoundariesInParents = true;
}
// minimum height
@@ -71,21 +69,13 @@ void RenderSVGImage::layout()
calcHeight();
// FIXME: Optimize caching the repaint rects.
- FloatRect oldBoundaries = m_localBounds;
m_localBounds = FloatRect(image->x().value(image), image->y().value(image), image->width().value(image), image->height().value(image));
m_cachedLocalRepaintRect = FloatRect();
- if (!updateCachedBoundariesInParents)
- updateCachedBoundariesInParents = oldBoundaries != m_localBounds;
-
// Invalidate all resources of this client if our layout changed.
if (m_everHadLayout && selfNeedsLayout())
SVGResourcesCache::clientLayoutChanged(this);
- // If our bounds changed, notify the parents.
- if (updateCachedBoundariesInParents)
- RenderImage::setNeedsBoundariesUpdate();
-
repainter.repaintAfterLayout();
setNeedsLayout(false);
}
@@ -127,13 +117,6 @@ void RenderSVGImage::destroy()
RenderImage::destroy();
}
-void RenderSVGImage::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
-{
- if (diff == StyleDifferenceLayout)
- setNeedsBoundariesUpdate();
- RenderImage::styleWillChange(diff, newStyle);
-}
-
void RenderSVGImage::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
{
RenderImage::styleDidChange(diff, oldStyle);
diff --git a/WebCore/rendering/RenderSVGImage.h b/WebCore/rendering/RenderSVGImage.h
index 105f0ab..38e3a13 100644
--- a/WebCore/rendering/RenderSVGImage.h
+++ b/WebCore/rendering/RenderSVGImage.h
@@ -65,7 +65,6 @@ private:
virtual void paint(PaintInfo&, int parentX, int parentY);
virtual void destroy();
- virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
virtual void updateFromElement();
diff --git a/WebCore/rendering/RenderSVGInline.cpp b/WebCore/rendering/RenderSVGInline.cpp
index bc6bc12..93e6a06 100644
--- a/WebCore/rendering/RenderSVGInline.cpp
+++ b/WebCore/rendering/RenderSVGInline.cpp
@@ -99,13 +99,6 @@ void RenderSVGInline::destroy()
RenderInline::destroy();
}
-void RenderSVGInline::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
-{
- if (diff == StyleDifferenceLayout)
- setNeedsBoundariesUpdate();
- RenderInline::styleWillChange(diff, newStyle);
-}
-
void RenderSVGInline::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
{
RenderInline::styleDidChange(diff, oldStyle);
diff --git a/WebCore/rendering/RenderSVGInline.h b/WebCore/rendering/RenderSVGInline.h
index fb38f1b..56d911f 100644
--- a/WebCore/rendering/RenderSVGInline.h
+++ b/WebCore/rendering/RenderSVGInline.h
@@ -56,7 +56,6 @@ private:
virtual InlineFlowBox* createInlineFlowBox();
virtual void destroy();
- virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
virtual void updateFromElement();
};
diff --git a/WebCore/rendering/RenderSVGModelObject.cpp b/WebCore/rendering/RenderSVGModelObject.cpp
index 28760a0..5a19749 100644
--- a/WebCore/rendering/RenderSVGModelObject.cpp
+++ b/WebCore/rendering/RenderSVGModelObject.cpp
@@ -87,13 +87,6 @@ void RenderSVGModelObject::destroy()
RenderObject::destroy();
}
-void RenderSVGModelObject::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
-{
- if (diff == StyleDifferenceLayout)
- setNeedsBoundariesUpdate();
- RenderObject::styleWillChange(diff, newStyle);
-}
-
void RenderSVGModelObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
{
RenderObject::styleDidChange(diff, oldStyle);
diff --git a/WebCore/rendering/RenderSVGModelObject.h b/WebCore/rendering/RenderSVGModelObject.h
index 87717c2..35c4dc3 100644
--- a/WebCore/rendering/RenderSVGModelObject.h
+++ b/WebCore/rendering/RenderSVGModelObject.h
@@ -61,7 +61,6 @@ public:
virtual void destroy();
virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool useTransforms, bool fixed, TransformState&) const;
- virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
virtual void updateFromElement();
diff --git a/WebCore/rendering/RenderSVGRoot.cpp b/WebCore/rendering/RenderSVGRoot.cpp
index 2428469..5995668 100644
--- a/WebCore/rendering/RenderSVGRoot.cpp
+++ b/WebCore/rendering/RenderSVGRoot.cpp
@@ -48,7 +48,6 @@ namespace WebCore {
RenderSVGRoot::RenderSVGRoot(SVGStyledElement* node)
: RenderBox(node)
, m_isLayoutSizeChanged(false)
- , m_needsBoundariesOrTransformUpdate(true)
{
setReplaced(true);
}
@@ -125,13 +124,6 @@ void RenderSVGRoot::layout()
SVGRenderSupport::layoutChildren(this, needsLayout);
m_isLayoutSizeChanged = false;
- // At this point LayoutRepainter already grabbed the old bounds,
- // recalculate them now so repaintAfterLayout() uses the new bounds.
- if (m_needsBoundariesOrTransformUpdate) {
- updateCachedBoundaries();
- m_needsBoundariesOrTransformUpdate = false;
- }
-
repainter.repaintAfterLayout();
view()->enableLayoutState();
@@ -204,13 +196,6 @@ void RenderSVGRoot::destroy()
RenderBox::destroy();
}
-void RenderSVGRoot::styleWillChange(StyleDifference diff, const RenderStyle* newStyle)
-{
- if (diff == StyleDifferenceLayout)
- setNeedsBoundariesUpdate();
- RenderBox::styleWillChange(diff, newStyle);
-}
-
void RenderSVGRoot::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
{
RenderBox::styleDidChange(diff, oldStyle);
@@ -282,6 +267,28 @@ const AffineTransform& RenderSVGRoot::localToParentTransform() const
return m_localToParentTransform;
}
+FloatRect RenderSVGRoot::objectBoundingBox() const
+{
+ return SVGRenderSupport::computeContainerBoundingBox(this, SVGRenderSupport::ObjectBoundingBox);
+}
+
+FloatRect RenderSVGRoot::strokeBoundingBox() const
+{
+ return SVGRenderSupport::computeContainerBoundingBox(this, SVGRenderSupport::StrokeBoundingBox);
+}
+
+FloatRect RenderSVGRoot::repaintRectInLocalCoordinates() const
+{
+ FloatRect repaintRect = SVGRenderSupport::computeContainerBoundingBox(this, SVGRenderSupport::RepaintBoundingBox);
+
+ const SVGRenderStyle* svgStyle = style()->svgStyle();
+ if (const ShadowData* shadow = svgStyle->shadow())
+ shadow->adjustRectForShadow(repaintRect);
+
+ repaintRect.inflate(borderAndPaddingWidth());
+ return repaintRect;
+}
+
IntRect RenderSVGRoot::clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer)
{
return SVGRenderSupport::clippedOverflowRectForRepaint(this, repaintContainer);
@@ -313,22 +320,6 @@ void RenderSVGRoot::mapLocalToContainer(RenderBoxModelObject* repaintContainer,
RenderBox::mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState);
}
-void RenderSVGRoot::updateCachedBoundaries()
-{
- m_objectBoundingBox = FloatRect();
- m_strokeBoundingBox = FloatRect();
- m_repaintBoundingBox = FloatRect();
-
- SVGRenderSupport::computeContainerBoundingBoxes(this, m_objectBoundingBox, m_strokeBoundingBox, m_repaintBoundingBox);
- SVGRenderSupport::intersectRepaintRectWithResources(this, m_repaintBoundingBox);
-
- const SVGRenderStyle* svgStyle = style()->svgStyle();
- if (const ShadowData* shadow = svgStyle->shadow())
- shadow->adjustRectForShadow(m_repaintBoundingBox);
-
- m_repaintBoundingBox.inflate(borderAndPaddingWidth());
-}
-
bool RenderSVGRoot::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, int _x, int _y, int _tx, int _ty, HitTestAction hitTestAction)
{
IntPoint pointInContainer(_x, _y);
diff --git a/WebCore/rendering/RenderSVGRoot.h b/WebCore/rendering/RenderSVGRoot.h
index 63a7b3f..b90113c 100644
--- a/WebCore/rendering/RenderSVGRoot.h
+++ b/WebCore/rendering/RenderSVGRoot.h
@@ -41,8 +41,6 @@ public:
RenderObjectChildList* children() { return &m_children; }
bool isLayoutSizeChanged() const { return m_isLayoutSizeChanged; }
- virtual void setNeedsBoundariesUpdate() { m_needsBoundariesOrTransformUpdate = true; }
- virtual void setNeedsTransformUpdate() { m_needsBoundariesOrTransformUpdate = true; }
private:
virtual RenderObjectChildList* virtualChildren() { return children(); }
@@ -60,7 +58,6 @@ private:
virtual void paint(PaintInfo&, int parentX, int parentY);
virtual void destroy();
- virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
virtual void updateFromElement();
@@ -69,9 +66,9 @@ private:
bool fillContains(const FloatPoint&) const;
bool strokeContains(const FloatPoint&) const;
- virtual FloatRect objectBoundingBox() const { return m_objectBoundingBox; }
- virtual FloatRect strokeBoundingBox() const { return m_strokeBoundingBox; }
- virtual FloatRect repaintRectInLocalCoordinates() const { return m_repaintBoundingBox; }
+ virtual FloatRect objectBoundingBox() const;
+ virtual FloatRect strokeBoundingBox() const;
+ virtual FloatRect repaintRectInLocalCoordinates() const;
virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);
@@ -83,7 +80,6 @@ private:
void calcViewport();
bool selfWillPaint();
- void updateCachedBoundaries();
IntSize parentOriginToBorderBox() const;
IntSize borderOriginToContentBox() const;
@@ -92,12 +88,8 @@ private:
RenderObjectChildList m_children;
FloatSize m_viewportSize;
- FloatRect m_objectBoundingBox;
- FloatRect m_strokeBoundingBox;
- FloatRect m_repaintBoundingBox;
mutable AffineTransform m_localToParentTransform;
bool m_isLayoutSizeChanged : 1;
- bool m_needsBoundariesOrTransformUpdate : 1;
};
inline RenderSVGRoot* toRenderSVGRoot(RenderObject* object)
diff --git a/WebCore/rendering/RenderSVGText.cpp b/WebCore/rendering/RenderSVGText.cpp
index 80b8a91..4b70643 100644
--- a/WebCore/rendering/RenderSVGText.cpp
+++ b/WebCore/rendering/RenderSVGText.cpp
@@ -75,12 +75,10 @@ void RenderSVGText::layout()
ASSERT(needsLayout());
LayoutRepainter repainter(*this, m_everHadLayout && checkForRepaintDuringLayout());
- bool updateCachedBoundariesInParents = false;
if (m_needsTransformUpdate) {
SVGTextElement* text = static_cast<SVGTextElement*>(node());
m_localTransform = text->animatedLocalTransform();
m_needsTransformUpdate = false;
- updateCachedBoundariesInParents = true;
}
// Reduced version of RenderBlock::layoutBlock(), which only takes care of SVG text.
@@ -97,22 +95,13 @@ void RenderSVGText::layout()
if (!firstChild())
setChildrenInline(true);
- // FIXME: We need to find a way to only layout the child boxes, if needed.
- FloatRect oldBoundaries = objectBoundingBox();
ASSERT(childrenInline());
forceLayoutInlineChildren();
- if (!updateCachedBoundariesInParents)
- updateCachedBoundariesInParents = oldBoundaries != objectBoundingBox();
-
// Invalidate all resources of this client if our layout changed.
if (m_everHadLayout && selfNeedsLayout())
SVGResourcesCache::clientLayoutChanged(this);
- // If our bounds changed, notify the parents.
- if (updateCachedBoundariesInParents)
- RenderSVGBlock::setNeedsBoundariesUpdate();
-
repainter.repaintAfterLayout();
setNeedsLayout(false);
}
diff --git a/WebCore/rendering/RenderSVGTransformableContainer.cpp b/WebCore/rendering/RenderSVGTransformableContainer.cpp
index c7d2029..94b9eea 100644
--- a/WebCore/rendering/RenderSVGTransformableContainer.cpp
+++ b/WebCore/rendering/RenderSVGTransformableContainer.cpp
@@ -35,7 +35,7 @@ RenderSVGTransformableContainer::RenderSVGTransformableContainer(SVGStyledTransf
{
}
-bool RenderSVGTransformableContainer::calculateLocalTransform()
+void RenderSVGTransformableContainer::calculateLocalTransform()
{
SVGStyledTransformableElement* element = static_cast<SVGStyledTransformableElement*>(node());
@@ -46,18 +46,17 @@ bool RenderSVGTransformableContainer::calculateLocalTransform()
}
if (!element->hasTagName(SVGNames::gTag) || !static_cast<SVGGElement*>(element)->isShadowTreeContainerElement())
- return needsUpdate;
+ return;
FloatSize translation = static_cast<SVGShadowTreeContainerElement*>(element)->containerTranslation();
if (translation.width() == 0 && translation.height() == 0)
- return needsUpdate;
+ return;
// FIXME: Could optimize this case for use to avoid refetching the animatedLocalTransform() here, if only the containerTranslation() changed.
if (!needsUpdate)
m_localTransform = element->animatedLocalTransform();
m_localTransform.translate(translation.width(), translation.height());
- return true;
}
}
diff --git a/WebCore/rendering/RenderSVGTransformableContainer.h b/WebCore/rendering/RenderSVGTransformableContainer.h
index b63b91c..e6de054 100644
--- a/WebCore/rendering/RenderSVGTransformableContainer.h
+++ b/WebCore/rendering/RenderSVGTransformableContainer.h
@@ -35,7 +35,7 @@ namespace WebCore {
virtual void setNeedsTransformUpdate() { m_needsTransformUpdate = true; }
private:
- virtual bool calculateLocalTransform();
+ virtual void calculateLocalTransform();
virtual AffineTransform localTransform() const { return m_localTransform; }
bool m_needsTransformUpdate : 1;
diff --git a/WebCore/rendering/RenderSVGViewportContainer.cpp b/WebCore/rendering/RenderSVGViewportContainer.cpp
index ccf67fa..f314bde 100644
--- a/WebCore/rendering/RenderSVGViewportContainer.cpp
+++ b/WebCore/rendering/RenderSVGViewportContainer.cpp
@@ -48,15 +48,10 @@ void RenderSVGViewportContainer::calcViewport()
SVGElement* element = static_cast<SVGElement*>(node());
if (element->hasTagName(SVGNames::svgTag)) {
SVGSVGElement* svg = static_cast<SVGSVGElement*>(element);
-
- FloatRect oldViewport = m_viewport;
m_viewport = FloatRect(svg->x().value(svg)
, svg->y().value(svg)
, svg->width().value(svg)
, svg->height().value(svg));
-
- if (oldViewport != m_viewport)
- setNeedsBoundariesUpdate();
}
}
diff --git a/WebCore/rendering/SVGRenderSupport.cpp b/WebCore/rendering/SVGRenderSupport.cpp
index 644ff70..fc99c91 100644
--- a/WebCore/rendering/SVGRenderSupport.cpp
+++ b/WebCore/rendering/SVGRenderSupport.cpp
@@ -161,31 +161,29 @@ void SVGRenderSupport::finishRenderSVGContent(RenderObject* object, PaintInfo& p
paintInfo.context->endTransparencyLayer();
}
-void SVGRenderSupport::computeContainerBoundingBoxes(const RenderObject* container, FloatRect& objectBoundingBox, FloatRect& strokeBoundingBox, FloatRect& repaintBoundingBox)
+FloatRect SVGRenderSupport::computeContainerBoundingBox(const RenderObject* container, ContainerBoundingBoxMode mode)
{
+ FloatRect boundingBox;
+
for (RenderObject* current = container->firstChild(); current; current = current->nextSibling()) {
- if (current->isSVGHiddenContainer())
- continue;
-
- const AffineTransform& transform = current->localToParentTransform();
- if (transform.isIdentity()) {
- objectBoundingBox.unite(current->objectBoundingBox());
- strokeBoundingBox.unite(current->strokeBoundingBox());
- repaintBoundingBox.unite(current->repaintRectInLocalCoordinates());
- } else {
- objectBoundingBox.unite(transform.mapRect(current->objectBoundingBox()));
- strokeBoundingBox.unite(transform.mapRect(current->strokeBoundingBox()));
- repaintBoundingBox.unite(transform.mapRect(current->repaintRectInLocalCoordinates()));
+ FloatRect childBoundingBox;
+
+ switch (mode) {
+ case ObjectBoundingBox:
+ childBoundingBox = current->objectBoundingBox();
+ break;
+ case StrokeBoundingBox:
+ childBoundingBox = current->strokeBoundingBox();
+ break;
+ case RepaintBoundingBox:
+ childBoundingBox = current->repaintRectInLocalCoordinates();
+ break;
}
- }
-}
-bool SVGRenderSupport::paintInfoIntersectsRepaintRect(const FloatRect& localRepaintRect, const AffineTransform& localTransform, const PaintInfo& paintInfo)
-{
- if (localTransform.isIdentity())
- return localRepaintRect.intersects(paintInfo.rect);
+ boundingBox.unite(current->localToParentTransform().mapRect(childBoundingBox));
+ }
- return localTransform.mapRect(localRepaintRect).intersects(paintInfo.rect);
+ return boundingBox;
}
const RenderSVGRoot* SVGRenderSupport::findTreeRootObject(const RenderObject* start)
diff --git a/WebCore/rendering/SVGRenderSupport.h b/WebCore/rendering/SVGRenderSupport.h
index 9242a92..2de1e99 100644
--- a/WebCore/rendering/SVGRenderSupport.h
+++ b/WebCore/rendering/SVGRenderSupport.h
@@ -28,12 +28,11 @@
#if ENABLE(SVG)
#include "PaintInfo.h"
-#include <wtf/Noncopyable.h>
-
namespace WebCore {
class FloatPoint;
class FloatRect;
+class ImageBuffer;
class RenderBoxModelObject;
class RenderObject;
class RenderStyle;
@@ -41,7 +40,7 @@ class RenderSVGRoot;
class TransformState;
// SVGRendererSupport is a helper class sharing code between all SVG renderers.
-class SVGRenderSupport : public Noncopyable {
+class SVGRenderSupport {
public:
// Used by all SVG renderers who apply clip/filter/etc. resources to the renderer content
static bool prepareToRenderSVGContent(RenderObject*, PaintInfo&);
@@ -59,11 +58,15 @@ public:
// Determines whether the passed point lies in a clipping area
static bool pointInClippingArea(RenderObject*, const FloatPoint&);
- // Traverses all children of given container and returns the union object/stroke/repaintBoundingBox.
- static void computeContainerBoundingBoxes(const RenderObject* container, FloatRect& objectBoundingBox, FloatRect& strokeBoundingBox, FloatRect& repaintBoundingBox);
+ enum ContainerBoundingBoxMode {
+ ObjectBoundingBox,
+ StrokeBoundingBox,
+ RepaintBoundingBox
+ };
- // Determines wheter the renderer needs to be painted.
- static bool paintInfoIntersectsRepaintRect(const FloatRect& localRepaintRect, const AffineTransform& localTransform, const PaintInfo& paintInfo);
+ // Used to share the "walk all the children" logic between objectBoundingBox
+ // and repaintRectInLocalCoordinates in RenderSVGRoot and RenderSVGContainer
+ static FloatRect computeContainerBoundingBox(const RenderObject* container, ContainerBoundingBoxMode);
// Important functions used by nearly all SVG renderers centralizing coordinate transformations / repaint rect calculations
static IntRect clippedOverflowRectForRepaint(RenderObject*, RenderBoxModelObject* repaintContainer);
@@ -76,6 +79,11 @@ public:
// FIXME: These methods do not belong here.
static const RenderObject* findTextRootObject(const RenderObject* start);
static const RenderSVGRoot* findTreeRootObject(const RenderObject* start);
+
+private:
+ // This class is not constructable.
+ SVGRenderSupport();
+ ~SVGRenderSupport();
};
} // namespace WebCore
diff --git a/WebCore/rendering/style/SVGRenderStyle.cpp b/WebCore/rendering/style/SVGRenderStyle.cpp
index 7d1ad3b..51d2f20 100644
--- a/WebCore/rendering/style/SVGRenderStyle.cpp
+++ b/WebCore/rendering/style/SVGRenderStyle.cpp
@@ -162,10 +162,6 @@ StyleDifference SVGRenderStyle::diff(const SVGRenderStyle* other) const
|| svg_inherited_flags._joinStyle != other->svg_inherited_flags._joinStyle)
return StyleDifferenceLayout;
- // Shadow changes require relayouts, as they affect the repaint rects.
- if (shadowSVG != other->shadowSVG)
- return StyleDifferenceLayout;
-
// Some stroke properties, requires relayouts, as the cached stroke boundaries need to be recalculated.
if (stroke != other->stroke) {
if (stroke->width != other->stroke->width
@@ -182,6 +178,10 @@ StyleDifference SVGRenderStyle::diff(const SVGRenderStyle* other) const
// NOTE: All comparisions below may only return StyleDifferenceRepaint
+ // Shadow changes need to cause repaints.
+ if (shadowSVG != other->shadowSVG)
+ return StyleDifferenceRepaint;
+
// Painting related properties only need repaints.
if (miscNotEqual) {
if (misc->floodColor != other->misc->floodColor
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list