bool SVGAnimateTransformElement::calculateFromAndToValues(const String& fromString, const String& toString) { m_fromTransform = parseTransformValue(fromString); if (!m_fromTransform.isValid()) return false; m_toTransform = parseTransformValue(toString); return m_toTransform.isValid(); }
bool SVGAnimateTransformElement::calculateFromAndByValues(const String& fromString, const String& byString) { m_fromTransform = parseTransformValue(fromString); if (!m_fromTransform.isValid()) return false; m_toTransform = SVGTransformDistance::addSVGTransforms(m_fromTransform, parseTransformValue(byString)); return m_toTransform.isValid(); }
bool SVGTransformable::parseTransformAttribute(SVGTransformList* list, const UChar*& currTransform, const UChar* end) { bool delimParsed = false; while (currTransform < end) { delimParsed = false; unsigned short type = SVGTransform::SVG_TRANSFORM_UNKNOWN; skipOptionalSpaces(currTransform, end); if (!parseAndSkipType(currTransform, end, type)) return false; SVGTransform t; if (!parseTransformValue(type, currTransform, end, t)) return false; ExceptionCode ec = 0; list->appendItem(t, ec); skipOptionalSpaces(currTransform, end); if (currTransform < end && *currTransform == ',') { delimParsed = true; currTransform++; } skipOptionalSpaces(currTransform, end); } return !delimParsed; }
bool SVGTransformable::parseTransformAttribute(SVGTransformList& list, const UChar*& currTransform, const UChar* end, TransformParsingMode mode) { if (mode == ClearList) list.clear(); bool delimParsed = false; while (currTransform < end) { delimParsed = false; SVGTransform::SVGTransformType type = SVGTransform::SVG_TRANSFORM_UNKNOWN; skipOptionalSVGSpaces(currTransform, end); if (!parseAndSkipType(currTransform, end, type)) return false; SVGTransform transform; if (!parseTransformValue(type, currTransform, end, transform)) return false; list.append(transform); skipOptionalSVGSpaces(currTransform, end); if (currTransform < end && *currTransform == ',') { delimParsed = true; ++currTransform; } skipOptionalSVGSpaces(currTransform, end); } return !delimParsed; }
float SVGAnimateTransformElement::calculateDistance(const String& fromString, const String& toString) { // FIXME: This is not correct in all cases. The spec demands that each component (translate x and y for example) // is paced separately. To implement this we need to treat each component as individual animation everywhere. SVGTransform from = parseTransformValue(fromString); if (!from.isValid()) return -1.f; SVGTransform to = parseTransformValue(toString); if (!to.isValid() || from.type() != to.type()) return -1.f; if (to.type() == SVGTransform::SVG_TRANSFORM_TRANSLATE) { FloatSize diff = to.translate() - from.translate(); return sqrtf(diff.width() * diff.width() + diff.height() * diff.height()); } if (to.type() == SVGTransform::SVG_TRANSFORM_ROTATE) return fabsf(to.angle() - from.angle()); if (to.type() == SVGTransform::SVG_TRANSFORM_SCALE) { FloatSize diff = to.scale() - from.scale(); return sqrtf(diff.width() * diff.width() + diff.height() * diff.height()); } return -1.f; }