git.asbjorn.biz
/
swftools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fixed mem leaks
[swftools.git]
/
lib
/
devices
/
record.c
diff --git
a/lib/devices/record.c
b/lib/devices/record.c
index
3485840
..
48b57f6
100644
(file)
--- 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 -------------- */
/* ----------------- reading/writing of primitives with caching -------------- */
+void state_clear(state_t*state)
+{
+ int t;
+ for(t=0;t<sizeof(state->last_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);
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);
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;
}
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);
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_string[OP_DRAWCHAR] = strdup(font_id);
+
i->state.last_color[OP_DRAWCHAR] = *color;
i->state.last_matrix[OP_DRAWCHAR] = *matrix;
} else {
i->state.last_color[OP_DRAWCHAR] = *color;
i->state.last_matrix[OP_DRAWCHAR] = *matrix;
} else {
@@
-781,7
+799,6
@@
static void replay(struct _gfxdevice*dev, gfxdevice_t*out, reader_t*r, gfxfontli
msg("<trace> replay: ADDFONT out=%08x(%s)", out, out->name);
gfxfont_t*font = readFont(r, &state);
if(!gfxfontlist_hasfont(*fontlist, font)) {
msg("<trace> replay: ADDFONT out=%08x(%s)", out, out->name);
gfxfont_t*font = readFont(r, &state);
if(!gfxfontlist_hasfont(*fontlist, font)) {
- printf("%08x / %08x: font %s is new\n", out, *fontlist, font->id);
*fontlist = gfxfontlist_addfont(*fontlist, font);
out->addfont(out, font);
} else {
*fontlist = gfxfontlist_addfont(*fontlist, font);
out->addfont(out, font);
} else {
@@
-811,6
+828,7
@@
static void replay(struct _gfxdevice*dev, gfxdevice_t*out, reader_t*r, gfxfontli
}
}
finish:
}
}
finish:
+ state_clear(&state);
r->dealloc(r);
if(_fontlist)
gfxfontlist_free(_fontlist, 0);
r->dealloc(r);
if(_fontlist)
gfxfontlist_free(_fontlist, 0);
@@
-928,6
+946,8
@@
static gfxresult_t* record_finish(struct _gfxdevice*dev)
msg("<error> Warning: unclosed cliplevels");
}
msg("<error> Warning: unclosed cliplevels");
}
+ state_clear(&i->state);
+
#ifdef STATS
int total = i->w.pos;
if(total && i->use_tempfile) {
#ifdef STATS
int total = i->w.pos;
if(total && i->use_tempfile) {