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