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 serv...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...
Date: Wed, 09 Apr 2008 09:29:00 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  08/04/09 09:28:59

Modified files:
        .              : ChangeLog 
        server         : sprite_instance.cpp 
        server/parser  : sprite_definition.cpp sprite_definition.h 
        server/swf     : tag_loaders.cpp 
        testsuite/misc-swfmill.all: zeroframe_definesprite.xml 

Log message:
                * server/parser/sprite_definition.h: overrides from public 
virtuals
                  in base class can as well be public here; comment out the
                  assertion insisting in getPlaylist requiring a frame number <
                  the advertised number of frames (we must support advertising
                  less frames then available, in particular: 0).
                * server/parser/sprite_definition.cpp (read): always warn about
                  malformed swf, not just the first time. It will stop at end of
                  parsing anyway.
                * server/sprite_instance.cpp:
                  (stagePlacementCallback): still try to execute tags in first 
frame,
                  even if there were no SHOWFRAME tags (fixes bug #22872).
                  (sprite_currentframe_get): return min between loaded frame
                  and current frame (well, yes, it seems real current frame may 
be
                  > then loaded, in gnash model).
                * server/swf/tag_loaders.cpp (sprite_loader): warn' here about
                  no frames advertised (so we have the character id).
                * testsuite/misc-swfmill.all/zeroframe_definesprite.xml: test
                  that tags in first frame of a 0-advertised 0-showframe
                  sprite are still executed.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.6223&r2=1.6224
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.498&r2=1.499
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.cpp?cvsroot=gnash&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.h?cvsroot=gnash&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/tag_loaders.cpp?cvsroot=gnash&r1=1.193&r2=1.194
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-swfmill.all/zeroframe_definesprite.xml?cvsroot=gnash&r1=1.2&r2=1.3

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.6223
retrieving revision 1.6224
diff -u -b -r1.6223 -r1.6224
--- ChangeLog   8 Apr 2008 21:59:22 -0000       1.6223
+++ ChangeLog   9 Apr 2008 09:28:57 -0000       1.6224
@@ -1,3 +1,25 @@
+2008-04-09 Sandro Santilli <address@hidden>
+
+       * server/parser/sprite_definition.h: overrides from public virtuals
+         in base class can as well be public here; comment out the
+         assertion insisting in getPlaylist requiring a frame number <
+         the advertised number of frames (we must support advertising
+         less frames then available, in particular: 0).
+       * server/parser/sprite_definition.cpp (read): always warn about
+         malformed swf, not just the first time. It will stop at end of
+         parsing anyway.
+       * server/sprite_instance.cpp:
+         (stagePlacementCallback): still try to execute tags in first frame,
+         even if there were no SHOWFRAME tags (fixes bug #22872).
+         (sprite_currentframe_get): return min between loaded frame
+         and current frame (well, yes, it seems real current frame may be
+         > then loaded, in gnash model).
+       * server/swf/tag_loaders.cpp (sprite_loader): warn' here about
+         no frames advertised (so we have the character id).
+       * testsuite/misc-swfmill.all/zeroframe_definesprite.xml: test
+         that tags in first frame of a 0-advertised 0-showframe 
+         sprite are still executed.
+
 2008-04-08 Sandro Santilli <address@hidden>
 
        * server/as_object.{cpp,h}: add init_readonly_property taking

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.498
retrieving revision 1.499
diff -u -b -r1.498 -r1.499
--- server/sprite_instance.cpp  8 Apr 2008 21:59:23 -0000       1.498
+++ server/sprite_instance.cpp  9 Apr 2008 09:28:58 -0000       1.499
@@ -1818,7 +1818,7 @@
 {
   boost::intrusive_ptr<sprite_instance> ptr = 
ensureType<sprite_instance>(fn.this_ptr);
 
-  return as_value(ptr->get_current_frame() + 1);
+  return as_value(std::min(ptr->get_loaded_frames(), ptr->get_current_frame() 
+ 1));
 }
 
 static as_value
@@ -2976,7 +2976,7 @@
 {
   testInvariant();
 
-  assert(frame < get_loaded_frames());
+  //assert(frame < get_loaded_frames());
 
   assert(typeflags);
 
@@ -3988,6 +3988,7 @@
   // See testsuite/misc-swfmill.all/zeroframe_definesprite.swf
   //m_def->ensure_frame_loaded(0);
 
+#if 0
   // We might have loaded NO frames !
   bool hasFrames = get_loaded_frames();
   if ( ! hasFrames )
@@ -3996,6 +3997,7 @@
     ONCE( log_swferror(_("stagePlacementCallback: no frames loaded for 
sprite/movie %s"), getTarget()) );
     );
   }
+#endif
 
   // We execute events immediately when the stage-placed character is dynamic.
   // This is becase we assume that this means that the character is placed 
during
@@ -4039,13 +4041,10 @@
   assert(!_callingFrameActions); // or will not be queuing actions
   if ( get_parent() == 0 )
   {
-    if ( hasFrames )
-    {
 #ifdef GNASH_DEBUG
       log_debug(_("Executing tags of frame0 in sprite %s"), getTarget());
 #endif
       execute_frame_tags(0, TAG_DLIST|TAG_ACTION);
-    }
 
     if ( _vm.getSWFVersion() > 5 )
     {
@@ -4064,14 +4063,11 @@
 #endif
     queueEvent(event_id::LOAD, movie_root::apDOACTION);
 
-    if ( hasFrames )
-    {
 #ifdef GNASH_DEBUG
       log_debug(_("Executing tags of frame0 in sprite %s"), getTarget());
 #endif
       execute_frame_tags(0, TAG_DLIST|TAG_ACTION);
     }
-  }
 
 }
 

Index: server/parser/sprite_definition.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- server/parser/sprite_definition.cpp 3 Apr 2008 09:43:16 -0000       1.30
+++ server/parser/sprite_definition.cpp 9 Apr 2008 09:28:59 -0000       1.31
@@ -156,15 +156,14 @@
         if ( m_frame_count > m_loading_frame )
         {
                IF_VERBOSE_MALFORMED_SWF(
-               ONCE( log_swferror(_(SIZET_FMT " frames advertised in header, 
but only " SIZET_FMT " SHOWFRAME tags "
-                       "found in define sprite. Is a common thing, will warn 
only once."), m_frame_count, m_loading_frame) );
+               log_swferror(_("%d frames advertised in header, but only %d 
SHOWFRAME tags "
+                       "found in define sprite."), m_frame_count, 
m_loading_frame );
                );
 
                // this should be safe 
                m_loading_frame = m_frame_count;
         }
 
-
                IF_VERBOSE_PARSE (
        log_parse(_("  -- sprite END --"));
                );

Index: server/parser/sprite_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- server/parser/sprite_definition.h   3 Mar 2008 17:45:01 -0000       1.39
+++ server/parser/sprite_definition.h   9 Apr 2008 09:28:59 -0000       1.40
@@ -109,41 +109,14 @@
                _timeline.getFrameDepths(frameno, depths);
        }
 
-private:
-
-       void read(stream* in);
-
-       /// Tags loader table.
-       //
-       /// TODO: make it a static member, specific to sprite_definition
-       SWF::TagLoadersTable& _tag_loaders;
-
-       /// Top-level movie definition
-       /// (the definition read from SWF stream)
-       movie_definition* m_movie_def;
-
-       typedef std::map<size_t, PlayList> PlayListMap;
-
-       /// movie control events for each frame.
-       PlayListMap m_playlist;
-
-       // stores 0-based frame #'s
-       typedef std::map<std::string, size_t> NamedFrameMap;
-       NamedFrameMap m_named_frames;
-
-       size_t m_frame_count;
-
-       // Number of frames completely parsed 
-       size_t m_loading_frame;
-
-       // overloads from movie_definition
+       // overload from movie_definition
        virtual float   get_width_pixels() const { return 1; }
+
+       // overload from movie_definition
        virtual float   get_height_pixels() const { return 1; }
 
-       virtual size_t  get_frame_count() const
-       {
-               return m_frame_count;
-       }
+       // overload from movie_definition
+       virtual size_t  get_frame_count() const { return m_frame_count; }
 
        /// \brief
        /// Return total bytes of the movie from which this sprite
@@ -278,6 +251,34 @@
                character* parent, int id);
 
 
+private:
+
+       void read(stream* in);
+
+       /// Tags loader table.
+       //
+       /// TODO: make it a static member, specific to sprite_definition
+       SWF::TagLoadersTable& _tag_loaders;
+
+       /// Top-level movie definition
+       /// (the definition read from SWF stream)
+       movie_definition* m_movie_def;
+
+       typedef std::map<size_t, PlayList> PlayListMap;
+
+       /// movie control events for each frame.
+       PlayListMap m_playlist;
+
+       // stores 0-based frame #'s
+       typedef std::map<std::string, size_t> NamedFrameMap;
+       NamedFrameMap m_named_frames;
+
+       size_t m_frame_count;
+
+       // Number of frames completely parsed 
+       size_t m_loading_frame;
+
+
        // See dox in movie_definition.h
        virtual void    addControlTag(ControlTag* c)
        {
@@ -295,7 +296,7 @@
        {
                // Don't access playlist of a frame which has not been
                // completely parsed yet.
-               assert(frame_number < m_loading_frame);
+               //assert(frame_number < m_loading_frame);
 
                PlayListMap::const_iterator it = m_playlist.find(frame_number);
                if ( it == m_playlist.end() ) return NULL;

Index: server/swf/tag_loaders.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/tag_loaders.cpp,v
retrieving revision 1.193
retrieving revision 1.194
diff -u -b -r1.193 -r1.194
--- server/swf/tag_loaders.cpp  26 Mar 2008 16:51:55 -0000      1.193
+++ server/swf/tag_loaders.cpp  9 Apr 2008 09:28:59 -0000       1.194
@@ -916,6 +916,12 @@
     sprite_definition* ch = new sprite_definition(m, in);
     //ch->read(in);
 
+    IF_VERBOSE_MALFORMED_SWF(
+    if ( ! ch->get_frame_count() )
+       log_swferror(_("Sprite %d advertise no frames"), character_id);
+    );
+
+
     m->add_character(character_id, ch);
 }
 

Index: testsuite/misc-swfmill.all/zeroframe_definesprite.xml
===================================================================
RCS file: 
/sources/gnash/gnash/testsuite/misc-swfmill.all/zeroframe_definesprite.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- testsuite/misc-swfmill.all/zeroframe_definesprite.xml       26 Mar 2008 
15:36:55 -0000      1.2
+++ testsuite/misc-swfmill.all/zeroframe_definesprite.xml       9 Apr 2008 
09:28:59 -0000       1.3
@@ -10,7 +10,7 @@
   |  - _totalframes reflects what's advertised, no matter number of SHOWFRAME
   |
 -->
-  <Header framerate="12" frames="1">
+  <Header framerate="12" frames="2">
     <size>
       <Rectangle left="0" right="12800" top="0" bottom="9600"/>
     </size>
@@ -44,6 +44,64 @@
       </DefineSprite>
 
       <!--
+        |  Definition of a 0-advertised frames, with NO SHOWFRAME tag
+       |  but an action in it
+       -->
+      <DefineSprite objectID="4" frames="0">
+        <tags>
+          <DoAction>
+            <actions>
+              <PushData>
+                <items>
+                  <StackString value="_root"/> 
+                </items>
+              </PushData> <!-- [string:_root] -->
+              <GetVariable/> <!-- [movieclip:_root] -->
+              <PushData>
+                <items>
+                  <StackString value="summary"/> 
+                  <StackString value="_root"/> 
+                </items>
+              </PushData> <!-- 
[movieclip:_root],[string:summary],[string:_root] -->
+              <GetVariable/> <!-- 
[movieclip:_root],[string:summary],[movieclip:_root] -->
+              <PushData>
+                <items>
+                  <StackString value="summary"/> 
+                </items>
+              </PushData> <!-- 
[movieclip:_root],[string:summary],[movieclip:_root],[string:summary] -->
+              <GetMember/> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22] -->
+              <PushData>
+                <items>
+                  <StackString value="d"/> 
+                  <StackString value="_framesloaded"/> 
+                </items>
+              </PushData> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d],[string:_framesloaded]
 -->
+              <GetVariable/> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d],[number:0] -->
+              <AddTyped/> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d0] -->
+              <PushData>
+                <items>
+                  <StackString value="_totalframes"/> 
+                </items>
+              </PushData> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d0],[string:_totalframes]
 -->
+              <GetVariable/> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d0],[number:0] -->
+              <AddTyped/> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d00] -->
+              <PushData>
+                <items>
+                  <StackString value="_currentframe"/> 
+                </items>
+              </PushData> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d00],[string:_currentframe]
 -->
+              <GetVariable/> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d00],[number:0] 
-->
+              <AddTyped/> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d000] -->
+              <AddTyped/> <!-- 
[movieclip:_root],[string:summary],[string:a00b11c22d000] -->
+              <SetMember/> <!-- EMPTY STACK -->
+              <EndAction/>
+            </actions>
+          </DoAction>
+          <End/>
+        </tags>
+      </DefineSprite>
+
+      <!--
         |  Place the zero-frames no-showframe sprite
        -->
       <PlaceObject2 replace="0" depth="1" objectID="1" name="zero_zero" 
allflags1="1" allflags2="0">
@@ -180,18 +238,27 @@
         </events>
       </PlaceObject2>
 
+      <!--
+        |  Place the zero-frames no-showframe sprite but action tag in it
+       -->
+      <PlaceObject2 replace="0" depth="4" objectID="4" 
name="zero_zero_doaction" allflags1="0" allflags2="0">
+      </PlaceObject2>
+
+      <!-- Let a frame go by, so actions in object 4 (zero_zero_doaction) are 
executed before we check here -->
+      <ShowFrame/>
+
       <DoAction>
         <actions>
           <PushData>
             <items>
-              <StackString value="a00b11c22"/>
+              <StackString value="a00b11c22d000"/>
               <StackString value="summary"/>
             </items>
           </PushData>
           <GetVariable/> 
 
           <Duplicate/> <!-- .. debugging .. -->
-          <Trace/> <!-- expect a00b11c22 -->
+          <Trace/> <!-- expect a00b11c22d000 -->
 
          <EqualTyped/>
 
@@ -205,16 +272,16 @@
                 // NOTE: the number of characters in the next string push 
                 // DOES matter in the BranchIfTrue tag above, so keep it 
constant
                 -->
-              <StackString value="FAILED: expected a00b11c22 ...        "/>
+              <StackString value="FAILED: expected a00b11c22d000        "/>
             </items>
           </PushData>
           <Trace/>
-          <BranchAlways byteOffset="27"/> // get to end 
+          <BranchAlways byteOffset="37"/> // get to end 
 
          // PASSED tracing
           <PushData>
             <items>
-              <StackString value="PASSED: got a00b11c22"/>
+              <StackString value="PASSED: got a00b11c22d000      "/>
             </items>
           </PushData>
           <Trace/>
@@ -227,6 +294,9 @@
           </PushData>
           <Trace/>
 
+          // don't loop forever..
+          <Stop/>
+
           <EndAction/>
         </actions>
       </DoAction>




reply via email to

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