void SVGAnimateMotionElement::applyResultsToTarget() { // We accumulate to the target element transform list so there is not much to do here. SVGElement* targetElement = this->targetElement(); if (!targetElement) return; if (RenderObject* renderer = targetElement->renderer()) RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer); AffineTransform* t = targetElement->supplementalTransform(); if (!t) return; // ...except in case where we have additional instances in <use> trees. const HashSet<SVGElementInstance*>& instances = targetElement->instancesForElement(); const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it != end; ++it) { SVGElement* shadowTreeElement = (*it)->shadowTreeElement(); ASSERT(shadowTreeElement); AffineTransform* transform = shadowTreeElement->supplementalTransform(); if (!transform) continue; transform->setMatrix(t->a(), t->b(), t->c(), t->d(), t->e(), t->f()); if (RenderObject* renderer = shadowTreeElement->renderer()) { renderer->setNeedsTransformUpdate(); RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer); } } }
void SVGAnimateMotionElement::applyResultsToTarget() { // We accumulate to the target element transform list so there is not much to do here. SVGElement* targetElement = this->targetElement(); if (!targetElement) return; if (RenderElement* renderer = targetElement->renderer()) RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); AffineTransform* targetSupplementalTransform = targetElement->supplementalTransform(); if (!targetSupplementalTransform) return; // ...except in case where we have additional instances in <use> trees. for (auto* instance : targetElement->instances()) { AffineTransform* transform = instance->supplementalTransform(); if (!transform || *transform == *targetSupplementalTransform) continue; *transform = *targetSupplementalTransform; if (RenderElement* renderer = instance->renderer()) { renderer->setNeedsTransformUpdate(); RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); } } }
void SVGAnimateMotionElement::resetAnimatedType() { if (!hasValidAttributeType()) return; SVGElement* targetElement = this->targetElement(); if (!targetElement) return; if (AffineTransform* transform = targetElement->supplementalTransform()) transform->makeIdentity(); }
void SVGAnimateMotionElement::calculateAnimatedValue(float percentage, unsigned, SVGSMILElement*) { SVGElement* targetElement = this->targetElement(); if (!targetElement) return; AffineTransform* transform = targetElement->supplementalTransform(); if (!transform) return; if (RenderObject* targetRenderer = targetElement->renderer()) targetRenderer->setNeedsTransformUpdate(); if (!isAdditive()) transform->makeIdentity(); // FIXME: Implement accumulate. if (animationMode() == PathAnimation) { ASSERT(!animationPath().isEmpty()); Path path = animationPath(); float positionOnPath = path.length() * percentage; bool ok; FloatPoint position = path.pointAtLength(positionOnPath, ok); if (ok) { transform->translate(position.x(), position.y()); RotateMode rotateMode = this->rotateMode(); if (rotateMode == RotateAuto || rotateMode == RotateAutoReverse) { float angle = path.normalAngleAtLength(positionOnPath, ok); if (rotateMode == RotateAutoReverse) angle += 180; transform->rotate(angle); } } return; } FloatSize diff = m_toPoint - m_fromPoint; transform->translate(diff.width() * percentage + m_fromPoint.x(), diff.height() * percentage + m_fromPoint.y()); }
void SVGAnimateMotionElement::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGSMILElement*) { SVGElement* targetElement = this->targetElement(); if (!targetElement) return; AffineTransform* transform = targetElement->supplementalTransform(); if (!transform) return; if (RenderObject* targetRenderer = targetElement->renderer()) targetRenderer->setNeedsTransformUpdate(); if (!isAdditive()) transform->makeIdentity(); if (animationMode() != PathAnimation) { FloatPoint toPointAtEndOfDuration = m_toPoint; if (isAccumulated() && repeatCount && m_hasToPointAtEndOfDuration) toPointAtEndOfDuration = m_toPointAtEndOfDuration; float animatedX = 0; animateAdditiveNumber(percentage, repeatCount, m_fromPoint.x(), m_toPoint.x(), toPointAtEndOfDuration.x(), animatedX); float animatedY = 0; animateAdditiveNumber(percentage, repeatCount, m_fromPoint.y(), m_toPoint.y(), toPointAtEndOfDuration.y(), animatedY); transform->translate(animatedX, animatedY); return; } buildTransformForProgress(transform, percentage); // Handle accumulate="sum". if (isAccumulated() && repeatCount) { for (unsigned i = 0; i < repeatCount; ++i) buildTransformForProgress(transform, 1); } }