added doc
[swftools.git] / src / swfc-interpolation.c
index 26c8374..b3a0c35 100644 (file)
 #include <memory.h>
 #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)
@@ -140,7 +140,7 @@ float exponentialInOut(float fraction, float start, float delta)
 
 float sineIn(float fraction, float start, float delta)
 {
-       return delta * (1 - cos(fraction * PI/2)) + start;
+       return delta * (1 - cos(fraction * M_PI/2)) + start;
 }
 
 float sineOut(float fraction, float start, float delta)
@@ -164,8 +164,7 @@ float elasticIn(float fraction, float start, float delta, float amplitude, int b
        if (amplitude < fabs(delta))
                amplitude = delta;
        float period = 1 / (bounces + 0.25);
-//     float s = asin(delta / amplitude) - 2 * PI / period;
-       return amplitude * pow(2, damping * (fraction - 1)) * sin(fraction * (2 * PI) / period /*+ fraction * s*/) + start;
+       return amplitude * pow(2, damping * (fraction - 1)) * sin(fraction * (2 * M_PI) / period) + start;
 }
 
 float elasticOut(float fraction, float start, float delta, float amplitude, int bounces, float damping)