created from simple_viewer.c
[swftools.git] / swfs / simple_viewer.c
1 /* simple_viewer.c
2
3    Creates the swf file simple_viewer.swf. 
4    I'm not much of an designer. Suggestions and improvements concerning
5    this file or simple_viewer.swf are highly welcome. -mk
6    
7    Part of the swftools package.
8
9    Copyright (c) 2000, 2001 Matthias Kramm <kramm@quiss.org>
10  
11    This file is distributed under the GPL, see file COPYING for details 
12 */
13
14 #include <stdio.h>
15 #include <fcntl.h>
16 #include <math.h>
17 #include "rfxswf.h"
18
19 TAG* tag;
20
21 int button_sizex = 20; //button size in pixels
22 int button_sizey = 20; 
23
24 RGBA button_colors[6]=
25 {{0,0x00,0x00,0x80}, //Idle      left
26  {0,0x00,0x00,0x80}, //   "      right
27  {0,0x20,0x20,0xc0}, //MouseOver left
28  {0,0x20,0x20,0xc0}, //   "      right
29  {0,0x10,0x10,0xff}, //Down      left
30  {0,0x10,0x10,0xff}};//   "      right
31
32 int useDefineButton2 = 0; // set this to 1 to use DefineButton2 Tags
33                           // instead of DefineButton1
34 #define SUBTITLES 1
35
36 int main (int argc,char ** argv)
37 { SWF swf;
38   RGBA rgb;
39   SRECT r;
40   LPSHAPE s;
41   MATRIX m;
42   ActionTAG*a1,*a2,*a3;
43   S32 width=1024,height = 768;
44   
45   int f,i,ls1,fs1;
46   int count;
47   int t;
48
49   memset(&swf,0x00,sizeof(SWF));        // set global movie parameters
50
51   swf.fileVersion    = 4;               // make flash 4 compatible swf
52   swf.frameRate      = 0x1900;          // about 0x19 frames per second
53   
54   swf.movieSize.xmax = 20*width;        // flash units: 1 pixel = 20 units
55   swf.movieSize.ymax = 20*height;
56
57   swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR);
58   tag = swf.firstTag;
59   rgb.r = 0xff;
60   rgb.g = 0xff;
61   rgb.b = 0xff;
62   swf_SetRGB(tag,&rgb);
63  
64   // initialize matrix
65   m.sx = 65536; //scale
66   m.sy = 65536;
67   m.r0 = 0; //rotate
68   m.r1 = 0;
69   m.tx = 0; //move
70   m.ty = 0;
71
72   /* the "viewport" object will be replaced by swfcombine
73      with the object to browse. It is placed at the
74      upper left corner (0,0), by setting m.tx and m.ty
75      to 0. Therefore, the buttons are "in" the viewport,
76      not above it*/
77   tag = swf_InsertTag(tag,ST_DEFINESPRITE);
78   swf_SetU16(tag, 23); //id
79   swf_SetU16(tag, 0); //frames
80   tag = swf_InsertTag(tag,ST_END);
81   tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
82   m.tx = 0; //move
83   m.ty = 0;
84   swf_ObjectPlace(tag, 23, 1,&m,0,"viewport");
85
86   for(count=0;count<6;count++)
87   {
88       tag = swf_InsertTag(tag,ST_DEFINESHAPE);
89       swf_ShapeNew(&s);               // create new shape instance
90       rgb.r = rgb.b = rgb.g = 0x00;           
91       ls1 = swf_ShapeAddLineStyle(s,40,&rgb);
92       rgb = button_colors[count];
93       fs1 = swf_ShapeAddSolidFillStyle(s,&rgb);
94       swf_SetU16(tag,32+count);                // now set character ID
95       r.xmin = 0;
96       r.ymin = 0;
97       r.xmax = 20*width;
98       r.ymax = 20*height;
99       swf_SetRect(tag,&r);              // set shape bounds
100       swf_SetShapeHeader(tag,s);        // write all styles to tag
101       if(count&1)
102       {
103           swf_ShapeSetAll(tag,s,0,0,ls1,fs1,0); // move to (0,0), select linestyle ls1 and no fillstyle
104           /* SetLine coordinates are relative.
105              It's important that the start and end points match, otherwise
106              the Macromedia Flash player will crash. */
107           swf_ShapeSetLine(tag,s,20*button_sizex,20*button_sizey);
108           swf_ShapeSetLine(tag,s,-20*button_sizex,20*button_sizey);
109           swf_ShapeSetLine(tag,s,0,-40*button_sizey);
110       } else {
111           swf_ShapeSetAll(tag,s,20*button_sizex,0,ls1,fs1,0);
112           swf_ShapeSetLine(tag,s,-20*button_sizex,20*button_sizey);
113           swf_ShapeSetLine(tag,s,20*button_sizex,20*button_sizey);
114           swf_ShapeSetLine(tag,s,0,-40*button_sizey);
115       }
116       swf_ShapeSetEnd(tag);   // finish drawing
117       swf_ShapeFree(s);   // clean shape structure (which isn't needed anymore after writing the tag)
118   }
119
120   a1 = swf_ActionStart(tag);
121     action_SetTarget("viewport");
122     action_PreviousFrame();
123     action_SetTarget("");
124     action_End();
125   swf_ActionEnd();
126
127   a2 = swf_ActionStart(tag);
128     action_SetTarget("viewport");
129     action_NextFrame();
130     action_SetTarget("");
131     action_End();
132   swf_ActionEnd();
133
134   a3 = swf_ActionStart(tag);
135     action_SetTarget("viewport");
136     action_Stop();
137     action_SetTarget("");
138 #ifdef SUBTITLES
139     action_PushString("/:subtitle");
140     action_PushString(""); //reset variable
141     action_SetVariable();
142 #endif
143     action_End();
144   swf_ActionEnd();
145
146   for(t=0;t<2;t++)
147   {
148       if(!useDefineButton2)
149       {
150           tag = swf_InsertTag(tag,ST_DEFINEBUTTON);
151           swf_SetU16(tag,30+t); //id
152           swf_ButtonSetRecord(tag,BS_UP|BS_HIT,32+t,1,NULL,NULL);
153           swf_ButtonSetRecord(tag,BS_OVER,34+t,1,NULL,NULL);
154           swf_ButtonSetRecord(tag,BS_DOWN,36+t,1,NULL,NULL);
155           swf_SetU8(tag,0); // end of button records
156          
157           if(t)
158             swf_ActionSet(tag,a2);
159           else
160             swf_ActionSet(tag,a1);
161       }
162       else
163       {
164           tag = swf_InsertTag(tag,ST_DEFINEBUTTON2);
165           swf_SetU16(tag,30+t); //id
166           swf_ButtonSetFlags(tag, 0); //menu=no
167           swf_ButtonSetRecord(tag,BS_UP|BS_HIT,32+t,1,NULL,NULL);
168           swf_ButtonSetRecord(tag,BS_OVER,34+t,1,NULL,NULL);
169           swf_ButtonSetRecord(tag,BS_DOWN,36+t,1,NULL,NULL);
170           swf_SetU8(tag,0); // end of button records
171
172           swf_ButtonSetCondition(tag, BC_OVERDOWN_OVERUP);
173           if(t)
174             swf_ActionSet(tag,a2);
175           else
176             swf_ActionSet(tag,a1);
177            
178           swf_ButtonPostProcess(tag, 1); // don't forget!
179       }
180   }
181
182   tag = swf_InsertTag(tag,ST_DOACTION);
183   swf_ActionSet(tag,a3);
184
185   m.tx = 0; //move
186   m.ty = 0;
187   tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
188   swf_ObjectPlace(tag, 30, 2,&m,0,0);
189   m.tx = button_sizex*30;
190   tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
191   swf_ObjectPlace(tag, 31, 3,&m,0,0);
192   
193   swf_ActionFree(a1);
194   swf_ActionFree(a2);
195   swf_ActionFree(a3);
196
197 #ifdef SUBTITLES
198   tag = swf_InsertTag(tag,ST_DEFINEFONT2); {
199       U8 data[] = {0x90, 0x00, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x73, 
200                    0x20, 0x4e, 0x65, 0x77, 0x20, 0x52, 0x6f, 0x6d, 
201                    0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
202                    0x00, 0x00, 0x00, 0x00};
203       swf_SetU16(tag, 0x76); //id
204       swf_SetBlock(tag, data, sizeof(data));
205   }
206   tag = swf_InsertTag(tag,ST_DEFINEEDITTEXT); {
207       EditTextLayout layout;
208       layout.align = 0;
209       layout.leftmargin = 0;
210       layout.rightmargin = 0;
211       layout.indent = 0;
212       layout.leading = 0;
213
214       swf_SetU16(tag, 0x77);//id
215       r.xmin = button_sizex*60;
216       r.xmax = r.xmin+ 826*20;
217       r.ymin = 0;
218       r.ymax = button_sizey*80;
219       rgb.r = rgb.g = rgb.b = 0;
220       rgb.a = 255;
221       swf_SetEditText(tag, ET_MULTILINE|ET_READONLY, r, 0, &rgb, 0, 0x76, button_sizey*40, &layout, "/:subtitle");
222       m.tx = m.ty = 0;
223   }
224   tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
225   swf_ObjectPlace(tag, 0x77, 4,&m,0,0);
226 #endif
227
228   tag = swf_InsertTag(tag,ST_SHOWFRAME);
229   tag = swf_InsertTag(tag,ST_END);
230   
231
232   f = open("simple_viewer.swf",O_WRONLY|O_CREAT|O_TRUNC, 0644);
233   if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n");
234   close(f);
235
236   swf_FreeTags(&swf);                       // cleanup
237   return 0;
238 }
239
240