X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fmodules%2Fswftools.c;h=42279bb434b528b9780d55e32453f3386203a0fd;hp=d4275d3b85528b8ab19ad5497b9dd1212baa34c2;hb=d85090d5a239735d923590480573573b1d856009;hpb=dfa75b5adac950d31e7427c7cc82a71f5ed04294 diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index d4275d3..42279bb 100644 --- a/lib/modules/swftools.c +++ b/lib/modules/swftools.c @@ -974,7 +974,20 @@ char swf_Relocate (SWF*swf, char*bitmap) memset(slaveids, -1, sizeof(slaveids)); tag = swf->firstTag; char ok = 1; + int current_id=0; +#define NEW_ID(n) \ + for(current_id++;current_id<65536;current_id++) { \ + if(!bitmap[current_id]) { \ + n = current_id; \ + break; \ + } \ + } \ + if(current_id==65536) { \ + fprintf(stderr, "swf_Relocate: Couldn't relocate: Out of IDs\n"); \ + return 0; \ + } + while(tag) { int num; @@ -989,21 +1002,12 @@ char swf_Relocate (SWF*swf, char*bitmap) if(!bitmap[id]) { //free newid = id; + } else if(slaveids[id]>0) { + newid = slaveids[id]; } else { - newid = 0; - for(current_id++;current_id<65536;current_id++) - { - if(!bitmap[current_id]) - { - newid = current_id; - break; - } - } - if(current_id==65536) { - fprintf(stderr, "swf_Relocate: Couldn't relocate: Out of IDs\n"); - return 0; - } + NEW_ID(newid); } + bitmap[newid] = 1; slaveids[id] = newid; @@ -1023,17 +1027,8 @@ char swf_Relocate (SWF*swf, char*bitmap) the main timeline. It's used in e.g. SYMBOLTAG tags, but never defined, so if we're asked to reallocate it, we have to allocate an ID for it on the fly. */ - int newid = 0; - for(current_id++;current_id<65536;current_id++) { - if(!bitmap[current_id]) { - newid = current_id; - break; - } - } - if(current_id==65536) { - fprintf(stderr, "swf_Relocate: Couldn't relocate: Out of IDs\n"); - return 0; - } + int newid; + NEW_ID(newid); bitmap[newid] = 1; slaveids[id] = newid; id = newid; @@ -1041,8 +1036,13 @@ char swf_Relocate (SWF*swf, char*bitmap) /* well- we don't know this id, but it's not reserved anyway, so just leave it alone */ } else { - fprintf(stderr, "swf_Relocate: Mapping id (%d) never encountered before in %s\n", id, + /* this actually happens with files created with Flash CS4 and never. + Apparently e.g. DefineButton tags are able to use forward declarations of objects. */ + fprintf(stderr, "warning: Mapping id (%d) never encountered before in %s\n", id, swf_TagGetName(tag)); + int newid; + NEW_ID(newid); + id = slaveids[id] = newid; ok = 0; } } else {