| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/animation/SVGPathSegInterpolationFunctions.h" | 5 #include "core/animation/SVGPathSegInterpolationFunctions.h" |
| 6 | 6 |
| 7 namespace blink { | 7 namespace blink { |
| 8 | 8 |
| 9 | 9 |
| 10 PassOwnPtr<InterpolableNumber> consumeControlAxis(double value, bool isAbsolute,
double currentValue) | 10 PassOwnPtr<InterpolableNumber> consumeControlAxis(double value, bool isAbsolute,
double currentValue) |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 OwnPtr<InterpolableList> result = InterpolableList::create(2); | 57 OwnPtr<InterpolableList> result = InterpolableList::create(2); |
| 58 result->set(0, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); | 58 result->set(0, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); |
| 59 result->set(1, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); | 59 result->set(1, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); |
| 60 | 60 |
| 61 if (toAbsolutePathSegType(segment.command) == PathSegMoveToAbs) { | 61 if (toAbsolutePathSegType(segment.command) == PathSegMoveToAbs) { |
| 62 // Any upcoming 'closepath' commands bring us back to the location we ha
ve just moved to. | 62 // Any upcoming 'closepath' commands bring us back to the location we ha
ve just moved to. |
| 63 coordinates.initialX = coordinates.currentX; | 63 coordinates.initialX = coordinates.currentX; |
| 64 coordinates.initialY = coordinates.currentY; | 64 coordinates.initialY = coordinates.currentY; |
| 65 } | 65 } |
| 66 | 66 |
| 67 return result.release(); | 67 return std::move(result); |
| 68 } | 68 } |
| 69 | 69 |
| 70 PathSegmentData consumeInterpolableSingleCoordinate(const InterpolableValue& val
ue, SVGPathSegType segType, PathCoordinates& coordinates) | 70 PathSegmentData consumeInterpolableSingleCoordinate(const InterpolableValue& val
ue, SVGPathSegType segType, PathCoordinates& coordinates) |
| 71 { | 71 { |
| 72 const InterpolableList& list = toInterpolableList(value); | 72 const InterpolableList& list = toInterpolableList(value); |
| 73 bool isAbsolute = isAbsolutePathSegType(segType); | 73 bool isAbsolute = isAbsolutePathSegType(segType); |
| 74 PathSegmentData segment; | 74 PathSegmentData segment; |
| 75 segment.command = segType; | 75 segment.command = segType; |
| 76 segment.targetPoint.setX(consumeInterpolableCoordinateAxis(list.get(0), isAb
solute, coordinates.currentX)); | 76 segment.targetPoint.setX(consumeInterpolableCoordinateAxis(list.get(0), isAb
solute, coordinates.currentX)); |
| 77 segment.targetPoint.setY(consumeInterpolableCoordinateAxis(list.get(1), isAb
solute, coordinates.currentY)); | 77 segment.targetPoint.setY(consumeInterpolableCoordinateAxis(list.get(1), isAb
solute, coordinates.currentY)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 88 PassOwnPtr<InterpolableValue> consumeCurvetoCubic(const PathSegmentData& segment
, PathCoordinates& coordinates) | 88 PassOwnPtr<InterpolableValue> consumeCurvetoCubic(const PathSegmentData& segment
, PathCoordinates& coordinates) |
| 89 { | 89 { |
| 90 bool isAbsolute = isAbsolutePathSegType(segment.command); | 90 bool isAbsolute = isAbsolutePathSegType(segment.command); |
| 91 OwnPtr<InterpolableList> result = InterpolableList::create(6); | 91 OwnPtr<InterpolableList> result = InterpolableList::create(6); |
| 92 result->set(0, consumeControlAxis(segment.x1(), isAbsolute, coordinates.curr
entX)); | 92 result->set(0, consumeControlAxis(segment.x1(), isAbsolute, coordinates.curr
entX)); |
| 93 result->set(1, consumeControlAxis(segment.y1(), isAbsolute, coordinates.curr
entY)); | 93 result->set(1, consumeControlAxis(segment.y1(), isAbsolute, coordinates.curr
entY)); |
| 94 result->set(2, consumeControlAxis(segment.x2(), isAbsolute, coordinates.curr
entX)); | 94 result->set(2, consumeControlAxis(segment.x2(), isAbsolute, coordinates.curr
entX)); |
| 95 result->set(3, consumeControlAxis(segment.y2(), isAbsolute, coordinates.curr
entY)); | 95 result->set(3, consumeControlAxis(segment.y2(), isAbsolute, coordinates.curr
entY)); |
| 96 result->set(4, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); | 96 result->set(4, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); |
| 97 result->set(5, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); | 97 result->set(5, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); |
| 98 return result.release(); | 98 return std::move(result); |
| 99 } | 99 } |
| 100 | 100 |
| 101 PathSegmentData consumeInterpolableCurvetoCubic(const InterpolableValue& value,
SVGPathSegType segType, PathCoordinates& coordinates) | 101 PathSegmentData consumeInterpolableCurvetoCubic(const InterpolableValue& value,
SVGPathSegType segType, PathCoordinates& coordinates) |
| 102 { | 102 { |
| 103 const InterpolableList& list = toInterpolableList(value); | 103 const InterpolableList& list = toInterpolableList(value); |
| 104 bool isAbsolute = isAbsolutePathSegType(segType); | 104 bool isAbsolute = isAbsolutePathSegType(segType); |
| 105 PathSegmentData segment; | 105 PathSegmentData segment; |
| 106 segment.command = segType; | 106 segment.command = segType; |
| 107 segment.point1.setX(consumeInterpolableControlAxis(list.get(0), isAbsolute,
coordinates.currentX)); | 107 segment.point1.setX(consumeInterpolableControlAxis(list.get(0), isAbsolute,
coordinates.currentX)); |
| 108 segment.point1.setY(consumeInterpolableControlAxis(list.get(1), isAbsolute,
coordinates.currentY)); | 108 segment.point1.setY(consumeInterpolableControlAxis(list.get(1), isAbsolute,
coordinates.currentY)); |
| 109 segment.point2.setX(consumeInterpolableControlAxis(list.get(2), isAbsolute,
coordinates.currentX)); | 109 segment.point2.setX(consumeInterpolableControlAxis(list.get(2), isAbsolute,
coordinates.currentX)); |
| 110 segment.point2.setY(consumeInterpolableControlAxis(list.get(3), isAbsolute,
coordinates.currentY)); | 110 segment.point2.setY(consumeInterpolableControlAxis(list.get(3), isAbsolute,
coordinates.currentY)); |
| 111 segment.targetPoint.setX(consumeInterpolableCoordinateAxis(list.get(4), isAb
solute, coordinates.currentX)); | 111 segment.targetPoint.setX(consumeInterpolableCoordinateAxis(list.get(4), isAb
solute, coordinates.currentX)); |
| 112 segment.targetPoint.setY(consumeInterpolableCoordinateAxis(list.get(5), isAb
solute, coordinates.currentY)); | 112 segment.targetPoint.setY(consumeInterpolableCoordinateAxis(list.get(5), isAb
solute, coordinates.currentY)); |
| 113 return segment; | 113 return segment; |
| 114 } | 114 } |
| 115 | 115 |
| 116 PassOwnPtr<InterpolableValue> consumeCurvetoQuadratic(const PathSegmentData& seg
ment, PathCoordinates& coordinates) | 116 PassOwnPtr<InterpolableValue> consumeCurvetoQuadratic(const PathSegmentData& seg
ment, PathCoordinates& coordinates) |
| 117 { | 117 { |
| 118 bool isAbsolute = isAbsolutePathSegType(segment.command); | 118 bool isAbsolute = isAbsolutePathSegType(segment.command); |
| 119 OwnPtr<InterpolableList> result = InterpolableList::create(4); | 119 OwnPtr<InterpolableList> result = InterpolableList::create(4); |
| 120 result->set(0, consumeControlAxis(segment.x1(), isAbsolute, coordinates.curr
entX)); | 120 result->set(0, consumeControlAxis(segment.x1(), isAbsolute, coordinates.curr
entX)); |
| 121 result->set(1, consumeControlAxis(segment.y1(), isAbsolute, coordinates.curr
entY)); | 121 result->set(1, consumeControlAxis(segment.y1(), isAbsolute, coordinates.curr
entY)); |
| 122 result->set(2, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); | 122 result->set(2, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); |
| 123 result->set(3, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); | 123 result->set(3, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); |
| 124 return result.release(); | 124 return std::move(result); |
| 125 } | 125 } |
| 126 | 126 |
| 127 PathSegmentData consumeInterpolableCurvetoQuadratic(const InterpolableValue& val
ue, SVGPathSegType segType, PathCoordinates& coordinates) | 127 PathSegmentData consumeInterpolableCurvetoQuadratic(const InterpolableValue& val
ue, SVGPathSegType segType, PathCoordinates& coordinates) |
| 128 { | 128 { |
| 129 const InterpolableList& list = toInterpolableList(value); | 129 const InterpolableList& list = toInterpolableList(value); |
| 130 bool isAbsolute = isAbsolutePathSegType(segType); | 130 bool isAbsolute = isAbsolutePathSegType(segType); |
| 131 PathSegmentData segment; | 131 PathSegmentData segment; |
| 132 segment.command = segType; | 132 segment.command = segType; |
| 133 segment.point1.setX(consumeInterpolableControlAxis(list.get(0), isAbsolute,
coordinates.currentX)); | 133 segment.point1.setX(consumeInterpolableControlAxis(list.get(0), isAbsolute,
coordinates.currentX)); |
| 134 segment.point1.setY(consumeInterpolableControlAxis(list.get(1), isAbsolute,
coordinates.currentY)); | 134 segment.point1.setY(consumeInterpolableControlAxis(list.get(1), isAbsolute,
coordinates.currentY)); |
| 135 segment.targetPoint.setX(consumeInterpolableCoordinateAxis(list.get(2), isAb
solute, coordinates.currentX)); | 135 segment.targetPoint.setX(consumeInterpolableCoordinateAxis(list.get(2), isAb
solute, coordinates.currentX)); |
| 136 segment.targetPoint.setY(consumeInterpolableCoordinateAxis(list.get(3), isAb
solute, coordinates.currentY)); | 136 segment.targetPoint.setY(consumeInterpolableCoordinateAxis(list.get(3), isAb
solute, coordinates.currentY)); |
| 137 return segment; | 137 return segment; |
| 138 } | 138 } |
| 139 | 139 |
| 140 PassOwnPtr<InterpolableValue> consumeArc(const PathSegmentData& segment, PathCoo
rdinates& coordinates) | 140 PassOwnPtr<InterpolableValue> consumeArc(const PathSegmentData& segment, PathCoo
rdinates& coordinates) |
| 141 { | 141 { |
| 142 bool isAbsolute = isAbsolutePathSegType(segment.command); | 142 bool isAbsolute = isAbsolutePathSegType(segment.command); |
| 143 OwnPtr<InterpolableList> result = InterpolableList::create(7); | 143 OwnPtr<InterpolableList> result = InterpolableList::create(7); |
| 144 result->set(0, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); | 144 result->set(0, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); |
| 145 result->set(1, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); | 145 result->set(1, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); |
| 146 result->set(2, InterpolableNumber::create(segment.r1())); | 146 result->set(2, InterpolableNumber::create(segment.r1())); |
| 147 result->set(3, InterpolableNumber::create(segment.r2())); | 147 result->set(3, InterpolableNumber::create(segment.r2())); |
| 148 result->set(4, InterpolableNumber::create(segment.arcAngle())); | 148 result->set(4, InterpolableNumber::create(segment.arcAngle())); |
| 149 result->set(5, InterpolableBool::create(segment.largeArcFlag())); | 149 result->set(5, InterpolableBool::create(segment.largeArcFlag())); |
| 150 result->set(6, InterpolableBool::create(segment.sweepFlag())); | 150 result->set(6, InterpolableBool::create(segment.sweepFlag())); |
| 151 return result.release(); | 151 return std::move(result); |
| 152 } | 152 } |
| 153 | 153 |
| 154 PathSegmentData consumeInterpolableArc(const InterpolableValue& value, SVGPathSe
gType segType, PathCoordinates& coordinates) | 154 PathSegmentData consumeInterpolableArc(const InterpolableValue& value, SVGPathSe
gType segType, PathCoordinates& coordinates) |
| 155 { | 155 { |
| 156 const InterpolableList& list = toInterpolableList(value); | 156 const InterpolableList& list = toInterpolableList(value); |
| 157 bool isAbsolute = isAbsolutePathSegType(segType); | 157 bool isAbsolute = isAbsolutePathSegType(segType); |
| 158 PathSegmentData segment; | 158 PathSegmentData segment; |
| 159 segment.command = segType; | 159 segment.command = segType; |
| 160 segment.targetPoint.setX(consumeInterpolableCoordinateAxis(list.get(0), isAb
solute, coordinates.currentX)); | 160 segment.targetPoint.setX(consumeInterpolableCoordinateAxis(list.get(0), isAb
solute, coordinates.currentX)); |
| 161 segment.targetPoint.setY(consumeInterpolableCoordinateAxis(list.get(1), isAb
solute, coordinates.currentY)); | 161 segment.targetPoint.setY(consumeInterpolableCoordinateAxis(list.get(1), isAb
solute, coordinates.currentY)); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 } | 198 } |
| 199 | 199 |
| 200 PassOwnPtr<InterpolableValue> consumeCurvetoCubicSmooth(const PathSegmentData& s
egment, PathCoordinates& coordinates) | 200 PassOwnPtr<InterpolableValue> consumeCurvetoCubicSmooth(const PathSegmentData& s
egment, PathCoordinates& coordinates) |
| 201 { | 201 { |
| 202 bool isAbsolute = isAbsolutePathSegType(segment.command); | 202 bool isAbsolute = isAbsolutePathSegType(segment.command); |
| 203 OwnPtr<InterpolableList> result = InterpolableList::create(4); | 203 OwnPtr<InterpolableList> result = InterpolableList::create(4); |
| 204 result->set(0, consumeControlAxis(segment.x2(), isAbsolute, coordinates.curr
entX)); | 204 result->set(0, consumeControlAxis(segment.x2(), isAbsolute, coordinates.curr
entX)); |
| 205 result->set(1, consumeControlAxis(segment.y2(), isAbsolute, coordinates.curr
entY)); | 205 result->set(1, consumeControlAxis(segment.y2(), isAbsolute, coordinates.curr
entY)); |
| 206 result->set(2, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); | 206 result->set(2, consumeCoordinateAxis(segment.x(), isAbsolute, coordinates.cu
rrentX)); |
| 207 result->set(3, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); | 207 result->set(3, consumeCoordinateAxis(segment.y(), isAbsolute, coordinates.cu
rrentY)); |
| 208 return result.release(); | 208 return std::move(result); |
| 209 } | 209 } |
| 210 | 210 |
| 211 PathSegmentData consumeInterpolableCurvetoCubicSmooth(const InterpolableValue& v
alue, SVGPathSegType segType, PathCoordinates& coordinates) | 211 PathSegmentData consumeInterpolableCurvetoCubicSmooth(const InterpolableValue& v
alue, SVGPathSegType segType, PathCoordinates& coordinates) |
| 212 { | 212 { |
| 213 const InterpolableList& list = toInterpolableList(value); | 213 const InterpolableList& list = toInterpolableList(value); |
| 214 bool isAbsolute = isAbsolutePathSegType(segType); | 214 bool isAbsolute = isAbsolutePathSegType(segType); |
| 215 PathSegmentData segment; | 215 PathSegmentData segment; |
| 216 segment.command = segType; | 216 segment.command = segType; |
| 217 segment.point2.setX(consumeInterpolableControlAxis(list.get(0), isAbsolute,
coordinates.currentX)); | 217 segment.point2.setX(consumeInterpolableControlAxis(list.get(0), isAbsolute,
coordinates.currentX)); |
| 218 segment.point2.setY(consumeInterpolableControlAxis(list.get(1), isAbsolute,
coordinates.currentY)); | 218 segment.point2.setY(consumeInterpolableControlAxis(list.get(1), isAbsolute,
coordinates.currentY)); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 return consumeInterpolableCurvetoCubicSmooth(value, segType, coordinates
); | 305 return consumeInterpolableCurvetoCubicSmooth(value, segType, coordinates
); |
| 306 | 306 |
| 307 case PathSegUnknown: | 307 case PathSegUnknown: |
| 308 default: | 308 default: |
| 309 ASSERT_NOT_REACHED(); | 309 ASSERT_NOT_REACHED(); |
| 310 return PathSegmentData(); | 310 return PathSegmentData(); |
| 311 } | 311 } |
| 312 } | 312 } |
| 313 | 313 |
| 314 } // namespace blink | 314 } // namespace blink |
| OLD | NEW |