X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc-interpolation.c;fp=src%2Fswfc-interpolation.c;h=b3a0c355028cd13d82e67a1e40b40e75de4b4c71;hb=01d3feb7d0121737b3456a3cfbaf6a02b6362d8d;hp=7e845aee07ceb25aaaad872921de7a9090b2e6fa;hpb=ac8a1cbb659d91911eb9253ea7a56ac8c8de99ea;p=swftools.git diff --git a/src/swfc-interpolation.c b/src/swfc-interpolation.c index 7e845ae..b3a0c35 100644 --- a/src/swfc-interpolation.c +++ b/src/swfc-interpolation.c @@ -24,99 +24,99 @@ #include #include "swfc-interpolation.h" -static inline float poly(float fraction, float start, float delta, int degree) +static inline float poly(float fraction, float start, float delta, float slope, int degree) { - return delta * pow(fraction, degree) + start; + return delta * ((1 - slope) * pow(fraction, degree) + slope * fraction) + start; } float linear(float fraction, float start, float delta) { - return poly(fraction, start, delta, 1); + return poly(fraction, start, delta, 0, 1); } -float quadIn(float fraction, float start, float delta) +float quadIn(float fraction, float start, float delta, float slope) { - return poly(fraction, start, delta, 2); + return poly(fraction, start, delta, slope, 2); } -float quadOut(float fraction, float start, float delta) +float quadOut(float fraction, float start, float delta, float slope) { - return quadIn(1 - fraction, start + delta, -delta); + return quadIn(1 - fraction, start + delta, -delta, slope); } -float quadInOut(float fraction, float start, float delta) +float quadInOut(float fraction, float start, float delta, float slope) { if (fraction < 0.5) - return quadIn(2 * fraction, start, delta / 2); - return quadOut(2 * fraction - 1, start + delta / 2, delta / 2); + return quadIn(2 * fraction, start, delta / 2, slope); + return quadOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); } -float cubicIn(float fraction, float start, float delta) +float cubicIn(float fraction, float start, float delta, float slope) { - return poly(fraction, start, delta, 3); + return poly(fraction, start, delta, slope, 3); } -float cubicOut(float fraction, float start, float delta) +float cubicOut(float fraction, float start, float delta, float slope) { - return cubicIn(1 - fraction, start + delta, -delta); + return cubicIn(1 - fraction, start + delta, -delta, slope); } -float cubicInOut(float fraction, float start, float delta) +float cubicInOut(float fraction, float start, float delta, float slope) { if (fraction < 0.5) - return cubicIn(2 * fraction, start, delta / 2); - return cubicOut(2 * fraction - 1, start + delta / 2, delta / 2); + return cubicIn(2 * fraction, start, delta / 2, slope); + return cubicOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); } -float quartIn(float fraction, float start, float delta) +float quartIn(float fraction, float start, float delta, float slope) { - return poly(fraction, start, delta, 4); + return poly(fraction, start, delta, slope, 4); } -float quartOut(float fraction, float start, float delta) +float quartOut(float fraction, float start, float delta, float slope) { - return quartIn(1 - fraction, start + delta, -delta); + return quartIn(1 - fraction, start + delta, -delta, slope); } -float quartInOut(float fraction, float start, float delta) +float quartInOut(float fraction, float start, float delta, float slope) { if (fraction < 0.5) - return quartIn(2 * fraction, start, delta / 2); - return quartOut(2 * fraction - 1, start + delta / 2, delta / 2); + return quartIn(2 * fraction, start, delta / 2, slope); + return quartOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); } -float quintIn(float fraction, float start, float delta) +float quintIn(float fraction, float start, float delta, float slope) { - return poly(fraction, start, delta, 5); + return poly(fraction, start, delta, slope, 5); } -float quintOut(float fraction, float start, float delta) +float quintOut(float fraction, float start, float delta, float slope) { - return quintIn(1 - fraction, start + delta, -delta); + return quintIn(1 - fraction, start + delta, -delta, slope); } -float quintInOut(float fraction, float start, float delta) +float quintInOut(float fraction, float start, float delta, float slope) { if (fraction < 0.5) - return quintIn(2 * fraction, start, delta / 2); - return quintOut(2 * fraction - 1, start + delta / 2, delta / 2); + return quintIn(2 * fraction, start, delta / 2, slope); + return quintOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); } -float circleIn(float fraction, float start, float delta) +float circleIn(float fraction, float start, float delta, float slope) { - return delta * (1 - sqrt(1 - fraction * fraction)) + start; + return delta * (1 - sqrt(1 - (1 - 2 * slope) * fraction * fraction - 2 * slope * fraction)) + start; } -float circleOut(float fraction, float start, float delta) +float circleOut(float fraction, float start, float delta, float slope) { - return circleIn(1 - fraction, start + delta, -delta); + return circleIn(1 - fraction, start + delta, -delta, slope); } -float circleInOut(float fraction, float start, float delta) +float circleInOut(float fraction, float start, float delta, float slope) { if (fraction < 0.5) - return circleIn(2 * fraction, start, delta / 2); - return circleOut(2 * fraction - 1, start + delta / 2, delta / 2); + return circleIn(2 * fraction, start, delta / 2, slope); + return circleOut(2 * fraction - 1, start + delta / 2, delta / 2, slope); } float exponentialIn(float fraction, float start, float delta)