sdl_fader: Implement blind effects

This commit is contained in:
kichikuou
2022-01-16 22:05:53 +09:00
parent c4d74d659a
commit bc97e4c826
6 changed files with 161 additions and 349 deletions
-28
View File
@@ -39,10 +39,8 @@ static ecopyparam_t ecp;
#define ECA7_D 16
#define ECA12_D 256
static void ec7_cb();
static void ec11_cb(int step);
static void ec11_prepare(void);
static void ec12_cb(int step);
@@ -99,9 +97,6 @@ void gpx_effect(int no,
ags_faderinfo_t i;
switch(no) {
case 7:
ec7_cb();
break;
case 11:
ec11_prepare();
i.step_max = 6;
@@ -131,29 +126,6 @@ void gpx_effect(int no,
}
#define EC_WAIT \
if ((key |= sys_getInputInfo()) && ecp.cancel) break; \
key = sys_keywait(cnt - sdl_getTicks(), ecp.cancel);
static void ec7_cb() {
int i, j, y, key = 0, cnt;
int waitcnt = ecp.time == 0 ? 40 : (ecp.time/60);
cnt = sdl_getTicks();
for (i = 0; i < ECA7_D + ecp.h / ECA7_D -1; i++) {
cnt += waitcnt;
for (j = 0; j < min(i + 1, ECA7_D); j++) {
y = j + ECA7_D * (i-j);
if (y < 0 || y >= ecp.h) continue;
gr_copy(ecp.write, ecp.wx, ecp.wy + y, ecp.src, ecp.sx, ecp.sy + y, ecp.w, 1);
}
ags_updateArea(ecp.wx, ecp.wy, ecp.w, ecp.h);
EC_WAIT;
}
ags_updateArea(ecp.wx, ecp.wy, ecp.w, ecp.h);
}
static void ec11_prepare() {
int i;
-102
View File
@@ -40,9 +40,6 @@
static void ec6_cb(surface_t *, surface_t *);
static void ec7_cb(surface_t *, surface_t *);
static void ec8_cb(surface_t *, surface_t *);
static void ec9_cb(surface_t *, surface_t *);
static void ec11_cb(surface_t *, surface_t *);
static void ec12_cb(surface_t *, surface_t *);
static void ec13_cb(surface_t *, surface_t *);
@@ -70,99 +67,6 @@ static void ec_dummy_cb(surface_t *sfsrc, surface_t *sfdst) {
WARNING("NOT IMPLEMENTED\n");
}
// すだれ落ち
static void ec7_cb(surface_t *sfsrc, surface_t *sfdst) {
#define EC7DELTA 16
int curstep, maxstep = sfsrc->height / EC7DELTA + EC7DELTA;
int i, t, y;
curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
//SACT_DEBUG("step = %d\n", curstep);
if (ecp.oldstep == curstep) {
usleep(0);
return;
}
t = ecp.oldstep;
while(t < curstep) {
for (i = 0; i < min(t + 1, EC7DELTA); i++) {
y = i + EC7DELTA * (t - i);
if (y < 0 || y >= sfsrc->height) continue;
gr_copy(sf0, 0, y,
sfdst, 0, y, sfsrc->width, 1);
}
t++;
}
ecp.oldstep = curstep;
ags_updateFull();
}
// すだれ左->右
static void ec8_cb(surface_t *sfsrc, surface_t *sfdst) {
#define EC8DELTA 16
int curstep, maxstep = sfsrc->width / EC8DELTA + EC8DELTA;
int i, t, x;
curstep = maxstep * (ecp.curtime - ecp.sttime) / (ecp.edtime - ecp.sttime);
//SACT_DEBUG("step = %d\n", curstep);
if (ecp.oldstep == curstep) {
usleep(0);
return;
}
t = ecp.oldstep;
while(t < curstep) {
for (i = 0; i < min(t + 1, EC8DELTA); i++) {
x = i + EC8DELTA * (t - i);
if (x < 0 || x >= sfsrc->width) continue;
gr_copy(sf0, x, 0,
sfdst, x, 0, 1, sfsrc->height);
}
t++;
}
ecp.oldstep = curstep;
ags_updateFull();
}
// すだれ落ち&左->右
static void ec9_cb(surface_t *sfsrc, surface_t *sfdst) {
#define EC9DELTA 16
int curstep, maxstep;
int i, t, x, y;
maxstep = max(sfsrc->height / EC9DELTA + EC9DELTA,
sfsrc->width / EC9DELTA + EC9DELTA);
curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
//SACT_DEBUG("step = %d\n", curstep);
if (ecp.oldstep == curstep) {
usleep(0);
return;
}
t = ecp.oldstep;
while(t < curstep) {
for (i = 0; i < min(t + 1, EC9DELTA); i++) {
y = i + EC9DELTA * (t - i);
if (y < 0 || y >= sfsrc->height) continue;
gr_copy(sf0, 0, y,
sfdst, 0, y, sfsrc->width, 1);
}
for (i = 0; i < min(t + 1, EC9DELTA); i++) {
x = i + EC9DELTA * (t - i);
if (x < 0 || x >= sfsrc->width) continue;
gr_copy(sf0, x, 0,
sfdst, x, 0, 1, sfsrc->height);
}
t++;
}
ecp.oldstep = curstep;
ags_updateFull();
}
// 上->下クロスフェード
static void ec12_cb(surface_t *src, surface_t *dst) {
#define EC12DELTA 256
@@ -258,12 +162,6 @@ int nt_sp_eupdate(int type, int time, int cancel) {
case 10:
cb = ec_dummy_cb;
break;
case 107: // 簾落ち
cb = ec7_cb;
break;
case 108: // 左->右すだれ
cb = ec8_cb;
break;
case 111: // 線形ぼかし
ec11_prepare(sfsrc, sfdst);
cb = ec11_cb;
+3 -99
View File
@@ -41,9 +41,6 @@
static void ec6_cb(surface_t *, surface_t *);
static void ec7_cb(surface_t *, surface_t *);
static void ec8_cb(surface_t *, surface_t *);
static void ec9_cb(surface_t *, surface_t *);
static void ec11_cb(surface_t *, surface_t *);
static void ec12_cb(surface_t *, surface_t *);
static void ec13_cb(surface_t *, surface_t *);
@@ -76,9 +73,9 @@ static entrypoint *cb[39] = {
sdlfader_cb,
sdlfader_cb,
ec6_cb,
ec7_cb,
ec8_cb,
ec9_cb,
sdlfader_cb,
sdlfader_cb,
sdlfader_cb,
ec10_cb,
ec11_cb,
ec12_cb,
@@ -115,99 +112,6 @@ static void ec_dummy_cb(surface_t *sfsrc, surface_t *sfdst) {
WARNING("NOT IMPLEMENTED\n");
}
// すだれ落ち
static void ec7_cb(surface_t *sfsrc, surface_t *sfdst) {
#define EC7DELTA 16
int curstep, maxstep = sfsrc->height / EC7DELTA + EC7DELTA;
int i, t, y;
curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
SACT_DEBUG("step = %d\n", curstep);
if (ecp.oldstep == curstep) {
usleep(0);
return;
}
t = ecp.oldstep;
while(t < curstep) {
for (i = 0; i < min(t + 1, EC7DELTA); i++) {
y = i + EC7DELTA * (t - i);
if (y < 0 || y >= sfsrc->height) continue;
gr_copy(sf0, 0, y,
sfdst, 0, y, sfsrc->width, 1);
}
t++;
}
ecp.oldstep = curstep;
ags_updateFull();
}
// すだれ左->右
static void ec8_cb(surface_t *sfsrc, surface_t *sfdst) {
#define EC8DELTA 16
int curstep, maxstep = sfsrc->width / EC8DELTA + EC8DELTA;
int i, t, x;
curstep = maxstep * (ecp.curtime - ecp.sttime) / (ecp.edtime - ecp.sttime);
SACT_DEBUG("step = %d\n", curstep);
if (ecp.oldstep == curstep) {
usleep(0);
return;
}
t = ecp.oldstep;
while(t < curstep) {
for (i = 0; i < min(t + 1, EC8DELTA); i++) {
x = i + EC8DELTA * (t - i);
if (x < 0 || x >= sfsrc->width) continue;
gr_copy(sf0, x, 0,
sfdst, x, 0, 1, sfsrc->height);
}
t++;
}
ecp.oldstep = curstep;
ags_updateFull();
}
// すだれ落ち&左->右
static void ec9_cb(surface_t *sfsrc, surface_t *sfdst) {
#define EC9DELTA 16
int curstep, maxstep;
int i, t, x, y;
maxstep = max(sfsrc->height / EC9DELTA + EC9DELTA,
sfsrc->width / EC9DELTA + EC9DELTA);
curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime);
SACT_DEBUG("step = %d\n", curstep);
if (ecp.oldstep == curstep) {
usleep(0);
return;
}
t = ecp.oldstep;
while(t < curstep) {
for (i = 0; i < min(t + 1, EC9DELTA); i++) {
y = i + EC9DELTA * (t - i);
if (y < 0 || y >= sfsrc->height) continue;
gr_copy(sf0, 0, y,
sfdst, 0, y, sfsrc->width, 1);
}
for (i = 0; i < min(t + 1, EC9DELTA); i++) {
x = i + EC9DELTA * (t - i);
if (x < 0 || x >= sfsrc->width) continue;
gr_copy(sf0, x, 0,
sfdst, x, 0, 1, sfsrc->height);
}
t++;
}
ecp.oldstep = curstep;
ags_updateFull();
}
// 上->下クロスフェード
static void ec12_cb(surface_t *src, surface_t *dst) {
#define EC12DELTA 256