blob: 592456c877c89157a7d1e012555486f0fd42256e [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.
#include <algorithm>
#include "base/macros.h"
#include "services/keyboard_native/fast_out_slow_in_interpolator.h"
// NOTE: This class has been translated to C++ from the Android Open Source
// Project. Specifically from the following files:
// https://github.com/android/platform_frameworks_support/blob/master/v4/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
// https://github.com/android/platform_frameworks_support/blob/master/v4/java/android/support/v4/view/animation/LookupTableInterpolator.java
namespace keyboard {
static const float kFastOutSlowInLUT[] = {
0.0000f, 0.0001f, 0.0002f, 0.0005f, 0.0009f, 0.0014f, 0.0020f, 0.0027f,
0.0036f, 0.0046f, 0.0058f, 0.0071f, 0.0085f, 0.0101f, 0.0118f, 0.0137f,
0.0158f, 0.0180f, 0.0205f, 0.0231f, 0.0259f, 0.0289f, 0.0321f, 0.0355f,
0.0391f, 0.0430f, 0.0471f, 0.0514f, 0.0560f, 0.0608f, 0.0660f, 0.0714f,
0.0771f, 0.0830f, 0.0893f, 0.0959f, 0.1029f, 0.1101f, 0.1177f, 0.1257f,
0.1339f, 0.1426f, 0.1516f, 0.1610f, 0.1707f, 0.1808f, 0.1913f, 0.2021f,
0.2133f, 0.2248f, 0.2366f, 0.2487f, 0.2611f, 0.2738f, 0.2867f, 0.2998f,
0.3131f, 0.3265f, 0.3400f, 0.3536f, 0.3673f, 0.3810f, 0.3946f, 0.4082f,
0.4217f, 0.4352f, 0.4485f, 0.4616f, 0.4746f, 0.4874f, 0.5000f, 0.5124f,
0.5246f, 0.5365f, 0.5482f, 0.5597f, 0.5710f, 0.5820f, 0.5928f, 0.6033f,
0.6136f, 0.6237f, 0.6335f, 0.6431f, 0.6525f, 0.6616f, 0.6706f, 0.6793f,
0.6878f, 0.6961f, 0.7043f, 0.7122f, 0.7199f, 0.7275f, 0.7349f, 0.7421f,
0.7491f, 0.7559f, 0.7626f, 0.7692f, 0.7756f, 0.7818f, 0.7879f, 0.7938f,
0.7996f, 0.8053f, 0.8108f, 0.8162f, 0.8215f, 0.8266f, 0.8317f, 0.8366f,
0.8414f, 0.8461f, 0.8507f, 0.8551f, 0.8595f, 0.8638f, 0.8679f, 0.8720f,
0.8760f, 0.8798f, 0.8836f, 0.8873f, 0.8909f, 0.8945f, 0.8979f, 0.9013f,
0.9046f, 0.9078f, 0.9109f, 0.9139f, 0.9169f, 0.9198f, 0.9227f, 0.9254f,
0.9281f, 0.9307f, 0.9333f, 0.9358f, 0.9382f, 0.9406f, 0.9429f, 0.9452f,
0.9474f, 0.9495f, 0.9516f, 0.9536f, 0.9556f, 0.9575f, 0.9594f, 0.9612f,
0.9629f, 0.9646f, 0.9663f, 0.9679f, 0.9695f, 0.9710f, 0.9725f, 0.9739f,
0.9753f, 0.9766f, 0.9779f, 0.9791f, 0.9803f, 0.9815f, 0.9826f, 0.9837f,
0.9848f, 0.9858f, 0.9867f, 0.9877f, 0.9885f, 0.9894f, 0.9902f, 0.9910f,
0.9917f, 0.9924f, 0.9931f, 0.9937f, 0.9944f, 0.9949f, 0.9955f, 0.9960f,
0.9964f, 0.9969f, 0.9973f, 0.9977f, 0.9980f, 0.9984f, 0.9986f, 0.9989f,
0.9991f, 0.9993f, 0.9995f, 0.9997f,
};
FastOutSlowInInterpolator::FastOutSlowInInterpolator()
: step_size_(1.0f / (arraysize(kFastOutSlowInLUT) - 1.0f)) {
}
FastOutSlowInInterpolator::~FastOutSlowInInterpolator() {
}
float FastOutSlowInInterpolator::GetInterpolation(float input) {
if (input >= 1.0f) {
return 1.0f;
}
if (input <= 0.0f) {
return 0.0f;
}
// Calculate index - We use min with length - 2 to avoid
// IndexOutOfBoundsException when
// we lerp (linearly interpolate) in the return statement
int position = std::min((int)(input * (arraysize(kFastOutSlowInLUT) - 1)),
(int)(arraysize(kFastOutSlowInLUT) - 2));
// Calculate values to account for small offsets as the lookup table has
// discrete values
float quantized = position * step_size_;
float diff = input - quantized;
float weight = diff / step_size_;
// Linearly interpolate between the table values
return kFastOutSlowInLUT[position] +
weight *
(kFastOutSlowInLUT[position + 1] - kFastOutSlowInLUT[position]);
}
} // namespace keyboard