Initial revision
[swftools.git] / lib / example / texbox_ac.c
1 \r
2 // linux/gcc: cc texbox_ac.c ../rfxswf.c -funsigned-char -o texbox -lmingac -lm -ljpeg; cp texbox /home/www/cgi-bin/texbox\r
3 \r
4 #include <stdio.h>\r
5 #include <fcntl.h>\r
6 #include <math.h>\r
7 #include "../rfxswf.h"\r
8 #include "../mingac.h"  // Action Compiler of MING library\r
9 \r
10 // Box\r
11 \r
12 #define BANNER_TEXT     "reflex"\r
13 #define QUALITY 80\r
14 #define ID_FONT         2000\r
15 #define ID_BANNER       2001\r
16 #define ID_HIGHLIGHT    2002\r
17 #define ID_BUTTON       2003\r
18 #define ID_BITMAP       2004\r
19 #define ID_SHAPE        2005\r
20 #define ID_SHAPE2       2006\r
21 \r
22 #define a 200\r
23 int sX[] = { a,-a, a,-a, a,-a, a,-a};\r
24 int sY[] = { a, a,-a,-a, a, a,-a,-a};\r
25 int sZ[] = { a, a, a, a,-a,-a,-a,-a};\r
26 #undef a\r
27 \r
28 #define PRECISION 16\r
29 \r
30 int SHADE = 1;\r
31 \r
32 int dX[8];\r
33 int dY[8];\r
34 int square_visible[6]  = {0,0,0,0,0,0};\r
35 int square_depth[6][2] = {{2,3},{4,5},{6,7},{8,9},{10,11},{12,13}};\r
36 int square_light[6]    = {0,0,64,64,-64,-64};\r
37 \r
38 int sin_[512],cos_[512];\r
39 \r
40 void calcTables()       \r
41 { int i;\r
42   double d;\r
43   for (i=0;i<512;i++)\r
44   { d = ((double)i)/128*3.14159;\r
45     sin_[i] = (int)(sin(d)*(1<<PRECISION));\r
46     cos_[i] = (int)(cos(d)*(1<<PRECISION));\r
47   }\r
48 }\r
49 \r
50 LPTAG MapSquare(LPTAG t,int dx0,int dy0,int p1,int p2,int p3,int p4,int dx,int dy,int square)\r
51 { MATRIX m;\r
52   CXFORM cx;\r
53 \r
54   if (SHADE)\r
55   { GetCXForm(NULL,&cx,1);\r
56     cx.r1 = cx.b1 = cx.g1 = square_light[square];\r
57   }\r
58         \r
59   if (((dX[p2]-dX[p1])*(dY[p3]-dY[p1])-(dX[p3]-dX[p1])*(dY[p2]-dY[p1]))<0) \r
60   { if (square_visible[square])\r
61     { t = InsertTag(t,ST_REMOVEOBJECT2); SetU16(t,square_depth[square][0]);\r
62       t = InsertTag(t,ST_REMOVEOBJECT2); SetU16(t,square_depth[square][1]);\r
63     }\r
64     square_visible[square] = 0;\r
65     return t; \r
66   }\r
67 \r
68   t = InsertTag(t,ST_PLACEOBJECT2);\r
69   \r
70   MatrixMapTriangle(&m,dx0,dy0,dX[p1]+dx,dY[p1]+dy,\r
71                         dX[p2]+dx,dY[p2]+dy,\r
72                  dX[p4]+dx,dY[p4]+dy);\r
73 \r
74   if (!square_visible[square])\r
75     ObjectPlace(t,ID_SHAPE,square_depth[square][0],&m,SHADE?&cx:NULL,NULL);\r
76   else\r
77     ObjectMove(t,square_depth[square][0],&m,SHADE?&cx:NULL);\r
78 \r
79   t = InsertTag(t,ST_PLACEOBJECT2);\r
80   \r
81   MatrixMapTriangle(&m,dx0,dy0,dX[p3]+dx,dY[p3]+dy,\r
82                         dX[p4]+dx,dY[p4]+dy,\r
83                  dX[p2]+dx,dY[p2]+dy);\r
84 \r
85   if (!square_visible[square])\r
86     ObjectPlace(t,ID_SHAPE2,square_depth[square][1],&m,SHADE?&cx:NULL,NULL);\r
87   else\r
88     ObjectMove(t,square_depth[square][1],&m,SHADE?&cx:NULL);\r
89 \r
90   square_visible[square] = 1;\r
91  \r
92   return t;\r
93 }\r
94 \r
95 void mapBox(int xw,int yw,int zw)\r
96 { int i;\r
97   int x1,y1,z1,x2,y2,z2,x3,y3,z3;\r
98   int y,x,z;\r
99   \r
100   xw &= 255;\r
101   yw &= 255;\r
102   zw &= 255;\r
103 \r
104   for (i=0;i<8;i++)\r
105   { x = sX[i];\r
106     y = sY[i];\r
107     z = sZ[i];\r
108                   \r
109     y1 = ( y*cos_[xw]- z*sin_[xw])>>PRECISION;\r
110     z1 = ( y*sin_[xw]+ z*cos_[xw])>>PRECISION;\r
111     x1 = x;\r
112 \r
113     x2 = (x1*cos_[yw]+z1*sin_[yw])>>PRECISION;\r
114     y2 = y1;\r
115 \r
116     x3 = (x2*cos_[zw]-y2*sin_[zw])>>PRECISION;\r
117     y3 = (x2*sin_[zw]+y2*cos_[zw])>>PRECISION;\r
118     z3 = (z1*cos_[yw]-x1*sin_[yw])>>PRECISION;\r
119 \r
120     dX[i] = x3*4000/(z3+950);\r
121     dY[i] = y3*4000/(z3+950);\r
122         \r
123   }\r
124 }\r
125 \r
126 void mapLights(int xw,int yw,int zw)\r
127 { int i;\r
128   int x1,y1,z1,x2,y2,z2,x3,y3,z3;\r
129 \r
130   int y[] = {0,0,0,0,256,-256};\r
131   int x[] = {0,0,256,-256,0,0};\r
132   int z[] = {256,-256,0,0,0,0};\r
133 \r
134   int lz = 256; // lightvector\r
135   int lx = 200, ly = 200;\r
136 \r
137   for (i=0;i<6;i++)\r
138   { y1 = (y[i]*cos_[xw]-z[i]*sin_[xw])>>PRECISION;\r
139     z1 = (y[i]*sin_[xw]+z[i]*cos_[xw])>>PRECISION;\r
140     x1 = x[i];\r
141 \r
142     x2 = (x1*cos_[yw]+z1*sin_[yw])>>PRECISION;\r
143     y2 = y1;\r
144     z2 = (z1*cos_[yw]-x1*sin_[yw])>>PRECISION;\r
145 \r
146     x3 = (x2*cos_[zw]-y2*sin_[zw])>>PRECISION;\r
147     y3 = (x2*sin_[zw]+y2*cos_[zw])>>PRECISION;\r
148     z3 = z2;\r
149 \r
150     square_light[i] = -128-((x3*lx + y3*ly + z3*lz)>>9);\r
151   }\r
152 }\r
153 \r
154 \r
155 int main (int argc,char ** argv)\r
156 { SWF swf;\r
157   LPTAG t;\r
158   RGBA rgb;\r
159   SRECT r;\r
160   LPSHAPE s;\r
161   S32 width = 800,height = 800;\r
162   U8 gbits,abits;\r
163   int fs,ls; // line & fillstyle\r
164   LPSWFFONT font;\r
165   FONTUSAGE use;\r
166   LPJPEGBITS jpeg;\r
167   MATRIX m;  \r
168   \r
169   int f,i,j,frame;\r
170   \r
171   InitCompiler(AC_DEFAULT);\r
172   \r
173   f = open("Arial.efont",O_RDONLY);\r
174   if (f>=0)\r
175   { if (FAILED(FontImport(f,&font)))\r
176     { fprintf(stderr,"Font import failed\n");\r
177       close(f);\r
178       return -1;\r
179     }\r
180   }\r
181   else\r
182   { fprintf(stderr,"Font not found\n");\r
183     return -1;\r
184   }\r
185   close(f);\r
186 \r
187   FontSetID(font,ID_FONT);\r
188   FontInitUsage(&use);\r
189   FontUse(&use,BANNER_TEXT);\r
190   FontReduce(font,&use);\r
191   \r
192   calcTables();\r
193   \r
194   memset(&swf,0x00,sizeof(SWF));\r
195 \r
196   swf.FileVersion    = 4;\r
197   swf.FrameRate      = 0x4000;\r
198   swf.MovieSize.xmax = 4*width;\r
199   swf.MovieSize.ymax = 4*height;\r
200 \r
201   swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR);\r
202   t = swf.FirstTag;\r
203 \r
204         rgb.r = 0xff;\r
205         rgb.g = 0xff;\r
206         rgb.b = 0xff;\r
207         SetRGB(t,&rgb);\r
208 \r
209   t = InsertTag(t,ST_DEFINEFONT);\r
210 \r
211         FontSetDefine(t,font);\r
212 \r
213   t = InsertTag(t,ST_DEFINEFONTINFO);\r
214 \r
215         FontSetInfo(t,font);\r
216 \r
217   t = InsertTag(t,ST_DEFINETEXT);\r
218 \r
219         SetU16(t,ID_BANNER);            // ID\r
220         \r
221         r.xmin = 0;\r
222         r.ymin = 0;\r
223         r.xmax = 400;\r
224         r.ymax = 400;\r
225         SetRect(t,&r);\r
226 \r
227         SetMatrix(t,NULL);\r
228 \r
229         TextCountBits(font,BANNER_TEXT,80,&gbits,&abits);\r
230         \r
231         SetU8(t,gbits);\r
232         SetU8(t,abits);\r
233 \r
234         rgb.r = 0xc0;\r
235         rgb.g = 0xc0;\r
236         rgb.b = 0xc0;\r
237 \r
238         TextSetInfoRecord(t,font,height/4,&rgb,0,200);\r
239         TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits);\r
240 \r
241         SetU8(t,0);\r
242         \r
243   t = InsertTag(t,ST_DEFINETEXT);\r
244 \r
245         SetU16(t,ID_HIGHLIGHT);            // ID\r
246         \r
247         r.xmin = 0; r.ymin = 0; r.xmax = 800; r.ymax = 400;\r
248         SetRect(t,&r);\r
249 \r
250         SetMatrix(t,NULL);\r
251         TextCountBits(font,BANNER_TEXT,80,&gbits,&abits);\r
252         \r
253         SetU8(t,gbits);\r
254         SetU8(t,abits);\r
255 \r
256         rgb.r = 0x20;\r
257         rgb.g = 0x20;\r
258         rgb.b = 0x20;\r
259 \r
260         TextSetInfoRecord(t,font,height/4,&rgb,0,200);\r
261         TextSetCharRecord(t,font,BANNER_TEXT,80,gbits,abits);\r
262 \r
263         SetU8(t,0);\r
264         \r
265     t = InsertTag(t,ST_DEFINEBUTTON);\r
266     \r
267         GetMatrix(NULL,&m);\r
268         \r
269         m.tx = 3*width;\r
270         m.ty = 7*height/2;\r
271         \r
272         SetU16(t,ID_BUTTON); // ID\r
273         ButtonSetRecord(t,BS_UP,ID_BANNER,1,&m,NULL);\r
274         ButtonSetRecord(t,BS_DOWN|BS_HIT|BS_OVER,ID_HIGHLIGHT,1,&m,NULL);\r
275         SetU8(t,0); // End of Button Records\r
276         \r
277         ActionCompile(t,"if (status==1) { status = 0; stop();} else { status=1; play();}");\r
278     \r
279       \r
280     t = InsertTag(t,ST_PLACEOBJECT2);\r
281 \r
282          ObjectPlace(t,ID_BUTTON,1,NULL,NULL,NULL);\r
283 \r
284     t = InsertTag(t,ST_DEFINEBITSJPEG2);\r
285 \r
286          SetU16(t,ID_BITMAP);\r
287          SetJPEGBits(t,"eye.jpg",QUALITY);\r
288          \r
289     t = InsertTag(t,ST_DEFINESHAPE);\r
290     \r
291          NewShape(&s);\r
292          rgb.b = rgb.g = rgb.r = 0x00;\r
293          ls = ShapeAddLineStyle(s,10,&rgb);     \r
294          rgb.b = 0xff;\r
295 \r
296          m.tx = m.ty = 0;\r
297          m.r0 = m.r1 = 0;\r
298          m.sx = m.sy = width<<8;\r
299   \r
300          fs = ShapeAddBitmapFillStyle(s,&m,ID_BITMAP,0);\r
301     \r
302          SetU16(t,ID_SHAPE);    // ID   \r
303          \r
304          r.xmin = 0; r.ymin = 0;\r
305          r.xmax = 2*width; r.ymax = 2*height;\r
306          SetRect(t,&r);\r
307 \r
308          SetShapeHeader(t,s);\r
309          ShapeSetAll(t,s,width,0,0,fs,0);\r
310          ShapeSetLine(t,s,-width,height);\r
311          ShapeSetStyle(t,s,ls,fs,0);\r
312          ShapeSetLine(t,s,0,-height);\r
313          ShapeSetLine(t,s,width,0);\r
314          ShapeSetEnd(t);\r
315 \r
316          ShapeFree(s);\r
317          \r
318     t = InsertTag(t,ST_DEFINESHAPE);\r
319     \r
320          NewShape(&s);\r
321          rgb.b = rgb.g = rgb.r = 0x00;\r
322          ls = ShapeAddLineStyle(s,10,&rgb);     \r
323          rgb.b = 0xff;\r
324 \r
325          m.tx = m.ty = 0;\r
326          m.r0 = m.r1 = 0;\r
327          m.sx = m.sy = -(width<<8);\r
328   \r
329          fs = ShapeAddBitmapFillStyle(s,&m,ID_BITMAP,0);\r
330     \r
331          SetU16(t,ID_SHAPE2);   // ID   \r
332          \r
333          r.xmin = 0; r.ymin = 0;\r
334          r.xmax = 2*width; r.ymax = 2*height;\r
335          SetRect(t,&r);\r
336 \r
337          SetShapeHeader(t,s);\r
338          ShapeSetAll(t,s,width,0,0,fs,0);\r
339          ShapeSetLine(t,s,-width,height);\r
340          ShapeSetStyle(t,s,ls,fs,0);\r
341          ShapeSetLine(t,s,0,-height);\r
342          ShapeSetLine(t,s,width,0);\r
343          ShapeSetEnd(t);\r
344 \r
345          ShapeFree(s);\r
346    \r
347   for (frame=0;frame<256;frame++)\r
348   { int dc = 3; // whitespace correction\r
349 \r
350     mapBox(frame<<1,frame<<1,frame);\r
351     if (SHADE) mapLights(frame<<1,frame<<1,frame);\r
352     \r
353     t = MapSquare(t,width-dc,height-dc,0,2,3,1,2*width,2*height,0);\r
354     t = MapSquare(t,width-dc,height-dc,4,5,7,6,2*width,2*height,1);\r
355     t = MapSquare(t,width-dc,height-dc,0,4,6,2,2*width,2*height,2);\r
356     t = MapSquare(t,width-dc,height-dc,1,3,7,5,2*width,2*height,3);\r
357     t = MapSquare(t,width-dc,height-dc,0,1,5,4,2*width,2*height,4);\r
358     t = MapSquare(t,width-dc,height-dc,2,6,7,3,2*width,2*height,5);\r
359         \r
360     t = InsertTag(t,ST_SHOWFRAME);\r
361   }\r
362   /*\r
363     t = InsertTag(t,ST_DOACTION);\r
364 \r
365       ActionCompile(t,"stop();");\r
366     */  \r
367     t = InsertTag(t,ST_END);\r
368   \r
369   WriteCGI(&swf);\r
370   FreeTags(&swf);\r
371   return 0;\r
372 }\r
373 \r
374 \r