generates simple_viewer.swf.
[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     action_PushString("/:subtitle");
139     action_PushString("...");
140     action_SetVariable();
141     action_End();
142   swf_ActionEnd();
143
144   for(t=0;t<2;t++)
145   {
146       if(!useDefineButton2)
147       {
148           tag = swf_InsertTag(tag,ST_DEFINEBUTTON);
149           swf_SetU16(tag,30+t); //id
150           swf_ButtonSetRecord(tag,BS_UP|BS_HIT,32+t,1,NULL,NULL);
151           swf_ButtonSetRecord(tag,BS_OVER,34+t,1,NULL,NULL);
152           swf_ButtonSetRecord(tag,BS_DOWN,36+t,1,NULL,NULL);
153           swf_SetU8(tag,0); // end of button records
154          
155           if(t)
156             swf_ActionSet(tag,a2);
157           else
158             swf_ActionSet(tag,a1);
159       }
160       else
161       {
162           tag = swf_InsertTag(tag,ST_DEFINEBUTTON2);
163           swf_SetU16(tag,30+t); //id
164           swf_ButtonSetFlags(tag, 0); //menu=no
165           swf_ButtonSetRecord(tag,BS_UP|BS_HIT,32+t,1,NULL,NULL);
166           swf_ButtonSetRecord(tag,BS_OVER,34+t,1,NULL,NULL);
167           swf_ButtonSetRecord(tag,BS_DOWN,36+t,1,NULL,NULL);
168           swf_SetU8(tag,0); // end of button records
169
170           swf_ButtonSetCondition(tag, BC_OVERDOWN_OVERUP);
171           if(t)
172             swf_ActionSet(tag,a2);
173           else
174             swf_ActionSet(tag,a1);
175            
176           swf_ButtonPostProcess(tag, 1); // don't forget!
177       }
178   }
179
180   tag = swf_InsertTag(tag,ST_DOACTION);
181   swf_ActionSet(tag,a3);
182
183   m.tx = 0; //move
184   m.ty = 0;
185   tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
186   swf_ObjectPlace(tag, 30, 2,&m,0,0);
187   m.tx = button_sizex*30;
188   tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
189   swf_ObjectPlace(tag, 31, 3,&m,0,0);
190   
191   swf_ActionFree(a1);
192   swf_ActionFree(a2);
193   swf_ActionFree(a3);
194
195 #ifdef SUBTITLES
196   tag = swf_InsertTag(tag,ST_DEFINEFONT2); {
197       U8 data[] = {0x90, 0x00, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x73, 
198                    0x20, 0x4e, 0x65, 0x77, 0x20, 0x52, 0x6f, 0x6d, 
199                    0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
200                    0x00, 0x00, 0x00, 0x00};
201       swf_SetU16(tag, 0x76); //id
202       swf_SetBlock(tag, data, sizeof(data));
203   }
204   tag = swf_InsertTag(tag,ST_DEFINEEDITTEXT); {
205       EditTextLayout layout;
206       layout.align = 0;
207       layout.leftmargin = 0;
208       layout.rightmargin = 0;
209       layout.indent = 0;
210       layout.leading = 0;
211
212       swf_SetU16(tag, 0x77);//id
213       r.xmin = button_sizex*60;
214       r.xmax = r.xmin+ 826*20;
215       r.ymin = 0;
216       r.ymax = button_sizey*80;
217       rgb.r = rgb.g = rgb.b = 0;
218       rgb.a = 255;
219       swf_SetEditText(tag, ET_MULTILINE|ET_READONLY, r, 0, &rgb, 0, 0x76, button_sizey*40, &layout, "/:subtitle");
220       m.tx = m.ty = 0;
221   }
222   tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
223   swf_ObjectPlace(tag, 0x77, 4,&m,0,0);
224 #endif
225
226   tag = swf_InsertTag(tag,ST_SHOWFRAME);
227   tag = swf_InsertTag(tag,ST_END);
228   
229
230   f = open("simple_viewer.swf",O_WRONLY|O_CREAT|O_TRUNC, 0644);
231   if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n");
232   close(f);
233
234   swf_FreeTags(&swf);                       // cleanup
235   return 0;
236 }
237
238