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;
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;
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(¤trect, 0, sizeof(currentrect));
stackpos++;
incrementid();
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++;
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);
}