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

Unified Diff: third_party/WebKit/Source/core/svg/SVGPath.cpp

Issue 1460253002: SVGPath object "mutability" cleanup (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase; byteStreamWillChange->byteStreamChanged; Drop some includes. Created 5 years, 1 month 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
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGPath.h ('k') | third_party/WebKit/Source/core/svg/SVGPathUtilities.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/svg/SVGPath.cpp
diff --git a/third_party/WebKit/Source/core/svg/SVGPath.cpp b/third_party/WebKit/Source/core/svg/SVGPath.cpp
index bbc275ccecec7514541a5ddfafa7cb32200f9f01..6fbd605fc6b742d99994818ab2b8909643131fae 100644
--- a/third_party/WebKit/Source/core/svg/SVGPath.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGPath.cpp
@@ -36,6 +36,35 @@
namespace blink {
+namespace {
+
+PassOwnPtr<SVGPathByteStream> blendPathByteStreams(const SVGPathByteStream& fromStream, const SVGPathByteStream& toStream, float progress)
+{
+ OwnPtr<SVGPathByteStream> resultStream = SVGPathByteStream::create();
+ SVGPathByteStreamBuilder builder(*resultStream);
+ SVGPathByteStreamSource fromSource(fromStream);
+ SVGPathByteStreamSource toSource(toStream);
+ SVGPathBlender blender(&fromSource, &toSource, &builder);
+ blender.blendAnimatedPath(progress);
+ return resultStream.release();
+}
+
+PassOwnPtr<SVGPathByteStream> addPathByteStreams(PassOwnPtr<SVGPathByteStream> fromStream, const SVGPathByteStream& byStream, unsigned repeatCount = 1)
+{
+ if (fromStream->isEmpty() || byStream.isEmpty())
+ return fromStream;
+ OwnPtr<SVGPathByteStream> tempFromStream = fromStream;
+ OwnPtr<SVGPathByteStream> resultStream = SVGPathByteStream::create();
+ SVGPathByteStreamBuilder builder(*resultStream);
+ SVGPathByteStreamSource fromSource(*tempFromStream);
+ SVGPathByteStreamSource bySource(byStream);
+ SVGPathBlender blender(&fromSource, &bySource, &builder);
+ blender.addAnimatedPath(repeatCount);
+ return resultStream.release();
+}
+
+}
+
SVGPath::SVGPath()
: SVGPropertyBase(classType())
{
@@ -63,7 +92,7 @@ const Path& SVGPath::path() const
PassRefPtrWillBeRawPtr<SVGPath> SVGPath::clone() const
{
- return adoptRefWillBeNoop(new SVGPath(byteStream().copy()));
+ return SVGPath::create(byteStream().copy());
}
PassRefPtrWillBeRawPtr<SVGPropertyBase> SVGPath::cloneForAnimation(const String& value) const
@@ -81,7 +110,7 @@ SVGPathByteStream& SVGPath::ensureByteStream()
return *m_byteStream.get();
}
-void SVGPath::byteStreamWillChange()
+void SVGPath::byteStreamChanged()
{
m_cachedPath.clear();
}
@@ -91,12 +120,6 @@ const SVGPathByteStream& SVGPath::byteStream() const
return const_cast<SVGPath*>(this)->ensureByteStream();
}
-SVGPathByteStream& SVGPath::mutableByteStream()
-{
- byteStreamWillChange();
- return ensureByteStream();
-}
-
String SVGPath::valueAsString() const
{
String string;
@@ -106,17 +129,24 @@ String SVGPath::valueAsString() const
void SVGPath::setValueAsString(const String& string, ExceptionState& exceptionState)
{
- if (!buildSVGPathByteStreamFromString(string, mutableByteStream(), UnalteredParsing))
+ if (!buildSVGPathByteStreamFromString(string, ensureByteStream(), UnalteredParsing))
exceptionState.throwDOMException(SyntaxError, "Problem parsing path \"" + string + "\"");
+ byteStreamChanged();
+}
+
+void SVGPath::setValueAsByteStream(PassOwnPtr<SVGPathByteStream> byteStream)
+{
+ m_byteStream = byteStream;
+ byteStreamChanged();
}
void SVGPath::add(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement*)
{
- RefPtrWillBeRawPtr<SVGPath> otherList = toSVGPath(other);
- if (byteStream().size() != otherList->byteStream().size())
+ const SVGPathByteStream& otherPathByteStream = toSVGPath(other)->byteStream();
+ if (byteStream().size() != otherPathByteStream.size())
return;
- addToSVGPathByteStream(mutableByteStream(), otherList->byteStream());
+ setValueAsByteStream(addPathByteStreams(m_byteStream.release(), otherPathByteStream));
}
void SVGPath::calculateAnimatedValue(SVGAnimationElement* animationElement, float percentage, unsigned repeatCount, PassRefPtrWillBeRawPtr<SVGPropertyBase> fromValue, PassRefPtrWillBeRawPtr<SVGPropertyBase> toValue, PassRefPtrWillBeRawPtr<SVGPropertyBase> toAtEndOfDurationValue, SVGElement*)
@@ -124,56 +154,47 @@ void SVGPath::calculateAnimatedValue(SVGAnimationElement* animationElement, floa
ASSERT(animationElement);
bool isToAnimation = animationElement->animationMode() == ToAnimation;
- const RefPtrWillBeRawPtr<SVGPath> from = toSVGPath(fromValue);
const RefPtrWillBeRawPtr<SVGPath> to = toSVGPath(toValue);
- const RefPtrWillBeRawPtr<SVGPath> toAtEndOfDuration = toSVGPath(toAtEndOfDurationValue);
-
const SVGPathByteStream& toStream = to->byteStream();
- const SVGPathByteStream* fromStream = &from->byteStream();
- OwnPtr<SVGPathByteStream> copy;
// If no 'to' value is given, nothing to animate.
if (!toStream.size())
return;
+ const RefPtrWillBeRawPtr<SVGPath> from = toSVGPath(fromValue);
+ const SVGPathByteStream* fromStream = &from->byteStream();
+
+ OwnPtr<SVGPathByteStream> copy;
if (isToAnimation) {
copy = byteStream().copy();
fromStream = copy.get();
}
- byteStreamWillChange();
-
// If the 'from' value is given and it's length doesn't match the 'to' value list length, fallback to a discrete animation.
if (fromStream->size() != toStream.size() && fromStream->size()) {
if (percentage < 0.5) {
if (!isToAnimation) {
- m_byteStream = fromStream->copy();
+ setValueAsByteStream(fromStream->copy());
return;
}
} else {
- m_byteStream = toStream.copy();
+ setValueAsByteStream(toStream.copy());
return;
}
}
OwnPtr<SVGPathByteStream> lastAnimatedStream = m_byteStream.release();
-
- m_byteStream = SVGPathByteStream::create();
- SVGPathByteStreamBuilder builder(*m_byteStream);
-
- SVGPathByteStreamSource fromSource(*fromStream);
- SVGPathByteStreamSource toSource(toStream);
-
- SVGPathBlender blender(&fromSource, &toSource, &builder);
- blender.blendAnimatedPath(percentage);
+ OwnPtr<SVGPathByteStream> newStream = blendPathByteStreams(*fromStream, toStream, percentage);
// Handle additive='sum'.
if (!fromStream->size() || (animationElement->isAdditive() && !isToAnimation))
- addToSVGPathByteStream(*m_byteStream, *lastAnimatedStream);
+ newStream = addPathByteStreams(newStream.release(), *lastAnimatedStream);
// Handle accumulate='sum'.
if (animationElement->isAccumulated() && repeatCount)
- addToSVGPathByteStream(*m_byteStream, toAtEndOfDuration->byteStream(), repeatCount);
+ newStream = addPathByteStreams(newStream.release(), toSVGPath(toAtEndOfDurationValue)->byteStream(), repeatCount);
+
+ setValueAsByteStream(newStream.release());
}
float SVGPath::calculateDistance(PassRefPtrWillBeRawPtr<SVGPropertyBase> to, SVGElement*)
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGPath.h ('k') | third_party/WebKit/Source/core/svg/SVGPathUtilities.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698