Index: third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp |
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp |
index 11cf345ab6bba5d210856d8b5df1a00a19d80e6a..8653fca29ee23cd93a1483631f2a27e215eebe4c 100644 |
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp |
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGResourceMarker.cpp |
@@ -65,7 +65,8 @@ FloatRect LayoutSVGResourceMarker::markerBoundaries(const AffineTransform& marke |
{ |
FloatRect coordinates = LayoutSVGContainer::paintInvalidationRectInLocalSVGCoordinates(); |
- // Map paint invalidation rect into parent coordinate space, in which the marker boundaries have to be evaluated |
+ // Map paint invalidation rect into parent coordinate space, in which the |
+ // marker boundaries have to be evaluated. |
coordinates = localToSVGParentTransform().mapRect(coordinates); |
return markerTransformation.mapRect(coordinates); |
@@ -105,26 +106,29 @@ SVGMarkerOrientType LayoutSVGResourceMarker::orientType() const |
AffineTransform LayoutSVGResourceMarker::markerTransformation(const FloatPoint& origin, float autoAngle, float strokeWidth) const |
{ |
- bool useStrokeWidth = markerUnits() == SVGMarkerUnitsStrokeWidth; |
+ // Apply scaling according to markerUnits ('strokeWidth' or 'userSpaceOnUse'.) |
+ float markerScale = markerUnits() == SVGMarkerUnitsStrokeWidth ? strokeWidth : 1; |
AffineTransform transform; |
transform.translate(origin.x(), origin.y()); |
transform.rotate(orientType() == SVGMarkerOrientAngle ? angle() : autoAngle); |
- transform = markerContentTransformation(transform, referencePoint(), useStrokeWidth ? strokeWidth : -1); |
+ transform.scale(markerScale); |
+ |
+ // The 'origin' coordinate maps to SVGs refX/refY, given in coordinates |
+ // relative to the viewport established by the marker. |
+ FloatPoint mappedReferencePoint = viewportTransform().mapPoint(referencePoint()); |
+ transform.translate(-mappedReferencePoint.x(), -mappedReferencePoint.y()); |
return transform; |
} |
-AffineTransform LayoutSVGResourceMarker::markerContentTransformation(const AffineTransform& contentTransformation, const FloatPoint& origin, float strokeWidth) const |
+bool LayoutSVGResourceMarker::shouldPaint() const |
{ |
- // The 'origin' coordinate maps to SVGs refX/refY, given in coordinates relative to the viewport established by the marker |
- FloatPoint mappedOrigin = viewportTransform().mapPoint(origin); |
- |
- AffineTransform transformation = contentTransformation; |
- if (strokeWidth != -1) |
- transformation.scaleNonUniform(strokeWidth, strokeWidth); |
- |
- transformation.translate(-mappedOrigin.x(), -mappedOrigin.y()); |
- return transformation; |
+ // An empty viewBox disables rendering. |
+ SVGMarkerElement* marker = toSVGMarkerElement(element()); |
+ ASSERT(marker); |
+ return !marker->viewBox()->isSpecified() |
+ || !marker->viewBox()->currentValue()->isValid() |
+ || !marker->viewBox()->currentValue()->value().isEmpty(); |
} |
AffineTransform LayoutSVGResourceMarker::viewportTransform() const |