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;
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;
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;
/* 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 {
msg("<notice> Slave file attached to object %d.", defineid);
}
}
+ } else if(tag->id == ST_EXPORTASSETS) {
+ int t;
+ int num = swf_GetU16(tag);
+ for(t=0;t<num;t++)
+ {
+ U16 id = swf_GetU16(tag);
+ char*name = swf_GetString(tag);
+ if(spriteid<0 && slavename && !strcmp(name,slavename)) {
+ spriteid = id;
+ msg("<notice> Slave file attached to object %d exported as %s.", id, name);
+ }
+ }
} else if(tag->id == ST_SYMBOLCLASS) {
/* a symbolclass tag is like a define tag: it defines id 0000 */
int num = swf_GetU16(tag);