first half of Huub Schaek's sweep patch
[swftools.git] / src / swfc-interpolation.c
index 7e845ae..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)