+void swf_Relocate (SWF*swf, char*bitmap)
+{
+ TAG*tag;
+ int slaveids[65536];
+ memset(slaveids, -1, sizeof(slaveids));
+ tag = swf->firstTag;
+ while(tag)
+ {
+ int num;
+ int *ptr;
+ int t;
+
+ if(swf_isDefiningTag(tag))
+ {
+ int newid;
+ int id;
+
+ id = swf_GetDefineID(tag); //own id
+
+ if(!bitmap[id]) { //free
+ newid = id;
+ }
+ else {
+ newid = 0;
+ for (t=1;t<65536;t++)
+ {
+ if(!bitmap[t])
+ {
+ newid = t;
+ break;
+ }
+ }
+ }
+ bitmap[newid] = 1;
+ slaveids[id] = newid;
+
+ swf_SetDefineID(tag, newid);
+ }
+
+ num = swf_GetNumUsedIDs(tag);
+ ptr = malloc(sizeof(int)*num);
+ swf_GetUsedIDs(tag, ptr);
+
+ for(t=0;t<num;t++) {
+ int id = GET16(&tag->data[ptr[t]]);
+ if(slaveids[id]<0) {
+ fprintf(stderr, "swf_Relocate: Mapping id never encountered before: %d\n", id);
+ return ;
+ }
+ id = slaveids[id];
+ PUT16(&tag->data[ptr[t]], id);
+ }
+ tag=tag->next;
+ }
+}
+