[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv... |
Date: |
Fri, 06 Apr 2007 15:36:05 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 07/04/06 15:36:05
Modified files:
. : ChangeLog
server : sprite_instance.cpp sprite_instance.h
server/vm : ASHandlers.cpp
testsuite/misc-ming.all: displaylist_depths_test.c
Log message:
Good stuff:
* testsuite/misc-ming.all/displaylist_depths_test.c:
Add a bunch of new tests about removing from protected
depth ranges and using swapDepth to move between ranges.
* server/sprite_instance.{h,cpp}: Add a removeMovieClip
public method for common use by ActionRemoveClip tag,
global removeMovieClip function and MovieClip.removeMovieClip
method; fix swapDepths to accept a depth as argument;
fix removeMovieClip to check for allowed depth bounds.
* server/vm/ASHandlers.cpp (ActionRemoveClip): use the new
sprite_instance::removeMovieClip method.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2798&r2=1.2799
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.225&r2=1.226
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.89&r2=1.90
http://cvs.savannah.gnu.org/viewcvs/gnash/server/vm/ASHandlers.cpp?cvsroot=gnash&r1=1.82&r2=1.83
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/displaylist_depths_test.c?cvsroot=gnash&r1=1.1&r2=1.2
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2798
retrieving revision 1.2799
diff -u -b -r1.2798 -r1.2799
--- ChangeLog 6 Apr 2007 11:43:44 -0000 1.2798
+++ ChangeLog 6 Apr 2007 15:36:05 -0000 1.2799
@@ -1,5 +1,18 @@
2007-04-06 Sandro Santilli <address@hidden>
+ * testsuite/misc-ming.all/displaylist_depths_test.c:
+ Add a bunch of new tests about removing from protected
+ depth ranges and using swapDepth to move between ranges.
+ * server/sprite_instance.{h,cpp}: Add a removeMovieClip
+ public method for common use by ActionRemoveClip tag,
+ global removeMovieClip function and MovieClip.removeMovieClip
+ method; fix swapDepths to accept a depth as argument;
+ fix removeMovieClip to check for allowed depth bounds.
+ * server/vm/ASHandlers.cpp (ActionRemoveClip): use the new
+ sprite_instance::removeMovieClip method.
+
+2007-04-06 Sandro Santilli <address@hidden>
+
* server/: character.h, dlist.{cpp,h}, sprite_instance.{cpp,h}:
Character instance depth is a _signed_ value !
Add a character::staticDepthOffset constant to use for converting
Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.225
retrieving revision 1.226
diff -u -b -r1.225 -r1.226
--- server/sprite_instance.cpp 6 Apr 2007 11:43:44 -0000 1.225
+++ server/sprite_instance.cpp 6 Apr 2007 15:36:05 -0000 1.226
@@ -130,12 +130,7 @@
static as_value sprite_remove_movieclip(const fn_call& fn)
{
boost::intrusive_ptr<sprite_instance> sprite =
ensureType<sprite_instance>(fn.this_ptr);
-
- sprite_instance* parent =
dynamic_cast<sprite_instance*>(sprite->get_parent());
- if (parent)
- {
- parent->remove_display_object(sprite->get_depth(), 0);
- }
+ sprite->removeMovieClip();
return as_value();
}
@@ -286,69 +281,108 @@
//swapDepths(target:Object) : Void
static as_value sprite_swap_depths(const fn_call& fn)
{
- boost::intrusive_ptr<sprite_instance> sprite =
ensureType<sprite_instance>(fn.this_ptr);
+ typedef boost::intrusive_ptr<sprite_instance> SpritePtr;
+ typedef boost::intrusive_ptr<character> CharPtr;
+
+ SpritePtr sprite = ensureType<sprite_instance>(fn.this_ptr);
+ int this_depth = sprite->get_depth();
+
+ // Lower bound of source depth below which swapDepth has no effect
+ static const int lowerDepthBound = -16384;
as_value rv;
+
if (fn.nargs < 1)
{
IF_VERBOSE_ASCODING_ERRORS(
- log_aserror("swapDepths needs one arg");
+ log_aserror("%s.swapDepths() needs one arg.",
sprite->getTarget().c_str());
);
return rv;
}
- boost::intrusive_ptr<character> target = NULL;
- if (fn.arg(0).is_object() )
+ if ( this_depth < lowerDepthBound )
{
- target =
boost::dynamic_pointer_cast<character>(fn.arg(0).to_object());
+ IF_VERBOSE_ASCODING_ERRORS(
+ stringstream ss; fn.dump_args(ss);
+ log_aserror("%s.swapDepths(%s) : won't swap a clip below depth
%d (%d).",
+ sprite->getTarget().c_str(), ss.str().c_str(),
lowerDepthBound, this_depth);
+ );
+ return rv;
}
- else if (fn.arg(0).is_number() )
- {
- // Macromedia Flash help says: depth starts at -16383 (0x3FFF)
- int target_depth = int(fn.arg(0).to_number()) + 16383 + 1;
- boost::intrusive_ptr<sprite_instance> parent =
dynamic_cast<sprite_instance*>(sprite->get_parent());
- if ( parent )
- {
- target = parent->get_character_at_depth(target_depth);
- }
- }
- else
+
+ SpritePtr this_parent =
dynamic_cast<sprite_instance*>(sprite->get_parent());
+ if ( ! this_parent )
{
IF_VERBOSE_ASCODING_ERRORS(
- log_aserror("swapDepths has received invalid arg\n");
+ stringstream ss; fn.dump_args(ss);
+ log_aserror("%s.swapDepths(%s): this sprite has no parent, "
+ "swapping depth of root ?",
+ sprite->getTarget().c_str(),
+ ss.str().c_str());
);
return rv;
}
- if (sprite == NULL || target == NULL)
+
+ CharPtr target = NULL;
+ int target_depth = 0;
+
+ // sprite.swapDepth(sprite)
+ if ( SpritePtr target_sprite = fn.arg(0).to_sprite() )
+ {
+ if ( sprite == target_sprite )
{
IF_VERBOSE_ASCODING_ERRORS(
- log_aserror("It is impossible to swap NULL character");
+ log_aserror("%s.swapDepths(%s): invalid call, swapping
to self?",
+ sprite->getTarget().c_str(),
target_sprite->getTarget().c_str());
);
return rv;
}
- if (sprite->get_parent() == target->get_parent() &&
sprite->get_parent() != NULL)
+ SpritePtr target_parent =
dynamic_cast<sprite_instance*>(sprite->get_parent());
+ if ( this_parent != target_parent )
{
- int target_depth = target->get_depth();
- target->set_depth(sprite->get_depth());
- sprite->set_depth(target_depth);
-
- boost::intrusive_ptr<sprite_instance> parent =
dynamic_cast<sprite_instance*>(sprite->get_parent());
- if ( parent )
- {
- parent->swap_characters(sprite.get(), target.get());
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("%s.swapDepths(%s): invalid call, the two
characters don't have the same parent",
+ sprite->getTarget().c_str(),
target_sprite->getTarget().c_str());
+ );
+ return rv;
}
+
+ target_depth = target_sprite->get_depth();
+ target = boost::dynamic_pointer_cast<character>(target_sprite);
}
else
{
+ // sprite.swapDepth(depth)
+ double td = fn.arg(0).to_number(&(fn.env()));
+ if ( isnan(td) )
+ {
IF_VERBOSE_ASCODING_ERRORS(
- log_aserror("Can't swap depth of MovieClips "
- "with different parents");
+ stringstream ss; fn.dump_args(ss);
+ log_aserror("%s.swapDepths(%s): first argument invalid "
+ "(neither a sprite nor a number).",
+ sprite->getTarget().c_str(),
+ ss.str().c_str());
);
+ return rv;
+ }
+
+ // TODO : check other kind of validities ?
+
+ target_depth = int(td);
+ target = this_parent->get_character_at_depth(target_depth);
+ }
+
+ sprite->set_depth(target_depth);
+ if ( target )
+ {
+ target->set_depth(this_depth);
+ this_parent->swap_characters(sprite.get(), target.get());
}
return rv;
+
}
// TODO: wrap the functionality in a sprite_instance method
@@ -3439,4 +3473,33 @@
}
}
+void
+sprite_instance::removeMovieClip()
+{
+ int depth = get_depth();
+ if ( depth < 0 || depth > 1048575 )
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("removeMovieClip(%s): sprite depth (%d) out of the "
+ "'dynamic' zone [0..1048575], won't remove",
+ getTarget().c_str(), depth);
+ );
+ return;
+ }
+
+ sprite_instance* parent = dynamic_cast<sprite_instance*>(get_parent());
+ if (parent)
+ {
+ // second argument is arbitrary, see comments above
+ // the function declaration in sprite_instance.h
+ parent->remove_display_object(depth, 0);
+ }
+ else
+ {
+ // I guess this can only happen if someone uses
_root.swapDepth([0..1048575])
+ log_error("Can't remove sprite %s as it has no parent!",
getTarget().c_str());
+ }
+
+}
+
} // namespace gnash
Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -b -r1.89 -r1.90
--- server/sprite_instance.h 6 Apr 2007 11:43:44 -0000 1.89
+++ server/sprite_instance.h 6 Apr 2007 15:36:05 -0000 1.90
@@ -17,7 +17,7 @@
//
//
-/* $Id: sprite_instance.h,v 1.89 2007/04/06 11:43:44 strk Exp $ */
+/* $Id: sprite_instance.h,v 1.90 2007/04/06 15:36:05 strk Exp $ */
// Stateful live Sprite instance
@@ -666,6 +666,30 @@
/// _target and _target_dot.
virtual void set_name(const char* name);
+ /// Remove this sprite from the stage.
+ //
+ /// This function is intended to be called by
+ /// effect of a removeMovieClip() ActionScript call
+ /// and implements the checks required for this specific
+ /// case.
+ ///
+ /// Callers are:
+ /// - The ActionRemoveClip tag handler.
+ /// - The global removeMovieClip(target) function.
+ /// - The MovieClip.removeMovieClip() method.
+ ///
+ /// The removal will not occur if the depth of this
+ /// characters is not in the "dynamic" range [0..1048575]
+ /// as described at the following URL:
+ ///
+ /// http://www.senocular.com/flash/tutorials/depths/?page=2
+ ///
+ /// A testcases for this behaviour can be found in
+ ///
+ /// testsuite/misc-ming.all/displaylist_depths_test.swf
+ ///
+ void removeMovieClip();
+
/// @{ Drawing API
void lineStyle(uint16_t thickness, const rgba& color)
Index: server/vm/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/vm/ASHandlers.cpp,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -b -r1.82 -r1.83
--- server/vm/ASHandlers.cpp 5 Apr 2007 19:33:54 -0000 1.82
+++ server/vm/ASHandlers.cpp 6 Apr 2007 15:36:05 -0000 1.83
@@ -14,7 +14,7 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-/* $Id: ASHandlers.cpp,v 1.82 2007/04/05 19:33:54 strk Exp $ */
+/* $Id: ASHandlers.cpp,v 1.83 2007/04/06 15:36:05 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1164,7 +1164,7 @@
void
SWFHandlers::ActionRemoveClip(ActionExec& thread)
{
-// GNASH_REPORT_FUNCTION;
+ //GNASH_REPORT_FUNCTION;
as_environment& env = thread.env;
thread.ensureStack(1);
@@ -1191,12 +1191,7 @@
return;
}
- sprite_instance* parent =
dynamic_cast<sprite_instance*>(sprite->get_parent());
- if (parent)
- {
- parent->remove_display_object(sprite->get_depth(), 0);
- }
-
+ sprite->removeMovieClip();
}
/// \brief Trace messages from the Flash movie using trace();
Index: testsuite/misc-ming.all/displaylist_depths_test.c
===================================================================
RCS file:
/sources/gnash/gnash/testsuite/misc-ming.all/displaylist_depths_test.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/misc-ming.all/displaylist_depths_test.c 6 Apr 2007 09:56:00
-0000 1.1
+++ testsuite/misc-ming.all/displaylist_depths_test.c 6 Apr 2007 15:36:05
-0000 1.2
@@ -33,20 +33,49 @@
#define OUTPUT_VERSION 6
#define OUTPUT_FILENAME "displaylist_depths_test.swf"
-static SWFMovieClip get_static_mc(void);
+void add_dynamic_mc(SWFMovie mo, const char* name, int depth, int x, int y,
int width, int height);
+void add_static_mc(SWFMovie mo, const char* name, int depth, int x, int y, int
width, int height);
-SWFMovieClip
-get_static_mc()
+void
+add_dynamic_mc(SWFMovie mo, const char* name, int depth, int x, int y, int
width, int height)
+{
+ SWFAction ac = compile_actions("createEmptyMovieClip('%s', %d);"
+ "with (%s) {"
+ " lineStyle(1, 0x000000, 100);"
+ " beginFill(0x00FF00, 100);"
+ " moveTo(%d, %d);"
+ " lineTo(%d, %d);"
+ " lineTo(%d, %d);"
+ " lineTo(%d, %d);"
+ " lineTo(%d, %d);"
+ " endFill();"
+ "}",
+ name, depth, name,
+ x, y,
+ x, y+height,
+ x+width, y+height,
+ x+width, y,
+ x, y);
+
+ SWFMovie_add(mo, (SWFBlock)ac);
+}
+
+void
+add_static_mc(SWFMovie mo, const char* name, int depth, int x, int y, int
width, int height)
{
SWFShape sh;
SWFMovieClip mc;
+ SWFDisplayItem it;
- sh = make_fill_square (0, 300, 60, 60, 255, 0, 0, 255, 0, 0);
+ sh = make_fill_square (x, y, width, height, 255, 0, 0, 255, 0, 0);
mc = newSWFMovieClip();
SWFMovieClip_add(mc, (SWFBlock)sh);
SWFMovieClip_nextFrame(mc);
+ it = SWFMovie_add(mo, (SWFBlock)mc);
+ SWFDisplayItem_setDepth(it, depth);
+ SWFDisplayItem_setName(it, name);
- return mc;
+ SWFMovie_add(mo, (SWFBlock)mc);
}
@@ -55,8 +84,6 @@
{
SWFMovie mo;
SWFMovieClip dejagnuclip;
- SWFMovieClip mc1;
- SWFDisplayItem it;
const char *srcdir=".";
if ( argc>1 )
@@ -70,44 +97,140 @@
Ming_init();
mo = newSWFMovieWithVersion(OUTPUT_VERSION);
SWFMovie_setDimension(mo, 800, 600);
- SWFMovie_setRate (mo, 12);
+ SWFMovie_setRate (mo, 2);
dejagnuclip = get_dejagnu_clip((SWFBlock)get_default_font(srcdir), 10,
0, 0, 800, 600);
SWFMovie_add(mo, (SWFBlock)dejagnuclip);
- SWFMovie_nextFrame(mo); // end of frame 1
+ SWFMovie_nextFrame(mo);
+ add_actions(mo, "note('Test placement of static and dynamic objects at
different depth ranges.');");
+ add_actions(mo, "note('Characters placed in *reserved* zones will not
be removed');");
+ add_actions(mo, "note('');");
+ add_actions(mo, "note('WARNING: Adobe flash player 9 seems to fail this
test, but flash player 7 succeeds.');");
+ add_actions(mo, "note(' Remember this before blaming Gnash for
breaking compatibility ;)');");
+ add_actions(mo, "note('');");
- // Add a static red square at depth 3
- mc1 = get_static_mc();
- it = SWFMovie_add(mo, (SWFBlock)mc1);
- SWFDisplayItem_setDepth(it, 3);
- SWFDisplayItem_setName(it, "staticmc");
- SWFMovie_nextFrame(mo); // end of frame 2
-
- // Create an (dynamic) green movieclip at depth 3
- add_actions(mo, "createEmptyMovieClip('dynamicmc', 3);"
- "with (dynamicmc) {"
- " lineStyle(1, 0x000000, 100);"
- " beginFill(0x00FF00, 100);"
- " moveTo(20, 320);"
- " lineTo(80, 320);"
- " lineTo(80, 380);"
- " lineTo(20, 380);"
- " lineTo(20, 320);"
- "}");
- SWFMovie_nextFrame(mo); // end of frame 3
+ // Add a static red square at depth 3 and another one at depth 4
+ add_static_mc(mo, "staticmc", 3, 0, 300, 60, 60);
+
+ // Create a dynamic green movieclip at depth 3
+ add_dynamic_mc(mo, "dynamicmc", 3, 20, 320, 60, 60);
+
+ // Create a dynamic green movieclip at depth -2000 (just below the
static one)
+ // The renderer seems to be still rendering this ABOVE the static one !
+ add_dynamic_mc(mo, "dynamicmc_2000", -2000, 20, 280, 60, 60);
+
+ // Create a dynamic green movieclip at depth -30000 (below the static
range)
+ add_dynamic_mc(mo, "dynamicmc_30000", -30000, 20, 280, 60, 60);
+
+ // Create a dynamic green movieclip at depth 0 (first in "dynamic" zone)
+ add_dynamic_mc(mo, "dynamicmc0", 0, 90, 320, 60, 60);
- // Check that both exist
+ // Create a dynamic green movieclip at depth 1048575 (last in "dynamic"
zone)
+ add_dynamic_mc(mo, "dynamicmc1048575", 1048575, 160, 320, 60, 60);
+
+ // Create a dynamic green movieclip at depth 1048576 (first in
"reserve" zone)
+ add_dynamic_mc(mo, "dynamicmc1048576", 1048576, 0, 390, 60, 60);
+
+ // Create a dynamic green movieclip at depth 2130690045 (last in
"reserve" zone)
+ // This seems to create the empty clip, but NOT render anything !
+ add_dynamic_mc(mo, "dynamicmc2130690045", 2130690045, 0, 390, 60, 60);
+
+ // Create a static red movieclip at depth 0
+ add_static_mc(mo, "staticmc0", 0, 0, 230, 60, 60);
+
+ // Check what depth has been each char created in
check_equals(mo, "typeof(staticmc)", "'movieclip'");
+ check_equals(mo, "staticmc.getDepth()", "-16381"); // converted at
negative depth !
check_equals(mo, "typeof(dynamicmc)", "'movieclip'");
-
- // Check that the static one had been moved at negative depth !
- check_equals(mo, "staticmc.getDepth()", "-16381");
check_equals(mo, "dynamicmc.getDepth()", "3");
+ check_equals(mo, "typeof(dynamicmc_2000)", "'movieclip'");
+ check_equals(mo, "dynamicmc_2000.getDepth()", "-2000");
+ check_equals(mo, "typeof(dynamicmc_30000)", "'movieclip'");
+ check_equals(mo, "dynamicmc_30000.getDepth()", "-30000");
+ check_equals(mo, "typeof(dynamicmc0)", "'movieclip'");
+ check_equals(mo, "dynamicmc0.getDepth()", "0");
+ check_equals(mo, "typeof(dynamicmc1048575)", "'movieclip'");
+ check_equals(mo, "dynamicmc1048575.getDepth()", "1048575");
+ check_equals(mo, "typeof(dynamicmc1048576)", "'movieclip'");
+ check_equals(mo, "dynamicmc1048576.getDepth()", "1048576");
+ check_equals(mo, "typeof(dynamicmc2130690045)", "'movieclip'");
+ check_equals(mo, "dynamicmc2130690045.getDepth()", "2130690045");
+ check_equals(mo, "typeof(staticmc0)", "'movieclip'");
+ check_equals(mo, "staticmc0.getDepth()", "-16384"); // converted at
negative depth !
+
+ SWFMovie_nextFrame(mo);
+
+ // Try removing all characters
+ add_actions(mo, "removeMovieClip(staticmc);"
+ "removeMovieClip(dynamicmc);"
+ "removeMovieClip(dynamicmc_2000);"
+ "removeMovieClip(dynamicmc_30000);"
+ "removeMovieClip(dynamicmc0);"
+ "removeMovieClip(dynamicmc1048575);"
+ "removeMovieClip(dynamicmc1048576);"
+ "removeMovieClip(dynamicmc2130690045);"
+ "removeMovieClip(staticmc0);"
+ );
+
+ // Check what gets removed and what not
+ check_equals(mo, "typeof(staticmc)", "'movieclip'");
+ check_equals(mo, "typeof(dynamicmc)", "'undefined'");
+ check_equals(mo, "typeof(dynamicmc_2000)", "'movieclip'"); // clip at
negative depth is not removed
+ check_equals(mo, "typeof(dynamicmc_30000)", "'movieclip'"); // clip at
negative depth is not removed
+ check_equals(mo, "typeof(dynamicmc0)", "'undefined'");
+ check_equals(mo, "typeof(dynamicmc1048575)", "'undefined'");
+ check_equals(mo, "typeof(dynamicmc1048576)", "'movieclip'"); // clip in
"reserved" zone not removed
+ check_equals(mo, "typeof(dynamicmc2130690045)", "'movieclip'"); // clip
in "reserved" zone not removed
+ check_equals(mo, "typeof(staticmc0)", "'movieclip'");
+
+ SWFMovie_nextFrame(mo);
+
+ // Move all non-removed chars to the "dynamic" depth range
+ // and try removing them again.
+ add_actions(mo, "staticmc.swapDepths(1000);"
+ "dynamicmc_2000.swapDepths(1001);"
+ "dynamicmc1048576.swapDepths(1002);"
+ "dynamicmc2130690045.swapDepths(1003);"
+ "staticmc0.swapDepths(1004);"
+ "dynamicmc_30000.swapDepths(1005);"
+ );
+
+ check_equals(mo, "staticmc.getDepth()", "1000");
+ check_equals(mo, "dynamicmc_2000.getDepth()", "1001");
+ check_equals(mo, "dynamicmc1048576.getDepth()", "1002");
+ // MM bug: swapDepths aginst this char (in reserved zone) doesn't do
+ // anything with player9. It works fine with player7.
+ check_equals(mo, "dynamicmc2130690045.getDepth()", "1003");
+ check_equals(mo, "staticmc0.getDepth()", "1004");
+ // swapDepth doesn't work for the clip at -30000 !!
+ check_equals(mo, "dynamicmc_30000.getDepth()", "-30000");
+
+ add_actions(mo, "removeMovieClip(staticmc);"
+ "removeMovieClip(dynamicmc_2000);"
+ "removeMovieClip(dynamicmc1048576);"
+ "removeMovieClip(dynamicmc2130690045);"
+ "removeMovieClip(staticmc0);"
+ );
+
+ // Check if we cleaned them all now
+ check_equals(mo, "typeof(staticmc)", "'undefined'");
+ check_equals(mo, "typeof(dynamicmc_2000)", "'undefined'");
+ check_equals(mo, "typeof(dynamicmc1048576)", "'undefined'");
+ // MM bug: swapDepths against this char (in reserved zone) didn't do
+ // anything with player9, so the removeMovieClip call against
+ // it still doesn't work. It works fine with player7.
+ check_equals(mo, "typeof(dynamicmc2130690045)", "'undefined'");
+ // MM bug?: altought the staticmc0 results undefined after the call
+ // to removeMovieClip, it is sill rendered !!
+ check_equals(mo, "typeof(staticmc0)", "'undefined'");
add_actions(mo, "_root.totals(); stop();");
SWFMovie_nextFrame(mo);
+ // TODO:
+ // - test the MovieClip and global version of removeMovieClip !
+
//Output movie
puts("Saving " OUTPUT_FILENAME );
SWFMovie_save(mo, OUTPUT_FILENAME);
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...,
Sandro Santilli <=
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv..., Sandro Santilli, 2007/04/10
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv..., Zou Lunkai, 2007/04/15
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv..., Sandro Santilli, 2007/04/16