1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/* swfbutton.c
Button functions
Extension module for the rfxswf library.
Part of the swftools package.
Copyright (c) 2000, 2001 Rainer Böhme <rfxswf@reflex-studio.de>
This file is distributed under the GPL, see file COPYING for details
*/
int swf_ButtonSetRecord(TAG * t,U8 state,U16 id,U16 layer,MATRIX * m,CXFORM * cx)
{ swf_SetU8(t,state);
swf_SetU16(t,id);
swf_SetU16(t,layer);
swf_SetMatrix(t,m);
if (swf_GetTagID(t)==ST_DEFINEBUTTON2) swf_SetCXForm(t,cx,0);
return 0;
}
int swf_ButtonSetCondition(TAG * t,U16 condition)
{ swf_SetU16(t,0); // dummy for Action Offset -> later set by ButtonPostProcess
swf_SetU16(t,condition);
return 0;
}
int swf_ButtonSetFlags(TAG * t,U8 flags)
{ if (swf_GetTagID(t)==ST_DEFINEBUTTON2)
{ swf_SetU8(t,flags);
swf_SetU16(t,0); // dummy for Action Offset -> later set by ButtonPostProcess
}
return 0;
}
void swf_SetButtonOffset(TAG * t,U32 offsetpos)
{ U32 now = swf_GetTagPos(t);
U16 diff = now-offsetpos;
swf_SetTagPos(t,offsetpos);
t->data[t->pos++] = (U8)(diff&0xff);
t->data[t->pos++] = (U8)(diff>>8);
swf_SetTagPos(t,now);
}
int swf_ButtonPostProcess(TAG * t,int anz_action)
{ if (swf_GetTagID(t)==ST_DEFINEBUTTON2)
{ U32 oldTagPos;
U32 offsetpos;
oldTagPos = swf_GetTagPos(t);
// scan DefineButton2 Record
swf_GetU16(t); // Character ID
swf_GetU8(t); // Flags;
offsetpos = swf_GetTagPos(t); // first offset
swf_GetU16(t);
while (swf_GetU8(t)) // state -> parse ButtonRecord
{ swf_GetU16(t); // id
swf_GetU16(t); // layer
swf_GetMatrix(t,NULL); // matrix
swf_GetCXForm(t,NULL,0);// CXForm
}
swf_SetButtonOffset(t,offsetpos);
while(anz_action)
{ U8 a;
offsetpos = swf_GetTagPos(t); // offset
swf_GetU16(t);
swf_GetU16(t); // condition
while (a=swf_GetU8(t)) // skip action records
{ if (a&0x80)
{ U16 l = swf_GetU16(t);
swf_GetBlock(t,NULL,l);
}
}
if (--anz_action) swf_SetButtonOffset(t,offsetpos);
}
swf_SetTagPos(t,oldTagPos);
}
return 0;
}
|