brought up to date.
[swftools.git] / doc / fileformat.sc
1 # ===========================================================================
2 #
3 # swfc(1) File format specification
4 #
5 # Warning: not all of this is actually implemented yet- if there's a
6 # "TODO" behind a command, it has yet to be integrated into swfc.
7 #
8 # ===========================================================================
9
10 # File header
11 # -----------
12
13 .flash bbox=200x200 version=6 fps=50 name="spec.swf" compress
14
15 # bbox=200x200         : set bounding box to 200x200
16 # bbox=200x200:100:100 : set bounding box to (100,100)-(300,300)
17 # bbox=autocrop        : (default) - make bbox just big enough so that nothing ever get's clipped
18 #
19 # all coordinates are in pixels, not in twips. fixed point values like 1.25, 333.40 are allowed.
20 #
21 # version=6    : generate flash mx movie
22 # fps=50       : set framerate to 50 frames/second
23 # name="..."   : save result to spec.flash. (Default: input file with extension 
24 #                                          changed to .flash, or the value of the -o command line 
25 #                                          parameter if given)
26
27 # inherit swf movies:
28 # ---------------------
29
30 .swf mymovie1 "choo1.swf"
31 .swf mymovie2 filename="choo1.swf" # long form
32 .swf mymovie3 filename=choo1.swf # long form, without quotes
33 .swf mymovie4 choo1.swf # short form, without quotes
34
35 # Notice: An embedded animation can't have a different framerate than
36 # the frame rate from the surrounding animation.
37
38 #TODO: Those files currently come from the current directory- they should come from the script directory.
39
40 # load an image:
41 # --------------
42
43 .jpeg background "panorama.jpg"
44 .jpeg background2 "panorama.jpg" quality=30% #reduces jpeg quality
45
46 .png background3 "choochoo.png" #TODO
47
48 # (you can put this directly (generating a shape), or insert it into a shape via the fill= argument
49
50 # define a texture from an image:
51 # -------------------------------
52
53 .texture text1=background scale=50% rotate=45
54
55 # define a gradient
56 # -----------------
57
58 .gradient mygradient:
59     0% red
60     50% green
61     75% aquamarine
62     100% #ffffff
63 .end
64
65 # with a hard edge:
66
67 .gradient mygradient:
68     0% red
69     50% green
70     50% red
71     75% aquamarine
72     100% #ffffff
73 .end
74
75 # with alpha:
76
77 .gradient mygradient:
78     0%   #00000000
79     50%  #0000ff40
80     75%  #0000ff80
81     100% #0000ffc0
82 .end
83
84 # define a texture from a gradient:
85 # ---------------------------------
86
87 .texture grad2=mygradient x=0 y=0 width=125 height=200 rotate=45
88
89 # Create simple objects:
90 # ----------------------
91
92 .box mybox1 width=100 height=50 color=black fill=none #unfilled rectangle (just the lines)
93 .box mybox2 width=100 height=50 color=black           #same as above
94 .box mybox3 width=100 height=50 color=black fill      #filled black rectangle
95 .box mybox4 width=100 height=50 color=red line=2 fill=blue #blue rectangle with red edges
96 .box mybox5 width=100 height=50 color=red line=2 fill=background #filled with image "background", with red edges
97
98 .circle mycircle1 r=50 color=#aa33ff fill=mygradient # filled with gradient (defined above)
99 .circle mycircle1 r=50 color=#aa33ff fill=grad2      # filled with gradient texture
100
101 # Sounds:
102 # -------
103
104 .sound sound1 "LocoStart.wav"
105
106 .frame 16
107     .play sound1 loop=1 #other arguments supported: nomultiple (don't start if already playing)
108 .frame 55
109     .stop sound1
110
111 .frame 66
112     # this starts a synchronized soundtrack at this frame position. The command
113     # expects a filename, not a sound object, as it would be duplicating the
114     # sound object otherwise, and I'd rather have that done explicitly.
115     .soundtrack "LocoStart.wav" # TODO
116
117 # Elements of the movie should be animated by various means 
118 # moving (x,y and zoom) 
119 # ---------------------
120
121 .box obj1 width=200.0 height=100.0
122
123 .frame 100
124     .put obj1 x=0 y=0 #object starts at (0,0)
125
126 .frame 140
127     .change obj1 x+=100 y=0 scale=120% # smoothly move obj1 100 pixels to the right over 40 frames,
128                                        # scaling it to 120% of it's original size
129 .frame 170
130     .jump obj1 x=200 y=200 # make object to suddenly change to 200,200 at frame 70.
131
132 .frame 190
133     .qchange obj1 x=300 y=200 # TODO # make obj1 move towards 300,200...
134 .frame 210
135     .qchange obj1 x=300 y=300 # TODO # ... and then smoothly over to 300,300 using bspline interpolation
136
137 #.frame 220   #TODO
138 #    .jump obj1 x=reset y=reset
139
140 .frame 230
141     .del obj1   #Remove object again
142
143 # morphing
144 # --------
145
146 .morphshape morphthing start="start.fig" end="end.fig" #TODO
147 .frame 250
148     .put morphthing ratio=0%
149 .frame 270
150     .change morphthing ratio=100%
151
152 # interpolation between crude manual animation frames
153 # ---------------------------------------------------
154
155 .circle ball r=50 color=blue fill=violet
156
157 # now draw two balls, which fly around each other.
158
159 .frame 300
160 .put myball1=ball x=0 y=100 blue=0
161 .put myball2=ball x=100 y=100 red=0
162
163 .frame 310
164 # the .qchange means, "interpolate to this position and frame, using quadratic splines".
165          .qchange myball1 x=50 y=0 #TODO
166          .qchange myball2 x=50 y=100 #TODO
167
168 .frame 320
169 # We could also use coordinates relative to start position: .change myball1 x+=100 y+=0
170          .qchange myball1 x=100 y=100 #TODO
171          .qchange myball2 x=0 y=100 #TODO
172
173 .frame 330
174          .qchange myball1 x=50 y=100 #TODO
175          .qchange myball2 x=50 y=0 #TODO
176  
177 .frame 340
178 # Hmmm. This frame is the same as frame 0. How to prevent duplicating that one?
179          .qchange myball1 x=0 y=100 #TODO
180          .qchange myball2 x=100 y=100 #TODO
181
182 # color transforms (fading)
183 # -------------------------
184
185 # .put, .change, .qchange, .jump all support params which result in color transform.
186 # Everything up to the + is multiplicated, the rest summed.
187
188 .put obj1 blue=50% #(scale blue color component to 50%)
189 .change obj1 blue=128 #(same as above)
190 .change obj1 red=+25% #(shift blue color component by 25%)
191 .change obj1 red=+64 #(same as above)
192 .change obj1 green=50%+50% #(scale green color component to 50% and then shift it by 50%)
193 .change obj1 green=128+128 #(same as above)
194 .change obj1 green=-1+255 #(invert green color component)
195 .change obj1 green=2-128  #(reduce spectrum for green to the upper 50%)
196 .change obj1 luminance=50% #(fade all color components 50% to black, same as red=50% green=50% blue=50%)
197 .change obj1 alpha=50% #(make object 50% transparent)
198
199 # scaling
200 # -------
201
202 .change obj1 scale=50%   # change an object to 50% of it's size
203 .change obj1 scaley=50%  # flatten object to 50% of it's height
204 .change obj1 scaley=110% scalex=75% #(funhouse mirror!)
205
206 # rotating
207 # --------
208
209 .change obj1 rotate=45  # tilt object, counterclockwise
210
211 # shearing
212 # --------
213
214 .change obj1 shear=100%  # shear object
215
216 # sprites (a.k.a. movieClips)
217 # -------
218
219 .sprite spr1
220     .frame 1    .put ball1=ball 0 0
221     .frame 2    .change ball1 100 100
222 .end
223
224 .sprite spr2
225     .frame 1    .put ball2=ball 100 0
226     .frame 7    .change ball2 0 100
227 .end
228
229 .frame 400
230     .put spr1
231     .put spr2
232
233 # so spr1 has three frames, spr2 has seven. The whole animation loops after 21 frames.
234
235 # multi-level nesting: (sprites can be nested to any depth)
236
237 .sprite mspr1
238     .sprite mspr2
239         .sprite spr3
240         .put ball 100 0
241         .end
242     .end
243 .end
244
245 # clipping an animation inside a star-shaped sprite:
246
247 .swf mystar1 "star.swf"
248 .swf anim1 "penguins.swf"
249
250 .sprite cspr1
251     .startclip mystar1
252         .put anim1
253     .end
254 .end
255 .frame 401
256     .put cspr1 rotate=0
257 .frame 402
258     .change cspr1 rotate=360
259
260 # buttons
261 # -------
262
263 .png play "Play.png" #TODO
264 .png play_pressed "Play_pressed.png" #TODO
265 .png stoplogo "Stop.png" #TODO
266
267 .button playbutton
268     .show play as=idle
269     .show play as=area
270     .show play_pressed as=pressed
271     .show play_pressed as=hower
272 .end
273
274 .button playbutton2
275     .show play as=idle
276     .on_press inside
277     .on_release inside
278     .on_release outside
279     .on_move_in pressed
280     .on_move_out pressed
281     .on_move_in
282     .on_move_out
283     .on_key "a":
284         # actionscript...
285     .end
286 .end
287
288 .button mybutton
289     .show play as=idle
290     .show obj1 x=300 y=400 scale=110% pivot=center 
291          as=pressed
292 .end
293
294 .box blueshape 10 10
295 .box greenshape 10 10
296 .box whiteshape 10 10
297 .box activearea 10 10
298 .box emtpyshape 10 10
299 .box window1 10 10
300 # button which is blue, get's green when the mouse hovers over it, and
301 # white when it is pressed:
302 .button b1
303     .show blueshape as=idle
304     .show greenshape as=hower
305     .show whiteshape as=press
306 .end
307
308 # button where the button position is not identical to the active area:
309 .button b2
310     .show activearea as=area
311     .show blueshape as=idle
312     .show greenshape as=hower
313     .show whiteshape as=press
314 .end
315
316 # (if area is not set, it's the same as shape)
317
318 # the above put into use: pop up a window if the mouse cursor enters a certain
319 # area:
320 .button b3
321     .show activearea as=area
322     .show emtpyshape as=idle
323     .show window1 as=hower
324 .end
325
326 # fonts
327 # -----
328 .font font1 "myfont.swf"
329 .font font1 "myfont.ttf"
330 .font font1 "myfont.pfa"
331
332 # text fields
333 # -----------
334 .text mytext1 font=font1 text="I am a happy little scroll message" color=blue size=100%
335
336 # edittext
337 # --------
338 #(field where the flash animation can get input from the user)
339
340 .font helvetica "helvetica-bold.swf"
341 .edittext edittext1 text="Type something here" color=blue maxlength=200 font=helvetica size=24 width=320 height=200 #TODO
342 # width/height: dimensions of the box
343 # text: The text which appears initally in the box, and can be overwritten by the user
344 # maxlength: max. length of the text the user can type
345 # color/font/size: Font appeareance
346 # variable: Name of the actionscript variable the text is stored in
347 # The following boolean options are also supported:
348 # password (show input only as stars), wordwrap, multiline, html, noselect, readonly
349
350 # actionscript
351 # ------------
352
353 .action:
354     _root.play();
355 .end
356
357 # depth control
358 # -------------------
359 # .put, .change, .qchange, .jump, .startclip take before and after parameters,
360 # which can be used to specify the depth of an object
361
362 .put o1=obj1 #TODO
363 .put o2=obj1 below=o1 x=50 #TODO
364 .frame
365 .change o1 #TODO
366 .change o2 above=o1 x=50 #TODO
367
368 # newline conventions
369 # -------------------
370
371 # All Newlines are treated as normal whitespace. Therefore, splitting
372 # commands over several lines, like
373 .put obj2=obj1 x=300
374              y=300
375              red=100%
376              green=50%
377              blue=50%
378 # is allowed.
379
380 # Furthermore, having more than one command in one line is also possible:
381
382 .frame 600  .change obj1 x+=700  .change obj2 x+=300
383 .frame 601  .change obj1 x+=500  .change obj2 x+=500
384 .frame 602  .change obj1 x+=300  .change obj2 x+=700
385
386 .end # end of first file
387