gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Gnash-commit] gnash ChangeLog server/sprite_instance.h server...


From: zou lunkai
Subject: Re: [Gnash-commit] gnash ChangeLog server/sprite_instance.h server...
Date: Sun, 8 Apr 2007 16:57:04 +0800

-       frameno = iclamp(int(num), 1, m_def->get_frame_count())-1;
+     // all frame numbers >= 0 are valid, but a valid frame number may still
+     // reference a non-exist frame(eg. frameno > total_frames).
+      frameno = num - 1;

think about a hard-coded frame number within ActionGotoFrame tag, of
course it might be a value greater than total frames. And another
reason I didn't clamp it here is that if the specified frame number is
greater than total frames, the expected behavious is jumping to the
last frame but not pushing the actions of the last frame. So it's
slightly different as the ActionGotoFrame(last_frame).



On 4/8/07, Zou Lunkai <address@hidden> wrote:
CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Zou Lunkai <zoulunkai>  07/04/08 08:37:07

Modified files:
       .              : ChangeLog
       server         : sprite_instance.h sprite_instance.cpp
Added files:
       testsuite/misc-ming.all: get_frame_number_test.c

Log message:
       new testcase for get_frame_number() and fixs

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2810&r2=1.2811
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.90&r2=1.91
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.227&r2=1.228
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/get_frame_number_test.c?cvsroot=gnash&rev=1.1

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2810
retrieving revision 1.2811
diff -u -b -r1.2810 -r1.2811
--- ChangeLog   8 Apr 2007 08:06:58 -0000       1.2810
+++ ChangeLog   8 Apr 2007 08:37:07 -0000       1.2811
@@ -1,3 +1,11 @@
+2007-04-08 Zou Lunkai <address@hidden>
+
+       * testsuite/misc-ming.all:get_frame_number_test.c
+       new testcase for get_frame_number() and goto_frame().
+       *server/sprite_instance.h, sprite_instance.cpp
+       update implementation of get_frame_number() and goto_frame(),
+       fix the above the testcase.
+
 2007-04-08 Sandro Santilli <address@hidden>

       * testsuite/actionscript.all/XML.as: add tests for XML.attributes

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -b -r1.90 -r1.91
--- server/sprite_instance.h    6 Apr 2007 15:36:05 -0000       1.90
+++ server/sprite_instance.h    8 Apr 2007 08:37:07 -0000       1.91
@@ -17,7 +17,7 @@
 //
 //

-/* $Id: sprite_instance.h,v 1.90 2007/04/06 15:36:05 strk Exp $ */
+/* $Id: sprite_instance.h,v 1.91 2007/04/08 08:37:07 zoulunkai Exp $ */

 // Stateful live Sprite instance

@@ -279,14 +279,11 @@

       /// Parse frame spec and return a 0-based frame number.
       //
-       /// If frame spec cannot be converted to !NAN number
+       /// If frame spec cannot be converted to !NAN and !Infinity number
       /// it will be converted to a string and considered a
       /// frame label (returns false if referring to an
       /// unknwown label).
       ///
-       /// If frame spec can be converted to a non-zero positive
-       /// integer it will be "clamped" to the valid range.
-       ///
       /// @param frame_spec
       ///     The frame specification.
       ///

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.227
retrieving revision 1.228
diff -u -b -r1.227 -r1.228
--- server/sprite_instance.cpp  6 Apr 2007 16:23:43 -0000       1.227
+++ server/sprite_instance.cpp  8 Apr 2007 08:37:07 -0000       1.228
@@ -1725,11 +1725,11 @@

       as_environment* env = const_cast<as_environment*>(&m_as_environment);

-       double num =  frame_spec.to_number(env);
+       as_value str(frame_spec.to_std_string(env));

-       // TODO: check if a frame labeled "0" or "-3" or "Infinite"
-       //       takes precedence over the numerical value.
-       if ( isnan(num) )
+       double num =  str.to_number(env);
+
+       if ( isnan(num) || isinf(num))
       {
               return m_def->get_labeled_frame(frame_spec.to_string(env), 
&frameno);
       }
@@ -1737,7 +1737,10 @@
       // TODO: are we sure we shouldn't check for frames labeled with negative 
numbers ?
       if ( num < 1 ) return false;

-       frameno = iclamp(int(num), 1, m_def->get_frame_count())-1;
+       // all frame numbers >= 0 are valid, but a valid frame number may still
+       // reference a non-exist frame(eg. frameno > total_frames).
+       frameno = num - 1;
+
       return true;
 }

@@ -2424,15 +2427,20 @@

       assert(! isUnloaded() );

-       //      target_frame_number = iclamp(target_frame_number, 0, 
m_def->get_frame_count() - 1);
-       // Macromedia Flash ignores goto_frame(bad_frame)
-       if (target_frame_number > m_def->get_frame_count() - 1 ||
-                       target_frame_number == m_current_frame) // to prevent 
infinitive recursion
-       {
-               //FIXME: Don't set play state to STOP, just return will be more 
correct.
-               //  m_current_frame will be incremented in next advance_sprite, 
so I think
-               //  there will be no 'infinitive recursion' (Zou)
+       // goto_frame stops by default.
+       // ActionGotoFrame tells the movieClip to go to the target frame
+       // and stop at that frame.
               set_play_state(STOP);
+
+       if(target_frame_number == m_current_frame)
+       {
+               // don't push actions
+               return;
+       }
+       if(target_frame_number > m_def->get_frame_count() - 1)
+       {
+               m_current_frame = m_def->get_frame_count() - 1;
+               // don't push actions
               return;
       }

@@ -2513,10 +2521,6 @@
       //  current frame should also be executed(Zou)
       m_current_frame = target_frame_number;

-       // goto_frame stops by default.
-       // Zou: ActionGotoFrame tells the movieClip to go to the target frame
-       //  and stop at that frame.
-       set_play_state(STOP);

       // After entering to advance_sprite() m_current_frame points to frame
       // that already is executed.

Index: testsuite/misc-ming.all/get_frame_number_test.c
===================================================================
RCS file: testsuite/misc-ming.all/get_frame_number_test.c
diff -N testsuite/misc-ming.all/get_frame_number_test.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ testsuite/misc-ming.all/get_frame_number_test.c     8 Apr 2007 08:37:07 
-0000       1.1
@@ -0,0 +1,135 @@
+/*
+ *   Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+/*
+ * Zou Lunkai, address@hidden
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ming.h>
+
+#include "ming_utils.h"
+
+#define OUTPUT_VERSION 6
+#define OUTPUT_FILENAME  "get_frame_number_test.swf"
+
+
+int
+main(int argc, char** argv)
+{
+  SWFMovie mo;
+  SWFMovieClip  dejagnuclip;
+
+  const char *srcdir=".";
+  if ( argc>1 )
+    srcdir=argv[1];
+  else
+  {
+      fprintf(stderr, "Usage: %s <mediadir>\n", argv[0]);
+      return 1;
+  }
+
+  Ming_init();
+  mo = newSWFMovieWithVersion(OUTPUT_VERSION);
+  SWFMovie_setDimension(mo, 800, 600);
+  SWFMovie_setRate (mo, 12.0);
+
+  dejagnuclip = get_dejagnu_clip((SWFBlock)get_default_font(srcdir), 10, 0, 0, 
800, 600);
+  SWFMovie_add(mo, (SWFBlock)dejagnuclip);
+  SWFMovie_nextFrame(mo); /* 1st frame */
+
+
+  SWFMovie_labelFrame(mo, "8");
+  SWFMovie_nextFrame(mo); /* 2nd frame */
+
+  SWFMovie_labelFrame(mo, "8a");
+  SWFMovie_nextFrame(mo); /* 3rd frame */
+
+  SWFMovie_labelFrame(mo, "aa");
+  SWFMovie_nextFrame(mo); /* 4th frame*/
+
+  check_equals(mo, "_currentframe", "5");
+  add_actions(mo, " gotoAndStop('8'); ");         // ActionGotoLabel
+  check_equals(mo, "_currentframe", "2");
+  add_actions(mo, " gotoAndStop('xxxxxxxx'); ");  // ActionGotoLabel
+  check_equals(mo, "_currentframe", "2");
+  add_actions(mo, " gotoAndStop('Infinity'); ");  // ActionGotoLabel
+  check_equals(mo, "_currentframe", "2");
+  add_actions(mo, " gotoAndStop(Infinity); ");    // ActionGotoExpression
+  check_equals(mo, "_currentframe", "2");
+  add_actions(mo, " x = 0; "
+                  " gotoAndStop(x); ");         // ActionGotoExpression
+  check_equals(mo, "_currentframe", "2");
+  add_actions(mo, " x = -1; "
+                  " gotoAndStop(x); ");         // ActionGotoExpression
+  check_equals(mo, "_currentframe", "2");
+  add_actions(mo, " gotoAndStop(6); ");         // ActionGotoFrame
+  SWFMovie_nextFrame(mo); /* 5th frame */
+
+  add_actions(mo, "function func1() {}"
+                  "func1.prototype.toString = function() { return '8'; };"
+                  "x1 = new func1();"
+
+                  "function func2() {}"
+                  "func2.prototype.valueOf = function() { return 8;}; "
+                  "x2 = new func2();"
+
+                  "function func3() {}"
+                  "func3.prototype.toString = function() { return '8'; }; "
+                  "func3.prototype.valueOf = function() { return 8;};"
+                  "x3 = new func3();" );
+
+
+  add_actions(mo, " x = '8'; gotoAndStop(x); ");     // ActionGotoExpression
+  check_equals(mo, "_currentframe", "6");
+
+  add_actions(mo, " x = '8a'; gotoAndStop(x); ");    // ActionGotoExpression
+  check_equals(mo, "_currentframe", "3");
+
+  add_actions(mo, " x = 'aa'; gotoAndStop(x); ");    // ActionGotoExpression
+  check_equals(mo, "_currentframe", "4");
+
+  add_actions(mo, " gotoAndStop(x1); ");             // ActionGotoExpression
+  /* reach the last frame */
+  check_equals(mo, "_currentframe", "6");
+
+  /* reset _currentframe to 1 */
+  add_actions(mo, " gotoAndStop(1); ");
+  add_actions(mo, " gotoAndStop(x2); ");             // ActionGotoExpression
+  check_equals(mo, "_currentframe", "1");
+
+  add_actions(mo, " gotoAndStop(x3); ");             // ActionGotoExpression
+  /* reach the last frame */
+  check_equals(mo, "_currentframe", "6");
+
+  add_actions(mo, " _root.totals(); stop(); ");
+  SWFMovie_nextFrame(mo); /* 6th frame */
+
+  //Output movie
+  puts("Saving " OUTPUT_FILENAME );
+  SWFMovie_save(mo, OUTPUT_FILENAME);
+
+  return 0;
+}
+
+
+
+
+
+


_______________________________________________
Gnash-commit mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/gnash-commit





reply via email to

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