blob: f1e9bfb1d582972556aabefaf3dc3b72c48c6996 [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.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_CSS_INTERPOLATION_TYPE_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_CSS_INTERPOLATION_TYPE_H_
#include "third_party/blink/renderer/core/animation/css_interpolation_environment.h"
#include "third_party/blink/renderer/core/animation/interpolation_type.h"
#include "third_party/blink/renderer/core/core_export.h"
namespace blink {
class CSSCustomPropertyDeclaration;
class ComputedStyle;
class PropertyRegistration;
class StyleResolverState;
class CORE_EXPORT CSSInterpolationType : public InterpolationType {
public:
class CSSConversionChecker : public ConversionChecker {
public:
bool IsValid(const InterpolationEnvironment& environment,
const InterpolationValue& underlying) const final {
return IsValid(To<CSSInterpolationEnvironment>(environment).GetState(),
underlying);
}
protected:
virtual bool IsValid(const StyleResolverState&,
const InterpolationValue& underlying) const = 0;
};
virtual InterpolationValue MaybeConvertNeutral(
const InterpolationValue& underlying,
ConversionCheckers&) const = 0;
virtual InterpolationValue MaybeConvertInitial(const StyleResolverState&,
ConversionCheckers&) const = 0;
virtual InterpolationValue MaybeConvertInherit(const StyleResolverState&,
ConversionCheckers&) const = 0;
virtual InterpolationValue MaybeConvertValue(const CSSValue&,
const StyleResolverState*,
ConversionCheckers&) const = 0;
virtual const CSSValue* CreateCSSValue(const InterpolableValue&,
const NonInterpolableValue*,
const StyleResolverState&) const {
// TODO(alancutter): Implement this for all subclasses and make this an
// abstract declaration so the return type can be changed to
// const CSSValue&.
NOTREACHED();
return nullptr;
}
protected:
CSSInterpolationType(PropertyHandle, const PropertyRegistration* = nullptr);
const CSSProperty& CssProperty() const {
return GetProperty().GetCSSProperty();
}
InterpolationValue MaybeConvertSingle(const PropertySpecificKeyframe&,
const InterpolationEnvironment&,
const InterpolationValue& underlying,
ConversionCheckers&) const final;
// The interpolation stack has an optimization where we perform compositing
// after interpolation. This is against spec, but it works for simple addition
// cases and halves the amount of computation needed. Some types require
// compositing before interpolation (e.g. if their composition operator is a
// concatenation), however, and for those we define this method that is called
// pre-interpolation.
// TODO(crbug.com/1009230): Revisit the post-interpolation composite
// optimization.
virtual InterpolationValue PreInterpolationCompositeIfNeeded(
InterpolationValue value,
const InterpolationValue& underlying,
EffectModel::CompositeOperation,
ConversionCheckers&) const {
return value;
}
InterpolationValue MaybeConvertUnderlyingValue(
const InterpolationEnvironment&) const final;
virtual InterpolationValue MaybeConvertStandardPropertyUnderlyingValue(
const ComputedStyle&) const = 0;
void Apply(const InterpolableValue&,
const NonInterpolableValue*,
InterpolationEnvironment&) const final;
virtual void ApplyStandardPropertyValue(const InterpolableValue&,
const NonInterpolableValue*,
StyleResolverState&) const = 0;
private:
InterpolationValue MaybeConvertSingleInternal(
const PropertySpecificKeyframe&,
const InterpolationEnvironment&,
const InterpolationValue& underlying,
ConversionCheckers&) const;
InterpolationValue MaybeConvertCustomPropertyDeclaration(
const CSSCustomPropertyDeclaration&,
const InterpolationEnvironment&,
ConversionCheckers&) const;
const PropertyRegistration& Registration() const {
DCHECK(GetProperty().IsCSSCustomProperty());
return *registration_;
}
void ApplyCustomPropertyValue(const InterpolableValue&,
const NonInterpolableValue*,
StyleResolverState&) const;
WeakPersistent<const PropertyRegistration> registration_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_CSS_INTERPOLATION_TYPE_H_