give control over starting point

This commit is contained in:
Paul Fitzpatrick
2018-05-08 18:52:00 -04:00
parent c0cb0d41bf
commit 6408182636
3 changed files with 32 additions and 16 deletions

View File

@@ -126,12 +126,12 @@ void GifAnim::apply() {
blocks.push_back(Bytes((char*)mem,(size_t)sz));
int accum_delay = 0;
// bool have_r = false;
//Render *r_prev = NULL;
//Render *r_pre_prev = NULL;
int emit_ct = 0;
int step_pending = 0;
for (int i=0; i<frames; i++) {
int pending_frame_number = pal_index;
int pending_count = 0;
for (int base=0; base<frames; base++) {
int i = (base + ((first_frame >= 0) ? first_frame : 0)) % frames;
step_pending += step;
dbg_printf("Working on frame %d\n", i);
@@ -150,13 +150,16 @@ void GifAnim::apply() {
renders->remove_render(i);
bool change = false;
if (i>0) {
int emitting_frame_number = -1;
if (base>0) {
for (int x=0; x<ww && !change; x++) {
for (int y=0; y<hh; y++) {
int p0 = gd_prev->pixels[y][x];
int p1 = gd_curr->pixels[y][x];
if (p0!=p1) {
change = true;
emitting_frame_number = pending_frame_number;
pending_frame_number = i;
break;
}
}
@@ -167,16 +170,17 @@ void GifAnim::apply() {
mem = gdImageGifAnimAddPtr(gd_prev,&sz,
local_color?1:0,
0,0,
step_pending,1,
step_pending-step,1,
(emit_ct>=1)?gd_pre_prev:NULL);
dbg_printf(" Generated frame, %d ticks\n", step_pending);
step_pending = 0;
dbg_printf(" Generated frame %d (%d), %d ticks\n", emitting_frame_number,
pending_count, step_pending-step);
step_pending = step;
pending_count = 0;
emit_ct++;
blocks.push_back(Bytes((char*)mem,(size_t)sz));
}
if (change) {
//r_pre_prev = r_prev;
gdImagePtr tmp = gd_pre_prev;
gd_pre_prev = gd_prev;
gd_prev = gd_curr;
@@ -185,16 +189,17 @@ void GifAnim::apply() {
gdImagePtr tmp = gd_prev;
gd_prev = gd_curr;
gd_curr = tmp;
pending_frame_number = i;
pending_count++;
}
//r_prev = r;
// ...
//renders->remove_render(i);
//renders->remove_mapping(i);
if (i == frames - 1) {
step_pending += last_step;
}
}
step_pending += step;
step_pending += last_step;
// step_pending += step;
// step_pending += last_step;
if (frames) {
mem = gdImageGifAnimAddPtr(gd_prev,&sz,
local_color?1:0,
@@ -203,7 +208,8 @@ void GifAnim::apply() {
(emit_ct>=1)?gd_pre_prev:NULL);
emit_ct++;
blocks.push_back(Bytes((char*)mem,(size_t)sz));
dbg_printf(" Generated final frame, %d ticks\n",
dbg_printf(" Generated final frame, %d (%d), %d ticks\n",
pending_frame_number, pending_count,
step_pending);
}

View File

@@ -15,6 +15,7 @@ private:
double period;
double hold;
bool early_release;
int first_frame;
public:
@@ -23,6 +24,7 @@ public:
period = 0.1;
hold = 5;
early_release = true;
first_frame = -1;
}
~GifAnim();
@@ -42,6 +44,10 @@ public:
palette_frames = palette;
}
void set_first_frame(int index) {
first_frame = index;
}
void apply();
void save(const char *fname);

View File

@@ -40,6 +40,7 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "reanimator ... --last 4\n");
fprintf(stderr, "reanimator ... --single\n");
fprintf(stderr, "reanimator ... --auto_zoom\n");
fprintf(stderr, "reanimator ... --start 10 # frame to start at\n");
fprintf(stderr, "reanimator ... --save \"frame_%%06d.jpg\"\n");
fprintf(stderr, "reanimator ... --gif example.gif\n");
fprintf(stderr, "reanimator ... --stats\n");
@@ -99,6 +100,9 @@ int main(int argc, char *argv[]) {
anim.attach_renders(&renders);
anim.set_palette(repo.get_palette());
anim.set_timing(repo.get_period(),repo.get_hold());
if (options.check("start")) {
anim.set_first_frame(options.check("start",Value(0)).asInt());
}
anim.apply();
anim.save(options.find("gif").asString().c_str());
}