InterpolationValue SVGNumberInterpolationType::maybeConvertSVGValue( const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedNumber) return nullptr; return InterpolationValue( InterpolableNumber::create(toSVGNumber(svgValue).value())); }
PassOwnPtr<InterpolationValue> SVGPathInterpolationType::maybeConvertSVGValue(const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedPath) return nullptr; SVGPathByteStreamSource pathSource(toSVGPath(svgValue).byteStream()); size_t length = 0; PathCoordinates currentCoordinates; Vector<OwnPtr<InterpolableValue>> interpolablePathSegs; Vector<SVGPathSegType> pathSegTypes; while (pathSource.hasMoreData()) { const PathSegmentData segment = pathSource.parseSegment(); interpolablePathSegs.append(SVGPathSegInterpolationFunctions::consumePathSeg(segment, currentCoordinates)); pathSegTypes.append(segment.command); length++; } OwnPtr<InterpolableList> pathArgs = InterpolableList::create(length); for (size_t i = 0; i < interpolablePathSegs.size(); i++) pathArgs->set(i, interpolablePathSegs[i].release()); OwnPtr<InterpolableList> result = InterpolableList::create(PathComponentIndexCount); result->set(PathArgsIndex, pathArgs.release()); result->set(PathNeutralIndex, InterpolableNumber::create(0)); return InterpolationValue::create(*this, result.release(), SVGPathNonInterpolableValue::create(pathSegTypes)); }
InterpolationValue SVGPathInterpolationType::maybeConvertSVGValue( const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedPath) return nullptr; return PathInterpolationFunctions::convertValue( toSVGPath(svgValue).byteStream()); }
PassOwnPtr<InterpolationValue> SVGNumberListInterpolationType::maybeConvertSVGValue(const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedNumberList) return nullptr; const SVGNumberList& numberList = toSVGNumberList(svgValue); OwnPtr<InterpolableList> result = InterpolableList::create(numberList.length()); for (size_t i = 0; i < numberList.length(); i++) result->set(i, InterpolableNumber::create(numberList.at(i)->value())); return InterpolationValue::create(*this, result.release()); }
PassOwnPtr<InterpolationValue> SVGIntegerOptionalIntegerInterpolationType::maybeConvertSVGValue(const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedIntegerOptionalInteger) return nullptr; const SVGIntegerOptionalInteger& integerOptionalInteger = toSVGIntegerOptionalInteger(svgValue); OwnPtr<InterpolableList> result = InterpolableList::create(2); result->set(0, InterpolableNumber::create(integerOptionalInteger.firstInteger()->value())); result->set(1, InterpolableNumber::create(integerOptionalInteger.secondInteger()->value())); return InterpolationValue::create(*this, result.release()); }
InterpolationValue SVGNumberListInterpolationType::maybeConvertSVGValue( const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedNumberList) return nullptr; const SVGNumberList& numberList = toSVGNumberList(svgValue); std::unique_ptr<InterpolableList> result = InterpolableList::create(numberList.length()); for (size_t i = 0; i < numberList.length(); i++) result->set(i, InterpolableNumber::create(numberList.at(i)->value())); return InterpolationValue(std::move(result)); }
PassOwnPtr<InterpolationValue> SVGRectInterpolationType::maybeConvertSVGValue(const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedRect) return nullptr; const SVGRect& rect = toSVGRect(svgValue); OwnPtr<InterpolableList> result = InterpolableList::create(RectComponentIndexCount); result->set(RectX, InterpolableNumber::create(rect.x())); result->set(RectY, InterpolableNumber::create(rect.y())); result->set(RectWidth, InterpolableNumber::create(rect.width())); result->set(RectHeight, InterpolableNumber::create(rect.height())); return InterpolationValue::create(*this, result.release()); }
InterpolationValue SVGPointListInterpolationType::maybeConvertSVGValue( const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedPoints) return nullptr; const SVGPointList& pointList = toSVGPointList(svgValue); std::unique_ptr<InterpolableList> result = InterpolableList::create(pointList.length() * 2); for (size_t i = 0; i < pointList.length(); i++) { const SVGPoint& point = *pointList.at(i); result->set(2 * i, InterpolableNumber::create(point.x())); result->set(2 * i + 1, InterpolableNumber::create(point.y())); } return InterpolationValue(std::move(result)); }
InterpolationValue SVGTransformListInterpolationType::maybeConvertSVGValue(const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedTransformList) return nullptr; const SVGTransformList& svgList = toSVGTransformList(svgValue); OwnPtr<InterpolableList> result = InterpolableList::create(svgList.length()); Vector<SVGTransformType> transformTypes; for (size_t i = 0; i < svgList.length(); i++) { const SVGTransform* transform = svgList.at(i); SVGTransformType transformType(transform->transformType()); if (transformType == SVG_TRANSFORM_MATRIX) { // TODO(ericwilligers): Support matrix interpolation. return nullptr; } result->set(i, toInterpolableValue(transform->clone().get(), transformType)); transformTypes.append(transformType); } return InterpolationValue(result.release(), SVGTransformNonInterpolableValue::create(transformTypes)); }
PassOwnPtr<InterpolationValue> SVGIntegerInterpolationType::maybeConvertSVGValue(const SVGPropertyBase& svgValue) const { if (svgValue.type() != AnimatedInteger) return nullptr; return InterpolationValue::create(*this, InterpolableNumber::create(toSVGInteger(svgValue).value())); }