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


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv... [release_0_7_2]
Date: Wed, 15 Nov 2006 09:58:30 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Branch:         release_0_7_2
Changes by:     Sandro Santilli <strk>  06/11/15 09:58:30

Modified files:
        .              : ChangeLog 
        server         : sprite_instance.cpp sprite_instance.h 
        server/parser  : movie_def_impl.h movie_definition.h 
                         sprite_definition.h 

Log message:
                * server/sprite_instance.{h.cpp}: use a std::list
                  for ActionList (now typedef'd) as it's more appropriate
                  since we execute it from the start and execution can
                  append items to it; typdef both PlayList and ActionList.
                  This seems to fix bug #17793.
                * server/parser/: movie_definition.h, movie_def_impl.h,
                  sprite_definition.h: typedef PlayList and use that.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&only_with_tag=release_0_7_2&r1=1.1412.2.172&r2=1.1412.2.173
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&only_with_tag=release_0_7_2&r1=1.69.2.7&r2=1.69.2.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&only_with_tag=release_0_7_2&r1=1.32.2.3&r2=1.32.2.4
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_def_impl.h?cvsroot=gnash&only_with_tag=release_0_7_2&r1=1.12.2.1&r2=1.12.2.2
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_definition.h?cvsroot=gnash&only_with_tag=release_0_7_2&r1=1.5.2.1&r2=1.5.2.2
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.h?cvsroot=gnash&only_with_tag=release_0_7_2&r1=1.4.2.2&r2=1.4.2.3

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.1412.2.172
retrieving revision 1.1412.2.173
diff -u -b -r1.1412.2.172 -r1.1412.2.173
--- ChangeLog   14 Nov 2006 20:05:15 -0000      1.1412.2.172
+++ ChangeLog   15 Nov 2006 09:58:29 -0000      1.1412.2.173
@@ -1,3 +1,13 @@
+2006-11-15 Sandro Santilli <address@hidden>
+
+       * server/sprite_instance.{h.cpp}: use a std::list
+         for ActionList (now typedef'd) as it's more appropriate
+         since we execute it from the start and execution can
+         append items to it; typdef both PlayList and ActionList.
+         This seems to fix bug #17793.
+       * server/parser/: movie_definition.h, movie_def_impl.h,
+         sprite_definition.h: typedef PlayList and use that.
+
 2006-11-14 Tomas Groth Christensen <address@hidden>
 
        * backend/sound_handler_sdl.cpp: Make sure the decode data is

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.69.2.7
retrieving revision 1.69.2.8
diff -u -b -r1.69.2.7 -r1.69.2.8
--- server/sprite_instance.cpp  13 Nov 2006 08:21:15 -0000      1.69.2.7
+++ server/sprite_instance.cpp  15 Nov 2006 09:58:29 -0000      1.69.2.8
@@ -61,15 +61,21 @@
 //------------------------------------------------
 
 // Execute the actions in the action list, in the given
-// environment.
+// environment. The list of action will be consumed
+// starting from the first element. When the function returns
+// the list should be empty.
 static void
 execute_actions(as_environment* env,
-               const std::vector<action_buffer*>& action_list)
+               sprite_instance::ActionList& action_list)
 {
-       // action_list.size() may be changed due to actions
-       for (unsigned int i=0; i < action_list.size(); ++i)
-       {
-           action_list[i]->execute(env);
+       // action_list may be changed due to actions (appended-to)
+       // this loop might be optimized by using an iterator
+       // and a final call to .clear() 
+       while ( ! action_list.empty() )
+       {
+               action_buffer* ab = action_list.front();
+               action_list.pop_front(); 
+               ab->execute(env);
        }
 }
 
@@ -1057,7 +1063,7 @@
        //smart_ptr<as_object>  this_ptr(this);
 
        execute_actions(&m_as_environment, m_action_list);
-       m_action_list.resize(0);
+       assert(m_action_list.empty());
 
        testInvariant();
 }
@@ -1101,11 +1107,17 @@
                    return;
        }
 
-       size_t top_action = m_action_list.size();
+       // Take not of iterator to last element
+       ActionList::iterator top_iterator = m_action_list.end();
+       --top_iterator; // now points to last element in *current* list
+
+#ifndef NDEBUG
+       size_t original_size = m_action_list.size();
+#endif
 
        // Execute the execute_tag actions
 
-       const std::vector<execute_tag*>&playlist = 
m_def->get_playlist(frame_number);
+       const PlayList& playlist = m_def->get_playlist(frame_number);
        for (size_t i=0, n=playlist.size(); i<n; ++i)
        {
                execute_tag*    e = playlist[i];
@@ -1118,16 +1130,16 @@
        // Execute any new actions triggered by the tag,
        // leaving existing actions to be executed.
 
-       size_t idx = top_action;
-       while (m_action_list.size() > idx)
+       ++top_iterator; // now points to one past last of *previous* list
+       ActionList::const_iterator it = top_iterator;
+       while (it != m_action_list.end())
        {
-               m_action_list[idx]->execute(&m_as_environment);
-               ++idx;
+               (*it)->execute(&m_as_environment);
+               ++it;
        }
-       m_action_list.erase(m_action_list.begin()+top_action,
-               m_action_list.end());
+       m_action_list.erase(top_iterator, m_action_list.end());
 
-       assert(m_action_list.size() == top_action);
+       assert(m_action_list.size() == original_size);
 }
 
 character* sprite_instance::add_empty_movieclip(const char* name, int depth)
@@ -1609,7 +1621,7 @@
                                set_invalidated();
 
                                // affected depths
-                               const std::vector<execute_tag*>&        
playlist = m_def->get_playlist(0);
+                               const PlayList& playlist = 
m_def->get_playlist(0);
                                std::vector<uint16> affected_depths;
                                for (unsigned int i = 0; i < playlist.size(); 
i++)
                                {
@@ -1640,8 +1652,7 @@
        m_display_list.advance(delta_time);
 
        execute_actions(&m_as_environment, m_goto_frame_action_list);
-       m_goto_frame_action_list.resize(0);
-
+       assert(m_goto_frame_action_list.empty());
 }
 
 // child movieclip advance
@@ -1685,8 +1696,7 @@
        // Execute this frame's init actions, if necessary.
        if (m_init_actions_executed[frame] == false)
        {
-               const std::vector<execute_tag*>* init_actions = 
-                       m_def->get_init_actions(frame);
+               const PlayList* init_actions = m_def->get_init_actions(frame);
 
                if ( init_actions && ! init_actions->empty() )
                {
@@ -1701,7 +1711,7 @@
                }
        }
 
-       const std::vector<execute_tag*>& playlist = m_def->get_playlist(frame);
+       const PlayList& playlist = m_def->get_playlist(frame);
        if (state_only)
        {
                std::for_each(playlist.begin(), playlist.end(),
@@ -1729,7 +1739,7 @@
 
        assert(frame < m_def->get_frame_count());
 
-       const std::vector<execute_tag*>& playlist = m_def->get_playlist(frame);
+       const PlayList& playlist = m_def->get_playlist(frame);
 
        for (unsigned int i=0, n=playlist.size(); i<n; ++i)
        {
@@ -1747,7 +1757,7 @@
            assert(frame >= 0);
            assert((size_t)frame < m_def->get_frame_count());
 
-           const std::vector<execute_tag*>&    playlist = 
m_def->get_playlist(frame);
+           const PlayList& playlist = m_def->get_playlist(frame);
            for (unsigned int i = 0; i < playlist.size(); i++)
                {
                    execute_tag*        e = playlist[i];
@@ -1766,7 +1776,7 @@
 
        for (int f = frame - 1; f >= 0; f--)
        {
-           const std::vector<execute_tag*>&    playlist = 
m_def->get_playlist(f);
+           const PlayList& playlist = m_def->get_playlist(f);
            for (int i = playlist.size() - 1; i >= 0; i--)
                {
                    execute_tag*        e = playlist[i];
@@ -1819,7 +1829,7 @@
                {
                        execute_frame_tags_reverse(f);
                }
-    m_action_list.resize(0);
+               m_action_list.clear();
                execute_frame_tags(target_frame_number, false);
                //we don't have the concept of a DisplayList update anymore
                //m_display_list.update();
@@ -1832,7 +1842,7 @@
                        execute_frame_tags(f, true);
                }
 
-    m_action_list.resize(0);
+               m_action_list.clear();
                execute_frame_tags(target_frame_number, false);
                //we don't have the concept of a DisplayList update anymore
                //m_display_list.update();
@@ -1849,8 +1859,8 @@
        // Macromedia Flash do goto_frame then run actions from this frame.
        // We do too.
 
-   m_goto_frame_action_list = m_action_list; //.assign(m_action_list.begin(), 
m_action_list.end());
-        m_action_list.resize(0);
+       m_goto_frame_action_list = m_action_list; 
+       m_action_list.clear();
 
 }
 

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.32.2.3
retrieving revision 1.32.2.4
diff -u -b -r1.32.2.3 -r1.32.2.4
--- server/sprite_instance.h    13 Nov 2006 08:21:15 -0000      1.32.2.3
+++ server/sprite_instance.h    15 Nov 2006 09:58:29 -0000      1.32.2.4
@@ -17,7 +17,7 @@
 // 
 //
 
-/* $Id: sprite_instance.h,v 1.32.2.3 2006/11/13 08:21:15 strk Exp $ */
+/* $Id: sprite_instance.h,v 1.32.2.4 2006/11/15 09:58:29 strk Exp $ */
 
 // Stateful live Sprite instance
 
@@ -29,6 +29,7 @@
 #endif
 
 #include <vector>
+#include <list>
 #include <map>
 
 #include "edit_text_character.h" // temp hack
@@ -56,6 +57,10 @@
 
 public:
 
+       typedef std::list<action_buffer*> ActionList;
+       // must match movie_definition::PlayList
+       typedef std::vector<execute_tag*> PlayList;
+
        sprite_instance(movie_definition* def,
                movie_root* r, character* parent, int id);
 
@@ -523,9 +528,8 @@
 
        DisplayList     m_display_list;
 
-       //std::vector<action_buffer*>   m_action_list;
-       std::vector<action_buffer*>     m_action_list;
-       std::vector<action_buffer*>     m_goto_frame_action_list;
+       ActionList      m_action_list;
+       ActionList      m_goto_frame_action_list;
 
        play_state      m_play_state;
        size_t          m_current_frame;

Index: server/parser/movie_def_impl.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/movie_def_impl.h,v
retrieving revision 1.12.2.1
retrieving revision 1.12.2.2
diff -u -b -r1.12.2.1 -r1.12.2.2
--- server/parser/movie_def_impl.h      30 Oct 2006 14:28:55 -0000      1.12.2.1
+++ server/parser/movie_def_impl.h      15 Nov 2006 09:58:29 -0000      1.12.2.2
@@ -195,10 +195,10 @@
        hash<int, smart_ptr<sound_sample> >             m_sound_streams;
 
        /// A list of movie control events for each frame.
-       std::vector<std::vector<execute_tag*> >         m_playlist;
+       std::vector<PlayList> m_playlist;
 
        /// Init actions for each frame.
-       std::vector<std::vector<execute_tag*> >    m_init_action_list;
+       std::vector<PlayList> m_init_action_list;
 
        /// 0-based frame #'s
        stringi_hash<size_t> m_named_frames;
@@ -436,13 +436,13 @@
            return m_jpeg_in.get();
        }
 
-       virtual const std::vector<execute_tag*>& get_playlist(size_t 
frame_number)
+       virtual const PlayList& get_playlist(size_t frame_number)
        {
                assert(frame_number <= m_loading_frame);
                return m_playlist[frame_number];
        }
 
-       virtual const std::vector<execute_tag*>* get_init_actions(size_t 
frame_number)
+       virtual const PlayList* get_init_actions(size_t frame_number)
        {
                assert(frame_number <= m_loading_frame);
                //ensure_frame_loaded(frame_number);

Index: server/parser/movie_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/movie_definition.h,v
retrieving revision 1.5.2.1
retrieving revision 1.5.2.2
diff -u -b -r1.5.2.1 -r1.5.2.2
--- server/parser/movie_definition.h    30 Oct 2006 14:28:55 -0000      1.5.2.1
+++ server/parser/movie_definition.h    15 Nov 2006 09:58:30 -0000      1.5.2.2
@@ -67,6 +67,8 @@
 class movie_definition : public character_def
 {
 public:
+       typedef std::vector<execute_tag*> PlayList;
+
        virtual int     get_version() const = 0;
        virtual float   get_width_pixels() const = 0;
        virtual float   get_height_pixels() const = 0;
@@ -161,8 +163,8 @@
 
        // From movie_definition_sub
 
-       virtual const std::vector<execute_tag*>& get_playlist(size_t 
frame_number) = 0;
-       virtual const std::vector<execute_tag*>* get_init_actions(size_t 
frame_number) = 0;
+       virtual const PlayList& get_playlist(size_t frame_number) = 0;
+       virtual const PlayList* get_init_actions(size_t frame_number) = 0;
        virtual smart_ptr<resource>     get_exported_resource(const tu_string& 
symbol) = 0;
 
 

Index: server/parser/sprite_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.h,v
retrieving revision 1.4.2.2
retrieving revision 1.4.2.3
diff -u -b -r1.4.2.2 -r1.4.2.3
--- server/parser/sprite_definition.h   6 Nov 2006 13:23:59 -0000       1.4.2.2
+++ server/parser/sprite_definition.h   15 Nov 2006 09:58:30 -0000      1.4.2.3
@@ -76,7 +76,7 @@
        movie_definition* m_movie_def;
 
        /// movie control events for each frame.
-       std::vector<std::vector<execute_tag*> > m_playlist;
+       std::vector<PlayList> m_playlist;
 
        // stores 0-based frame #'s
        stringi_hash<size_t> m_named_frames;
@@ -330,7 +330,7 @@
        }
 
        /// frame_number is 0-based
-       const std::vector<execute_tag*>& get_playlist(size_t frame_number)
+       const PlayList& get_playlist(size_t frame_number)
        {
                return m_playlist[frame_number];
        }
@@ -338,7 +338,7 @@
        // Sprites do not have init actions in their
        // playlists!  Only the root movie
        // (movie_def_impl) does (@@ correct?)
-       virtual const std::vector<execute_tag*>* get_init_actions(size_t 
/*frame_number*/)
+       virtual const PlayList* get_init_actions(size_t /*frame_number*/)
        {
            return NULL;
        }




reply via email to

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