Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WebCore / rendering / svg / RenderSVGResourceMarker.cpp
index 50173e4..d20a516 100644 (file)
  */
 
 #include "config.h"
-
-#if ENABLE(SVG)
 #include "RenderSVGResourceMarker.h"
 
 #include "GraphicsContext.h"
-#include "RenderSVGContainer.h"
-#include "SVGElement.h"
-#include "SVGMarkerElement.h"
-#include "SVGRenderSupport.h"
-#include "SVGStyledElement.h"
-#include "SVGStyledTransformableElement.h"
+#include "RenderSVGRoot.h"
+#include <wtf/StackStats.h>
 
 namespace WebCore {
 
-RenderSVGResourceType RenderSVGResourceMarker::s_resourceType = MarkerResourceType;
-
-RenderSVGResourceMarker::RenderSVGResourceMarker(SVGMarkerElement* node)
-    : RenderSVGResourceContainer(node)
+RenderSVGResourceMarker::RenderSVGResourceMarker(SVGMarkerElement& element, Ref<RenderStyle>&& style)
+    : RenderSVGResourceContainer(element, WTFMove(style))
 {
 }
 
@@ -47,9 +39,10 @@ RenderSVGResourceMarker::~RenderSVGResourceMarker()
 
 void RenderSVGResourceMarker::layout()
 {
+    StackStats::LayoutCheckPoint layoutCheckPoint;
     // Invalidate all resources if our layout changed.
-    if (m_everHadLayout && selfNeedsLayout())
-        removeAllClientsFromCache();
+    if (everHadLayout() && selfNeedsLayout())
+        RenderSVGRoot::addResourceForClientInvalidation(this);
 
     // RenderSVGHiddenContainer overwrites layout(). We need the
     // layouting of RenderSVGContainer for calculating  local
@@ -62,16 +55,15 @@ void RenderSVGResourceMarker::removeAllClientsFromCache(bool markForInvalidation
     markAllClientsForInvalidation(markForInvalidation ? LayoutAndBoundariesInvalidation : ParentOnlyInvalidation);
 }
 
-void RenderSVGResourceMarker::removeClientFromCache(RenderObject* client, bool markForInvalidation)
+void RenderSVGResourceMarker::removeClientFromCache(RenderElement& client, bool markForInvalidation)
 {
-    ASSERT(client);
     markClientForInvalidation(client, markForInvalidation ? BoundariesInvalidation : ParentOnlyInvalidation);
 }
 
 void RenderSVGResourceMarker::applyViewportClip(PaintInfo& paintInfo)
 {
-    if (SVGRenderSupport::isOverflowHidden(this))
-        paintInfo.context->clip(m_viewport);
+    if (SVGRenderSupport::isOverflowHidden(*this))
+        paintInfo.context().clip(m_viewport);
 }
 
 FloatRect RenderSVGResourceMarker::markerBoundaries(const AffineTransform& markerTransformation) const
@@ -94,32 +86,23 @@ const AffineTransform& RenderSVGResourceMarker::localToParentTransform() const
 
 FloatPoint RenderSVGResourceMarker::referencePoint() const
 {
-    SVGMarkerElement* marker = static_cast<SVGMarkerElement*>(node());
-    ASSERT(marker);
-
-    SVGLengthContext lengthContext(marker);
-    return FloatPoint(marker->refX().value(lengthContext), marker->refY().value(lengthContext));
+    SVGLengthContext lengthContext(&markerElement());
+    return FloatPoint(markerElement().refX().value(lengthContext), markerElement().refY().value(lengthContext));
 }
 
 float RenderSVGResourceMarker::angle() const
 {
-    SVGMarkerElement* marker = static_cast<SVGMarkerElement*>(node());
-    ASSERT(marker);
-
     float angle = -1;
-    if (marker->orientType() == SVGMarkerOrientAngle)
-        angle = marker->orientAngle().value();
+    if (markerElement().orientType() == SVGMarkerOrientAngle)
+        angle = markerElement().orientAngle().value();
 
     return angle;
 }
 
 AffineTransform RenderSVGResourceMarker::markerTransformation(const FloatPoint& origin, float autoAngle, float strokeWidth) const
 {
-    SVGMarkerElement* marker = static_cast<SVGMarkerElement*>(node());
-    ASSERT(marker);
-
     float markerAngle = angle();
-    bool useStrokeWidth = marker->markerUnits() == SVGMarkerUnitsStrokeWidth;
+    bool useStrokeWidth = markerElement().markerUnits() == SVGMarkerUnitsStrokeWidth;
 
     AffineTransform transform;
     transform.translate(origin.x(), origin.y());
@@ -130,8 +113,12 @@ AffineTransform RenderSVGResourceMarker::markerTransformation(const FloatPoint&
 
 void RenderSVGResourceMarker::draw(PaintInfo& paintInfo, const AffineTransform& transform)
 {
+    // An empty viewBox disables rendering.
+    if (markerElement().hasAttribute(SVGNames::viewBoxAttr) && markerElement().viewBoxIsValid() && markerElement().viewBox().isEmpty())
+        return;
+
     PaintInfo info(paintInfo);
-    GraphicsContextStateSaver stateSaver(*info.context);
+    GraphicsContextStateSaver stateSaver(info.context());
     info.applyTransform(transform);
     RenderSVGContainer::paint(info, IntPoint());
 }
@@ -151,10 +138,7 @@ AffineTransform RenderSVGResourceMarker::markerContentTransformation(const Affin
 
 AffineTransform RenderSVGResourceMarker::viewportTransform() const
 {
-    SVGMarkerElement* marker = static_cast<SVGMarkerElement*>(node());
-    ASSERT(marker);
-
-    return marker->viewBoxToViewTransform(m_viewport.width(), m_viewport.height());
+    return markerElement().viewBoxToViewTransform(m_viewport.width(), m_viewport.height());
 }
 
 void RenderSVGResourceMarker::calcViewport()
@@ -162,15 +146,10 @@ void RenderSVGResourceMarker::calcViewport()
     if (!selfNeedsLayout())
         return;
 
-    SVGMarkerElement* marker = static_cast<SVGMarkerElement*>(node());
-    ASSERT(marker);
-    
-    SVGLengthContext lengthContext(marker);
-    float w = marker->markerWidth().value(lengthContext);
-    float h = marker->markerHeight().value(lengthContext);
+    SVGLengthContext lengthContext(&markerElement());
+    float w = markerElement().markerWidth().value(lengthContext);
+    float h = markerElement().markerHeight().value(lengthContext);
     m_viewport = FloatRect(0, 0, w, h);
 }
 
 }
-
-#endif // ENABLE(SVG)