Reviewed by Simon Fraser.
Move more code into SVGRenderBase
https://bugs.webkit.org/show_bug.cgi?id=25532
clippedOverflowRectForRepaint, computeRectForRepaint and mapLocalToContainer
are now all shared via SVGRenderBase.
RenderForeignObject should also be sharing this code, but I've left it
alone for now, as changing that would likely cause test changes.
No test changes. It's possible that transformed <svg:image> elements will
now show up with better metrics in the inspector.
* rendering/RenderSVGImage.cpp:
(WebCore::RenderSVGImage::clippedOverflowRectForRepaint):
(WebCore::RenderSVGImage::computeRectForRepaint):
(WebCore::RenderSVGImage::mapLocalToContainer):
* rendering/RenderSVGImage.h:
* rendering/RenderSVGModelObject.cpp:
(WebCore::RenderSVGModelObject::clippedOverflowRectForRepaint):
(WebCore::RenderSVGModelObject::computeRectForRepaint):
(WebCore::RenderSVGModelObject::mapLocalToContainer):
* rendering/RenderSVGText.cpp:
(WebCore::RenderSVGText::clippedOverflowRectForRepaint):
(WebCore::RenderSVGText::computeRectForRepaint):
(WebCore::RenderSVGText::mapLocalToContainer):
* rendering/SVGRenderSupport.cpp:
(WebCore::SVGRenderBase::clippedOverflowRectForRepaint):
(WebCore::SVGRenderBase::computeRectForRepaint):
(WebCore::SVGRenderBase::mapLocalToContainer):
* rendering/SVGRenderSupport.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@43210 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/SVGRenderSupport.cpp b/WebCore/rendering/SVGRenderSupport.cpp
index 8c060bf..1ff48bb 100644
--- a/WebCore/rendering/SVGRenderSupport.cpp
+++ b/WebCore/rendering/SVGRenderSupport.cpp
@@ -26,7 +26,6 @@
#if ENABLE(SVG)
#include "SVGRenderSupport.h"
-#include "TransformationMatrix.h"
#include "ImageBuffer.h"
#include "RenderObject.h"
#include "RenderSVGContainer.h"
@@ -36,10 +35,45 @@
#include "SVGResourceMasker.h"
#include "SVGStyledElement.h"
#include "SVGURIReference.h"
+#include "TransformState.h"
+#include "TransformationMatrix.h"
#include <wtf/UnusedParam.h>
namespace WebCore {
+IntRect SVGRenderBase::clippedOverflowRectForRepaint(RenderObject* object, RenderBoxModelObject* repaintContainer)
+{
+ // Return early for any cases where we don't actually paint
+ if (object->style()->visibility() != VISIBLE && !object->enclosingLayer()->hasVisibleContent())
+ return IntRect();
+
+ // Pass our local paint rect to computeRectForRepaint() which will
+ // map to parent coords and recurse up the parent chain.
+ IntRect repaintRect = enclosingIntRect(object->repaintRectInLocalCoordinates());
+ object->computeRectForRepaint(repaintContainer, repaintRect);
+ return repaintRect;
+}
+
+void SVGRenderBase::computeRectForRepaint(RenderObject* object, RenderBoxModelObject* repaintContainer, IntRect& repaintRect, bool fixed)
+{
+ // Translate to coords in our parent renderer, and then call computeRectForRepaint on our parent
+ repaintRect = object->localToParentTransform().mapRect(repaintRect);
+ object->parent()->computeRectForRepaint(repaintContainer, repaintRect, fixed);
+}
+
+void SVGRenderBase::mapLocalToContainer(const RenderObject* object, RenderBoxModelObject* repaintContainer, bool fixed , bool useTransforms, TransformState& transformState)
+{
+ ASSERT(!fixed); // We should have no fixed content in the SVG rendering tree.
+
+ // FIXME: If we don't respect useTransforms we break SVG text rendering.
+ // Seems RenderSVGInlineText has some own broken translation hacks which depend useTransforms=false
+ // This should instead be ASSERT(useTransforms) once we fix RenderSVGInlineText
+ if (useTransforms)
+ transformState.applyTransform(object->localToParentTransform());
+
+ object->parent()->mapLocalToContainer(repaintContainer, fixed, useTransforms, transformState);
+}
+
void SVGRenderBase::prepareToRenderSVGContent(RenderObject* object, RenderObject::PaintInfo& paintInfo, const FloatRect& boundingBox, SVGResourceFilter*& filter, SVGResourceFilter* rootFilter)
{
#if !ENABLE(SVG_FILTERS)