added option -t.
[swftools.git] / src / reloc.c
index f3243a3..3ccc519 100644 (file)
@@ -46,6 +46,37 @@ void map_ids_mem(u8*mem, int length)
 
     switch(newtag->id)
     {
+       case TAGID_DEFINEBUTTONCXFORM: {
+           int t;
+           maponeid(&newtag->data[0]); //button id
+           reader_init (newtag->data, newtag->length);
+           for(t=0;t<4;t++) {
+               int flags;
+               maponeid(&newtag->data[0]);
+               readu16(); //sound id
+               flags = readu8();
+               if(flags&1)
+                   readu32(); // in point
+               if(flags&2)
+                   readu32(); // out points
+               if(flags&4)
+                   readu16(); // loop count
+               if(flags&8)
+               {
+                   int npoints = readu8();
+                   int s;
+                   for(s=0;s<npoints;s++)
+                   {
+                       readu32();
+                       readu16();
+                       readu16();
+                   }
+               }
+           }
+        } break;
+       case TAGID_DEFINEBUTTONSOUND:
+           maponeid(&newtag->data[0]); //button id
+       break;
        case TAGID_PLACEOBJECT:
            maponeid(&newtag->data[0]);
         break;
@@ -104,7 +135,8 @@ void map_ids_mem(u8*mem, int length)
                readu16(); //char
                readu16(); //layer
                readMATRIX();
-               readCXFORM();
+               if(num>1)
+                 readCXFORM();
            }
            // ...
        break;
@@ -124,22 +156,26 @@ void map_ids_mem(u8*mem, int length)
            num ++;
        case TAGID_DEFINETEXT: { 
            int glyphbits, advancebits;
+           int id;
            reader_init (newtag->data, newtag->length);
-           readu16(); //id
+           id = readu16(); //id
            readRECT(); //bounding box
+           resetbits();
            readMATRIX(); //matrix
            resetbits();
            glyphbits = readu8(); //glyphbits
            advancebits = readu8(); //advancebits
            while(1) {
-               u16 flags = getbits(8);
+               u16 flags;
+               resetbits();
+               flags = getbits(8);
                if(!flags) break;
                if(flags & 128) // text style record
                {
+                   resetbits();
                    if(flags & 8) { // hasfont
                        maponeid(getinputpos());
-                       resetbits();
-                       readu16();
+                       id = readu16();
                    }
                    if(flags & 4) { // hascolor
                        if(num==1) readRGB();
@@ -158,9 +194,12 @@ void map_ids_mem(u8*mem, int length)
                        readu16();
                    }
                } else { // glyph record
-                   getbits(glyphbits);
-                   getbits(advancebits);
-                   break;
+                   int t;
+                   resetbits();
+                   for(t=0;t<flags;t++) {
+                       getbits(glyphbits);
+                       getbits(advancebits);
+                   }
                }
            }
            break;
@@ -183,7 +222,7 @@ void map_ids_mem(u8*mem, int length)
 //         printf("%d shape bounds: %d %d %d %d\n",newtag->id,r.x1,r.y1,r.x2,r.y2);
            resetbits();
            count = readu8();
-           if(count == 0xff && num>1)
+           if(count == 0xff && num>1) // defineshape2,3 only
                count = readu16();
 //         printf("%d fillstyles\n", count);
            for(t=0;t<count;t++)
@@ -193,6 +232,7 @@ void map_ids_mem(u8*mem, int length)
                pos=getinputpos();
 //             printf("%02x %02x %02x %02x %02x %02x %02x %02x\n", 
 //                     pos[0],pos[1],pos[2],pos[3],pos[4],pos[5],pos[6],pos[7]);
+               resetbits();
                type = readu8(); //type
 //             printf("fillstyle %d is type 0x%02x\n", t, type);
                if(type == 0) {
@@ -203,6 +243,7 @@ void map_ids_mem(u8*mem, int length)
                }
                if(type == 0x10 || type == 0x12)
                {
+                   resetbits();
                    readMATRIX();
                    resetbits();
                    readGRADIENT(num);
@@ -253,6 +294,7 @@ void swf_relocate (u8*data, int length, int*_bitmap)
     while(file.tags[pos].id != 0) {
        struct swf_tag*tag = &file.tags[pos];
         
+       logf("<debug> relocator: processing tag %02x", tag->id);
        map_ids(&file.tags[pos]);
 
        if(is_defining_tag(tag->id))
@@ -271,11 +313,11 @@ void swf_relocate (u8*data, int length, int*_bitmap)
            bitmap[newid] = 1;
            slaveids[id] = newid;
 
-           logf("<debug> sprite id %d mapped to %d",id, newid);
+           logf("<debug> relocator: id %d mapped to %d",id, newid);
            
            setidintag(tag, newid);
 
-           logf("<debug> [sprite defs] write tag %02x (%d bytes in body)", 
+           logf("<debug> [reloc] write tag %02x (%d bytes in body)", 
                    tag->id, tag->length);
        } 
         pos++;