X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fmodules%2Fswftools.c;h=83f8c6a2d9d92a4094b13cfad18a530c7614f718;hb=0784a8a882e7b98299fb6a90f0f9a7ebb322562b;hp=63943c73d0ae1cdbe00b9f9f843ea18f3374f05e;hpb=965fb2d8ab551a8544f85bf1ab7441bcd0c7c2c5;p=swftools.git diff --git a/lib/modules/swftools.c b/lib/modules/swftools.c index 63943c7..83f8c6a 100644 --- a/lib/modules/swftools.c +++ b/lib/modules/swftools.c @@ -118,6 +118,7 @@ U16 swf_GetDefineID(TAG * t) case ST_DEFINEFONTINFO: //pseudodefine case ST_DEFINEFONTINFO2: //pseudodefine case ST_DEFINEFONTALIGNZONES: //pseudodefine + case ST_DEFINEFONTNAME: //pseudodefine case ST_DEFINETEXT: case ST_DEFINETEXT2: case ST_DEFINESOUND: @@ -155,6 +156,7 @@ SRECT swf_GetDefineBBox(TAG * t) { case ST_DEFINESHAPE: case ST_DEFINESHAPE2: case ST_DEFINESHAPE3: + case ST_DEFINESHAPE4: case ST_DEFINEEDITTEXT: case ST_DEFINETEXT: case ST_DEFINETEXT2: @@ -203,6 +205,12 @@ U16 swf_GetPlaceID(TAG * t) U16 d = swf_GetU16(t); id = (flags&PF_CHAR)?swf_GetU16(t):id; } break; + case ST_PLACEOBJECT3: + { U8 flags = swf_GetU8(t); + U8 flags2 = swf_GetU8(t); + U16 d = swf_GetU16(t); + id = (flags&PF_CHAR)?swf_GetU16(t):id; + } break; } @@ -234,6 +242,7 @@ static int swf_definingtagids[] = ST_DEFINEBUTTON2, ST_DEFINESOUND, ST_DEFINEVIDEOSTREAM, + ST_DEFINEBINARY, -1 }; @@ -242,9 +251,11 @@ static int swf_spritetagids[] = {ST_SHOWFRAME, ST_PLACEOBJECT, ST_PLACEOBJECT2, + ST_PLACEOBJECT3, ST_REMOVEOBJECT, - ST_REMOVEOBJECT2, //? + ST_REMOVEOBJECT2, ST_DOACTION, + ST_DOABC, ST_STARTSOUND, ST_FRAMELABEL, ST_SOUNDSTREAMHEAD, @@ -260,6 +271,7 @@ static int swf_pseudodefiningtagids[] = ST_DEFINEFONTINFO, ST_DEFINEFONTINFO2, ST_DEFINEFONTALIGNZONES, + ST_DEFINEFONTNAME, ST_DEFINEBUTTONCXFORM, ST_DEFINEBUTTONSOUND, ST_DEFINESCALINGGRID, @@ -330,6 +342,11 @@ int swf_GetDepth(TAG * t) { U8 flags = swf_GetU8(t); depth = swf_GetU16(t); } break; + case ST_PLACEOBJECT3: + { U8 flags = swf_GetU8(t); + U8 flags2 = swf_GetU8(t); + depth = swf_GetU16(t); + } break; case ST_SETTABINDEX: { depth = swf_GetU16(t); @@ -371,7 +388,7 @@ char* swf_GetName(TAG * t) switch(swf_GetTagID(t)) { case ST_FRAMELABEL: - name = &t->data[swf_GetTagPos(t)]; + name = (char*)&t->data[swf_GetTagPos(t)]; break; case ST_PLACEOBJECT3: case ST_PLACEOBJECT2: { @@ -387,11 +404,11 @@ char* swf_GetName(TAG * t) swf_GetCXForm(t, &c, 1); if(flags&PF_RATIO) swf_GetU16(t); - if(flags&PF_CLIPACTION) + if(flags&PF_CLIPDEPTH) swf_GetU16(t); if(flags&PF_NAME) { swf_ResetReadBits(t); - name = &t->data[swf_GetTagPos(t)]; + name = (char*)&t->data[swf_GetTagPos(t)]; } } break; @@ -403,45 +420,61 @@ char* swf_GetName(TAG * t) /* used in enumerateUsedIDs */ void swf_GetMorphGradient(TAG * tag, GRADIENT * gradient1, GRADIENT * gradient2) { - GRADIENT dummy1; - GRADIENT dummy2; int t; - if(!gradient1) - gradient1 = &dummy1; - if(!gradient2) - gradient2 = &dummy2; - gradient1->num = - gradient2->num = swf_GetU8(tag); - for(t=0;tnum;t++) + int num = swf_GetU8(tag) & 15; + if(gradient1) gradient1->num = num; + if(gradient2) gradient2->num = num; + + if(gradient1) { + gradient1->num = num; + gradient1->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient1->num); + gradient1->ratios = (U8*)rfx_calloc(sizeof(gradient1->ratios[0])*gradient1->num); + } + if(gradient2) { + gradient2->num = num; + gradient2->rgba = (RGBA*)rfx_calloc(sizeof(RGBA)*gradient2->num); + gradient2->ratios = (U8*)rfx_calloc(sizeof(gradient2->ratios[0])*gradient2->num); + } + for(t=0;t=8) //FIXME - s=7; - gradient1->ratios[t] = swf_GetU8(tag); - swf_GetRGBA(tag, &gradient1->rgba[t]); - gradient2->ratios[t] = swf_GetU8(tag); - swf_GetRGBA(tag, &gradient2->rgba[t]); + U8 ratio; + RGBA color; + + ratio = swf_GetU8(tag); + swf_GetRGBA(tag, &color); + if(gradient1) { + gradient1->ratios[t] = ratio; + gradient1->rgba[t] = color; + } + + ratio = swf_GetU8(tag); + swf_GetRGBA(tag, &color); + if(gradient2) { + gradient2->ratios[t] = ratio; + gradient2->rgba[t] = color; + } } } #define DEBUG_ENUMERATE if(0) +//#define DEBUG_ENUMERATE void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void*callback_data, int num, int morph) { U16 count; int t; count = swf_GetU8(tag); - if(count == 0xff && num>1) // defineshape2,3 only + if(count == 0xff && num>1) // defineshape2,3,4 only count = swf_GetU16(tag); + DEBUG_ENUMERATE printf("%d fill styles\n", count); for(t=0;tpos); if(type == 0) { - if(num == 3) + if(num >= 3) {swf_GetRGBA(tag, NULL);if(morph) swf_GetRGBA(tag, NULL);} else {swf_GetRGB(tag, NULL);if(morph) swf_GetRGB(tag, NULL);} @@ -449,19 +482,25 @@ void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void else if(type == 0x10 || type == 0x12 || type == 0x13) { swf_ResetReadBits(tag); - swf_GetMatrix(tag, NULL); + MATRIX m; + swf_GetMatrix(tag, &m); + DEBUG_ENUMERATE swf_DumpMatrix(stdout, &m); if(morph) swf_GetMatrix(tag, NULL); swf_ResetReadBits(tag); if(morph) swf_GetMorphGradient(tag, NULL, NULL); - else - swf_GetGradient(tag, NULL, /*alpha*/ num>=3?1:0); + else { + GRADIENT g; + swf_GetGradient(tag, &g, /*alpha*/ num>=3?1:0); + DEBUG_ENUMERATE swf_DumpGradient(stdout, &g); + if(type == 0x13) + swf_GetU16(tag); + } } else if(type == 0x40 || type == 0x41 || type == 0x42 || type == 0x43) { swf_ResetReadBits(tag); - // we made it. if(tag->data[tag->pos] != 0xff || tag->data[tag->pos+1] != 0xff) (callback)(tag, tag->pos, callback_data); @@ -473,22 +512,34 @@ void enumerateUsedIDs_styles(TAG * tag, void (*callback)(TAG*, int, void*), void swf_GetMatrix(tag, NULL); } else { - fprintf(stderr, "rfxswf:swftools.c Unknown fillstyle:0x%02x\n",type); + fprintf(stderr, "rfxswf:swftools.c Unknown fillstyle:0x%02x in tag %02x\n",type, tag->id); } } swf_ResetReadBits(tag); count = swf_GetU8(tag); // line style array if(count == 0xff) count = swf_GetU16(tag); + DEBUG_ENUMERATE printf("%d line styles\n", count); for(t=0;t= 4) { + U16 flags = swf_GetU16(tag); + if(flags & 0x2000) + swf_GetU16(tag); // miter limit + if(flags & 0x0800) { + fprintf(stderr, "Filled strokes parsing not yet supported\n"); + } + } + if(num >= 3) + {swf_GetRGBA(tag, &color);if(morph) swf_GetRGBA(tag, NULL);} else - {swf_GetRGB(tag, NULL);if(morph) swf_GetRGB(tag, NULL);} + {swf_GetRGB(tag, &color);if(morph) swf_GetRGB(tag, NULL);} + DEBUG_ENUMERATE printf("line style %d: %02x%02x%02x%02x \n", t, color.r,color.g,color.b,color.a); } } @@ -556,6 +607,8 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v case ST_FREECHARACTER: /* unusual tags, which all start with an ID */ case ST_NAMECHARACTER: + case ST_DEFINEBINARY: + case ST_DEFINEFONTNAME: case ST_GENERATORTEXT: callback(tag, tag->pos + base, callback_data); break; @@ -598,7 +651,7 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v if(id == ST_END) break; tag2->len = tag2->memsize = len; - tag2->data = rfx_alloc(len); + tag2->data = (U8*)rfx_alloc(len); memcpy(tag2->data, &tag->data[tag->pos], len); /* I never saw recursive sprites, but they are (theoretically) possible, so better add base here again */ @@ -621,7 +674,6 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v } while(1) { - U16 charid; if(!swf_GetU8(tag)) //flags break; callback(tag, tag->pos + base, callback_data); @@ -715,9 +767,10 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v callback(tag, tag->pos + base, callback_data); break; - case ST_DEFINEMORPHSHAPE: + case ST_DEFINEMORPHSHAPE2: case ST_DEFINESHAPE4: num++; + case ST_DEFINEMORPHSHAPE: case ST_DEFINESHAPE3: num++; //fallthrough case ST_DEFINESHAPE2: @@ -728,37 +781,46 @@ void enumerateUsedIDs(TAG * tag, int base, void (*callback)(TAG*, int, void*), v int id; int numshapes = 1; int morph = 0; - if(tag->id == ST_DEFINEMORPHSHAPE) { + if(tag->id == ST_DEFINEMORPHSHAPE || tag->id==ST_DEFINEMORPHSHAPE2) { numshapes = 2; morph = 1; } id = swf_GetU16(tag); // id; - swf_GetRect(tag, NULL); // shape bounds + SRECT r={0,0,0,0},r2={0,0,0,0}; + swf_GetRect(tag, &r); // shape bounds if(morph) { swf_ResetReadBits(tag); swf_GetRect(tag, NULL); // shape bounds2 - if(num==4) + if(num>=4) { + swf_ResetReadBits(tag); swf_GetRect(tag, NULL); // edge bounds1 + } } if(num>=4) { - swf_GetRect(tag, NULL); // edge bounds - swf_GetU8(tag); // flags, &1: contains scaling stroke, &2: contains non-scaling stroke + swf_ResetReadBits(tag); + swf_GetRect(tag, &r2); // edge bounds + U8 flags = swf_GetU8(tag); // flags, &1: contains scaling stroke, &2: contains non-scaling stroke + DEBUG_ENUMERATE printf("flags: %02x (1=scaling strokes, 2=non-scaling strokes)\n", flags); } if(morph) { swf_GetU32(tag); //offset to endedges } DEBUG_ENUMERATE printf("Tag:%d Name:%s ID:%d\n", tag->id, swf_TagGetName(tag), id); + DEBUG_ENUMERATE printf("BBox %.2f %.2f %.2f %.2f\n", r.xmin/20.0,r.ymin/20.0,r.xmax/20.0,r.ymax/20.0); + DEBUG_ENUMERATE printf("BBox %.2f %.2f %.2f %.2f\n", r2.xmin/20.0,r2.ymin/20.0,r2.xmax/20.0,r2.ymax/20.0); + DEBUG_ENUMERATE printf("style tag pos: %d\n", tag->pos); enumerateUsedIDs_styles(tag, callback, callback_data, num, morph); DEBUG_ENUMERATE printf("-------\n"); + swf_ResetReadBits(tag); while(--numshapes>=0) /* morph shapes define two shapes */ { DEBUG_ENUMERATE printf("shape:%d\n", numshapes); fillbits = swf_GetBits(tag, 4); linebits = swf_GetBits(tag, 4); - DEBUG_ENUMERATE printf("%d %d\n", fillbits, linebits); + DEBUG_ENUMERATE printf("fillbits=%d linebits=%d\n", fillbits, linebits); swf_ResetReadBits(tag); while(1) { int flags; @@ -896,7 +958,7 @@ void swf_Relocate (SWF*swf, char*bitmap) num = swf_GetNumUsedIDs(tag); if(num) { - ptr = rfx_alloc(sizeof(int)*num); + ptr = (int*)rfx_alloc(sizeof(int)*num); swf_GetUsedIDs(tag, ptr); for(t=0;tdata[ptr[t]], id); } - id = slaveids[id]; - PUT16(&tag->data[ptr[t]], id); } } tag=tag->next; @@ -931,7 +993,7 @@ void swf_Relocate2(SWF*swf, int*id2id) if(num) { int *ptr; int t; - ptr = rfx_alloc(sizeof(int)*num); + ptr = (int*)rfx_alloc(sizeof(int)*num); swf_GetUsedIDs(tag, ptr); for(t=0;tdata[ptr[t]]); @@ -1097,10 +1159,10 @@ static int tagHash(TAG*tag) void swf_Optimize(SWF*swf) { const int hash_size = 131072; - char* dontremap = rfx_calloc(sizeof(char)*65536); - U16* remap = rfx_alloc(sizeof(U16)*65536); - TAG* id2tag = rfx_calloc(sizeof(TAG*)*65536); - TAG** hashmap = rfx_calloc(sizeof(TAG*)*hash_size); + char* dontremap = (char*)rfx_calloc(sizeof(char)*65536); + U16* remap = (U16*)rfx_alloc(sizeof(U16)*65536); + TAG* id2tag = (TAG*)rfx_calloc(sizeof(TAG*)*65536); + TAG** hashmap = (TAG**)rfx_calloc(sizeof(TAG*)*hash_size); TAG* tag; int t; for(t=0;t<65536;t++) { @@ -1128,7 +1190,7 @@ void swf_Optimize(SWF*swf) /* remap the tag */ int num = swf_GetNumUsedIDs(tag); - int*positions = rfx_alloc(sizeof(int)*num); + int*positions = (int*)rfx_alloc(sizeof(int)*num); int t; swf_GetUsedIDs(tag, positions); for(t=0;tpos; len = tag->len - after_bbox_offset; - data = malloc(len); + data = (U8*)malloc(len); memcpy(data, &tag->data[after_bbox_offset], len); tag->writeBit = 0; tag->len = 2;