| 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 | 
|  |