X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fdevices%2Frecord.c;h=48b57f659a698031f58a1fdd4d249b9bd0c27e7b;hp=a09cbbc4d97abea2c9c007b0535e3b257c17101d;hb=f32de5188d6ec5a3b70ced18669e27e0b250bf50;hpb=9b328ffcb7522c4c0d021a1a8c68e95390e1b2a7 diff --git a/lib/devices/record.c b/lib/devices/record.c index a09cbbc..48b57f6 100644 --- a/lib/devices/record.c +++ b/lib/devices/record.c @@ -453,6 +453,17 @@ static gfxfont_t*readFont(reader_t*r, state_t*state) /* ----------------- reading/writing of primitives with caching -------------- */ +void state_clear(state_t*state) +{ + int t; + for(t=0;tlast_string)/sizeof(state->last_string[0]);t++) { + if(state->last_string[t]) { + free(state->last_string[t]); + state->last_string[t] = 0; + } + } +} + static char* read_string(reader_t*r, state_t*state, U8 id, U8 flags) { assert(id>=0 && id<16); @@ -461,6 +472,9 @@ static char* read_string(reader_t*r, state_t*state, U8 id, U8 flags) return strdup(state->last_string[id]); } char*s = reader_readString(r); + if(state->last_string[id]) { + free(state->last_string[id]); + } state->last_string[id] = strdup(s); return s; } @@ -609,7 +623,11 @@ static void record_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyphnr, writer_writeString(&i->w, font_id); dumpColor(&i->w, &i->state, color); dumpMatrix(&i->w, &i->state, matrix); + + if(i->state.last_string[OP_DRAWCHAR]) + free(i->state.last_string[OP_DRAWCHAR]); i->state.last_string[OP_DRAWCHAR] = strdup(font_id); + i->state.last_color[OP_DRAWCHAR] = *color; i->state.last_matrix[OP_DRAWCHAR] = *matrix; } else { @@ -810,6 +828,7 @@ static void replay(struct _gfxdevice*dev, gfxdevice_t*out, reader_t*r, gfxfontli } } finish: + state_clear(&state); r->dealloc(r); if(_fontlist) gfxfontlist_free(_fontlist, 0); @@ -927,6 +946,8 @@ static gfxresult_t* record_finish(struct _gfxdevice*dev) msg(" Warning: unclosed cliplevels"); } + state_clear(&i->state); + #ifdef STATS int total = i->w.pos; if(total && i->use_tempfile) {