Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / svg / SVGAnimatedColor.cpp
1 /*
2  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21
22 #include "core/svg/SVGAnimatedColor.h"
23
24 #include "core/rendering/RenderObject.h"
25 #include "core/svg/ColorDistance.h"
26 #include "core/svg/SVGAnimateElement.h"
27
28 namespace blink {
29
30 String SVGColorProperty::valueAsString() const
31 {
32     return m_styleColor.isCurrentColor() ? "currentColor" : m_styleColor.color().serializedAsCSSComponentValue();
33 }
34
35 PassRefPtr<SVGPropertyBase> SVGColorProperty::cloneForAnimation(const String&) const
36 {
37     // SVGAnimatedColor is deprecated. So No SVG DOM animation.
38     ASSERT_NOT_REACHED();
39     return nullptr;
40 }
41
42 static inline Color fallbackColorForCurrentColor(SVGElement* targetElement)
43 {
44     ASSERT(targetElement);
45     if (RenderObject* targetRenderer = targetElement->renderer())
46         return targetRenderer->style()->visitedDependentColor(CSSPropertyColor);
47     else
48         return Color::transparent;
49 }
50
51 void SVGColorProperty::add(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement* contextElement)
52 {
53     ASSERT(contextElement);
54
55     Color fallbackColor = fallbackColorForCurrentColor(contextElement);
56     Color fromColor = toSVGColorProperty(other)->m_styleColor.resolve(fallbackColor);
57     Color toColor = m_styleColor.resolve(fallbackColor);
58     m_styleColor = StyleColor(ColorDistance::addColors(fromColor, toColor));
59 }
60
61 void SVGColorProperty::calculateAnimatedValue(SVGAnimationElement* animationElement, float percentage, unsigned repeatCount, PassRefPtr<SVGPropertyBase> fromValue, PassRefPtr<SVGPropertyBase> toValue, PassRefPtr<SVGPropertyBase> toAtEndOfDurationValue, SVGElement* contextElement)
62 {
63     StyleColor fromStyleColor = toSVGColorProperty(fromValue)->m_styleColor;
64     StyleColor toStyleColor = toSVGColorProperty(toValue)->m_styleColor;
65     StyleColor toAtEndOfDurationStyleColor = toSVGColorProperty(toAtEndOfDurationValue)->m_styleColor;
66
67     // Apply currentColor rules.
68     ASSERT(contextElement);
69     Color fallbackColor = fallbackColorForCurrentColor(contextElement);
70     Color fromColor = fromStyleColor.resolve(fallbackColor);
71     Color toColor = toStyleColor.resolve(fallbackColor);
72     Color toAtEndOfDurationColor = toAtEndOfDurationStyleColor.resolve(fallbackColor);
73     Color animatedColor = m_styleColor.resolve(fallbackColor);
74
75     ASSERT(animationElement);
76     float animatedRed = animatedColor.red();
77     animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.red(), toColor.red(), toAtEndOfDurationColor.red(), animatedRed);
78
79     float animatedGreen = animatedColor.green();
80     animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.green(), toColor.green(), toAtEndOfDurationColor.green(), animatedGreen);
81
82     float animatedBlue = animatedColor.blue();
83     animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.blue(), toColor.blue(), toAtEndOfDurationColor.blue(), animatedBlue);
84
85     float animatedAlpha = animatedColor.alpha();
86     animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.alpha(), toColor.alpha(), toAtEndOfDurationColor.alpha(), animatedAlpha);
87
88     m_styleColor = StyleColor(makeRGBA(roundf(animatedRed), roundf(animatedGreen), roundf(animatedBlue), roundf(animatedAlpha)));
89 }
90
91 float SVGColorProperty::calculateDistance(PassRefPtr<SVGPropertyBase> toValue, SVGElement* contextElement)
92 {
93     ASSERT(contextElement);
94     Color fallbackColor = fallbackColorForCurrentColor(contextElement);
95
96     Color fromColor = m_styleColor.resolve(fallbackColor);
97     Color toColor = toSVGColorProperty(toValue)->m_styleColor.resolve(fallbackColor);
98     return ColorDistance::distance(fromColor, toColor);
99 }
100
101 }