float SVGAnimatedColorAnimator::calculateDistance(const String& fromString, const String& toString) { // FIXME: currentColor should be resolved ASSERT(m_contextElement); StyleColor from = SVGColor::colorFromRGBColorString(fromString); if (from.isCurrentColor()) return -1; StyleColor to = SVGColor::colorFromRGBColorString(toString); if (to.isCurrentColor()) return -1; return ColorDistance::distance(from.color(), to.color()); }
Color CSSColorInterpolationType::resolveInterpolableColor(const InterpolableValue& interpolableColor, const StyleResolverState& state, bool isVisited, bool isTextDecoration) { const InterpolableList& list = toInterpolableList(interpolableColor); ASSERT(list.length() == InterpolableColorIndexCount); double red = toInterpolableNumber(list.get(Red))->value(); double green = toInterpolableNumber(list.get(Green))->value(); double blue = toInterpolableNumber(list.get(Blue))->value(); double alpha = toInterpolableNumber(list.get(Alpha))->value(); if (double currentcolorFraction = toInterpolableNumber(list.get(Currentcolor))->value()) { auto currentColorGetter = isVisited ? ColorPropertyFunctions::getVisitedColor : ColorPropertyFunctions::getUnvisitedColor; StyleColor currentStyleColor = StyleColor::currentColor(); if (isTextDecoration) currentStyleColor = currentColorGetter(CSSPropertyWebkitTextFillColor, *state.style()); if (currentStyleColor.isCurrentColor()) currentStyleColor = currentColorGetter(CSSPropertyColor, *state.style()); addPremultipliedColor(red, green, blue, alpha, currentcolorFraction, currentStyleColor.getColor()); } const TextLinkColors& colors = state.document().textLinkColors(); if (double webkitActivelinkFraction = toInterpolableNumber(list.get(WebkitActivelink))->value()) addPremultipliedColor(red, green, blue, alpha, webkitActivelinkFraction, colors.activeLinkColor()); if (double webkitLinkFraction = toInterpolableNumber(list.get(WebkitLink))->value()) addPremultipliedColor(red, green, blue, alpha, webkitLinkFraction, isVisited ? colors.visitedLinkColor() : colors.linkColor()); if (double quirkInheritFraction = toInterpolableNumber(list.get(QuirkInherit))->value()) addPremultipliedColor(red, green, blue, alpha, quirkInheritFraction, colors.textColor()); alpha = clampTo<double>(alpha, 0, 255); if (alpha == 0) return Color::transparent; return makeRGBA( round(red / alpha), round(green / alpha), round(blue / alpha), round(alpha)); }
std::unique_ptr<InterpolableValue> CSSColorInterpolationType::createInterpolableColor(const StyleColor& color) { if (color.isCurrentColor()) return createInterpolableColorForIndex(Currentcolor); return createInterpolableColor(color.getColor()); }