16412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh/*
26412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Copyright (C) 2015 The Android Open Source Project
36412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh *
46412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Licensed under the Apache License, Version 2.0 (the "License");
56412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * you may not use this file except in compliance with the License.
66412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * You may obtain a copy of the License at
76412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh *
86412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh *      http://www.apache.org/licenses/LICENSE-2.0
96412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh *
106412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Unless required by applicable law or agreed to in writing, software
116412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * distributed under the License is distributed on an "AS IS" BASIS,
126412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * See the License for the specific language governing permissions and
146412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * limitations under the License
156412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh */
166412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
176412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughpackage android.support.wearable.view;
186412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
196412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughimport android.animation.TimeInterpolator;
206412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughimport android.annotation.TargetApi;
216412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughimport android.os.Build;
226412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
236412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh/**
246412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * Interpolator that uses a Bezier derived S shaped curve.
256412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh * @hide
266412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh */
276412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
286412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hughclass Gusterpolator implements TimeInterpolator {
296412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
306412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    /** An instance of {@link android.support.wearable.view.Gusterpolator}. */
316412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    public static final Gusterpolator INSTANCE = new Gusterpolator();
326412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
336412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    /**
346412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * To avoid users of this class creating multiple copies needlessly, the constructor is
356412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * private.
366412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     */
376412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    private Gusterpolator() {}
386412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
396412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    /**
406412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * Lookup table values.
416412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * Generated using a Bezier curve from (0,0) to (1,1) with control points:
426412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * P0 (0,0)
436412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * P1 (0.4, 0)
446412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * P2 (0.2, 1.0)
456412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * P3 (1.0, 1.0)
466412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     *
476412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     * Values sampled with x at regular intervals between 0 and 1.
486412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh     */
496412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    private static final float[] VALUES = new float[] {
506412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.0f, 0.0002f, 0.0009f, 0.0019f, 0.0036f, 0.0059f, 0.0086f, 0.0119f, 0.0157f, 0.0209f,
516412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.0257f, 0.0321f, 0.0392f, 0.0469f, 0.0566f, 0.0656f, 0.0768f, 0.0887f, 0.1033f, 0.1186f,
526412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.1349f, 0.1519f, 0.1696f, 0.1928f, 0.2121f, 0.237f, 0.2627f, 0.2892f, 0.3109f, 0.3386f,
536412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.3667f, 0.3952f, 0.4241f, 0.4474f, 0.4766f, 0.5f, 0.5234f, 0.5468f, 0.5701f, 0.5933f,
546412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.6134f, 0.6333f, 0.6531f, 0.6698f, 0.6891f, 0.7054f, 0.7214f, 0.7346f, 0.7502f, 0.763f,
556412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.7756f, 0.7879f, 0.8f, 0.8107f, 0.8212f, 0.8326f, 0.8415f, 0.8503f, 0.8588f, 0.8672f,
566412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.8754f, 0.8833f, 0.8911f, 0.8977f, 0.9041f, 0.9113f, 0.9165f, 0.9232f, 0.9281f, 0.9328f,
576412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.9382f, 0.9434f, 0.9476f, 0.9518f, 0.9557f, 0.9596f, 0.9632f, 0.9662f, 0.9695f, 0.9722f,
586412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.9753f, 0.9777f, 0.9805f, 0.9826f, 0.9847f, 0.9866f, 0.9884f, 0.9901f, 0.9917f, 0.9931f,
596412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        0.9944f, 0.9955f, 0.9964f, 0.9973f, 0.9981f, 0.9986f, 0.9992f, 0.9995f, 0.9998f, 1.0f, 1.0f
606412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    };
616412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
626412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    private static final float STEP_SIZE = 1.0f / (VALUES.length - 1);
636412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
646412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    @Override
656412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    public float getInterpolation(float input) {
666412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        if (input >= 1.0f) {
676412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh            return 1.0f;
686412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        }
696412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
706412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        if (input <= 0f) {
716412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh            return 0f;
726412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        }
736412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
746412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        int position = Math.min(
756412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh                (int)(input * (VALUES.length - 1)),
766412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh                VALUES.length - 2);
776412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
786412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        float quantized = position * STEP_SIZE;
796412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        float difference = input - quantized;
806412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        float weight = difference / STEP_SIZE;
816412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh
826412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh        return VALUES[position] + weight * (VALUES[position + 1] - VALUES[position]);
836412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh    }
846412dc4a8f47b134af6c5abb5f7f30321bb3ce68Anthony Hugh}
85