blob: ef2dae40b623c3d1cd6d1d2388d72b0574b1b781 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/animation/CSSNumberInterpolationType.h"
#include "core/animation/NumberPropertyFunctions.h"
#include "core/css/resolver/StyleBuilder.h"
#include "core/css/resolver/StyleResolverState.h"
#include "wtf/PtrUtil.h"
#include <memory>
namespace blink {
class InheritedNumberChecker : public InterpolationType::ConversionChecker {
public:
static std::unique_ptr<InheritedNumberChecker> create(CSSPropertyID property,
double number) {
return WTF::wrapUnique(new InheritedNumberChecker(property, number));
}
private:
InheritedNumberChecker(CSSPropertyID property, double number)
: m_property(property), m_number(number) {}
bool isValid(const InterpolationEnvironment& environment,
const InterpolationValue& underlying) const final {
double parentNumber;
if (!NumberPropertyFunctions::getNumber(
m_property, *environment.state().parentStyle(), parentNumber))
return false;
return parentNumber == m_number;
}
const CSSPropertyID m_property;
const double m_number;
};
InterpolationValue CSSNumberInterpolationType::createNumberValue(
double number) const {
return InterpolationValue(InterpolableNumber::create(number));
}
InterpolationValue CSSNumberInterpolationType::maybeConvertNeutral(
const InterpolationValue&,
ConversionCheckers&) const {
return createNumberValue(0);
}
InterpolationValue CSSNumberInterpolationType::maybeConvertInitial(
const StyleResolverState&,
ConversionCheckers& conversionCheckers) const {
double initialNumber;
if (!NumberPropertyFunctions::getInitialNumber(cssProperty(), initialNumber))
return nullptr;
return createNumberValue(initialNumber);
}
InterpolationValue CSSNumberInterpolationType::maybeConvertInherit(
const StyleResolverState& state,
ConversionCheckers& conversionCheckers) const {
if (!state.parentStyle())
return nullptr;
double inheritedNumber;
if (!NumberPropertyFunctions::getNumber(cssProperty(), *state.parentStyle(),
inheritedNumber))
return nullptr;
conversionCheckers.push_back(
InheritedNumberChecker::create(cssProperty(), inheritedNumber));
return createNumberValue(inheritedNumber);
}
InterpolationValue CSSNumberInterpolationType::maybeConvertValue(
const CSSValue& value,
const StyleResolverState&,
ConversionCheckers&) const {
if (!value.isPrimitiveValue() || !toCSSPrimitiveValue(value).isNumber())
return nullptr;
return createNumberValue(toCSSPrimitiveValue(value).getDoubleValue());
}
InterpolationValue
CSSNumberInterpolationType::maybeConvertStandardPropertyUnderlyingValue(
const StyleResolverState& state) const {
double underlyingNumber;
if (!NumberPropertyFunctions::getNumber(cssProperty(), *state.style(),
underlyingNumber))
return nullptr;
return createNumberValue(underlyingNumber);
}
void CSSNumberInterpolationType::applyStandardPropertyValue(
const InterpolableValue& interpolableValue,
const NonInterpolableValue*,
StyleResolverState& state) const {
double clampedNumber = NumberPropertyFunctions::clampNumber(
cssProperty(), toInterpolableNumber(interpolableValue).value());
if (!NumberPropertyFunctions::setNumber(cssProperty(), *state.style(),
clampedNumber))
StyleBuilder::applyProperty(
cssProperty(), state,
*CSSPrimitiveValue::create(clampedNumber,
CSSPrimitiveValue::UnitType::Number));
}
} // namespace blink