[Top][All Lists]
[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;
}