109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/* 209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Copyright (C) 2014 Google Inc. All rights reserved. 309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * 409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * modification, are permitted provided that the following conditions are 609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * met: 709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * 809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 1009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 1109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 1209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * in the documentation and/or other materials provided with the 1309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * distribution. 1409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 1509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 1609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * this software without specific prior written permission. 1709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * 1809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */ 3009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "config.h" 3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/svg/SVGNumberOptionalNumber.h" 3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/svg/SVGAnimationElement.h" 3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/svg/SVGParserUtilities.h" 3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)namespace WebCore { 3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)SVGNumberOptionalNumber::SVGNumberOptionalNumber(PassRefPtr<SVGNumber> firstNumber, PassRefPtr<SVGNumber> secondNumber) 4007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch : SVGPropertyBase(classType()) 4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_firstNumber(firstNumber) 4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) , m_secondNumber(secondNumber) 4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassRefPtr<SVGNumberOptionalNumber> SVGNumberOptionalNumber::clone() const 4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return SVGNumberOptionalNumber::create(m_firstNumber->clone(), m_secondNumber->clone()); 4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 5107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochPassRefPtr<SVGPropertyBase> SVGNumberOptionalNumber::cloneForAnimation(const String& value) const 5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) float x, y; 5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!parseNumberOptionalNumber(value, x, y)) { 5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) x = y = 0; 5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return SVGNumberOptionalNumber::create(SVGNumber::create(x), SVGNumber::create(y)); 5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)String SVGNumberOptionalNumber::valueAsString() const 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_firstNumber->value() == m_secondNumber->value()) { 6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return String::number(m_firstNumber->value()); 6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return String::number(m_firstNumber->value()) + " " + String::number(m_secondNumber->value()); 6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void SVGNumberOptionalNumber::setValueAsString(const String& value, ExceptionState& exceptionState) 7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) float x, y; 7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!parseNumberOptionalNumber(value, x, y)) { 7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) exceptionState.throwDOMException(SyntaxError, "The value provided ('" + value + "') is invalid."); 7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) x = y = 0; 7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_firstNumber->setValue(x); 7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_secondNumber->setValue(y); 8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 82d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void SVGNumberOptionalNumber::add(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement*) 8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<SVGNumberOptionalNumber> otherNumberOptionalNumber = toSVGNumberOptionalNumber(other); 8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_firstNumber->setValue(m_firstNumber->value() + otherNumberOptionalNumber->m_firstNumber->value()); 8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_secondNumber->setValue(m_secondNumber->value() + otherNumberOptionalNumber->m_secondNumber->value()); 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 9007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid SVGNumberOptionalNumber::calculateAnimatedValue(SVGAnimationElement* animationElement, float percentage, unsigned repeatCount, PassRefPtr<SVGPropertyBase> from, PassRefPtr<SVGPropertyBase> to, PassRefPtr<SVGPropertyBase> toAtEndOfDuration, SVGElement*) 9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(animationElement); 9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<SVGNumberOptionalNumber> fromNumber = toSVGNumberOptionalNumber(from); 9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<SVGNumberOptionalNumber> toNumber = toSVGNumberOptionalNumber(to); 9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<SVGNumberOptionalNumber> toAtEndOfDurationNumber = toSVGNumberOptionalNumber(toAtEndOfDuration); 9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) float x = m_firstNumber->value(); 9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) float y = m_secondNumber->value(); 10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) animationElement->animateAdditiveNumber(percentage, repeatCount, fromNumber->firstNumber()->value(), toNumber->firstNumber()->value(), toAtEndOfDurationNumber->firstNumber()->value(), x); 10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) animationElement->animateAdditiveNumber(percentage, repeatCount, fromNumber->secondNumber()->value(), toNumber->secondNumber()->value(), toAtEndOfDurationNumber->secondNumber()->value(), y); 10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_firstNumber->setValue(x); 10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_secondNumber->setValue(y); 10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 10607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochfloat SVGNumberOptionalNumber::calculateDistance(PassRefPtr<SVGPropertyBase> other, SVGElement*) 10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIXME: Distance calculation is not possible for SVGNumberOptionalNumber right now. We need the distance for every single value. 10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return -1; 11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 113