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


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp
Date: Mon, 03 Sep 2007 13:18:14 +0000

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 <address@hidden>
+
+       * 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 <address@hidden>
 
        * 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;




reply via email to

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