17bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/* 27bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * Copyright (C) 2014 Google Inc. All rights reserved. 37bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * 47bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * Redistribution and use in source and binary forms, with or without 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner * modification, are permitted provided that the following conditions are 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner * met: 77bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * 87bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * * Redistributions of source code must retain the above copyright 97bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * notice, this list of conditions and the following disclaimer. 107bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * * Redistributions in binary form must reproduce the above 117bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * copyright notice, this list of conditions and the following disclaimer 127bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * in the documentation and/or other materials provided with the 137bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * distribution. 147bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * * Neither the name of Google Inc. nor the names of its 1548575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng * contributors may be used to endorse or promote products derived from 167bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * this software without specific prior written permission. 17ee04a6d3a40c3017124e3fd89a0db473a2824498Evan Cheng * 187bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 197bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 207bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 217248451c4307c05cf3ddfa8133f0c5334bab6455Weiming Zhao * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 227bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 237bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth */ 3094cc6d3a2b0a424527edcddd1875ed649e8b84f0Evan Cheng 313d62d780abbe0c2dd8edd7dd37a27365b2032d73Chris Lattner#include "config.h" 327bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "core/svg/SVGIntegerOptionalInteger.h" 33dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin 34d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "core/svg/SVGAnimationElement.h" 35d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "core/svg/SVGParserUtilities.h" 36dac237e18209b697a8ba122d0ddd9cad4dfba1f8Torok Edwin 377bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolanamespace blink { 387bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesSVGIntegerOptionalInteger::SVGIntegerOptionalInteger(PassRefPtr<SVGInteger> firstInteger, PassRefPtr<SVGInteger> secondInteger) 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : SVGPropertyBase(classType()) 41a2c519bd0bdb19d4bb1f2377fcf429653af95960Evan Cheng , m_firstInteger(firstInteger) 42a2c519bd0bdb19d4bb1f2377fcf429653af95960Evan Cheng , m_secondInteger(secondInteger) 43a2c519bd0bdb19d4bb1f2377fcf429653af95960Evan Cheng{ 44a2c519bd0bdb19d4bb1f2377fcf429653af95960Evan Cheng} 45a2c519bd0bdb19d4bb1f2377fcf429653af95960Evan Cheng 4648575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan ChengPassRefPtr<SVGIntegerOptionalInteger> SVGIntegerOptionalInteger::clone() const 4748575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng{ 4848575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng return SVGIntegerOptionalInteger::create(m_firstInteger->clone(), m_secondInteger->clone()); 4984c5eed15baa3710d7fb8522c7a28c8e0b732c2bBob Wilson} 5048575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 51a8e2989ece6dc46df59b0768184028257f913843Evan ChengPassRefPtr<SVGPropertyBase> SVGIntegerOptionalInteger::cloneForAnimation(const String& value) const 52a8e2989ece6dc46df59b0768184028257f913843Evan Cheng{ 53a8e2989ece6dc46df59b0768184028257f913843Evan Cheng float floatX, floatY; 54a8e2989ece6dc46df59b0768184028257f913843Evan Cheng if (!parseNumberOptionalNumber(value, floatX, floatY)) { 557bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola return SVGIntegerOptionalInteger::create(SVGInteger::create(0), SVGInteger::create(0)); 56828916203a731c5031fbe440f1fc6cdf82b2e711Jim Grosbach } 57828916203a731c5031fbe440f1fc6cdf82b2e711Jim Grosbach 58828916203a731c5031fbe440f1fc6cdf82b2e711Jim Grosbach int x = static_cast<int>(roundf(floatX)); 59828916203a731c5031fbe440f1fc6cdf82b2e711Jim Grosbach int y = static_cast<int>(roundf(floatY)); 60828916203a731c5031fbe440f1fc6cdf82b2e711Jim Grosbach 61828916203a731c5031fbe440f1fc6cdf82b2e711Jim Grosbach return SVGIntegerOptionalInteger::create(SVGInteger::create(x), SVGInteger::create(y)); 62a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} 63a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 64a8e2989ece6dc46df59b0768184028257f913843Evan ChengString SVGIntegerOptionalInteger::valueAsString() const 65a8e2989ece6dc46df59b0768184028257f913843Evan Cheng{ 664b20fbc01d6a298bb3c8c22cb76c33b366c1c1b9Rafael Espindola if (m_firstInteger->value() == m_secondInteger->value()) { 67a8e2989ece6dc46df59b0768184028257f913843Evan Cheng return String::number(m_firstInteger->value()); 68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 7084b19be6ab9544f72eafb11048a1121f5ea77c95Rafael Espindola return String::number(m_firstInteger->value()) + " " + String::number(m_secondInteger->value()); 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid SVGIntegerOptionalInteger::setValueAsString(const String& value, ExceptionState& exceptionState) 74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines{ 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines float x, y; 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!parseNumberOptionalNumber(value, x, y)) { 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines exceptionState.throwDOMException(SyntaxError, "The value provided ('" + value + "') is invalid."); 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines x = y = 0; 79a8e2989ece6dc46df59b0768184028257f913843Evan Cheng } 8052237119a9b41d6d714c96e730d651300b171298Anton Korobeynikov 8152237119a9b41d6d714c96e730d651300b171298Anton Korobeynikov m_firstInteger->setValue(x); 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines m_secondInteger->setValue(y); 83733c6b1db1a9a3f78da4fece933ccc7e509bfba0Evan Cheng} 84af4a891273b82798e97ad3e59359d93f3c8d6c19Bob Wilson 85af4a891273b82798e97ad3e59359d93f3c8d6c19Bob Wilsonvoid SVGIntegerOptionalInteger::add(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement*) 8652237119a9b41d6d714c96e730d651300b171298Anton Korobeynikov{ 87825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson RefPtr<SVGIntegerOptionalInteger> otherIntegerOptionalInteger = toSVGIntegerOptionalInteger(other); 8852237119a9b41d6d714c96e730d651300b171298Anton Korobeynikov 8952237119a9b41d6d714c96e730d651300b171298Anton Korobeynikov m_firstInteger->setValue(m_firstInteger->value() + otherIntegerOptionalInteger->m_firstInteger->value()); 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines m_secondInteger->setValue(m_secondInteger->value() + otherIntegerOptionalInteger->m_secondInteger->value()); 91014bf215c3457bb34fee348265e8f63a70b4d503Evan Cheng} 9248575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng 9348575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Chengvoid SVGIntegerOptionalInteger::calculateAnimatedValue(SVGAnimationElement* animationElement, float percentage, unsigned repeatCount, PassRefPtr<SVGPropertyBase> from, PassRefPtr<SVGPropertyBase> to, PassRefPtr<SVGPropertyBase> toAtEndOfDuration, SVGElement*) 94f40deed62f4f0126459ed7bfd1799f4e09b1aaa7Evan Cheng{ 95f40deed62f4f0126459ed7bfd1799f4e09b1aaa7Evan Cheng ASSERT(animationElement); 9692a202213bb4c20301abf6ab64e46df3695e60bfOwen Anderson 9792a202213bb4c20301abf6ab64e46df3695e60bfOwen Anderson RefPtr<SVGIntegerOptionalInteger> fromInteger = toSVGIntegerOptionalInteger(from); 9892a202213bb4c20301abf6ab64e46df3695e60bfOwen Anderson RefPtr<SVGIntegerOptionalInteger> toInteger = toSVGIntegerOptionalInteger(to); 9992a202213bb4c20301abf6ab64e46df3695e60bfOwen Anderson RefPtr<SVGIntegerOptionalInteger> toAtEndOfDurationInteger = toSVGIntegerOptionalInteger(toAtEndOfDuration); 100152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson 101152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson float x = m_firstInteger->value(); 102099e5553ebb868c06379ef05e56aae2346eaaa38Owen Anderson float y = m_secondInteger->value(); 103099e5553ebb868c06379ef05e56aae2346eaaa38Owen Anderson animationElement->animateAdditiveNumber(percentage, repeatCount, fromInteger->firstInteger()->value(), toInteger->firstInteger()->value(), toAtEndOfDurationInteger->firstInteger()->value(), x); 104152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson animationElement->animateAdditiveNumber(percentage, repeatCount, fromInteger->secondInteger()->value(), toInteger->secondInteger()->value(), toAtEndOfDurationInteger->secondInteger()->value(), y); 105152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson m_firstInteger->setValue(static_cast<int>(roundf(x))); 106152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson m_secondInteger->setValue(static_cast<int>(roundf(y))); 107152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson} 108152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Anderson 109152d4a4bb6b75de740b4b8a9f48abb9069d50c17Owen Andersonfloat SVGIntegerOptionalInteger::calculateDistance(PassRefPtr<SVGPropertyBase> other, SVGElement*) 110099e5553ebb868c06379ef05e56aae2346eaaa38Owen Anderson{ 111099e5553ebb868c06379ef05e56aae2346eaaa38Owen Anderson // FIXME: Distance calculation is not possible for SVGIntegerOptionalInteger right now. We need the distance for every single value. 1123e5561247202bae994dd259a2d8dc4eff8f799f3Jim Grosbach return -1; 1133e5561247202bae994dd259a2d8dc4eff8f799f3Jim Grosbach} 1143e5561247202bae994dd259a2d8dc4eff8f799f3Jim Grosbach 115828916203a731c5031fbe440f1fc6cdf82b2e711Jim Grosbach} 116828916203a731c5031fbe440f1fc6cdf82b2e711Jim Grosbach