Index: third_party/WebKit/Source/core/animation/animatable/AnimatablePath.cpp |
diff --git a/third_party/WebKit/Source/core/animation/animatable/AnimatablePath.cpp b/third_party/WebKit/Source/core/animation/animatable/AnimatablePath.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e48c1e7bc7cd703851d5a884d1a65834b55789fd |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/animation/animatable/AnimatablePath.cpp |
@@ -0,0 +1,61 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "config.h" |
+#include "core/animation/animatable/AnimatablePath.h" |
+ |
+#include "core/svg/SVGPathBlender.h" |
+#include "core/svg/SVGPathByteStreamBuilder.h" |
+#include "core/svg/SVGPathByteStreamSource.h" |
+#include "core/svg/SVGPathUtilities.h" |
+ |
+namespace blink { |
+ |
+bool AnimatablePath::usesDefaultInterpolationWith(const AnimatableValue* value) const |
+{ |
+ // Default interpolation is used if the paths have different lengths, |
+ // or the paths have a segment with different types (ignoring "relativeness"). |
+ |
+ SVGPathByteStreamSource fromSource(pathValue()->byteStream()); |
+ SVGPathByteStreamSource toSource(toAnimatablePath(value)->pathValue()->byteStream()); |
+ |
+ while (fromSource.hasMoreData()) { |
+ if (!toSource.hasMoreData()) |
+ return true; |
+ |
+ PathSegmentData fromSeg = fromSource.parseSegment(); |
+ PathSegmentData toSeg = toSource.parseSegment(); |
+ ASSERT(fromSeg.command != PathSegUnknown); |
+ ASSERT(toSeg.command != PathSegUnknown); |
+ |
+ if (toAbsolutePathSegType(fromSeg.command) != toAbsolutePathSegType(toSeg.command)) |
+ return true; |
+ } |
+ |
+ return toSource.hasMoreData(); |
+} |
+ |
+PassRefPtr<AnimatableValue> AnimatablePath::interpolateTo(const AnimatableValue* value, double fraction) const |
+{ |
+ if (usesDefaultInterpolationWith(value)) |
+ return defaultInterpolateTo(this, value, fraction); |
+ |
+ OwnPtr<SVGPathByteStream> byteStream = SVGPathByteStream::create(); |
+ SVGPathByteStreamBuilder builder(*byteStream); |
+ |
+ SVGPathByteStreamSource fromSource(pathValue()->byteStream()); |
+ SVGPathByteStreamSource toSource(toAnimatablePath(value)->pathValue()->byteStream()); |
+ |
+ SVGPathBlender blender(&fromSource, &toSource, &builder); |
+ bool ok = blender.blendAnimatedPath(fraction); |
+ ASSERT_UNUSED(ok, ok); |
+ return AnimatablePath::create(CSSPathValue::create(byteStream.release())); |
+} |
+ |
+bool AnimatablePath::equalTo(const AnimatableValue* value) const |
+{ |
+ return pathValue()->equals(*toAnimatablePath(value)->pathValue()); |
+} |
+ |
+} // namespace blink |