1e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck/*
2e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Copyright (C) 2014 The Android Open Source Project
3e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
4e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Licensed under the Apache License, Version 2.0 (the "License");
5e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * you may not use this file except in compliance with the License.
6e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * You may obtain a copy of the License at
7e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
8e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *      http://www.apache.org/licenses/LICENSE-2.0
9e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck *
10e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * Unless required by applicable law or agreed to in writing, software
11e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * distributed under the License is distributed on an "AS IS" BASIS,
12e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * See the License for the specific language governing permissions and
14e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck * limitations under the License.
15e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck */
16e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#ifndef INTERPOLATOR_H
17e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#define INTERPOLATOR_H
18e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
19315c329544d7c593d1072b071cbb92d9afe74021John Reck#include <stddef.h>
2051d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik#include <memory>
21315c329544d7c593d1072b071cbb92d9afe74021John Reck
22315c329544d7c593d1072b071cbb92d9afe74021John Reck#include <cutils/compiler.h>
239e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu#include <vector>
24315c329544d7c593d1072b071cbb92d9afe74021John Reck
25e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace android {
26e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Recknamespace uirenderer {
27e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
28e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckclass Interpolator {
29e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
30e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual ~Interpolator() {}
31e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
32e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    virtual float interpolate(float input) = 0;
33e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
34e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    static Interpolator* createDefaultInterpolator();
35e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
36e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckprotected:
37e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck    Interpolator() {}
38e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
39e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
40315c329544d7c593d1072b071cbb92d9afe74021John Reckclass ANDROID_API AccelerateDecelerateInterpolator : public Interpolator {
41e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reckpublic:
42d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
43c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck};
44c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
45c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckclass ANDROID_API AccelerateInterpolator : public Interpolator {
46c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic:
4749796451cb9d1dae580618eb320ef3c5e6d90cd4Chih-Hung Hsieh    explicit AccelerateInterpolator(float factor) : mFactor(factor), mDoubleFactor(factor*2) {}
48d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
49c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckprivate:
50c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    const float mFactor;
51c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    const float mDoubleFactor;
52c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck};
53c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
54c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckclass ANDROID_API AnticipateInterpolator : public Interpolator {
55c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic:
5649796451cb9d1dae580618eb320ef3c5e6d90cd4Chih-Hung Hsieh    explicit AnticipateInterpolator(float tension) : mTension(tension) {}
57d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
58c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckprivate:
59c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    const float mTension;
60c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck};
61c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
62c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckclass ANDROID_API AnticipateOvershootInterpolator : public Interpolator {
63c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic:
6449796451cb9d1dae580618eb320ef3c5e6d90cd4Chih-Hung Hsieh    explicit AnticipateOvershootInterpolator(float tension) : mTension(tension) {}
65d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
66c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckprivate:
67c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    const float mTension;
68c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck};
69c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
70c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckclass ANDROID_API BounceInterpolator : public Interpolator {
71c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic:
72d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
73c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck};
74c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
75c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckclass ANDROID_API CycleInterpolator : public Interpolator {
76c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic:
7749796451cb9d1dae580618eb320ef3c5e6d90cd4Chih-Hung Hsieh    explicit CycleInterpolator(float cycles) : mCycles(cycles) {}
78d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
79c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckprivate:
80c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    const float mCycles;
81c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck};
82c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
83c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckclass ANDROID_API DecelerateInterpolator : public Interpolator {
84c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic:
8549796451cb9d1dae580618eb320ef3c5e6d90cd4Chih-Hung Hsieh    explicit DecelerateInterpolator(float factor) : mFactor(factor) {}
86d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
87c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckprivate:
88c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    const float mFactor;
89c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck};
90e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
91c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckclass ANDROID_API LinearInterpolator : public Interpolator {
92c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic:
93d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override { return input; }
94c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck};
95c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck
96c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckclass ANDROID_API OvershootInterpolator : public Interpolator {
97c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckpublic:
9849796451cb9d1dae580618eb320ef3c5e6d90cd4Chih-Hung Hsieh    explicit OvershootInterpolator(float tension) : mTension(tension) {}
99d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
100c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reckprivate:
101c8ac775659fd252ce2cc9a61837c170ff70f0a1aJohn Reck    const float mTension;
102e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck};
103e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
1049e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liuclass ANDROID_API PathInterpolator : public Interpolator {
1059e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liupublic:
1069e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    explicit PathInterpolator(std::vector<float>&& x, std::vector<float>&& y)
1079e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu            : mX (x), mY(y) {}
1089e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    virtual float interpolate(float input) override;
1099e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liuprivate:
1109e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    std::vector<float> mX;
1119e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu    std::vector<float> mY;
1129e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu};
1139e9eeeeb78d94804cda00c2b36e56fdaca5552d6Doris Liu
114315c329544d7c593d1072b071cbb92d9afe74021John Reckclass ANDROID_API LUTInterpolator : public Interpolator {
115315c329544d7c593d1072b071cbb92d9afe74021John Reckpublic:
116315c329544d7c593d1072b071cbb92d9afe74021John Reck    LUTInterpolator(float* values, size_t size);
117315c329544d7c593d1072b071cbb92d9afe74021John Reck    ~LUTInterpolator();
118315c329544d7c593d1072b071cbb92d9afe74021John Reck
119d41c4d8c732095ae99c955b6b82f7306633004b1Chris Craik    virtual float interpolate(float input) override;
120315c329544d7c593d1072b071cbb92d9afe74021John Reck
121315c329544d7c593d1072b071cbb92d9afe74021John Reckprivate:
12251d6a3db97bdd5315f1a17a4b447d10a92217b98Chris Craik    std::unique_ptr<float[]> mValues;
123315c329544d7c593d1072b071cbb92d9afe74021John Reck    size_t mSize;
124315c329544d7c593d1072b071cbb92d9afe74021John Reck};
125315c329544d7c593d1072b071cbb92d9afe74021John Reck
126e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace uirenderer */
127e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck} /* namespace android */
128e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck
129e45b1fd03b524d2b57cc6c222d89076a31a08beaJohn Reck#endif /* INTERPOLATOR_H */
130