2 * Copyright (C) Research In Motion Limited 2011. All rights reserved.
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.
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.
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.
22 #include "core/svg/SVGAnimatedColor.h"
24 #include "core/rendering/RenderObject.h"
25 #include "core/svg/ColorDistance.h"
26 #include "core/svg/SVGAnimateElement.h"
30 String SVGColorProperty::valueAsString() const
32 return m_styleColor.isCurrentColor() ? "currentColor" : m_styleColor.color().serializedAsCSSComponentValue();
35 PassRefPtr<SVGPropertyBase> SVGColorProperty::cloneForAnimation(const String&) const
37 // SVGAnimatedColor is deprecated. So No SVG DOM animation.
42 static inline Color fallbackColorForCurrentColor(SVGElement* targetElement)
44 ASSERT(targetElement);
45 if (RenderObject* targetRenderer = targetElement->renderer())
46 return targetRenderer->style()->visitedDependentColor(CSSPropertyColor);
48 return Color::transparent;
51 void SVGColorProperty::add(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement* contextElement)
53 ASSERT(contextElement);
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));
61 void SVGColorProperty::calculateAnimatedValue(SVGAnimationElement* animationElement, float percentage, unsigned repeatCount, PassRefPtr<SVGPropertyBase> fromValue, PassRefPtr<SVGPropertyBase> toValue, PassRefPtr<SVGPropertyBase> toAtEndOfDurationValue, SVGElement* contextElement)
63 StyleColor fromStyleColor = toSVGColorProperty(fromValue)->m_styleColor;
64 StyleColor toStyleColor = toSVGColorProperty(toValue)->m_styleColor;
65 StyleColor toAtEndOfDurationStyleColor = toSVGColorProperty(toAtEndOfDurationValue)->m_styleColor;
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);
75 ASSERT(animationElement);
76 float animatedRed = animatedColor.red();
77 animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.red(), toColor.red(), toAtEndOfDurationColor.red(), animatedRed);
79 float animatedGreen = animatedColor.green();
80 animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.green(), toColor.green(), toAtEndOfDurationColor.green(), animatedGreen);
82 float animatedBlue = animatedColor.blue();
83 animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.blue(), toColor.blue(), toAtEndOfDurationColor.blue(), animatedBlue);
85 float animatedAlpha = animatedColor.alpha();
86 animationElement->animateAdditiveNumber(percentage, repeatCount, fromColor.alpha(), toColor.alpha(), toAtEndOfDurationColor.alpha(), animatedAlpha);
88 m_styleColor = StyleColor(makeRGBA(roundf(animatedRed), roundf(animatedGreen), roundf(animatedBlue), roundf(animatedAlpha)));
91 float SVGColorProperty::calculateDistance(PassRefPtr<SVGPropertyBase> toValue, SVGElement* contextElement)
93 ASSERT(contextElement);
94 Color fallbackColor = fallbackColorForCurrentColor(contextElement);
96 Color fromColor = m_styleColor.resolve(fallbackColor);
97 Color toColor = toSVGColorProperty(toValue)->m_styleColor.resolve(fallbackColor);
98 return ColorDistance::distance(fromColor, toColor);