This source file includes following definitions.
- m_value
- clone
- cloneForAnimation
- valueAsString
- parse
- setValueAsString
- add
- calculateAnimatedValue
- calculateDistance
- clone
- setValueAsString
#include "config.h"
#include "core/svg/SVGNumber.h"
#include "core/svg/SVGAnimationElement.h"
#include "core/svg/SVGParserUtilities.h"
namespace WebCore {
SVGNumber::SVGNumber(float value)
: SVGPropertyBase(classType())
, m_value(value)
{
}
PassRefPtr<SVGNumber> SVGNumber::clone() const
{
return create(m_value);
}
PassRefPtr<SVGPropertyBase> SVGNumber::cloneForAnimation(const String& value) const
{
RefPtr<SVGNumber> svgNumber = create();
svgNumber->setValueAsString(value, IGNORE_EXCEPTION);
return svgNumber.release();
}
String SVGNumber::valueAsString() const
{
return String::number(m_value);
}
template<typename CharType>
bool SVGNumber::parse(const CharType*& ptr, const CharType* end)
{
if (!parseNumber(ptr, end, m_value, false)) {
m_value = 0;
return false;
}
if (ptr != end) {
m_value = 0;
return false;
}
return true;
}
void SVGNumber::setValueAsString(const String& string, ExceptionState& exceptionState)
{
if (string.isEmpty()) {
m_value = 0;
return;
}
bool valid = false;
if (string.is8Bit()) {
const LChar* ptr = string.characters8();
const LChar* end = ptr + string.length();
valid = parse(ptr, end);
} else {
const UChar* ptr = string.characters16();
const UChar* end = ptr + string.length();
valid = parse(ptr, end);
}
if (!valid) {
exceptionState.throwDOMException(SyntaxError, "The value provided ('" + string + "') is invalid.");
m_value = 0;
}
}
void SVGNumber::add(PassRefPtr<SVGPropertyBase> other, SVGElement*)
{
setValue(m_value + toSVGNumber(other)->value());
}
void SVGNumber::calculateAnimatedValue(SVGAnimationElement* animationElement, float percentage, unsigned repeatCount, PassRefPtr<SVGPropertyBase> from, PassRefPtr<SVGPropertyBase> to, PassRefPtr<SVGPropertyBase> toAtEndOfDuration, SVGElement*)
{
ASSERT(animationElement);
RefPtr<SVGNumber> fromNumber = toSVGNumber(from);
RefPtr<SVGNumber> toNumber = toSVGNumber(to);
RefPtr<SVGNumber> toAtEndOfDurationNumber = toSVGNumber(toAtEndOfDuration);
animationElement->animateAdditiveNumber(percentage, repeatCount, fromNumber->value(), toNumber->value(), toAtEndOfDurationNumber->value(), m_value);
}
float SVGNumber::calculateDistance(PassRefPtr<SVGPropertyBase> other, SVGElement*)
{
return fabsf(m_value - toSVGNumber(other)->value());
}
PassRefPtr<SVGNumber> SVGNumberAcceptPercentage::clone() const
{
return create(m_value);
}
void SVGNumberAcceptPercentage::setValueAsString(const String& string, ExceptionState& exceptionState)
{
if (string.isEmpty()) {
m_value = 0;
return;
}
if (string.endsWith('%')) {
SVGNumber::setValueAsString(string.left(string.length() - 1), exceptionState);
if (exceptionState.hadException())
return;
m_value /= 100.0f;
return;
}
SVGNumber::setValueAsString(string, exceptionState);
}
SVGNumberAcceptPercentage::SVGNumberAcceptPercentage(float value)
: SVGNumber(value)
{
}
}