1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include "AnimationInterpolate.h"
#include "AnimationObject.h"
#define NUM_INTERPOLATE(a, b, perc) (a * (1.0 - (perc)) + b * (perc))
byte4
colorInterpolate(byte4 ina, byte4 inb, double percentage) {
ARGB a, b;
ARGB_set(&a, ina);
ARGB_set(&b, inb);
a.a = NUM_INTERPOLATE(a.a, b.a, percentage);
a.r = NUM_INTERPOLATE(a.r, b.r, percentage);
a.g = NUM_INTERPOLATE(a.g, b.g, percentage);
a.b = NUM_INTERPOLATE(a.b, b.b, percentage);
return a.a << 24 | a.r << 16 | a.g << 8 | a.b;
}
ARGB
A_Interpolate(const Animation* anim, u32 frameIndex, ARGB pixel, i32 r, i32 c, void* priv) {
struct A_Interpolate in = *(struct A_Interpolate*)priv;
double perc = (double)(frameIndex - in.startFrame) / (in.endFrame - in.startFrame);
if (perc < 0.0) perc = 0.0;
if (perc > 1.0) perc = 1.0;
in.interpolate(in.value, in.initialState, in.finalState, perc);
return in.callback(anim, frameIndex, pixel, r, c, in.priv);
}
void
AO_LineInterpolate(void* valueLine, const void* initialLine, const void* finalLine, double percentage) {
struct AO_Line* value = valueLine;
const struct AO_Line* initial = initialLine, *final = finalLine;
value->a = NUM_INTERPOLATE(initial->a, final->a, percentage);
value->b = NUM_INTERPOLATE(initial->b, final->b, percentage);
value->c = NUM_INTERPOLATE(initial->c, final->c, percentage);
value->width = NUM_INTERPOLATE(initial->width, final->width, percentage);
value->color = colorInterpolate(initial->color, final->color, percentage);
}
|