Add automated tests on function-type FSCommand parameter passing.
[gnash.git] / testsuite / misc-ming.all / masks_test.c
blob8e9b674e3baa81bbc6f671d5649fafe6f3af4e34
1 /*
2 * Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
20 * Sandro Santilli, strk@keybit.net
22 * Test masks
24 * run as ./masks_test
27 #include "ming_utils.h"
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <ming.h>
33 #define OUTPUT_VERSION 6
34 #define OUTPUT_FILENAME "masks_test.swf"
36 void add_dynamic_mc(SWFMovie mo, const char* name, int depth, int x, int y, int width, int height, int r, int g, int b);
37 void add_static_mc(SWFMovie mo, const char* name, int depth, int x, int y, int width, int height, int r, int g, int b);
38 void add_static_mask(SWFMovie mo, const char* name, int depth, int x, int y, int width, int height, int masklevel);
40 void
41 add_dynamic_mc(SWFMovie mo, const char* name, int depth, int x, int y, int width, int height, int r, int g, int b)
43 SWFAction ac = compile_actions("createEmptyMovieClip('%s', %d);"
44 "with (%s) {"
45 //" lineStyle(1, 0x000000, 100);"
46 " beginFill(0x%2.2X%2.2X%2.2X, 100);"
47 " moveTo(%d, %d);"
48 " lineTo(%d, %d);"
49 " lineTo(%d, %d);"
50 " lineTo(%d, %d);"
51 " lineTo(%d, %d);"
52 " endFill();"
53 "}",
54 name, depth, name,
55 r,g,b,
56 x, y,
57 x, y+height,
58 x+width, y+height,
59 x+width, y,
60 x, y
63 SWFMovie_add(mo, (SWFBlock)ac);
66 void
67 add_static_mc(SWFMovie mo, const char* name, int depth, int x, int y, int width, int height, int r, int g, int b)
69 SWFShape sh;
70 SWFMovieClip mc;
71 SWFDisplayItem it;
73 sh = make_fill_square (0, 0, width, height, r, g, b, r, g, b);
74 mc = newSWFMovieClip();
75 SWFMovieClip_add(mc, (SWFBlock)sh);
77 SWFMovieClip_nextFrame(mc);
79 it = SWFMovie_add(mo, (SWFBlock)mc);
80 SWFDisplayItem_setDepth(it, depth);
81 SWFDisplayItem_moveTo(it, x, y);
82 SWFDisplayItem_setName(it, name);
85 void
86 add_static_mask(SWFMovie mo, const char* name, int depth, int x, int y, int width, int height, int masklevel)
88 SWFShape sh;
89 SWFMovieClip mc;
90 SWFDisplayItem it;
92 sh = make_fill_square (-(width/2), -(height/2), width, height, 255, 0, 0, 255, 0, 0);
93 mc = newSWFMovieClip();
94 SWFMovieClip_add(mc, (SWFBlock)sh);
96 SWFMovieClip_nextFrame(mc);
98 it = SWFMovie_add(mo, (SWFBlock)mc);
99 SWFDisplayItem_setDepth(it, depth);
100 SWFDisplayItem_moveTo(it, x, y);
101 SWFDisplayItem_setName(it, name);
102 SWFDisplayItem_setMaskLevel(it, masklevel);
107 main(int argc, char** argv)
109 SWFMovie mo;
110 SWFMovieClip dejagnuclip;
111 SWFDisplayItem it;
113 const char *srcdir=".";
114 if ( argc>1 )
115 srcdir=argv[1];
116 else
118 //fprintf(stderr, "Usage: %s <mediadir>\n", argv[0]);
119 //return 1;
122 Ming_init();
123 mo = newSWFMovieWithVersion(OUTPUT_VERSION);
124 SWFMovie_setDimension(mo, 1200, 600);
125 SWFMovie_setRate (mo, 1);
127 dejagnuclip = get_dejagnu_clip((SWFBlock)get_default_font(srcdir), 10, 0, 0, 800, 600);
128 it = SWFMovie_add(mo, (SWFBlock)dejagnuclip);
129 SWFDisplayItem_setDepth(it, 1000);
130 SWFDisplayItem_moveTo(it, 300, 0);
131 SWFMovie_nextFrame(mo); // FRAME 2 starts here
133 add_actions(mo, "note('Test masks and dynamic masks at different depth ranges.');");
135 // this one seems to confuse the MM player
136 //add_static_mask(mo, "mask1", 1, 0, 150, 200, 100, 20);
138 // Red rect (staticmc2) is at 0,200-60,260
139 add_static_mc(mo, "staticmc2", 2, 0, 200, 60, 60, 255, 0, 0); // red
141 // Yellow rect (staticmc3) is at 30,200-90,260
142 add_static_mc(mo, "staticmc3", 3, 30, 200, 60, 60, 255, 255, 0); // yellow
144 // Green rect (staticmc4) is at 200,200-260,260
145 add_static_mc(mo, "staticmc4", 4, 200, 200, 60, 60, 0, 255, 0); // green
147 // Cyan rect (staticmc5) is at 230,200-290,260
148 add_static_mc(mo, "staticmc5", 5, 230, 200, 60, 60, 0, 255, 255); // cyan
150 // Blue rect (dynamicmc2) is at 0,300-60,360
151 add_dynamic_mc(mo, "dynamicmc2", 12, 0, 300, 60, 60, 0, 0, 255); // blue
153 // Violet rect (dynamicmc3) is at 30,300-90,360
154 add_dynamic_mc(mo, "dynamicmc3", 13, 30, 300, 60, 60, 255, 0, 255); // violet
156 // Dark green rect (dynamicmc4) is at 200,300-260,360
157 add_dynamic_mc(mo, "dynamicmc4", 14, 200, 300, 60, 60, 0, 128, 0); // dark green
159 // Light blue rect (dynamicmc5) is at 230,300-290,360
160 add_dynamic_mc(mo, "dynamicmc5", 15, 230, 300, 60, 60, 0, 128, 255); // light blue
163 // Red rect
164 check_equals(mo, "staticmc2.getDepth()", "-16382");
165 check(mo, "staticmc2.hitTest(10, 210, true)");
166 check(mo, "staticmc2.hitTest(50, 250, true)");
168 // Yellow rect
169 check_equals(mo, "staticmc3.getDepth()", "-16381");
170 check(mo, "staticmc3.hitTest(40, 210, true)");
171 check(mo, "staticmc3.hitTest(80, 250, true)");
173 // Green rect
174 check_equals(mo, "staticmc4.getDepth()", "-16380");
175 check(mo, "staticmc4.hitTest(210, 210, true)");
176 check(mo, "staticmc4.hitTest(250, 250, true)");
178 // Cyan rect
179 check_equals(mo, "staticmc5.getDepth()", "-16379");
180 check(mo, "staticmc5.hitTest(240, 210, true)");
181 check(mo, "staticmc5.hitTest(280, 250, true)");
183 // Blue rect
184 check_equals(mo, "dynamicmc2.getDepth()", "12");
185 check(mo, "dynamicmc2.hitTest(10, 310, true)");
186 check(mo, "dynamicmc2.hitTest(50, 350, true)");
188 // Violet rect
189 check_equals(mo, "dynamicmc3.getDepth()", "13");
190 check(mo, "dynamicmc3.hitTest(40, 310, true)");
191 check(mo, "dynamicmc3.hitTest(80, 350, true)");
193 // Dark green rect
194 check_equals(mo, "dynamicmc4.getDepth()", "14");
195 check(mo, "dynamicmc4.hitTest(210, 310, true)");
196 check(mo, "dynamicmc4.hitTest(250, 350, true)");
198 // Light blue rect
199 check_equals(mo, "dynamicmc5.getDepth()", "15");
200 check(mo, "dynamicmc5.hitTest(240, 310, true)");
201 check(mo, "dynamicmc5.hitTest(280, 350, true)");
203 add_actions(mo,
204 "note('Placed staticmc2 (red), staticmc3 (yellow), staticmc4 (green), staticmc5 (cyan) DisplayObjects');"
205 "note('Placed dynamicmc2 (blue), dynamicmc3 (violet), dynamicmc4 (dark green), dynamicmc5 (light blue) DisplayObjects');"
206 "note(' - Press any key to continue -');"
207 "stop();"
208 "l = new Object();"
209 "l.onKeyUp = function() { nextFrame(); };"
210 "Key.addListener(l);"
213 SWFMovie_nextFrame(mo); // FRAME 3 starts here
215 add_actions(mo,
216 "sm23 = staticmc2.setMask(staticmc3);" // red masked by yellow
217 "sm54 = staticmc5.setMask(staticmc4);" // cyan masked by green
218 "dm23 = dynamicmc2.setMask(dynamicmc3);" // blue masked by violet
219 "dm54 = dynamicmc5.setMask(dynamicmc4);" // light blue masked by dark green
222 add_actions(mo,
223 "note('staticmc2.setMask(staticmc3) [red masked by yellow]');"
224 "note('staticmc5.setMask(staticmc4) [cyan masked by green]');"
225 "note('dynamicmc2.setMask(dynamicmc3) [blue masked by violet');"
226 "note('dynamicmc5.setMask(dynamicmc4) [light blue masked by dark green');"
229 check_equals(mo, "typeof(sm23)", "'boolean'");
230 check_equals(mo, "sm23", "true");
231 check_equals(mo, "typeof(sm54)", "'boolean'");
232 check_equals(mo, "sm54", "true");
233 check_equals(mo, "typeof(dm23)", "'boolean'");
234 check_equals(mo, "dm23", "true");
235 check_equals(mo, "typeof(dm54)", "'boolean'");
236 check_equals(mo, "dm54", "true");
238 // Red rect is now masked by yellow
239 // Red rect (staticmc2) is at 0,200-60,260
240 // Yellow rect (staticmc3) is at 30,200-90,260
241 check(mo, "!staticmc2.hitTest(10, 210, true)");
242 check(mo, "staticmc2.hitTest(10, 210, false)"); // bounding box hitTest not affected by masks
243 check(mo, "staticmc2.hitTest(50, 250, true)");
245 // Yellow rect is now a mask
246 // hitTest() using 'shape' semantic won't see it,
247 // while hitTest() using 'bounding box' semantic will
248 check(mo, "staticmc3.hitTest(40, 210, false)");
249 check(mo, "staticmc3.hitTest(80, 250, false)");
250 check(mo, "!staticmc3.hitTest(40, 210, true)");
251 check(mo, "!staticmc3.hitTest(80, 250, true)");
253 // Green rect is now a mask
254 // hitTest() using 'shape' semantic won't see it,
255 // while hitTest() using 'bounding box' semantic will
256 check(mo, "!staticmc4.hitTest(210, 210, true)");
257 check(mo, "!staticmc4.hitTest(250, 250, true)");
258 check(mo, "staticmc4.hitTest(210, 210, false)");
259 check(mo, "staticmc4.hitTest(250, 250, false)");
261 // Cyan rect is now masked by green
262 // Green rect (staticmc4) is at 200,200-260,260
263 // Cyan rect (staticmc5) is at 230,200-290,260
264 check(mo, "staticmc5.hitTest(240, 210, true)");
265 check(mo, "!staticmc5.hitTest(280, 250, true)");
266 check(mo, "staticmc5.hitTest(280, 250, false)");
268 // Blue rect now is masked by Violet rect
269 // Violet rect (dynamicmc3) is at 30,300-90,360
270 // Blue rect (dynamicmc2) is at 0,300-60,360
271 check(mo, "!dynamicmc2.hitTest(10, 310, true)");
272 check(mo, "dynamicmc2.hitTest(10, 310, false)");
273 check(mo, "dynamicmc2.hitTest(50, 350, true)");
275 // Violet rect is now a mask
276 // hitTest() using 'shape' semantic won't see it,
277 // while hitTest() using 'bounding box' semantic will
278 check(mo, "!dynamicmc3.hitTest(40, 310, true)");
279 check(mo, "!dynamicmc3.hitTest(80, 350, true)");
280 check(mo, "dynamicmc3.hitTest(40, 310, false)");
281 check(mo, "dynamicmc3.hitTest(80, 350, false)");
283 // Dark green rect is now a mask
284 check(mo, "!dynamicmc4.hitTest(210, 310, true)");
285 check(mo, "!dynamicmc4.hitTest(250, 350, true)");
286 check(mo, "dynamicmc4.hitTest(210, 310, false)");
287 check(mo, "dynamicmc4.hitTest(250, 350, false)");
289 // Light blue now masked by Dark green
290 // Light blue rect (dynamicmc5) is at 230,300-290,360
291 // Dark green rect (dynamicmc4) is at 200,300-260,360
292 check(mo, "dynamicmc5.hitTest(240, 310, true)");
293 check(mo, "!dynamicmc5.hitTest(280, 350, true)");
294 check(mo, "dynamicmc5.hitTest(280, 350, false)");
296 add_actions(mo,
297 "note(' - Press any key to continue -');"
298 "stop();"
301 SWFMovie_nextFrame(mo); // FRAME 4 starts here
303 add_actions(mo,
304 "staticmc2.swapDepths(staticmc3);"
305 "staticmc4.swapDepths(staticmc5);"
306 "dynamicmc2.swapDepths(dynamicmc3);"
307 "dynamicmc4.swapDepths(dynamicmc5);"
310 add_actions(mo,
311 "note('Swapped depths of chars 2/3 and 4/5 to see if masks are still in effect');"
312 "note(' - Press any key to continue -');"
313 "stop();"
317 check_equals(mo, "staticmc2.getDepth()", "-16381");
318 check_equals(mo, "staticmc3.getDepth()", "-16382");
319 check_equals(mo, "staticmc4.getDepth()", "-16379");
320 check_equals(mo, "staticmc5.getDepth()", "-16380");
321 check_equals(mo, "dynamicmc2.getDepth()", "13");
322 check_equals(mo, "dynamicmc3.getDepth()", "12");
323 check_equals(mo, "dynamicmc4.getDepth()", "15");
324 check_equals(mo, "dynamicmc5.getDepth()", "14");
326 // Depth swapping didn't change hitTest effects
328 // Red rect is now masked by yellow
329 // Red rect (staticmc2) is at 0,200-60,260
330 // Yellow rect (staticmc3) is at 30,200-90,260
331 check(mo, "!staticmc2.hitTest(10, 210, true)");
332 check(mo, "staticmc2.hitTest(10, 210, false)"); // bounding box hitTest not affected by masks
333 check(mo, "staticmc2.hitTest(50, 250, true)");
335 // Yellow rect is now a mask
336 // hitTest() using 'shape' semantic won't see it,
337 // while hitTest() using 'bounding box' semantic will
338 check(mo, "staticmc3.hitTest(40, 210, false)");
339 check(mo, "staticmc3.hitTest(80, 250, false)");
340 check(mo, "!staticmc3.hitTest(40, 210, true)");
341 check(mo, "!staticmc3.hitTest(80, 250, true)");
343 // Green rect is now a mask
344 // hitTest() using 'shape' semantic won't see it,
345 // while hitTest() using 'bounding box' semantic will
346 check(mo, "staticmc4.hitTest(210, 210, false)");
347 check(mo, "staticmc4.hitTest(250, 250, false)");
348 check(mo, "!staticmc4.hitTest(210, 210, true)");
349 check(mo, "!staticmc4.hitTest(250, 250, true)");
351 // Cyan rect is now masked by green
352 // Green rect (staticmc4) is at 200,200-260,260
353 // Cyan rect (staticmc5) is at 230,200-290,260
354 check(mo, "staticmc5.hitTest(240, 210, true)");
355 check(mo, "!staticmc5.hitTest(280, 250, true)");
356 check(mo, "staticmc5.hitTest(280, 250, false)");
358 // Blue rect now is masked by Violet rect
359 // Violet rect (dynamicmc3) is at 30,300-90,360
360 // Blue rect (dynamicmc2) is at 0,300-60,360
361 check(mo, "!dynamicmc2.hitTest(10, 310, true)");
362 check(mo, "dynamicmc2.hitTest(10, 310, false)");
363 check(mo, "dynamicmc2.hitTest(50, 350, true)");
365 // Violet rect is now a mask
366 // hitTest() using 'shape' semantic won't see it,
367 // while hitTest() using 'bounding box' semantic will
368 check(mo, "!dynamicmc3.hitTest(40, 310, true)");
369 check(mo, "!dynamicmc3.hitTest(80, 350, true)");
370 check(mo, "dynamicmc3.hitTest(40, 310, false)");
371 check(mo, "dynamicmc3.hitTest(80, 350, false)");
373 // Dark green rect is now a mask
374 check(mo, "!dynamicmc4.hitTest(210, 310, true)");
375 check(mo, "!dynamicmc4.hitTest(250, 350, true)");
376 check(mo, "dynamicmc4.hitTest(210, 310, false)");
377 check(mo, "dynamicmc4.hitTest(250, 350, false)");
379 // Light blue now masked by Dark green
380 // Light blue rect (dynamicmc5) is at 230,300-290,360
381 // Dark green rect (dynamicmc4) is at 200,300-260,360
382 check(mo, "dynamicmc5.hitTest(240, 310, true)");
383 check(mo, "!dynamicmc5.hitTest(280, 350, true)");
384 check(mo, "dynamicmc5.hitTest(280, 350, false)");
386 SWFMovie_nextFrame(mo); // FRAME 5 starts here
389 add_actions(mo,
390 "sm32 = staticmc3.setMask(staticmc2);" // yellow masked by red
391 "sm45 = staticmc4.setMask(staticmc5);" // green masked by cyan
392 "dm32 = dynamicmc3.setMask(dynamicmc2);" // violet masked by blue
393 "dm45 = dynamicmc4.setMask(dynamicmc5);" // dark green masked by light blue
396 add_actions(mo,
397 "note('Swapped mask/maskee:');"
398 "note(' staticmc3.setMask(staticmc2) [yellow masked by red]');"
399 "note(' staticmc4.setMask(staticmc5) [green masked by cyan]');"
400 "note(' dynamicmc3.setMask(dynamicmc4) [violet masked by blue');"
401 "note(' dynamicmc4.setMask(dynamicmc5) [dark green masked by light blue');"
404 check_equals(mo, "typeof(sm32)", "'boolean'");
405 check_equals(mo, "sm32", "true");
406 check_equals(mo, "typeof(sm45)", "'boolean'");
407 check_equals(mo, "sm45", "true");
408 check_equals(mo, "typeof(dm32)", "'boolean'");
409 check_equals(mo, "dm32", "true");
410 check_equals(mo, "typeof(dm45)", "'boolean'");
411 check_equals(mo, "dm45", "true");
413 // Red rect is now a mask
414 check(mo, "!staticmc2.hitTest(10, 210, true)");
415 check(mo, "!staticmc2.hitTest(50, 250, true)");
416 check(mo, "staticmc2.hitTest(10, 210, false)");
417 check(mo, "staticmc2.hitTest(50, 250, false)");
419 // Yellow rect is now masked by Red rect
420 // Yellow rect (staticmc3) is at 30,200-90,260
421 // Red rect (staticmc2) is at 0,200-60,260
422 // Intersection is 30,200-60,260
423 // TODO: why no hitTest ??
424 xcheck(mo, "!staticmc3.hitTest(40, 210, true)"); // I'd think this should be true, why not ?
425 check(mo, "!staticmc3.hitTest(80, 250, true)"); // out of masked area
426 check(mo, "staticmc3.hitTest(80, 250, false)");
427 check(mo, "staticmc3.hitTest(40, 210, false)");
429 // Green rect is now masked by Cyan
430 // Green rect (staticmc4) is at 200,200-260,260
431 // Cyan rect (staticmc5) is at 230,200-290,260
432 // Intersection is 230,200-260,260
433 // TODO: why no hitTest ??
434 check(mo, "!staticmc4.hitTest(210, 210, true)"); // out of masked area
435 xcheck(mo, "!staticmc4.hitTest(250, 250, true)"); // I'd think this should be true, why not?
436 check(mo, "staticmc4.hitTest(210, 210, false)");
437 check(mo, "staticmc4.hitTest(250, 250, false)");
439 // Cyan rect is now a mask
440 check(mo, "!staticmc5.hitTest(240, 210, true)");
441 check(mo, "!staticmc5.hitTest(280, 250, true)");
442 check(mo, "staticmc5.hitTest(240, 210, false)");
443 check(mo, "staticmc5.hitTest(280, 250, false)");
445 // Blue rect is now a mask
446 check(mo, "!dynamicmc2.hitTest(10, 310, true)");
447 check(mo, "!dynamicmc2.hitTest(50, 350, true)");
448 check(mo, "dynamicmc2.hitTest(10, 310, false)");
449 check(mo, "dynamicmc2.hitTest(50, 350, false)");
451 // Violet rect is now masked by Blue rect
452 check(mo, "dynamicmc3.hitTest(40, 310, true)");
453 check(mo, "!dynamicmc3.hitTest(80, 350, true)");
454 check(mo, "dynamicmc3.hitTest(80, 350, false)");
456 // Dark green rect is masked by Light blue
457 check(mo, "!dynamicmc4.hitTest(210, 310, true)");
458 check(mo, "dynamicmc4.hitTest(210, 310, false)");
459 check(mo, "dynamicmc4.hitTest(250, 350, true)");
461 // Light blue is now a mask
462 check(mo, "dynamicmc5.hitTest(240, 310, false)");
463 check(mo, "dynamicmc5.hitTest(280, 350, false)");
464 check(mo, "!dynamicmc5.hitTest(240, 310, true)");
465 check(mo, "!dynamicmc5.hitTest(280, 350, true)");
467 add_actions(mo,
468 "note(' - Press any key to continue -');"
469 "stop();"
472 SWFMovie_nextFrame(mo);
474 add_actions(mo,
475 "var clips = [staticmc2, staticmc3, staticmc4, staticmc5, dynamicmc2, dynamicmc3, dynamicmc4, dynamicmc5];"
476 "for (i=0; i<clips.length; ++i) {"
477 " clips[i].onRollOver = function() { this._alpha = 50; };"
478 " clips[i].onRollOut = function() { this._alpha = 100; };"
480 "note('Made all DisplayObjects mouse-sensitive');"
483 // Red rect is a mask, but has mouse events !
484 check(mo, "staticmc2.hitTest(10, 210, true)");
485 check(mo, "staticmc2.hitTest(50, 250, true)");
487 // Yellow rect is now masked by Red rect
488 // Yellow rect (staticmc3) is at 30,200-90,260
489 // Red rect (staticmc2) is at 0,200-60,260
490 // Intersection is 30,200-60,260
491 check(mo, "staticmc3.hitTest(40, 210, true)");
492 check(mo, "!staticmc3.hitTest(80, 250, true)"); // out of masked area
493 check(mo, "staticmc3.hitTest(80, 250, false)");
495 // Green rect is now masked by Cyan
496 // Green rect (staticmc4) is at 200,200-260,260
497 // Cyan rect (staticmc5) is at 230,200-290,260
498 // Intersection is 230,200-260,260
499 check(mo, "!staticmc4.hitTest(210, 210, true)"); // out of masked area
500 check(mo, "staticmc4.hitTest(250, 250, true)");
501 check(mo, "staticmc4.hitTest(210, 210, false)");
503 // Cyan rect is a mask but has mouse events !
504 check(mo, "staticmc5.hitTest(240, 210, true)");
505 check(mo, "staticmc5.hitTest(280, 250, true)");
507 // Blue rect is a mask but has mouse events !
508 check(mo, "dynamicmc2.hitTest(10, 310, true)");
509 check(mo, "dynamicmc2.hitTest(50, 350, true)");
511 // Violet rect is now masked by Blue rect
512 check(mo, "dynamicmc3.hitTest(40, 310, true)");
513 check(mo, "!dynamicmc3.hitTest(80, 350, true)");
514 check(mo, "dynamicmc3.hitTest(80, 350, false)");
516 // Dark green rect is masked by Light blue
517 check(mo, "!dynamicmc4.hitTest(210, 310, true)");
518 check(mo, "dynamicmc4.hitTest(210, 310, false)");
519 check(mo, "dynamicmc4.hitTest(250, 350, true)");
521 // Light blue is a mask but has mouse events !
522 check(mo, "dynamicmc5.hitTest(240, 310, true)");
523 check(mo, "dynamicmc5.hitTest(280, 350, true)");
525 add_actions(mo, "_root.totals(154); stop();");
527 SWFMovie_nextFrame(mo);
530 // TODO:
531 // - test mask layers !!
533 //Output movie
534 puts("Saving " OUTPUT_FILENAME );
535 SWFMovie_save(mo, OUTPUT_FILENAME);
537 return 0;