blob: 5f7fdc569cc00a8fff16ed71ce75520c2ea816fe [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_INVALIDATABLE_INTERPOLATION_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_INVALIDATABLE_INTERPOLATION_H_
#include <memory>
#include "third_party/blink/renderer/core/animation/interpolation.h"
#include "third_party/blink/renderer/core/animation/interpolation_type.h"
#include "third_party/blink/renderer/core/animation/interpolation_types_map.h"
#include "third_party/blink/renderer/core/animation/primitive_interpolation.h"
#include "third_party/blink/renderer/core/animation/typed_interpolation_value.h"
namespace blink {
// See the documentation of Interpolation for general information about this
// class hierarchy.
//
// The InvalidatableInterpolation subclass stores the start and end keyframes as
// PropertySpecificKeyframe objects.
//
// InvalidatableInterpolation uses conversion checkers and the interpolation
// environment to respond to changes to the underlying property value during
// interpolation.
//
// InvalidatableInterpolation is used to implement additive animations. During
// the effect application phase of animation computation, the current animated
// value of the property is applied to the element by calling the static
// ApplyStack function with an ordered list of InvalidatableInterpolation
// objects.
class CORE_EXPORT InvalidatableInterpolation : public Interpolation {
public:
static InvalidatableInterpolation* Create(
const PropertyHandle& property,
PropertySpecificKeyframe* start_keyframe,
PropertySpecificKeyframe* end_keyframe) {
return new InvalidatableInterpolation(property, start_keyframe,
end_keyframe);
}
const PropertyHandle& GetProperty() const final { return property_; }
void Interpolate(int iteration, double fraction) override;
bool DependsOnUnderlyingValue() const final;
static void ApplyStack(const ActiveInterpolations&,
InterpolationEnvironment&);
bool IsInvalidatableInterpolation() const override { return true; }
const TypedInterpolationValue* GetCachedValueForTesting() const {
return cached_value_.get();
}
void Trace(Visitor* visitor) override {
visitor->Trace(start_keyframe_);
visitor->Trace(end_keyframe_);
Interpolation::Trace(visitor);
}
private:
InvalidatableInterpolation(const PropertyHandle& property,
PropertySpecificKeyframe* start_keyframe,
PropertySpecificKeyframe* end_keyframe)
: Interpolation(),
property_(property),
interpolation_types_(nullptr),
interpolation_types_version_(0),
start_keyframe_(start_keyframe),
end_keyframe_(end_keyframe),
current_fraction_(std::numeric_limits<double>::quiet_NaN()),
is_conversion_cached_(false) {}
using ConversionCheckers = InterpolationType::ConversionCheckers;
std::unique_ptr<TypedInterpolationValue> MaybeConvertUnderlyingValue(
const InterpolationEnvironment&) const;
const TypedInterpolationValue* EnsureValidConversion(
const InterpolationEnvironment&,
const UnderlyingValueOwner&) const;
void EnsureValidInterpolationTypes(const InterpolationEnvironment&) const;
void ClearConversionCache() const;
bool IsConversionCacheValid(const InterpolationEnvironment&,
const UnderlyingValueOwner&) const;
bool IsNeutralKeyframeActive() const;
std::unique_ptr<PairwisePrimitiveInterpolation> MaybeConvertPairwise(
const InterpolationEnvironment&,
const UnderlyingValueOwner&) const;
std::unique_ptr<TypedInterpolationValue> ConvertSingleKeyframe(
const PropertySpecificKeyframe&,
const InterpolationEnvironment&,
const UnderlyingValueOwner&) const;
void AddConversionCheckers(const InterpolationType&,
ConversionCheckers&) const;
void SetFlagIfInheritUsed(InterpolationEnvironment&) const;
double UnderlyingFraction() const;
const PropertyHandle property_;
mutable const InterpolationTypes* interpolation_types_;
mutable size_t interpolation_types_version_;
Member<PropertySpecificKeyframe> start_keyframe_;
Member<PropertySpecificKeyframe> end_keyframe_;
double current_fraction_;
mutable bool is_conversion_cached_;
mutable std::unique_ptr<PrimitiveInterpolation> cached_pair_conversion_;
mutable ConversionCheckers conversion_checkers_;
mutable std::unique_ptr<TypedInterpolationValue> cached_value_;
};
DEFINE_TYPE_CASTS(InvalidatableInterpolation,
Interpolation,
value,
value->IsInvalidatableInterpolation(),
value.IsInvalidatableInterpolation());
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_ANIMATION_INVALIDATABLE_INTERPOLATION_H_