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