win32 compile fixes
[swftools.git] / lib / modules / swftools.c
index 840573a..83f8c6a 100644 (file)
@@ -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:
@@ -240,6 +242,7 @@ static int swf_definingtagids[] =
  ST_DEFINEBUTTON2,
  ST_DEFINESOUND,
  ST_DEFINEVIDEOSTREAM,
+ ST_DEFINEBINARY,
  -1
 };
 
@@ -248,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,
@@ -266,6 +271,7 @@ static int swf_pseudodefiningtagids[] =
  ST_DEFINEFONTINFO,
  ST_DEFINEFONTINFO2,
  ST_DEFINEFONTALIGNZONES,
+ ST_DEFINEFONTNAME,
  ST_DEFINEBUTTONCXFORM,
  ST_DEFINEBUTTONSOUND,
  ST_DEFINESCALINGGRID,
@@ -382,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: {   
@@ -402,7 +408,7 @@ char* swf_GetName(TAG * t)
               swf_GetU16(t);
             if(flags&PF_NAME) {
               swf_ResetReadBits(t);
-              name = &t->data[swf_GetTagPos(t)];
+              name = (char*)&t->data[swf_GetTagPos(t)];
             }
         }
         break;
@@ -414,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;t<gradient1->num;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<num;t++)
     {
-       int s=t;
-       if(s>=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;t<count;t++)
     {
        int type;
-       U8*pos;
-       swf_ResetReadBits(tag);
        type = swf_GetU8(tag); //type
+       DEBUG_ENUMERATE printf("fill style %d) %02x (tagpos=%d)\n", t, type, tag->pos);
        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);}
@@ -460,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);
@@ -484,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<count;t++) 
     {
-       swf_GetU16(tag);
+       U16  width;
+       RGBA color;
+       width = swf_GetU16(tag);
        if(morph)
            swf_GetU16(tag);
-       if(num == 3)
-           {swf_GetRGBA(tag, NULL);if(morph) swf_GetRGBA(tag, NULL);}
+       if(num >= 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);
     }
 }
 
@@ -567,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;
@@ -609,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 */
@@ -632,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);
@@ -726,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:
@@ -739,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;
@@ -907,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;t<num;t++) {
@@ -915,10 +966,10 @@ void swf_Relocate (SWF*swf, char*bitmap)
                if(slaveids[id]<0) {
                    fprintf(stderr, "swf_Relocate: Mapping id (%d) never encountered before in %s\n", id,
                            swf_TagGetName(tag));
-                   return ;
+               } else {
+                   id = slaveids[id];
+                   PUT16(&tag->data[ptr[t]], id);
                }
-               id = slaveids[id];
-               PUT16(&tag->data[ptr[t]], id);
            }
        }
        tag=tag->next;
@@ -942,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;t<num;t++) {
                int id = GET16(&tag->data[ptr[t]]);
@@ -1108,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++) {
@@ -1139,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;t<num;t++) {
@@ -1220,7 +1271,7 @@ void swf_SetDefineBBox(TAG * tag, SRECT newbbox)
              swf_ResetReadBits(tag);
              after_bbox_offset = tag->pos;
              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;