X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftools.c;h=b94bc4acd7fc7577e5c8e0bc432d01df0ca6001f;hb=7564cb2f1c728e1e41425ca4b801e2262ef89bfe;hp=4117fc3d8a9b02e54443959dc1613429b75cc691;hpb=0ee8530d9e3fc453e1f97fa2623f5db344622a40;p=swftools.git diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index 4117fc3..b94bc4a 100644 --- a/lib/modules/swftools.c +++ b/lib/modules/swftools.c @@ -65,6 +65,14 @@ MATRIX * swf_MatrixMapTriangle(MATRIX * m,int dx,int dy,int x0,int y0, return m; } +void swf_SetDefineID(TAG * tag, U16 newid) +{ + int oldlen = tag->len; + tag->len = 0; + swf_SetU16(tag, newid); /* set defining ID */ + tag->len = oldlen; +} + U16 swf_GetDefineID(TAG * t) // up to SWF 4.0 { U32 oldTagPos; @@ -116,6 +124,7 @@ U16 swf_GetPlaceID(TAG * t) switch (swf_GetTagID(t)) { case ST_PLACEOBJECT: case ST_REMOVEOBJECT: + case ST_FREECHARACTER: case ST_STARTSOUND: id = swf_GetU16(t); break; @@ -282,7 +291,9 @@ char* swf_GetName(TAG * t) return name; } -void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num) +#define DEBUG_ENUMERATE if(0) + +static void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num) { U16 count; int t; @@ -524,10 +535,14 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v int id; id = swf_GetU16(tag); // id; swf_GetRect(tag, NULL); // bounds + + DEBUG_ENUMERATE printf("Tag:%d Name:%s ID:%d\n", tag->id, swf_TagGetName(tag), id); enumerateUsedIDs_styles(tag, callback, callback_data, num); + DEBUG_ENUMERATE printf("-------\n"); fillbits = swf_GetBits(tag, 4); linebits = swf_GetBits(tag, 4); + DEBUG_ENUMERATE printf("%d %d\n", fillbits, linebits); swf_ResetReadBits(tag); while(1) { int flags; @@ -538,19 +553,28 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v break; if(flags&1) { //move int n = swf_GetBits(tag, 5); - swf_GetBits(tag, n); //x - swf_GetBits(tag, n); //y + int x,y; + x = swf_GetBits(tag, n); //x + y = swf_GetBits(tag, n); //y + DEBUG_ENUMERATE printf("move %f %f\n",x/20.0,y/20.0); } if(flags&2) { //fill0 - swf_GetBits(tag, fillbits); + int fill0; + fill0 = swf_GetBits(tag, fillbits); + DEBUG_ENUMERATE printf("fill0 %d\n", fill0); } if(flags&4) { //fill1 - swf_GetBits(tag, fillbits); + int fill1; + fill1 = swf_GetBits(tag, fillbits); + DEBUG_ENUMERATE printf("fill1 %d\n", fill1); } if(flags&8) { //linestyle - swf_GetBits(tag, linebits); + int line; + line = swf_GetBits(tag, linebits); + DEBUG_ENUMERATE printf("linestyle %d\n",line); } if(flags&16) { + DEBUG_ENUMERATE printf("more fillstyles\n"); enumerateUsedIDs_styles(tag, callback, callback_data, num); fillbits = swf_GetBits(tag, 4); linebits = swf_GetBits(tag, 4); @@ -560,18 +584,24 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v if(flags) { //straight edge int n = swf_GetBits(tag, 4) + 2; if(swf_GetBits(tag, 1)) { //line flag - swf_GetBits(tag, n); //delta x - swf_GetBits(tag, n); //delta y + int x,y; + x = swf_GetSBits(tag, n); //delta x + y = swf_GetSBits(tag, n); //delta y + DEBUG_ENUMERATE printf("line %f %f\n",x/20.0,y/20.0); } else { int v=swf_GetBits(tag, 1); - swf_GetBits(tag, n); //vert/horz + int d; + d = swf_GetSBits(tag, n); //vert/horz + DEBUG_ENUMERATE printf("%s %f\n",v?"vertical":"horizontal", d/20.0); } } else { //curved edge int n = swf_GetBits(tag, 4) + 2; - swf_GetBits(tag, n); - swf_GetBits(tag, n); - swf_GetBits(tag, n); - swf_GetBits(tag, n); + int x1,y1,x2,y2; + x1 = swf_GetSBits(tag, n); + y1 = swf_GetSBits(tag, n); + x2 = swf_GetSBits(tag, n); + y2 = swf_GetSBits(tag, n); + DEBUG_ENUMERATE printf("curve %f %f %f %f\n", x1/20.0, y1/20.0, x2/20.0, y2/20.0); } } } @@ -585,12 +615,14 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v void callbackCount(TAG * t,int pos, void*ptr) { (*(int*)ptr)++; + DEBUG_ENUMERATE printf("callback(%d) %d\n", pos, *(U16*)&t->data[pos]); } void callbackFillin(TAG * t,int pos, void*ptr) { **(int**)ptr = pos; (*(int**)ptr)++; + DEBUG_ENUMERATE printf("callback(%d) %d\n", pos, *(U16*)&t->data[pos]); } int swf_GetNumUsedIDs(TAG * t) @@ -606,3 +638,59 @@ void swf_GetUsedIDs(TAG * t, int * positions) enumerateUsedIDs(t, 0, callbackFillin, &ptr); } +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;tdata[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; + } +} +