4 <title>SWFC Manual</title>
7 swfc is a tool for generating flash files. You can write small simple scripts
8 and then have them compiled to SWF Flash Animations.
14 This comment aims to give a short overview over the tags defined in guide.xslt.
17 Markups and Highlights:
23 <f>filename or pathname</f>
24 <c>variable name, command</c> ("c" stands for "code")
38 <a>http://www.quiss.org</a> OR
39 <a href=http://www.quiss.org>Quiss</a>
41 Shell scripts, commands to execute:
43 <shell>tail /var/log/messages</shell>
47 <code lang="sc"> (The lang= is optional)
56 <tr><td>Apples</td><td>Pears</td></tr>
57 <tr><td>3</td><td>4</td></tr>
70 Something to be careful about
75 <chapter title="Basic usage of swfc">
77 <section><title>Calling swfc</title>
81 swfc is command line based. You call it via
83 <shell>$ swfc file.sc</shell>
85 The filename of what is generated depends on the filename of the script (<f>file.sc</f>),
86 the filename given inside the script, and the optional <c>-o</c> passed to swfc.
92 <section><title>A simple swfc example</title>
95 Let's create simple SWF file, shall we?
96 The following script creates a red box with a yellow border. On the right side you
97 see the script used, on the left side the swf file that is generated.
101 .flash filename="box.swf"
102 .box b1 100 100 color=yellow fill=red
103 .put b1 pin=center scale=0%
105 .change b1 pin=center scale=100%
107 .change b1 pin=center scale=0%
112 The <c>.box</c> command creates the box. Every object that is created must also be explicitly
113 put into the scene using <c>.put</c> to become visible.
116 Change, on the other hand, modifies an already existing object.
117 It works gradually: In the example above, the change happens over 100 frames.
118 If you want to change an object suddently from one frame to the next, you
119 would use the <c>.jump</c> command.
124 <section><title>Color transforms</title>
127 You can define a number of parameters in the <c>.put</c>, <c>.change</c> and <c>.jump</c>
128 tags. Among those are the color transform parameters <c>red</c>, <c>green</c>,
129 <c>blue</c> and <c>alpha</c>.
130 Furthermore, for convenience, there's also <c>luminance</c>, which sets <c>red</c>, <c>green</c> and
131 <c>blue</c> in one go.
134 Each one of these consists of two parts: The multiplicator and the shift.
136 <c> ±<multiplicator>±<shift> </c>.
137 So, for example, to make an object 50% brighter, you would use
138 <c>luminance=+128</c>. Notice that all color components inside the transformed object in the range 128-255
139 will be mapped to 255 with this. To map 0 to 128, 255 to 255, but 128 to 192, you would
140 use <c>luminance=0.5+128</c>.
143 You can also specify negative values for both <c><mutliplicator></c> and <c><shift></c>.
144 This makes it e.g. possible to invert an object: <c>luminance=-1+255</c>.
147 The following example demonstrates a few of the possible transforms:
152 .flash filename="cxform.swf" version=5 fps=25
154 .jpeg s1 "photo.jpeg" quality=80%
156 .put s1 x=50 y=50 scalex=110 scaley=110
158 .change s1 x=0 y=0 scalex=210 scaley=210 red=-1+255 green=-1+255 blue=-1+255 #invert
160 .change s1 x=100 y=50 scalex=110 scaley=110 red=0 green=+0 blue=+0 #remove red
162 .change s1 x=0 y=0 scalex=210 scaley=210 red=+0 green=2 blue=-1+255 #amplify green, invert blue
164 .change s1 x=50 y=100 scalex=110 scaley=110 red=2-128 green=-2+255 blue=+0.7+40 #alien glow
166 .change s1 x=0 y=0 scalex=210 scaley=210 red=8-1024 green=8-1024 blue=8-1024 #palette reduce
168 .change s1 x=0 y=0 scalex=210 scaley=210 red=+0 green=+0 blue=+0 #back to normal
170 .change s1 x=105 y=105 scalex=0 scaley=0 luminance=0 #fadeout
174 A very useful fact is also that you can color transform the alpha component.
175 So to fade any object into the background, you would simply transform it's
176 alpha color: E.g. <c>alpha=64</c> would make the object 75% transparent.
177 This is used in an example further below.
183 <chapter title="Fonts">
187 swfc has font support. That means you can also insert texts into
189 The easiest way to load a font is to do something like
191 .font Arial filename="Arial.ttf"
194 You now have a font named <c>Arial</c> to play with.
195 For example, for the obligatory hello world program:
198 .flash filename="helloworld.swf"
200 .font Arial filename="Arial.ttf"
201 .text helloworld font=Arial text="Hello World!"
207 The text argument expects UTF-8 strings. So if you want to
208 pass any special characters (umlauts, digraphs etc.), they have to
212 Besides TrueType fonts, swfc also supports native SWF fonts.
213 If you have a SWF with a font you would like to use, do a
217 Then write down the font ID of the font, and do a
219 swfextract -f <fontid> file.swf -o myfont.swf
223 This will give you a file named myfont.swf which you can
224 also use in the <c>filename</c> parameter of <c>.font</c>.
228 Furthermore, you can convert TTF and Type1
229 fonts into SWF using <c>font2swf</c>:
231 font2swf Arial.ttf -o Arial.swf
233 The nice advantage of this is that you can play
234 Arial.swf in the flash player and see what the
236 (Also, loading a font in SWF format is slighly
237 faster than from a TTF file, as with TTFs spline
238 conversion has to take place).
244 So much for the basics. Now let's go to the more advanced
245 functionality around fonts.
249 Apart from being able to define text in your swfc files,
250 you can also define text <c>outlines</c>.
251 Those are not real characters but rather abstract vector
252 objects which you can use in other commands.
256 .flash filename="fontoutline.swf"
257 .font Arial "Arial.swf"
258 .textshape helloworld font=Arial size=200% text="Hello World"
259 .filled filled_helloworld outline=helloworld fill=blue line=3 color=green
260 .put filled_helloworld
264 Here, <c>.textshape helloworld</c> defines an outline named "helloworld",
265 which is then used to construct a filled outline named filled_helloworld.
267 To make this a little more interesting, let's fill with a gradient instead
271 .flash filename="fontgradient.swf"
272 .font Arial "Arial.swf"
273 .textshape helloworld font=Arial text="SHADE"
281 .filled filled_helloworld outline=helloworld fill=whitefade line=1 color=#2c2c2c
282 .put filled_helloworld scale=200%
286 While at it, you can also fill with an image:
289 .flash filename="fontimage.swf"
290 .font courier "Courier.swf"
291 .jpeg beach "beach.jpg"
292 .textshape text font=courier text="HOLIDAY"
294 .filled filled_text outline=text fill=beach line=1 color=#2c2c2c
295 .put filled_text scale=200%
299 But let's get back to normal <c>.text</c> characters.
300 The following demonstrates that you can treat objects defined
301 with <c>.text</c> like normal shapes, i.e., scale them, move them, and use
305 .flash filename="text5.swf"
306 .font courier "Courier.swf"
307 .text hithere text="HELLO" font=courier size=200%
308 .jpeg scenery "scenery.jpg"
311 .startclip hithere pin=center x=100 y=75 scale=50% #text clips...
312 .put scenery scale=50%
315 .change hithere rotate+=360 pin=center scale=100%
321 The last two examples look similar, but their underlying structure
322 is different: The first is a shape object filled with
323 image data (that is, a texture), while the second uses a normal
324 text object to clip an rectangular image. (More about clipping in
329 Also, <c>.text</c> takes a color attribute (that's actually
330 the poor man's version of the more advanced filling options
331 that <c>.textshape</c> in conjunction with <c>.filled</c> offers),
332 which is used here together with the alpha parameter of <c>.change</c>:
336 .flash filename="text6.swf"
337 .font times "Times.swf"
338 .text hello text="HELLO" font=times size=100% color=blue
339 .text world text="WORLD" font=times size=100% color=red
342 .put hello pin=center x=50 y=50
343 .put world pin=center x=50 y=50 alpha=25%
345 .change hello rotate+=360 pin=center alpha=25%
346 .change world rotate-=360 pin=center alpha=100%
352 <section title="Clipping">
356 .flash filename="xorclip.swf" bbox=640x480 background=black version=6
357 .font times "Times.swf"
358 .textshape helloworld text="HELLO WORLD" font=times size=500%
359 .filled helloworld1 outline=helloworld fill=blue line=0
360 .filled helloworld2 outline=helloworld fill=green line=0
363 .box background width=640 height=480 fill=white line=0
365 .put h1=helloworld1 y=200
366 .put h2=helloworld2 y=200
382 <section title="Edittext">
384 A special type of text in SWF is the <c>edittext</c>, which
385 can be modified by the viewer. It's content can also be queried
386 and set from ActionScript (see below).
387 You can generate this type of text with the <c>.edittext</c> command:
390 .flash filename="edittext.swf" bbox=210x110
391 .font Arial "Arial.swf"
392 .edittext myedittext font=Arial size=20%
394 color=blue border multiline wordwrap
395 text="Edit me!\nClick with your mouse on this text to edit it."
396 .put myedittext x=3 y=3
403 <chapter title="Shapes">
405 <section title="Creating Outlines">
407 In the previous chapter, we learned how to create a text outline
408 using <c>.textshape</c>. The other way to create outlines is to
409 use the .outline command:
412 .flash filename="house.swf"
414 .outline house_outline:
415 M 36.99 29.93 L 15.52 51.39 L 20.44 51.39 L 20.44 81.91
416 L 39.73 81.91 L 39.73 62.33 L 48.36 62.33
417 L 48.36 81.91 L 53.84 81.91 L 53.84 51.39
418 L 58.45 51.39 L 36.99 29.93
419 M 28.79 53.70 L 34.55 53.70 L 34.55 60.60 L 28.79 60.60
422 .filled house outline=house_outline fill=grey color=grey
427 The syntax of the paths inside the <c>.outline</c> command is the same as in svg.
428 That means you can use the svg editor of your choice (e.g.: <a href="http://inkscape.sourceforge.net">inkscape</a>)
429 to create these outlines. You then need to extract them out of the .xml/.svg file.
430 They are inside the "d" attribute of the "path" tag:
435 style="fill:#0000ff;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;"
436 d="M 369.90625 299.31250 L 155.21875 513.96875 L 204.40625 513.96875 L 204.40625 819.15625 L 397.31250 819.15625 L 397.31250 623.37500 L 483.68750 623.37500 L 483.68750 819.15625 L 538.40625 819.15625 L 538.40625 513.96875 L 584.56250 513.96875 L 369.90625 299.31250 z M 287.90625 537.00000 L 345.50000 537.00000 L 345.50000 606.09375 L 287.90625 606.09375 L 287.90625 537.00000 z "
443 <section title="Filling Outlines">
445 Outlines can be filled with gradients, bitmaps etc., just like
446 seen previously with <c>.textshape</c>:
449 .flash filename="gradients.swf"
452 M 521,640 C 502,678 370,546 328,554 C 270,566 152,731 93,722
453 C 51,716 147,549 127,512 C 98,460 -107,400 -117,341
454 C -124,299 63,339 93,308 C 133,265 127,50 180,23
455 C 218,3 238,195 276,213 C 330,238 532,166 575,208
456 C 605,238 429,316 424,358 C 416,417 547,587 521,640
467 .gradient fire radial:
480 .gradient transparent:
485 .box scenery fill=horizon width=200 height=200
486 .box bar fill=transparent width=240 height=20
487 .filled star1 outline=star fill=rainbow line=1
488 .filled star2 outline=star fill=fire line=1
490 .put scenery rotate=90%
491 .put star1 scale=10% x=-70
492 .put star2 scale=10% x=-180 y=110
493 .put bar x=-180 y=10 rotate=45
497 <!-- TODO: bitmap filling -->
501 <section title="Some more words about gradients">
504 The previous example demonstrated how to fill an outline with
509 There are two types of gradients: radial and linear. radial gradients
510 have a center point and a radius (and are immune to rotations), and
511 linear gradients have a start point and a width (or height) and can
515 gradients can be freely positioned inside the object
516 you want to fill, by passing the <c>x</c>, <c>y</c> and <c>width</c> and <c>height</c> (or <c>r</c>) parameters
520 .flash filename="gradients2.swf"
538 .gradient horizon1 radial x=-50 y=-50 r=100:
545 .gradient horizon2 radial x=0 y=0 r=50:
552 .filled o1 outline=o fill=horizon1 line=0
553 .filled o2 outline=o fill=horizon2 line=0
561 If you want to use a given gradient several times
562 with different <c>x</c> and <c>y</c> values, you can also first
563 define the gradient itself, and then position it with .texture:
566 .flash filename="gradients3.swf"
568 # same outline as above, only in more terse notation
577 .gradient horizon radial:
584 .texture horizon1=horizon x=-50 y=-50 r=100
585 .filled o1 outline=o fill=horizon1 line=0
588 .texture horizon2=horizon x=0 y=0 r=50
589 .filled o2 outline=o fill=horizon2 line=0
592 .texture horizon3=horizon x=0 y=50 r=10
593 .filled o3 outline=o fill=horizon3 line=0
596 .texture horizon4=horizon x=50 y=50 r=200
597 .filled o4 outline=o fill=horizon4 line=0
609 .texture bunt1=bunt x=-50 y=-50 width=100
610 .filled oo1 outline=o fill=bunt1 line=0
613 .texture bunt2=bunt x=-50 y=-50 width=141 height=141 rotate=45
614 .filled oo2 outline=o fill=bunt2 line=0
617 .texture bunt3=bunt x=-50 y=50 width=141 height=141 rotate=-45
618 .filled oo3 outline=o fill=bunt3 line=0
621 .texture bunt4=bunt x=50 y=50 width=100 rotate=180
622 .filled oo4 outline=o fill=bunt4 line=0
629 <!-- TODO: bitmap filling -->
636 <chapter title="ActionScript">
639 <c>swfc</c> has Actionscript support.
640 For normal actionscript, which is executed once a given frame
641 is reached, just open an <c>.action</c> block, and write
642 the ActionScript into the block:
645 .flash filename="action.swf" bbox=300x300 fps=50
647 .box mybox color=blue fill=green width=100 height=100
653 mybox._x = 100*Math.cos(_root.angle)+100;
654 mybox._y = 100*Math.sin(_root.angle)+100;
665 For much more interesting ActionScript examples, see
667 <a href="http://technoargia.free.fr/swftools/examples/flash_eyes/flash_eyes.html">Flash Eyes</a>
669 <a href="http://melusine.eu.org/syracuse/flash/20040429/fabrique/">source</a>
670 of Jean-Michel Sarlat's
671 <a href="http://melusine.eu.org/syracuse/flash/20040429/">Mandelbrot explorer</a>.
673 <a href="http://www.goldenxp.com/repo/swfr/index.htm">Sunder Iyer's swfc pages</a>.
680 <chapter title="Buttons">
682 Actionscript comes in handy when dealing with SWF Buttons.
685 A button defines, in SWF context, an object sensitive to mouse movement,
686 mouse buttons, and key presses.
689 The following is a trivial example: Four objects which change their shape
690 once the cursor is over it.
692 .flash filename="button1.swf" fps=50
694 .box box1 color=white fill=#336633 width=50 height=50
695 .box box2 color=white fill=#99cc99 width=100 height=100
697 .show box1 as=shape x=25 y=25
698 .show box2 as=hover x=12.5 y=12.5
703 .put b2=mybutton1 x=100 red=+255
704 .put b3=mybutton1 y=100 green=+255
705 .put b4=mybutton1 x=100 y=100 blue=+255
711 The <c>.show</c> command (which can only be used inside <c>.button</c>) has a syntax
712 very similar to <c>.put</c>.
713 For every shape a button uses, you can specify the position, color transform, scaling,
714 rotation etc. just like with <c>.put</c>.
717 The only <i>real</i> difference between those two commands is the <c>as</c> parameter:
718 with that you tell the button when to display that specific shape.
719 There are four allowed parameters to <c>as</c>:
721 <li><b>idle</b> The shape to display when the button is idle, that is, the
722 mouse is somewhere else, and not over the button.
723 </li><li><b>hover</b> The shape to display if the mouse cursor is <i>inside</i> the button.
724 What exactly is <i>"inside"</i> is defined by <b>area</b>:
725 </li><li><b>area</b> This shape is not displayed. It serves as bounding box (actually,
726 bounding polygon) for the button. A button considers itself
727 active (that is, the <c>hover</c> shape is active, not the <c>idle</c>
728 shape) if the mouse is inside this area. Also, mouse button clicks
729 have to be in this area for this button.
730 </li><li><b>pressed</b> The shape to display if the user clicks on the button. This shape
731 is displayed as long as the mouse button is down.
736 <!-- TODO: button actionscript -->
739 <section><title>Another button example: tooltips</title>
741 Due to the fact that button shapes can be put <i>anywhere</i> especially
742 outside the active area, it's easy to generate tooltips or subtitles.
745 .flash filename="tooltips.swf" fps=50
750 .font arial Arial.ttf
751 .edittext tooltip_fence text="fence" readonly color=green font=arial width=200 height=50 size=20%
752 .edittext tooltip_wheel text="wheel" readonly color=green font=arial width=200 height=50 size=20%
753 .edittext tooltip_tree text="tree" readonly color=green font=arial width=200 height=50 size=20%
754 .edittext tooltip_mountain text="mountain" readonly color=green font=arial width=200 height=50 size=20%
756 .box box1 fill=red width=1 height=1
758 .show box1 as=area x=0 y=0
759 .show tooltip_fence as=hover x=25 y=25 scalex=100 scaley=100 alpha=50%
760 .show tooltip_fence as=idle x=25 y=25 scalex=100 scaley=100 alpha=50%