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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
// եѴ (ž)
static void do_aff(surface_t *in, surface_t *out, int deg, double zx, double zy) {
int xs = in->width / 2;
int ys = in->height / 2;
double r = deg * M_PI / 180;
double c = cos(r);
double s = sin(r);
double x, y;
int i, j, m, n;
switch(in->depth) {
case 15:
case 16: {
WORD *src, *dst;
for (i = -ys; i < ys; i++) {
for (j = -xs; j < xs; j++) {
y = (j * s + i * c) / zy;
x = (j * c - i * s) / zx;
if (y > 0) m = (int)y;
else m = (int)(y -1);
if (x > 0) n = (int)x;
else n = (int)(x -1);
src = (WORD *)GETOFFSET_PIXEL(in, n+xs, m+ys);
dst = (WORD *)GETOFFSET_PIXEL(out, j+xs, i+ys);
if ((m >= -ys) && (m < ys) && (n >= -xs) && (n < xs)) {
*dst = *src;
}
}
}
break;
}
case 24:
case 32: {
DWORD *src, *dst;
for (i = -ys; i < ys; i++) {
for (j = -xs; j < xs; j++) {
y = (j * s + i * c) / zy;
x = (j * c - i * s) / zx;
if (y > 0) m = (int)y;
else m = (int)(y -1);
if (x > 0) n = (int)x;
else n = (int)(x -1);
src = (DWORD *)GETOFFSET_PIXEL(in, n+xs, m+ys);
dst = (DWORD *)GETOFFSET_PIXEL(out, j+xs, i+ys);
if ((m >= -ys) && (m < ys) && (n >= -xs) && (n < xs)) {
*dst = *src;
}
}
}
break;
}}
}
//ž
static void ec20_cb(surface_t *sfsrc, surface_t *sfdst) {
//ž
int maxstep, curstep;
maxstep = 360;
curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
sf_copyall(sf0, sfdst);
do_aff(sfsrc, sf0, curstep, 1- (double)curstep / maxstep, 1- (double)curstep / maxstep);
ags_updateFull();
ecp.oldstep = curstep;
}
//ž
static void ec21_cb(surface_t *sfsrc, surface_t *sfdst) {
int maxstep, curstep;
maxstep = 360;
curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
sf_copyall(sf0, sfsrc);
do_aff(sfdst, sf0, curstep, (double)curstep / maxstep, (double)curstep / maxstep);
ags_updateFull();
ecp.oldstep = curstep;
}
//ž(ײ)
static void ec22_cb(surface_t *sfsrc, surface_t *sfdst) {
int maxstep, curstep;
maxstep = 360;
curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
sf_copyall(sf0, sfdst);
do_aff(sfsrc, sf0, -curstep, 1- (double)curstep / maxstep, 1- (double)curstep / maxstep);
ags_updateFull();
ecp.oldstep = curstep;
}
//ž(ײ)
static void ec23_cb(surface_t *sfsrc, surface_t *sfdst) {
int maxstep, curstep;
maxstep = 360;
curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
sf_copyall(sf0, sfsrc);
do_aff(sfdst, sf0, -curstep, (double)curstep / maxstep, (double)curstep / maxstep);
ags_updateFull();
ecp.oldstep = curstep;
}
|