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

Unified Diff: third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp

Issue 1376523002: Support 'pathLength' for stroking operations on <path> (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove double space Created 4 years, 11 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
Index: third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp
index 485dad1fedb51470f1f1e638460decb932f1c2cd..48407740dc8dbb93663ae3ecd3cc4061e9e95e1e 100644
--- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp
+++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp
@@ -37,6 +37,7 @@
#include "core/paint/SVGShapePainter.h"
#include "core/svg/SVGGeometryElement.h"
#include "core/svg/SVGLengthContext.h"
+#include "core/svg/SVGPathElement.h"
#include "platform/geometry/FloatPoint.h"
#include "platform/graphics/StrokeData.h"
#include "wtf/MathExtras.h"
@@ -64,6 +65,28 @@ void LayoutSVGShape::createPath()
m_rareData->m_cachedNonScalingStrokePath.clear();
}
+float LayoutSVGShape::dashScaleFactor() const
+{
+ if (!isSVGPathElement(element()))
+ return 1;
+ SVGPathElement& pathElement = toSVGPathElement(*element());
+ if (!pathElement.pathLength()->isSpecified())
+ return 1;
+ const SVGComputedStyle& svgStyle = styleRef().svgStyle();
+ float authorPathLength = pathElement.pathLength()->currentValue()->value();
+ if (authorPathLength < 0 || !svgStyle.strokeDashArray()->size())
f(malita) 2016/02/02 13:44:00 Is pathLength applicable beyond dashing? I'm assum
fs 2016/02/02 13:47:23 It applies to <textPath> too I think, so I guess t
+ return 1;
+ if (!authorPathLength)
+ return 0;
+ // Since we know this is a <path> element, we also know the source of the
+ // path - the 'd' presentation attribute. Since the StylePath already
+ // caches the computed path length for use, use that here directly.
+ float computedPathLength = svgStyle.d()->length();
+ if (!computedPathLength)
+ return 1;
+ return computedPathLength / authorPathLength;
+}
+
void LayoutSVGShape::updateShapeFromElement()
{
createPath();
@@ -91,7 +114,7 @@ bool LayoutSVGShape::shapeDependentStrokeContains(const FloatPoint& point)
{
ASSERT(m_path);
StrokeData strokeData;
- SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, styleRef(), *this);
+ SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, styleRef(), *this, dashScaleFactor());
if (hasNonScalingStroke()) {
AffineTransform nonScalingTransform = nonScalingStrokeTransform();
@@ -257,7 +280,7 @@ FloatRect LayoutSVGShape::calculateStrokeBoundingBox() const
if (style()->svgStyle().hasStroke()) {
StrokeData strokeData;
- SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, styleRef(), *this);
+ SVGLayoutSupport::applyStrokeStyleToStrokeData(strokeData, styleRef(), *this, dashScaleFactor());
if (hasNonScalingStroke()) {
AffineTransform nonScalingTransform = nonScalingStrokeTransform();
if (nonScalingTransform.isInvertible()) {

Powered by Google App Engine
This is Rietveld 408576698