the area attribute of buttons is now copied from idle if not set.
[swftools.git] / src / swfc.c
index fb3fcc5..aa41307 100644 (file)
@@ -359,7 +359,6 @@ static MATRIX s_instancepos(SRECT rect, parameters_t*p)
     SRECT r;
     makeMatrix(&m, p);
     r = swf_TurnRect(rect, &m);
-    printf("%f %f %f %f\n", r.xmin/20.0, r.ymin/20.0, r.xmax/20.0, r.ymax/20.0);
     if(currentrect.xmin == 0 && currentrect.ymin == 0 && 
        currentrect.xmax == 0 && currentrect.ymax == 0)
        currentrect = r;
@@ -436,11 +435,19 @@ void s_sprite(char*name)
     incrementid();
 }
 
+typedef struct _buttonrecord
+{
+    U16 id;
+    MATRIX matrix;
+    CXFORM cxform;
+    char set;
+} buttonrecord_t;
+
 typedef struct _button
 {
     int endofshapes;
-    int shapes[4];
     int nr_actions;
+    buttonrecord_t records[4];
 } button_t;
 
 static button_t mybutton;
@@ -451,15 +458,15 @@ void s_button(char*name)
     swf_SetU16(tag, id); //id
     swf_ButtonSetFlags(tag, 0); //menu=no
 
-    mybutton.endofshapes = 0;
-    mybutton.shapes[0] = mybutton.shapes[1] = mybutton.shapes[2] = mybutton.shapes[3] = 0;
-    mybutton.nr_actions = 0;
+    memset(&mybutton, 0, sizeof(mybutton));
 
     memset(&stack[stackpos], 0, sizeof(stack[0]));
     stack[stackpos].type = 3;
     stack[stackpos].tag = tag;
     stack[stackpos].id = id;
     stack[stackpos].name = strdup(name);
+    stack[stackpos].oldrect = currentrect;
+    memset(&currentrect, 0, sizeof(currentrect));
 
     stackpos++;
     incrementid();
@@ -472,33 +479,56 @@ void s_buttonput(char*character, char*as, parameters_t p)
     if(!c) {
        syntaxerror("character %s not known (in .shape %s)", character, character);
     }
-    if(strstr(as, "idle")) {flags |= BS_UP;mybutton.shapes[0]=c->id;}
-    if(strstr(as, "hover")) {flags |= BS_OVER;mybutton.shapes[1]=c->id;}
-    if(strstr(as, "pressed")) {flags |= BS_DOWN;mybutton.shapes[2]=c->id;}
-    if(strstr(as, "area")) {flags |= BS_HIT;mybutton.shapes[3]=c->id;}
-    
     if(mybutton.endofshapes) {
        syntaxerror("a .do may not precede a .show", character, character);
     }
    
     m = s_instancepos(c->size, &p);
 
-    swf_ButtonSetRecord(stack[stackpos-1].tag,flags,c->id,1,&m,&p.cxform);
+    buttonrecord_t r;
+    r.id = c->id;
+    r.matrix = m;
+    r.cxform = p.cxform;
+    r.set = 1;
+    
+    if(strstr(as, "idle")) mybutton.records[0]=r;
+    if(strstr(as, "hover")) mybutton.records[1]=r;
+    if(strstr(as, "pressed")) mybutton.records[2]=r;
+    if(strstr(as, "area")) mybutton.records[3]=r;
 }
-void s_buttonaction(int flags, char*action)
+static void setbuttonrecords(TAG*tag)
 {
-    ActionTAG* a = 0;
+    int flags[] = {BS_UP,BS_OVER,BS_DOWN,BS_HIT};
     if(!mybutton.endofshapes) {
-       swf_SetU8(stack[stackpos-1].tag,0); // end of button records
+       int t;
+       
+       if(!mybutton.records[3].set) {
+           memcpy(&mybutton.records[3], &mybutton.records[0], sizeof(buttonrecord_t));
+       }
+
+       for(t=0;t<4;t++) {
+           if(mybutton.records[t].set)
+               swf_ButtonSetRecord(tag,flags[t],mybutton.records[t].id,1,&mybutton.records[t].matrix,&mybutton.records[t].cxform);
+       }
+       swf_SetU8(tag,0); // end of button records
        mybutton.endofshapes = 1;
     }
+}
+
+void s_buttonaction(int flags, char*action)
+{
+    ActionTAG* a = 0;
+    if(flags==0) {
+       return;
+    }
+    setbuttonrecords(stack[stackpos-1].tag);
     
     a = swf_ActionCompile(text, stack[0].swf->fileVersion);
     if(!a) {
        syntaxerror("Couldn't compile ActionScript");
     }
 
-    swf_ButtonSetCondition(stack[stackpos-1].tag, BC_OVERDOWN_OVERUP);
+    swf_ButtonSetCondition(stack[stackpos-1].tag, flags);
     swf_ActionSet(stack[stackpos-1].tag, a);
     mybutton.nr_actions++;
 
@@ -507,16 +537,17 @@ void s_buttonaction(int flags, char*action)
 
 static void s_endButton()
 {
+    setbuttonrecords(stack[stackpos-1].tag);
     stackpos--;
-    if(!mybutton.endofshapes) {
-       swf_SetU8(stack[stackpos].tag,0); // end of button records
-       mybutton.endofshapes = 1;
-    }
-    /* end of actions */
       
     swf_ButtonPostProcess(stack[stackpos].tag, mybutton.nr_actions);
 
+    SRECT r = currentrect;
+
     tag = stack[stackpos].tag;
+    currentrect = stack[stackpos].oldrect;
+
+    s_addcharacter(stack[stackpos].name, stack[stackpos].id, stack[stackpos].tag, r);
     free(stack[stackpos].name);
 }