summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/animation/timing_function.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/animation/timing_function.h')
-rw-r--r--chromium/third_party/blink/renderer/platform/animation/timing_function.h252
1 files changed, 252 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/animation/timing_function.h b/chromium/third_party/blink/renderer/platform/animation/timing_function.h
new file mode 100644
index 00000000000..51a9396ef29
--- /dev/null
+++ b/chromium/third_party/blink/renderer/platform/animation/timing_function.h
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
+ * (C) 2000 Antti Koivisto (koivisto@kde.org)
+ * (C) 2000 Dirk Mueller (mueller@kde.org)
+ * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_ANIMATION_TIMING_FUNCTION_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_ANIMATION_TIMING_FUNCTION_H_
+
+#include "base/memory/scoped_refptr.h"
+#include "cc/animation/timing_function.h"
+#include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+#include "third_party/blink/renderer/platform/wtf/assertions.h"
+#include "third_party/blink/renderer/platform/wtf/ref_counted.h"
+#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+
+namespace blink {
+
+class PLATFORM_EXPORT TimingFunction : public RefCounted<TimingFunction> {
+ public:
+ using Type = cc::TimingFunction::Type;
+
+ virtual ~TimingFunction() = default;
+
+ Type GetType() const { return type_; }
+
+ virtual String ToString() const = 0;
+
+ // Evaluates the timing function at the given fraction. The accuracy parameter
+ // provides a hint as to the required accuracy and is not guaranteed.
+ virtual double Evaluate(double fraction, double accuracy) const = 0;
+
+ // This function returns the minimum and maximum values obtainable when
+ // calling evaluate();
+ virtual void Range(double* min_value, double* max_value) const = 0;
+
+ // Create CC instance.
+ virtual std::unique_ptr<cc::TimingFunction> CloneToCC() const = 0;
+
+ protected:
+ TimingFunction(Type type) : type_(type) {}
+
+ private:
+ Type type_;
+};
+
+class PLATFORM_EXPORT LinearTimingFunction final : public TimingFunction {
+ public:
+ static LinearTimingFunction* Shared() {
+ DEFINE_STATIC_REF(LinearTimingFunction, linear,
+ (base::AdoptRef(new LinearTimingFunction())));
+ return linear;
+ }
+
+ ~LinearTimingFunction() override = default;
+
+ // TimingFunction implementation.
+ String ToString() const override;
+ double Evaluate(double fraction, double) const override;
+ void Range(double* min_value, double* max_value) const override;
+ std::unique_ptr<cc::TimingFunction> CloneToCC() const override;
+
+ private:
+ LinearTimingFunction() : TimingFunction(Type::LINEAR) {}
+};
+
+class PLATFORM_EXPORT CubicBezierTimingFunction final : public TimingFunction {
+ public:
+ using EaseType = cc::CubicBezierTimingFunction::EaseType;
+
+ static scoped_refptr<CubicBezierTimingFunction> Create(double x1,
+ double y1,
+ double x2,
+ double y2) {
+ return base::AdoptRef(new CubicBezierTimingFunction(x1, y1, x2, y2));
+ }
+
+ static CubicBezierTimingFunction* Preset(EaseType);
+
+ ~CubicBezierTimingFunction() override = default;
+
+ // TimingFunction implementation.
+ String ToString() const override;
+ double Evaluate(double fraction, double accuracy) const override;
+ void Range(double* min_value, double* max_value) const override;
+ std::unique_ptr<cc::TimingFunction> CloneToCC() const override;
+
+ double X1() const {
+ DCHECK_EQ(GetEaseType(), EaseType::CUSTOM);
+ return x1_;
+ }
+ double Y1() const {
+ DCHECK_EQ(GetEaseType(), EaseType::CUSTOM);
+ return y1_;
+ }
+ double X2() const {
+ DCHECK_EQ(GetEaseType(), EaseType::CUSTOM);
+ return x2_;
+ }
+ double Y2() const {
+ DCHECK_EQ(GetEaseType(), EaseType::CUSTOM);
+ return y2_;
+ }
+ EaseType GetEaseType() const { return bezier_->ease_type(); }
+
+ private:
+ explicit CubicBezierTimingFunction(EaseType ease_type)
+ : TimingFunction(Type::CUBIC_BEZIER),
+ bezier_(cc::CubicBezierTimingFunction::CreatePreset(ease_type)),
+ x1_(),
+ y1_(),
+ x2_(),
+ y2_() {}
+
+ CubicBezierTimingFunction(double x1, double y1, double x2, double y2)
+ : TimingFunction(Type::CUBIC_BEZIER),
+ bezier_(cc::CubicBezierTimingFunction::Create(x1, y1, x2, y2)),
+ x1_(x1),
+ y1_(y1),
+ x2_(x2),
+ y2_(y2) {}
+
+ std::unique_ptr<cc::CubicBezierTimingFunction> bezier_;
+
+ // TODO(loyso): Get these values from m_bezier->bezier_ (gfx::CubicBezier)
+ const double x1_;
+ const double y1_;
+ const double x2_;
+ const double y2_;
+};
+
+class PLATFORM_EXPORT StepsTimingFunction final : public TimingFunction {
+ public:
+ using StepPosition = cc::StepsTimingFunction::StepPosition;
+
+ static scoped_refptr<StepsTimingFunction> Create(int steps,
+ StepPosition step_position) {
+ return base::AdoptRef(new StepsTimingFunction(steps, step_position));
+ }
+
+ static StepsTimingFunction* Preset(StepPosition position) {
+ DEFINE_STATIC_REF(StepsTimingFunction, start,
+ Create(1, StepPosition::START));
+ DEFINE_STATIC_REF(StepsTimingFunction, middle,
+ Create(1, StepPosition::MIDDLE));
+ DEFINE_STATIC_REF(StepsTimingFunction, end, Create(1, StepPosition::END));
+ switch (position) {
+ case StepPosition::START:
+ return start;
+ case StepPosition::MIDDLE:
+ return middle;
+ case StepPosition::END:
+ return end;
+ default:
+ NOTREACHED();
+ return end;
+ }
+ }
+
+ ~StepsTimingFunction() override = default;
+
+ // TimingFunction implementation.
+ String ToString() const override;
+ double Evaluate(double fraction, double) const override;
+ void Range(double* min_value, double* max_value) const override;
+ std::unique_ptr<cc::TimingFunction> CloneToCC() const override;
+
+ int NumberOfSteps() const { return steps_->steps(); }
+ StepPosition GetStepPosition() const { return steps_->step_position(); }
+
+ private:
+ StepsTimingFunction(int steps, StepPosition step_position)
+ : TimingFunction(Type::STEPS),
+ steps_(cc::StepsTimingFunction::Create(steps, step_position)) {}
+
+ std::unique_ptr<cc::StepsTimingFunction> steps_;
+};
+
+class PLATFORM_EXPORT FramesTimingFunction final : public TimingFunction {
+ public:
+ static scoped_refptr<FramesTimingFunction> Create(int frames) {
+ return base::AdoptRef(new FramesTimingFunction(frames));
+ }
+
+ ~FramesTimingFunction() override = default;
+
+ // TimingFunction implementation.
+ String ToString() const override;
+ double Evaluate(double fraction, double) const override;
+ void Range(double* min_value, double* max_value) const override;
+ std::unique_ptr<cc::TimingFunction> CloneToCC() const override;
+
+ int NumberOfFrames() const { return frames_->frames(); }
+
+ private:
+ FramesTimingFunction(int frames)
+ : TimingFunction(Type::FRAMES),
+ frames_(cc::FramesTimingFunction::Create(frames)) {
+ DCHECK(RuntimeEnabledFeatures::FramesTimingFunctionEnabled());
+ }
+
+ std::unique_ptr<cc::FramesTimingFunction> frames_;
+};
+
+PLATFORM_EXPORT scoped_refptr<TimingFunction>
+CreateCompositorTimingFunctionFromCC(const cc::TimingFunction*);
+
+PLATFORM_EXPORT bool operator==(const LinearTimingFunction&,
+ const TimingFunction&);
+PLATFORM_EXPORT bool operator==(const CubicBezierTimingFunction&,
+ const TimingFunction&);
+PLATFORM_EXPORT bool operator==(const StepsTimingFunction&,
+ const TimingFunction&);
+PLATFORM_EXPORT bool operator==(const FramesTimingFunction&,
+ const TimingFunction&);
+
+PLATFORM_EXPORT bool operator==(const TimingFunction&, const TimingFunction&);
+PLATFORM_EXPORT bool operator!=(const TimingFunction&, const TimingFunction&);
+
+#define DEFINE_TIMING_FUNCTION_TYPE_CASTS(typeName, enumName) \
+ DEFINE_TYPE_CASTS(typeName##TimingFunction, TimingFunction, value, \
+ value->GetType() == TimingFunction::Type::enumName, \
+ value.GetType() == TimingFunction::Type::enumName)
+
+DEFINE_TIMING_FUNCTION_TYPE_CASTS(Linear, LINEAR);
+DEFINE_TIMING_FUNCTION_TYPE_CASTS(CubicBezier, CUBIC_BEZIER);
+DEFINE_TIMING_FUNCTION_TYPE_CASTS(Steps, STEPS);
+DEFINE_TIMING_FUNCTION_TYPE_CASTS(Frames, FRAMES);
+
+} // namespace blink
+
+#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_ANIMATION_TIMING_FUNCTION_H_