CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/09/03 13:18:14
Modified files: . : ChangeLog server : sprite_instance.cpp Log message: * server/sprite_instance.cpp (advance_sprite): don't use DisplayList::advance against DisplayList copies, for which invariant is not maintained. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4200&r2=1.4201 http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.322&r2=1.323 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.4200 retrieving revision 1.4201 diff -u -b -r1.4200 -r1.4201 --- ChangeLog 3 Sep 2007 11:46:41 -0000 1.4200 +++ ChangeLog 3 Sep 2007 13:18:13 -0000 1.4201 @@ -1,3 +1,9 @@ +2007-09-03 Sandro Santilli <[EMAIL PROTECTED]> + + * server/sprite_instance.cpp (advance_sprite): don't use + DisplayList::advance against DisplayList copies, for which + invariant is not maintained. + 2007-09-03 Udo Giacomozzi <[EMAIL PROTECTED]> * render_handler_agg_style.h: focal gradients now render correctly Index: server/sprite_instance.cpp =================================================================== RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v retrieving revision 1.322 retrieving revision 1.323 diff -u -b -r1.322 -r1.323 --- server/sprite_instance.cpp 3 Sep 2007 11:41:54 -0000 1.322 +++ server/sprite_instance.cpp 3 Sep 2007 13:18:14 -0000 1.323 @@ -1700,6 +1700,25 @@ } }; +/// A DisplayList visitor used to advance all non-unloaded characters +class AdvancerVisitor { + + float delta_time; + +public: + AdvancerVisitor(float dt) + : + delta_time(dt) + {} + + void operator() (character* ch) + { + // don't unload already unloaded characters + if ( ! ch->isUnloaded() ) ch->advance(delta_time); + } + +}; + //------------------------------------------------ // sprite_instance @@ -2332,12 +2351,11 @@ // to need oldDisplayList again later, to extract the list of // newly added characters // - //oldDisplayList.removeUnloaded(); // don't call removeUnloaded - oldDisplayList.sort(); // this is to avoid failing assertions, since we know characters might have changed depth... + { + AdvancerVisitor visitor(delta_time); DisplayList stillAlive = oldDisplayList; - stillAlive.clear_except(m_display_list, false); - //log_msg(_("Advancing %d pre-existing children of %s"), stillAlive.size(), getTargetPath().c_str()); - stillAlive.advance(delta_time); + stillAlive.visitAll(visitor); + } // Now execute actions on this timeline, after actions // in old childs timelines have been executed. @@ -2355,12 +2373,12 @@ // the chars we're clearing have *not* been removed: // we're simply doing internal work here... // + { + AdvancerVisitor visitor(delta_time); DisplayList newlyAdded = m_display_list; - //log_msg(_("%s has %d current children and %d old children"), getTargetPath().c_str(), m_display_list.size(), oldDisplayList.size()); - //newlyAdded.removeUnloaded(); - newlyAdded.clear(oldDisplayList, false); - //log_msg(_("Advancing %d newly-added (after clearing) children of %s"), newlyAdded.size(), getTargetPath().c_str()); - newlyAdded.advance(delta_time); + newlyAdded.clear(oldDisplayList, false); // keep only newly added + newlyAdded.visitAll(visitor); + } // Remember current state of the DisplayList for next iteration oldDisplayList = m_display_list; _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit