X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fflash.c;h=289dcbb717c95d3de7318f7aedf80adf3a8cdaa3;hb=e1752ee77f9bc5529aa551fe89ded25d879d0119;hp=fff828437fa632d359fb2bcf8327f32594f9a3c5;hpb=fc554a43712b76d16b41ec77dd311b4a78b1ef6b;p=swftools.git diff --git a/src/flash.c b/src/flash.c index fff8284..289dcbb 100644 --- a/src/flash.c +++ b/src/flash.c @@ -42,6 +42,21 @@ struct flash_header swf_read_header() return head; } +void swf_write_header(struct writer_t*w, struct flash_header*head) +{ + writer_writeu8(w, head->version); + writer_writeu32(w, head->length); + + writer_writebits(w, 31, 5); + writer_writebits(w, head->boundingBox.x1, 31); + writer_writebits(w, head->boundingBox.x2, 31); + writer_writebits(w, head->boundingBox.y1, 31); + writer_writebits(w, head->boundingBox.y2, 31); + writer_resetbits(w); + writer_writeu16(w, head->rate); + writer_writeu16(w, head->count); +} + struct RGB readRGB() { struct RGB rgb; @@ -69,7 +84,7 @@ struct GRADIENT readGRADIENT(int shape) for(t=0;t=3) + if(shape<3) gradient.rgb[t] = readRGB(); else gradient.rgba[t] = readRGBA(); @@ -108,14 +123,14 @@ void writeRECT(u8**pos, struct RECT*r) *pos = writer_getpos(&w); } -struct CXFORM readCXFORM() +struct CXFORM readCXFORM(char alpha) { struct CXFORM c; int bits; c.hasadd=readbit(); c.hasmult=readbit(); bits=getbits(4); - c.alpha = 0; + c.alpha = alpha; if (c.hasmult) { @@ -301,7 +316,7 @@ void placeobject_init (struct PlaceObject*obj, struct swf_tag*tag) obj -> matrix = readMATRIX(); obj -> hascxform = (getinputpos() < &tag->data[tag->length]); if(obj -> hascxform) - obj -> cxform = readCXFORM(); + obj -> cxform = readCXFORM(0); } void placeobject_write (struct PlaceObject*obj, struct writer_t*w) @@ -354,7 +369,7 @@ void placeobject2_init (struct PlaceObject2*obj,struct swf_tag*tag) obj->matrix = readMATRIX(); } if(obj->hascolortransform) { - obj->cxform = readCXFORM(); + obj->cxform = readCXFORM(0); } if(obj->hasratio) { obj->ratio=readu16(); @@ -479,7 +494,28 @@ int spritetagids[] = int getidfromtag(struct swf_tag* tag) { - // todo: check for more than one id + int num = 1; + switch(tag->id) { + case TAGID_PLACEOBJECT2: + num++; + case TAGID_PLACEOBJECT: + reader_init (tag->data, tag->length); + if(num>=2) { + char b = readu8(); + if(!(b&2)) + return -1; + } + readu16(); + return readu16(); + break; + case TAGID_REMOVEOBJECT: + return *(u16*)tag->data; + break; + case TAGID_REMOVEOBJECT2: + return -1; + break; + } + return *(u16*)tag->data; }