X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftools.c;h=72d5607b62e2951daaef63b9f33e7f843e2fcec8;hb=a36a0fe5a0f93dc010a3b65f064d870883f199e9;hp=37c8e8b2b11b362df2575420eed90f4f1f2a9b47;hpb=e9dc83904a5df2c24cc62004be16cecdaea83797;p=swftools.git diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index 37c8e8b..72d5607 100644 --- a/lib/modules/swftools.c +++ b/lib/modules/swftools.c @@ -25,8 +25,7 @@ #define S64 long long SFIXED RFXSWF_SP(SFIXED a1,SFIXED a2,SFIXED b1,SFIXED b2) -{ S64 a; - a = ((S64)a1*(S64)b1+(S64)a2*(S64)b2)>>16; +{ S64 a = ((S64)a1*(S64)b1+(S64)a2*(S64)b2)>>16; SFIXED result = (SFIXED)(a); if(a!=result) fprintf(stderr, "Warning: overflow in matrix multiplication"); @@ -486,7 +485,7 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v tag->pos = 0; switch(tag->id) { - case ST_DEFINEBUTTONCXFORM: { + case ST_DEFINEBUTTONSOUND: { int t; callback(tag, tag->pos + base, callback_data); for(t=0;t<4;t++) { @@ -513,7 +512,7 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v } } } break; - case ST_DEFINEBUTTONSOUND: + case ST_DEFINEBUTTONCXFORM: callback(tag, tag->pos + base, callback_data); //button id break; @@ -629,39 +628,39 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v advancebits = swf_GetU8(tag); //advancebits while(1) { U16 flags; + int t; swf_ResetReadBits(tag); flags = swf_GetBits(tag, 8); if(!flags) break; - if(flags & 128) // text style record - { + + swf_ResetReadBits(tag); + if(flags & 8) { // hasfont + callback(tag, tag->pos + base, callback_data); + id = swf_GetU16(tag); + } + if(flags & 4) { // hascolor + if(num==1) swf_GetRGB(tag, NULL); + else swf_GetRGBA(tag, NULL); + } + if(flags & 2) { //has x offset swf_ResetReadBits(tag); - if(flags & 8) { // hasfont - callback(tag, tag->pos + base, callback_data); - id = swf_GetU16(tag); - } - if(flags & 4) { // hascolor - if(num==1) swf_GetRGB(tag, NULL); - else swf_GetRGBA(tag, NULL); - } - if(flags & 2) { //has x offset - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - if(flags & 1) { //has y offset - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - if(flags & 8) { //has height - swf_ResetReadBits(tag); - swf_GetU16(tag); - } - } else { // glyph record - int t; + swf_GetU16(tag); + } + if(flags & 1) { //has y offset swf_ResetReadBits(tag); - for(t=0;tfirstTag; + while(tag) { + if(swf_isDefiningTag(tag)) { + int id = swf_GetDefineID(tag); + id = id2id[id]; + if(id>=0) { + swf_SetDefineID(tag, id); + } + } + int num = swf_GetNumUsedIDs(tag); + if(num) { + int *ptr; + int t; + ptr = rfx_alloc(sizeof(int)*num); + swf_GetUsedIDs(tag, ptr); + for(t=0;tdata[ptr[t]]); + id = id2id[id]; + if(id>=0) { + PUT16(&tag->data[ptr[t]], id); + } + } + } + } +} + void swf_RelocateDepth(SWF*swf, char*bitmap) { TAG*tag; @@ -883,10 +912,27 @@ void swf_RelocateDepth(SWF*swf, char*bitmap) while(tag) { + int depth; /* TODO * clip depths * sprites */ - int depth = swf_GetDepth(tag); + if(tag->id == ST_PLACEOBJECT2) { + SWFPLACEOBJECT obj; + swf_GetPlaceObject(tag, &obj); + if(obj.clipdepth) { + int newdepth = obj.clipdepth+nr; + if(newdepth>65535) { + fprintf(stderr, "Couldn't relocate depths: too large values\n"); + newdepth = 65535; + } + obj.clipdepth = newdepth; + swf_ResetTag(tag, ST_PLACEOBJECT2); + swf_SetPlaceObject(tag, &obj); + } + swf_PlaceObjectFree(&obj); + } + + depth = swf_GetDepth(tag); if(depth>=0) { int newdepth = depth+nr; if(newdepth>65535) { @@ -1029,8 +1075,6 @@ void swf_Optimize(SWF*swf) } tag = swf->firstTag; while(tag) { - int doremap=1; - TAG*next = tag->next; /* remap the tag */ @@ -1044,7 +1088,6 @@ void swf_Optimize(SWF*swf) PUT16(&tag->data[positions[t]], id); } rfx_free(positions); - tag = tag->next; /* now look for previous tags with the same content */ @@ -1055,22 +1098,11 @@ void swf_Optimize(SWF*swf) int match=0; if(!dontremap[id]) while((tag2 = hashmap[hash%hash_size])) { - if(tag2 != (TAG*)(-1) && tag->len == tag2->len) { - int t; - /* start at pos 2, as 0 and 1 are the id */ - for(t=2;tlen;t++) { - if(tag->data[t] != tag2->data[t]) - break; - } - if(t == tag->len) { - match=1; - } - } - if(match) { - /* we found two identical tags- remap one - of them */ - remap[id] = swf_GetDefineID(tag2); - break; + if(tag2 != (TAG*)0 && tag->len == tag2->len) { + if(memcmp(&tag->data[2],&tag2->data[2],tag->len-2) == 0) { + match = 1; + break; + } } hash++; } @@ -1078,10 +1110,12 @@ void swf_Optimize(SWF*swf) while(hashmap[hash%hash_size]) hash++; hashmap[hash%hash_size] = tag; } else { + /* we found two identical tags- remap one + of them */ + remap[id] = swf_GetDefineID(tag2); swf_DeleteTag(tag); if(tag == swf->firstTag) swf->firstTag = next; - doremap = 0; } } else if(swf_isPseudoDefiningTag(tag)) { int id = swf_GetDefineID(tag); @@ -1092,12 +1126,12 @@ void swf_Optimize(SWF*swf) swf_DeleteTag(tag); if(tag == swf->firstTag) swf->firstTag = next; - doremap = 0; } } tag = next; } + rfx_free(dontremap); rfx_free(remap); rfx_free(id2tag);