Interpolator.h revision 51d6a3db97bdd5315f1a17a4b447d10a92217b98
1e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti/*
2e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * Copyright (C) 2014 The Android Open Source Project
3e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti *
4e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License");
5e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * you may not use this file except in compliance with the License.
6e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * You may obtain a copy of the License at
7e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti *
8e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti *      http://www.apache.org/licenses/LICENSE-2.0
9e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti *
10e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * Unless required by applicable law or agreed to in writing, software
11e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS,
12e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * See the License for the specific language governing permissions and
14e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti * limitations under the License.
15e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti */
16e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti#ifndef INTERPOLATOR_H
17e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti#define INTERPOLATOR_H
18e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
19e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti#include <stddef.h>
20e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti#include <memory>
21e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
22e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti#include <cutils/compiler.h>
23e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
24e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittinamespace android {
2564483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colittinamespace uirenderer {
26e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
27e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitticlass Interpolator {
28e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittipublic:
29e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual ~Interpolator() {}
30e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
31e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual float interpolate(float input) = 0;
32e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
3362388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitti    static Interpolator* createDefaultInterpolator();
34e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
35e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittiprotected:
36befe778c73e48417942fc31c06509bac8e5ca0d2Erik Kline    Interpolator() {}
3734385d352da19805ae948215e2edbeedd16b7941Elliott Hughes};
38befe778c73e48417942fc31c06509bac8e5ca0d2Erik Kline
3934385d352da19805ae948215e2edbeedd16b7941Elliott Hughesclass ANDROID_API AccelerateDecelerateInterpolator : public Interpolator {
40befe778c73e48417942fc31c06509bac8e5ca0d2Erik Klinepublic:
4134385d352da19805ae948215e2edbeedd16b7941Elliott Hughes    virtual float interpolate(float input);
4234385d352da19805ae948215e2edbeedd16b7941Elliott Hughes};
4334385d352da19805ae948215e2edbeedd16b7941Elliott Hughes
4434385d352da19805ae948215e2edbeedd16b7941Elliott Hughesclass ANDROID_API AccelerateInterpolator : public Interpolator {
4534385d352da19805ae948215e2edbeedd16b7941Elliott Hughespublic:
4664483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitti    AccelerateInterpolator(float factor) : mFactor(factor), mDoubleFactor(factor*2) {}
47e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual float interpolate(float input);
48e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittiprivate:
49e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    const float mFactor;
50e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    const float mDoubleFactor;
51e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti};
52e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
53e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitticlass ANDROID_API AnticipateInterpolator : public Interpolator {
54e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittipublic:
55e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    AnticipateInterpolator(float tension) : mTension(tension) {}
56e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual float interpolate(float input);
5762388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colittiprivate:
5862388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitti    const float mTension;
5962388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitti};
6062388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitti
6162388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitticlass ANDROID_API AnticipateOvershootInterpolator : public Interpolator {
6262388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colittipublic:
6362388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitti    AnticipateOvershootInterpolator(float tension) : mTension(tension) {}
6462388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitti    virtual float interpolate(float input);
6562388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colittiprivate:
6662388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitti    const float mTension;
6762388936c88840a5f1ab7a7f6dd547467e99dfadLorenzo Colitti};
68e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
69e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitticlass ANDROID_API BounceInterpolator : public Interpolator {
70e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittipublic:
71e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual float interpolate(float input);
72e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti};
73e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
747dc78cf3af9fd11a4f1e2e981ce584a23755ea9eLorenzo Colitticlass ANDROID_API CycleInterpolator : public Interpolator {
7564483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colittipublic:
7664483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitti    CycleInterpolator(float cycles) : mCycles(cycles) {}
77e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual float interpolate(float input);
78e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittiprivate:
79e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    const float mCycles;
807dc78cf3af9fd11a4f1e2e981ce584a23755ea9eLorenzo Colitti};
8164483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitti
8264483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitticlass ANDROID_API DecelerateInterpolator : public Interpolator {
83e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittipublic:
8464483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitti    DecelerateInterpolator(float factor) : mFactor(factor) {}
8564483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitti    virtual float interpolate(float input);
86e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittiprivate:
877dc78cf3af9fd11a4f1e2e981ce584a23755ea9eLorenzo Colitti    const float mFactor;
8864483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitti};
8964483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitti
90e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitticlass ANDROID_API LinearInterpolator : public Interpolator {
9164483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colittipublic:
92e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual float interpolate(float input) { return input; }
937dc78cf3af9fd11a4f1e2e981ce584a23755ea9eLorenzo Colitti};
9464483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitti
9564483947fdb03bf838e317ac0a4af5e0f53a5bbfLorenzo Colitticlass ANDROID_API OvershootInterpolator : public Interpolator {
96e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittipublic:
97e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    OvershootInterpolator(float tension) : mTension(tension) {}
98e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual float interpolate(float input);
99e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittiprivate:
100e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    const float mTension;
101e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti};
102e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
103e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitticlass ANDROID_API LUTInterpolator : public Interpolator {
104e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittipublic:
105e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    LUTInterpolator(float* values, size_t size);
106e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    ~LUTInterpolator();
107e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
108e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    virtual float interpolate(float input);
109e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
110e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colittiprivate:
111e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti    std::unique_ptr<float[]> mValues;
1127dc78cf3af9fd11a4f1e2e981ce584a23755ea9eLorenzo Colitti    size_t mSize;
113e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti};
114e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
1157dc78cf3af9fd11a4f1e2e981ce584a23755ea9eLorenzo Colitti} /* namespace uirenderer */
116e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti} /* namespace android */
117e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti
118e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti#endif /* INTERPOLATOR_H */
119e1ad1849f3a65c1ff06919351ef1d73e9bc8854eLorenzo Colitti