Home | History | Annotate | Download | only in svg
      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 WebCore {
     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 }
    102