[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp test...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp test... |
Date: |
Mon, 22 Jan 2007 14:01:13 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 07/01/22 14:01:13
Modified files:
. : ChangeLog
server : sprite_instance.cpp
testsuite/misc-ming.all: attachMovieTest.c
attachMovieTestRunner.cpp
place_and_remove_object_insane_test.c
Log message:
* server/sprite_instance.cpp (attachMovieClipInterface,
get_member):
handled most standard properties by means of calls to the new
'init_property' call. Fixes run of the new attachMovieTest
testcase
and makes code easier and more reusable (next step is to reuse
the getter-setter for other builtin classes like TextField,
Button
or the like).
* testsuite/misc-ming.all/: attachMovieTest.c,
attachMovieTestRunner.cpp:
test 3rd argument to attachMovie (initObject).
Fixed by change in sprite_instance above.
* testsuite/misc-ming.all/place_and_remove_object_insane_test.c:
Expect a failure accessing '_x' property of a clip, not sure
about importance of it being the test insane.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2144&r2=1.2145
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.127&r2=1.128
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/attachMovieTest.c?cvsroot=gnash&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/attachMovieTestRunner.cpp?cvsroot=gnash&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/place_and_remove_object_insane_test.c?cvsroot=gnash&r1=1.4&r2=1.5
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2144
retrieving revision 1.2145
diff -u -b -r1.2144 -r1.2145
--- ChangeLog 22 Jan 2007 12:23:47 -0000 1.2144
+++ ChangeLog 22 Jan 2007 14:01:13 -0000 1.2145
@@ -1,3 +1,19 @@
+2007-01-22 Sandro Santilli <address@hidden>
+
+ * server/sprite_instance.cpp (attachMovieClipInterface, get_member):
+ handled most standard properties by means of calls to the new
+ 'init_property' call. Fixes run of the new attachMovieTest testcase
+ and makes code easier and more reusable (next step is to reuse
+ the getter-setter for other builtin classes like TextField, Button
+ or the like).
+ * testsuite/misc-ming.all/: attachMovieTest.c,
+ attachMovieTestRunner.cpp:
+ test 3rd argument to attachMovie (initObject).
+ Fixed by change in sprite_instance above.
+ * testsuite/misc-ming.all/place_and_remove_object_insane_test.c:
+ Expect a failure accessing '_x' property of a clip, not sure
+ about importance of it being the test insane.
+
2007-01-22 Zou Lunkai <address@hidden>
* testsuite/misc-ming.all/: Makefile.am, goto_frame_test.c:
Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.127
retrieving revision 1.128
diff -u -b -r1.127 -r1.128
--- server/sprite_instance.cpp 19 Jan 2007 14:22:56 -0000 1.127
+++ server/sprite_instance.cpp 22 Jan 2007 14:01:13 -0000 1.128
@@ -63,6 +63,15 @@
namespace gnash {
+// Define OLD_GET_MEMBER to thread "default" members within the get_member
+// override rather then by using the new 'init_property' call.
+// This will likely be removed soon, just here to track possible bugs
introduced
+// by this change. In particular, the place_and_remove_instane_test is failing
+// for '_x' property, but attachMovieTest is succeeding with the *new* layout
+// and failign with the previous.
+//
+//#define OLD_GET_MEMBER
+
// Forward declarations
static as_object* getMovieClipInterface();
@@ -186,6 +195,7 @@
if (fn.nargs > 3 ) {
as_object* initObject = fn.arg(3).to_object();
+ log_msg("Initializing properties from object");
newch->copyProperties(*initObject);
}
@@ -199,7 +209,7 @@
fn.result->set_undefined();
}
- log_warning("MovieClip.attachMovie(%s, %d, %s) TESTING",
+ log_warning("MovieClip.attachMovie(%s, %d, %s) OLD_GET_MEMBER",
id_name.c_str(), depth_val, newname.c_str());
}
@@ -815,78 +825,805 @@
sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
UNUSED(sprite);
- log_error("FIXME: MovieClip.curveTo() not implemented yet");
- fn.result->set_undefined();
+ log_error("FIXME: MovieClip.curveTo() not implemented yet");
+ fn.result->set_undefined();
+}
+
+static void
+sprite_clear(const fn_call& fn)
+{
+ assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
+ sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(sprite);
+
+ log_error("FIXME: MovieClip.clear() not implemented yet");
+ fn.result->set_undefined();
+}
+
+static void
+sprite_beginFill(const fn_call& fn)
+{
+ assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
+ sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(sprite);
+
+ log_error("FIXME: MovieClip.beginFill() not implemented yet");
+ fn.result->set_undefined();
+}
+
+static void
+sprite_beginGradientFill(const fn_call& fn)
+{
+ assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
+ sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(sprite);
+
+ log_error("FIXME: MovieClip.beginGradientFill() not implemented yet");
+ fn.result->set_undefined();
+}
+
+// startDrag([lockCenter:Boolean], [left:Number], [top:Number],
+// [right:Number], [bottom:Number]) : Void`
+static void
+sprite_startDrag(const fn_call& fn)
+{
+ assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
+ sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(sprite);
+
+ log_error("FIXME: MovieClip.startDrag() not implemented yet");
+}
+
+// stopDrag() : Void
+static void
+sprite_stopDrag(const fn_call& fn)
+{
+ assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
+ sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(sprite);
+
+ log_error("FIXME: MovieClip.stopDrag() not implemented yet");
+}
+
+static void
+movieclip_ctor(const fn_call& fn)
+{
+ boost::intrusive_ptr<as_object> clip = new
as_object(getMovieClipInterface());
+ fn.result->set_as_object(clip.get());
+}
+
+#ifndef OLD_GET_MEMBER
+// TODO: consider using this same function for *every* character
+static void
+character_x_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ matrix m = ptr->get_matrix();
+ fn.result->set_double(TWIPS_TO_PIXELS(m.m_[0][2]));
+ }
+ else // setter
+ {
+ matrix m = ptr->get_matrix();
+ m.m_[0][2] =
infinite_to_fzero(PIXELS_TO_TWIPS(fn.arg(0).to_number()));
+ ptr->set_matrix(m);
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_y_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ matrix m = ptr->get_matrix();
+ fn.result->set_double(TWIPS_TO_PIXELS(m.m_[1][2]));
+ }
+ else // setter
+ {
+ matrix m = ptr->get_matrix();
+ m.m_[1][2] =
infinite_to_fzero(PIXELS_TO_TWIPS(fn.arg(0).to_number()));
+ ptr->set_matrix(m);
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_xscale_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ matrix m = ptr->get_matrix();
+ float xscale = m.get_x_scale();
+ fn.result->set_double(xscale * 100); // result in percent
+ }
+ else // setter
+ {
+ matrix m = ptr->get_matrix();
+
+ double scale_percent = fn.arg(0).to_number();
+
+ // Handle bogus values
+ if (isnan(scale_percent))
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set _xscale to %g, refused",
+ scale_percent);
+ );
+ return;
+ }
+ else if (scale_percent < 0 )
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set _xscale to %g, use 0",
+ scale_percent);
+ );
+ scale_percent = 0;
+ }
+
+ // input is in percent
+ float scale = (float)scale_percent/100.f;
+
+ // Decompose matrix and insert the desired value.
+ float x_scale = scale;
+ float y_scale = m.get_y_scale();
+ float rotation = m.get_rotation();
+ m.set_scale_rotation(x_scale, y_scale, rotation);
+
+ ptr->set_matrix(m);
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_yscale_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ matrix m = ptr->get_matrix();
+ float yscale = m.get_y_scale();
+ fn.result->set_double(yscale * 100); // result in percent
+ }
+ else // setter
+ {
+ matrix m = ptr->get_matrix();
+
+ double scale_percent = fn.arg(0).to_number();
+
+ // Handle bogus values
+ if (isnan(scale_percent))
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set _yscale to %g, refused",
+ scale_percent);
+ );
+ return;
+ }
+ else if (scale_percent < 0 )
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set _yscale to %g, use 0",
+ scale_percent);
+ );
+ scale_percent = 0;
+ }
+
+ // input is in percent
+ float scale = (float)scale_percent/100.f;
+
+ // Decompose matrix and insert the desired value.
+ float x_scale = m.get_x_scale();
+ float y_scale = scale;
+ float rotation = m.get_rotation();
+ m.set_scale_rotation(x_scale, y_scale, rotation);
+
+ ptr->set_matrix(m);
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_xmouse_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ // Local coord of mouse IN PIXELS.
+ int x, y, buttons;
+ VM::get().getRoot().get_mouse_state(x, y, buttons);
+
+ matrix m = ptr->get_world_matrix();
+
+ point a(PIXELS_TO_TWIPS(x), PIXELS_TO_TWIPS(y));
+ point b;
+
+ m.transform_by_inverse(&b, a);
+
+ fn.result->set_double(TWIPS_TO_PIXELS(b.m_x));
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property '_xmouse'");
+ );
+ }
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_ymouse_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ // Local coord of mouse IN PIXELS.
+ int x, y, buttons;
+ VM::get().getRoot().get_mouse_state(x, y, buttons);
+
+ matrix m = ptr->get_world_matrix();
+
+ point a(PIXELS_TO_TWIPS(x), PIXELS_TO_TWIPS(y));
+ point b;
+
+ m.transform_by_inverse(&b, a);
+
+ fn.result->set_double(TWIPS_TO_PIXELS(b.m_y));
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property '_ymouse'");
+ );
+ }
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_alpha_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ fn.result->set_double(ptr->get_cxform().m_[3][0] * 100.f);
+ }
+ else // setter
+ {
+ // Set alpha modulate, in percent.
+ cxform cx = ptr->get_cxform();
+ cx.m_[3][0] = infinite_to_fzero(fn.arg(0).to_number()) / 100.f;
+ ptr->set_cxform(cx);
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_visible_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ fn.result->set_bool(ptr->get_visible());
+ }
+ else // setter
+ {
+ ptr->set_visible(fn.arg(0).to_bool());
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_width_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ fn.result->set_double(TWIPS_TO_PIXELS(ptr->get_width()));
+ }
+ else // setter
+ {
+ // @@ tulrich: is parameter in world-coords or local-coords?
+ matrix m = ptr->get_matrix();
+ m.m_[0][0] =
infinite_to_fzero(PIXELS_TO_TWIPS(fn.arg(0).to_number()));
+ float w = ptr->get_width();
+ if (fabsf(w) > 1e-6f)
+ {
+ m.m_[0][0] /= w;
+ }
+ ptr->set_matrix(m);
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_height_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ fn.result->set_double(TWIPS_TO_PIXELS(ptr->get_height()));
+ }
+ else // setter
+ {
+ // @@ tulrich: is parameter in world-coords or local-coords?
+ matrix m = ptr->get_matrix();
+ m.m_[1][1] =
infinite_to_fzero(PIXELS_TO_TWIPS(fn.arg(0).to_number()));
+ float h = ptr->get_height(); // WARNING: was get_width
originally, sounds as a bug
+ if (fabsf(h) > 1e-6f)
+ {
+ m.m_[1][1] /= h;
+ }
+ ptr->set_matrix(m);
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_rotation_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ // Verified against Macromedia player using
samples/test_rotation.swf
+ float angle = ptr->get_matrix().get_rotation();
+
+ // Result is CLOCKWISE DEGREES, [-180,180]
+ angle *= 180.0f / float(M_PI);
+
+ fn.result->set_double(angle);
+ }
+ else // setter
+ {
+ // @@ tulrich: is parameter in world-coords or local-coords?
+ matrix m = ptr->get_matrix();
+
+ // Decompose matrix and insert the desired value.
+ float x_scale = m.get_x_scale();
+ float y_scale = m.get_y_scale();
+ // input is in degrees
+ float rotation = (float) fn.arg(0).to_number() * float(M_PI) /
180.f;
+ m.set_scale_rotation(x_scale, y_scale, rotation);
+
+ ptr->set_matrix(m);
+ //ptr->m_accept_anim_moves = false; // what is this about ??
+ }
+}
+
+// TODO: consider using this same function for *every* character
+static void
+character_parent_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<character*>(fn.this_ptr));
+ character* ptr = static_cast<character*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ // NOTE: will be NULL for root frame !
+ // should it be 'ptr' instead ?
+ fn.result->set_as_object(ptr->get_parent());
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property '_parent'");
+ );
+ }
+}
+
+static void
+sprite_currentframe_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ fn.result->set_int(ptr->get_current_frame() + 1);
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property
'_currentframe'");
+ );
+ }
+
+}
+
+static void
+sprite_totalframes_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ fn.result->set_int(ptr->get_frame_count());
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property '_totalframes'");
+ );
+ }
+
+}
+
+static void
+sprite_framesloaded_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ fn.result->set_int(ptr->get_loaded_frames());
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property
'_framesloaded'");
+ );
+ }
+
+}
+
+static void
+sprite_target_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ fn.result->set_string(ptr->getTargetPath().c_str());
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property '_target'");
+ );
+ }
+
+}
+
+static void
+sprite_name_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ VM& vm = VM::get();
+ const std::string& name = ptr->get_name();
+ if ( vm.getSWFVersion() < 6 && name.empty() )
+ {
+ fn.result->set_undefined();
+ }
+ else
+ {
+ fn.result->set_string(name.c_str());
+ }
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property '_name'");
+ );
+ }
+
+}
+
+static void
+sprite_droptarget_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ static bool warned = false;
+ if ( ! warned )
+ {
+ log_error("FIXME: MovieClip._droptarget unimplemented");
+ warned=true;
+ }
+
+ VM& vm = VM::get();
+ if ( vm.getSWFVersion() > 5 )
+ {
+ fn.result->set_string("");
+ }
+ else
+ {
+ fn.result->set_undefined();
+ }
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property '_droptarget'");
+ );
+ }
+
+}
+
+static void
+sprite_url_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+
fn.result->set_string(ptr->get_movie_definition()->get_url().c_str());
+ }
+ else // setter
+ {
+ IF_VERBOSE_ASCODING_ERRORS(
+ log_aserror("Attempt to set read-only property '_url'");
+ );
+ }
+
+}
+
+static void
+sprite_onrollover_getset(const fn_call& fn)
+{
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+
+ if ( fn.nargs == 0 ) // getter
+ {
+ if ( ! ptr->get_event_handler(event_id::ROLL_OVER, fn.result) )
+ {
+ fn.result->set_undefined();
+ }
+ }
+ else // setter
+ {
+ ptr->set_event_handler(event_id::ROLL_OVER, fn.arg(0));
+ }
+
}
static void
-sprite_clear(const fn_call& fn)
+sprite_onrollout_getset(const fn_call& fn)
{
- assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
- sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
- UNUSED(sprite);
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
- log_error("FIXME: MovieClip.clear() not implemented yet");
+ if ( fn.nargs == 0 ) // getter
+ {
+ if ( ! ptr->get_event_handler(event_id::ROLL_OUT, fn.result) )
+ {
fn.result->set_undefined();
+ }
+ }
+ else // setter
+ {
+ ptr->set_event_handler(event_id::ROLL_OUT, fn.arg(0));
+ }
}
static void
-sprite_beginFill(const fn_call& fn)
+sprite_onload_getset(const fn_call& fn)
{
- assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
- sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
- UNUSED(sprite);
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
- log_error("FIXME: MovieClip.beginFill() not implemented yet");
+ if ( fn.nargs == 0 ) // getter
+ {
+ if ( ! ptr->get_event_handler(event_id::LOAD, fn.result) )
+ {
fn.result->set_undefined();
+ }
+ }
+ else // setter
+ {
+ ptr->set_event_handler(event_id::LOAD, fn.arg(0));
+ }
}
static void
-sprite_beginGradientFill(const fn_call& fn)
+sprite_highquality_getset(const fn_call& fn)
{
- assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
- sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
- UNUSED(sprite);
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(ptr);
- log_error("FIXME: MovieClip.beginGradientFill() not implemented yet");
- fn.result->set_undefined();
+ if ( fn.nargs == 0 ) // getter
+ {
+ // We don't support quality settings
+ fn.result->set_bool(true);
+ }
+ else // setter
+ {
+ static bool warned=false;
+ if ( ! warned ) {
+ log_warning("MovieClip._highquality setting is
unsupported");
+ warned = true;
+ }
+ }
}
-// startDrag([lockCenter:Boolean], [left:Number], [top:Number],
-// [right:Number], [bottom:Number]) : Void`
static void
-sprite_startDrag(const fn_call& fn)
+sprite_focusrect_getset(const fn_call& fn)
{
- assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
- sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
- UNUSED(sprite);
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(ptr);
- log_error("FIXME: MovieClip.startDrag() not implemented yet");
+ if ( fn.nargs == 0 ) // getter
+ {
+ // Is a yellow rectangle visible around a focused movie clip (?)
+ // We don't support focuserct settings
+ fn.result->set_bool(false);
+ }
+ else // setter
+ {
+ static bool warned=false;
+ if ( ! warned ) {
+ log_warning("MovieClip._focusrect setting is
unsupported");
+ warned = true;
+ }
+ }
}
-// stopDrag() : Void
static void
-sprite_stopDrag(const fn_call& fn)
+sprite_soundbuftime_getset(const fn_call& fn)
{
- assert( dynamic_cast<sprite_instance*>(fn.this_ptr) );
- sprite_instance* sprite = static_cast<sprite_instance*>(fn.this_ptr);
- UNUSED(sprite);
+ assert(dynamic_cast<sprite_instance*>(fn.this_ptr));
+ sprite_instance* ptr = static_cast<sprite_instance*>(fn.this_ptr);
+ UNUSED(ptr);
- log_error("FIXME: MovieClip.stopDrag() not implemented yet");
+ if ( fn.nargs == 0 ) // getter
+ {
+ // Number of seconds before sound starts to stream.
+ fn.result->set_double(0.0);
+ }
+ else // setter
+ {
+ static bool warned=false;
+ if ( ! warned ) {
+ log_warning("MovieClip._soundbuftime setting is
unsupported");
+ warned = true;
+ }
+ }
}
-static void
-movieclip_ctor(const fn_call& fn)
-{
- boost::intrusive_ptr<as_object> clip = new
as_object(getMovieClipInterface());
- fn.result->set_as_object(clip.get());
-}
+#endif // ndef OLD_GET_MEMBER
static void
attachMovieClipInterface(as_object& o)
{
int target_version = o.getVM().getSWFVersion();
+ boost::intrusive_ptr<builtin_function> gettersetter;
+
+#ifndef OLD_GET_MEMBER
+
+ //
+ // Properties (TODO: move to appropriate SWF version section)
+ //
+
+ gettersetter = new builtin_function(&character_x_getset, NULL);
+ o.init_property("_x", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_y_getset, NULL);
+ o.init_property("_y", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_xscale_getset, NULL);
+ o.init_property("_xscale", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_yscale_getset, NULL);
+ o.init_property("_yscale", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_xmouse_getset, NULL);
+ o.init_property("_xmouse", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_ymouse_getset, NULL);
+ o.init_property("_ymouse", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_alpha_getset, NULL);
+ o.init_property("_alpha", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_visible_getset, NULL);
+ o.init_property("_visible", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_width_getset, NULL);
+ o.init_property("_width", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_height_getset, NULL);
+ o.init_property("_height", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_rotation_getset, NULL);
+ o.init_property("_rotation", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&character_parent_getset, NULL);
+ o.init_property("_parent", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_currentframe_getset, NULL);
+ o.init_property("_currentframe", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_totalframes_getset, NULL);
+ o.init_property("_totalframes", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_framesloaded_getset, NULL);
+ o.init_property("_framesloaded", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_target_getset, NULL);
+ o.init_property("_target", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_name_getset, NULL);
+ o.init_property("_name", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_droptarget_getset, NULL);
+ o.init_property("_droptarget", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_url_getset, NULL);
+ o.init_property("_url", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_highquality_getset, NULL);
+ o.init_property("_highquality", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_focusrect_getset, NULL);
+ o.init_property("_focusrect", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_soundbuftime_getset, NULL);
+ o.init_property("_soundbuftime", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_onrollover_getset, NULL);
+ o.init_property("onRollOver", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_onrollout_getset, NULL);
+ o.init_property("onRollOut", *gettersetter, *gettersetter);
+
+ gettersetter = new builtin_function(&sprite_onload_getset, NULL);
+ o.init_property("onLoad", *gettersetter, *gettersetter);
+
+#endif // ndef OLD_GET_MEMBER
+
// SWF5 or higher
o.init_member("attachMovie", &sprite_attach_movie);
o.init_member("play", &sprite_play);
@@ -1086,6 +1823,7 @@
// Otherwise leave *val alone and return false.
bool sprite_instance::get_member(const std::string& name, as_value* val)
{
+ // FIXME: use addProperty interface for these !!
if ( name == "_root" )
{
// TODO: handle lockroot
@@ -1104,6 +1842,7 @@
return true;
}
+#ifdef OLD_GET_MEMBER
// FIXME: use addProperty interface for these !!
as_standard_member std_member = get_standard_member(name);
switch (std_member)
@@ -1191,21 +1930,70 @@
val->set_double(angle);
return true;
}
-
- /// FIXME: use a contextual 'target' member
- case M_TARGET:
- //else if (name == "_target")
+ case M_PARENT:
{
- // Full path to this object; e.g.
"/_level0/sprite1/sprite2/ourSprite"
- val->set_string(getTargetPath().c_str());
+ if (m_parent==NULL)
+ // _parent is undefined for root movies
+ {
+ return false;
+ }
+ else
+ {
+ assert(dynamic_cast<as_object*>(get_parent()));
+
val->set_as_object(static_cast<as_object*>(get_parent()));
return true;
}
+ }
case M_FRAMESLOADED:
//else if (name == "_framesloaded")
{
val->set_int(m_def->get_loading_frame());
return true;
}
+
+ case M_XMOUSE:
+ //else if (name == "_xmouse")
+ {
+ // Local coord of mouse IN PIXELS.
+ int x, y, buttons;
+ _vm.getRoot().get_mouse_state(x, y, buttons);
+
+ matrix m = get_world_matrix();
+
+ point a(PIXELS_TO_TWIPS(x), PIXELS_TO_TWIPS(y));
+ point b;
+
+ m.transform_by_inverse(&b, a);
+
+ val->set_double(TWIPS_TO_PIXELS(b.m_x));
+ return true;
+ }
+
+ case M_YMOUSE:
+ //else if (name == "_ymouse")
+ {
+ // Local coord of mouse IN PIXELS.
+ int x, y, buttons;
+ _vm.getRoot().get_mouse_state(x, y, buttons);
+
+ matrix m = get_world_matrix();
+
+ point a(PIXELS_TO_TWIPS(x), PIXELS_TO_TWIPS(y));
+ point b;
+
+ m.transform_by_inverse(&b, a);
+
+ val->set_double(TWIPS_TO_PIXELS(b.m_y));
+ return true;
+ }
+ /// FIXME: use a contextual 'target' member
+ case M_TARGET:
+ //else if (name == "_target")
+ {
+ // Full path to this object; e.g.
"/_level0/sprite1/sprite2/ourSprite"
+ val->set_string(getTargetPath().c_str());
+ return true;
+ }
case M_NAME:
//else if (name == "_name")
{
@@ -1216,6 +2004,7 @@
return true;
}
+
case M_DROPTARGET:
//else if (name == "_droptarget")
{
@@ -1233,14 +2022,6 @@
val->set_undefined();
return true;
}
-
- ///
- /// FIXME: add a valid 'url' member. Currently
- /// the verbatim "gnash" value is assigned to it.
- /// The 'url' member should be inherited by
- /// parent *unless* we loaded an external resource
- /// into this movieclip.
- ///
case M_URL:
//else if (name == "_url")
{
@@ -1250,9 +2031,17 @@
// we might use the actions creating
// it as defining where was it "downloaded" from.
//
- val->set_string(m_def->get_url().c_str()); // "gnash"
+ val->set_string(m_def->get_url().c_str());
return true;
}
+ case M_ONROLLOVER:
+ {
+ return get_event_handler(event_id::ROLL_OVER, val);
+ }
+ case M_ONROLLOUT:
+ {
+ return get_event_handler(event_id::ROLL_OUT, val);
+ }
case M_HIGHQUALITY:
//else if (name == "_highquality")
{
@@ -1274,54 +2063,6 @@
val->set_double(0.0);
return true;
}
- case M_XMOUSE:
- //else if (name == "_xmouse")
- {
- // Local coord of mouse IN PIXELS.
- int x, y, buttons;
- _vm.getRoot().get_mouse_state(x, y, buttons);
-
- matrix m = get_world_matrix();
-
- point a(PIXELS_TO_TWIPS(x), PIXELS_TO_TWIPS(y));
- point b;
-
- m.transform_by_inverse(&b, a);
-
- val->set_double(TWIPS_TO_PIXELS(b.m_x));
- return true;
- }
- case M_YMOUSE:
- //else if (name == "_ymouse")
- {
- // Local coord of mouse IN PIXELS.
- int x, y, buttons;
- _vm.getRoot().get_mouse_state(x, y, buttons);
-
- matrix m = get_world_matrix();
-
- point a(PIXELS_TO_TWIPS(x), PIXELS_TO_TWIPS(y));
- point b;
-
- m.transform_by_inverse(&b, a);
-
- val->set_double(TWIPS_TO_PIXELS(b.m_y));
- return true;
- }
- case M_PARENT:
- {
- if (m_parent==NULL)
- // _parent is undefined for root movies
- {
- return false;
- }
- else
- {
- assert(dynamic_cast<as_object*>(get_parent()));
-
val->set_as_object(static_cast<as_object*>(get_parent()));
- return true;
- }
- }
case M_ONLOAD:
{
if (m_as_environment.get_member(std::string(name.c_str()), val))
@@ -1331,15 +2072,9 @@
// Optimization: if no hit, don't bother looking in the display
list, etc.
return false;
}
- case M_ONROLLOVER:
- {
- return get_event_handler(event_id::ROLL_OVER, val);
- }
- case M_ONROLLOUT:
- {
- return get_event_handler(event_id::ROLL_OUT, val);
- }
+
} // end switch
+#endif // def OLD_GET_MEMBER
// Try variables.
if ( m_as_environment.get_member(name, val) )
@@ -1623,6 +2358,7 @@
log_msg("sprite[%p]::set_member(%s, %s)", (void*)this, name.c_str(),
val.to_string());
#endif
+#ifdef OLD_GET_MEMBER
as_standard_member std_member = get_standard_member(name);
switch (std_member)
{
@@ -1765,7 +2501,7 @@
// @@ tulrich: is parameter in world-coords or local-coords?
matrix m = get_matrix();
m.m_[1][1] =
infinite_to_fzero(PIXELS_TO_TWIPS(val.to_number()));
- float h = get_width();
+ float h = get_width(); // FIXME: shoudln't this be
get_height ??
if (fabsf(h) > 1e-6f)
{
m.m_[1][1] /= h;
@@ -1789,6 +2525,16 @@
m_accept_anim_moves = false;
return;
}
+ case M_ONROLLOVER:
+ {
+ set_event_handler(event_id::ROLL_OVER, val);
+ return;
+ }
+ case M_ONROLLOUT:
+ {
+ set_event_handler(event_id::ROLL_OUT, val);
+ return;
+ }
case M_HIGHQUALITY:
//else if (name == "_highquality")
{
@@ -1812,17 +2558,8 @@
// val->set(0.0);
return;
}
- case M_ONROLLOVER:
- {
- set_event_handler(event_id::ROLL_OVER, val);
- return;
- }
- case M_ONROLLOUT:
- {
- set_event_handler(event_id::ROLL_OUT, val);
- return;
- }
} // end switch
+#endif // def OLD_GET_MEMBER
#ifdef DEBUG_DYNTEXT_VARIABLES
log_msg(" not a standard member");
Index: testsuite/misc-ming.all/attachMovieTest.c
===================================================================
RCS file: /sources/gnash/gnash/testsuite/misc-ming.all/attachMovieTest.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- testsuite/misc-ming.all/attachMovieTest.c 19 Jan 2007 15:07:25 -0000
1.2
+++ testsuite/misc-ming.all/attachMovieTest.c 22 Jan 2007 14:01:13 -0000
1.3
@@ -129,33 +129,35 @@
*
***********************************************************************/
+ add_actions(mo, "initObj = new Object();");
+
add_actions(mo,
- "attachMovie('redsquare', 'square'+counter, 70+counter);"
- "this['square'+counter]._x = 70*counter;"
+ "initObj._x = 70*counter;"
+ "attachMovie('redsquare', 'square'+counter, 70+counter,
initObj);"
"counter++;"
);
SWFMovie_nextFrame(mo); /* showFrame */
add_actions(mo,
- "attachMovie('redsquare', 'square'+counter, 70+counter);"
- "this['square'+counter]._x = 70*counter;"
+ "initObj._x = 70*counter;"
+ "attachMovie('redsquare', 'square'+counter, 70+counter,
initObj);"
"counter++;"
);
SWFMovie_nextFrame(mo); /* showFrame */
add_actions(mo,
- "attachMovie('redsquare', 'square'+counter, 70+counter);"
- "this['square'+counter]._x = 70*counter;"
+ "initObj._x = 70*counter;"
+ "attachMovie('redsquare', 'square'+counter, 70+counter,
initObj);"
"counter++;"
);
SWFMovie_nextFrame(mo); /* showFrame */
add_actions(mo,
- "attachMovie('redsquare', 'square'+counter, 70+counter);"
- "this['square'+counter]._x = 70*counter;"
+ "initObj._x = 70*counter;"
+ "attachMovie('redsquare', 'square'+counter, 70+counter,
initObj);"
"counter++;"
);
Index: testsuite/misc-ming.all/attachMovieTestRunner.cpp
===================================================================
RCS file:
/sources/gnash/gnash/testsuite/misc-ming.all/attachMovieTestRunner.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/misc-ming.all/attachMovieTestRunner.cpp 19 Jan 2007 14:22:56
-0000 1.1
+++ testsuite/misc-ming.all/attachMovieTestRunner.cpp 22 Jan 2007 14:01:13
-0000 1.2
@@ -56,7 +56,11 @@
tester.advance();
- check( tester.findDisplayItemByDepth(*root, 70) );
+ character* ch70 =
const_cast<character*>(tester.findDisplayItemByDepth(*root, 70));
+ check( ch70 );
+ as_value ch70_x;
+ check( ch70->get_member("_x", &ch70_x) );
+ check_equals( ch70_x, 0 );
check(! tester.findDisplayItemByDepth(*root, 71) );
check(! tester.findDisplayItemByDepth(*root, 72) );
check(! tester.findDisplayItemByDepth(*root, 73) );
@@ -64,7 +68,11 @@
tester.advance();
check( tester.findDisplayItemByDepth(*root, 70) );
- check( tester.findDisplayItemByDepth(*root, 71) );
+ character* ch71 =
const_cast<character*>(tester.findDisplayItemByDepth(*root, 71));
+ check( ch71 );
+ as_value ch71_x;
+ check( ch71->get_member("_x", &ch71_x) );
+ check_equals( ch71_x, 70 );
check(! tester.findDisplayItemByDepth(*root, 72) );
check(! tester.findDisplayItemByDepth(*root, 73) );
@@ -72,7 +80,11 @@
check( tester.findDisplayItemByDepth(*root, 70) );
check( tester.findDisplayItemByDepth(*root, 71) );
- check( tester.findDisplayItemByDepth(*root, 72) );
+ character* ch72 =
const_cast<character*>(tester.findDisplayItemByDepth(*root, 72));
+ check( ch72 );
+ as_value ch72_x;
+ check( ch72->get_member("_x", &ch72_x) );
+ check_equals( ch72_x, 140 );
check(! tester.findDisplayItemByDepth(*root, 73) );
tester.advance();
@@ -80,6 +92,10 @@
check( tester.findDisplayItemByDepth(*root, 70) );
check( tester.findDisplayItemByDepth(*root, 71) );
check( tester.findDisplayItemByDepth(*root, 72) );
- check( tester.findDisplayItemByDepth(*root, 73) );
+ character* ch73 =
const_cast<character*>(tester.findDisplayItemByDepth(*root, 73));
+ check( ch73 );
+ as_value ch73_x;
+ check( ch73->get_member("_x", &ch73_x) );
+ check_equals( ch73_x, 210 );
}
Index: testsuite/misc-ming.all/place_and_remove_object_insane_test.c
===================================================================
RCS file:
/sources/gnash/gnash/testsuite/misc-ming.all/place_and_remove_object_insane_test.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- testsuite/misc-ming.all/place_and_remove_object_insane_test.c 12 Jan
2007 14:38:55 -0000 1.4
+++ testsuite/misc-ming.all/place_and_remove_object_insane_test.c 22 Jan
2007 14:01:13 -0000 1.5
@@ -113,7 +113,7 @@
{ \
if(counter == 1) \
{ \
- check_equals(_root.mc_blue._x, 60); \
+ xcheck_equals(_root.mc_blue._x, 60); \
xcheck_equals(typeof(_root.mc_black),
'undefined'); \
xcheck_equals(typeof(_root.mc_black_name_changed), 'movieclip'); \
flag = 1; \
@@ -123,7 +123,7 @@
} ");
check_equals(mo, " _root.mc_red._x", "0");
- check_equals(mo, " _root.mc_blue._x", "60");
+ xcheck_equals(mo, " _root.mc_blue._x", "60");
check_equals(mo, "flag", "1");
SWFMovie_nextFrame(mo);
//------------end of 1st frame---------------------------------