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, 15 Nov 2006 10:29:00 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  06/11/15 10:29:00

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&r1=1.1618&r2=1.1619
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.79&r2=1.80
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_def_impl.h?cvsroot=gnash&r1=1.16&r2=1.17
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/movie_definition.h?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.h?cvsroot=gnash&r1=1.9&r2=1.10

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.1618
retrieving revision 1.1619
diff -u -b -r1.1618 -r1.1619
--- ChangeLog   14 Nov 2006 21:11:45 -0000      1.1618
+++ ChangeLog   15 Nov 2006 10:29:00 -0000      1.1619
@@ -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 decoded data is

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.79
retrieving revision 1.80
diff -u -b -r1.79 -r1.80
--- server/sprite_instance.cpp  13 Nov 2006 08:34:26 -0000      1.79
+++ server/sprite_instance.cpp  15 Nov 2006 10:29:00 -0000      1.80
@@ -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);
        }
 }
 
@@ -1140,7 +1146,7 @@
        testInvariant();
 
        execute_actions(&m_as_environment, m_action_list);
-       m_action_list.resize(0);
+       assert(m_action_list.empty());
 
        testInvariant();
 }
@@ -1184,11 +1190,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];
@@ -1201,16 +1213,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)
@@ -1691,7 +1703,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++)
                                {
@@ -1722,8 +1734,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
@@ -1762,8 +1773,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() )
                {
@@ -1778,7 +1788,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(),
@@ -1801,7 +1811,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)
        {
@@ -1819,7 +1829,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];
@@ -1838,7 +1848,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];
@@ -1891,7 +1901,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();
@@ -1904,7 +1914,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();
@@ -1921,8 +1931,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.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- server/sprite_instance.h    13 Nov 2006 08:34:26 -0000      1.37
+++ server/sprite_instance.h    15 Nov 2006 10:29:00 -0000      1.38
@@ -17,7 +17,7 @@
 // 
 //
 
-/* $Id: sprite_instance.h,v 1.37 2006/11/13 08:34:26 strk Exp $ */
+/* $Id: sprite_instance.h,v 1.38 2006/11/15 10:29:00 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);
 
@@ -519,9 +524,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.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- server/parser/movie_def_impl.h      11 Nov 2006 22:44:54 -0000      1.16
+++ server/parser/movie_def_impl.h      15 Nov 2006 10:29:00 -0000      1.17
@@ -197,10 +197,10 @@
        hash<int, boost::intrusive_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;
@@ -438,13 +438,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.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- server/parser/movie_definition.h    11 Nov 2006 22:44:54 -0000      1.7
+++ server/parser/movie_definition.h    15 Nov 2006 10:29:00 -0000      1.8
@@ -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 boost::intrusive_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.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- server/parser/sprite_definition.h   11 Nov 2006 22:44:54 -0000      1.9
+++ server/parser/sprite_definition.h   15 Nov 2006 10:29:00 -0000      1.10
@@ -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]