gnash-commit
[Top][All Lists]
Advanced

[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---------------------------------




reply via email to

[Prev in Thread] Current Thread [Next in Thread]