/*
* Copyright (c) 2010-2016, Sikuli.org, sikulix.com
* Released under the MIT License.
*
*/
package org.sikuli.guide;
import java.util.Date;
public interface IAnimator {
public float step();
public boolean running();
}
abstract class TimeValueFunction {
protected float _beginVal, _endVal;
protected long _totalTime;
public TimeValueFunction(float beginVal, float endVal, long totalTime) {
_beginVal = beginVal;
_endVal = endVal;
_totalTime = totalTime;
}
public boolean isEnd(long t) {
return t >= _totalTime;
}
abstract public float getValue(long t);
}
class LinearInterpolation extends TimeValueFunction {
float _stepUnit;
public LinearInterpolation(float beginVal, float endVal, long totalTime) {
super(beginVal, endVal, totalTime);
_stepUnit = (endVal - beginVal) / (float) totalTime;
}
@Override
public float getValue(long t) {
if (t > _totalTime) {
return _endVal;
}
return _beginVal + _stepUnit * t;
}
}
class QuarticEase extends TimeValueFunction {
public QuarticEase(float beginVal, float endVal, long totalTime) {
super(beginVal, endVal, totalTime);
}
@Override
public float getValue(long t) {
if (t > _totalTime) {
return _endVal;
}
double t1 = (double) t / _totalTime;
return (float) (_beginVal + (_endVal - _beginVal) * t1 * t1 * t1 * t1);
}
}
class OutQuarticEase extends TimeValueFunction {
public OutQuarticEase(float beginVal, float endVal, long totalTime) {
super(beginVal, endVal, totalTime);
}
@Override
public float getValue(long t) {
if (t > _totalTime) {
return _endVal;
}
double t1 = (double) t / _totalTime;
double t2 = t1 * t1;
return (float) (_beginVal
+ (_endVal - _beginVal) * (-1 * t2 * t2 + 4 * t1 * t2 - 6 * t2 + 4 * t1));
}
}
class StopExtention extends TimeValueFunction {
TimeValueFunction _func;
public StopExtention(TimeValueFunction func, long totalTime) {
super(func._beginVal, func._endVal, totalTime);
_func = func;
_totalTime = totalTime;
}
@Override
public float getValue(long t) {
return _func.getValue(t);
}
@Override
public boolean isEnd(long t) {
return t >= _totalTime;
}
}
class TimeBasedAnimator implements IAnimator {
protected long _begin_time;
protected float _beginVal, _endVal, _stepUnit;
protected long _totalMS;
protected boolean _running;
protected TimeValueFunction _func;
public TimeBasedAnimator(TimeValueFunction func) {
_begin_time = -1;
_running = true;
_func = func;
}
@Override
public float step() {
if (_begin_time == -1) {
_begin_time = (new Date()).getTime();
return _func.getValue(0);
}
long now = (new Date()).getTime();
long delta = now - _begin_time;
float ret = _func.getValue(delta);
_running = !_func.isEnd(delta);
return ret;
}
@Override
public boolean running() {
return _running;
}
public void stop() {
_running = false;
}
}
class PulseAnimator implements IAnimator {
protected float _v1, _v2;
protected long _interval, _totalMS;
protected boolean _running;
protected long _begin_time = -1;
public PulseAnimator(float v1, float v2, long interval, long totalMS) {
_v1 = v1;
_v2 = v2;
_interval = interval;
_totalMS = totalMS;
_running = true;
}
@Override
public float step() {
if (_begin_time == -1) {
_begin_time = (new Date()).getTime();
return _v1;
}
long now = (new Date()).getTime();
long delta = now - _begin_time;
if (delta >= _totalMS) {
_running = false;
}
if ((delta / _interval) % 2 == 0) {
return _v1;
} else {
return _v2;
}
}
@Override
public boolean running() {
return _running;
}
}
class LinearAnimator extends TimeBasedAnimator {
public LinearAnimator(float beginVal, float endVal, long totalMS) {
super(new LinearInterpolation(beginVal, endVal, totalMS));
}
}