gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/character.h server/movie...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/character.h server/movie...
Date: Fri, 04 Aug 2006 15:30:37 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  06/08/04 15:30:36

Modified files:
        .              : ChangeLog 
        server         : character.h movie_def_impl.cpp movie_def_impl.h 
                         movie_definition.h movie_interface.h 
                         movie_root.cpp movie_root.h sprite_definition.h 
                         sprite_instance.cpp sprite_instance.h 

Log message:
                * server/character.h, server/movie_def_impl.cpp,
                  server/movie_def_impl.h, server/movie_definition.h,
                  server/movie_interface.h, server/movie_root.cpp,
                  server/movie_root.h, server/sprite_definition.h,
                  server/sprite_instance.cpp, server/sprite_instance.h:
                  Fixed more frame number types to be size_t rather then int;
                  added some doxygen comments; fixed ensure_frame_loaded calls
                  to not erroneusly using sprite frames rather then movie 
frames;
                  removed ensure_frame_loaded calls from goto_frame (will need
                  further thinking about it).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.587&r2=1.588
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.h?cvsroot=gnash&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_def_impl.cpp?cvsroot=gnash&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_def_impl.h?cvsroot=gnash&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_definition.h?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_interface.h?cvsroot=gnash&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.10&r2=1.11
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.h?cvsroot=gnash&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_definition.h?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.25&r2=1.26
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.12&r2=1.13

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.587
retrieving revision 1.588
diff -u -b -r1.587 -r1.588
--- ChangeLog   4 Aug 2006 15:20:23 -0000       1.587
+++ ChangeLog   4 Aug 2006 15:30:36 -0000       1.588
@@ -1,5 +1,18 @@
 2006-08-04 Sandro Santilli <address@hidden>
 
+       * server/character.h, server/movie_def_impl.cpp,
+         server/movie_def_impl.h, server/movie_definition.h,
+         server/movie_interface.h, server/movie_root.cpp,
+         server/movie_root.h, server/sprite_definition.h,
+         server/sprite_instance.cpp, server/sprite_instance.h:
+         Fixed more frame number types to be size_t rather then int;
+         added some doxygen comments; fixed ensure_frame_loaded calls
+         to not erroneusly using sprite frames rather then movie frames;
+         removed ensure_frame_loaded calls from goto_frame (will need
+         further thinking about it).
+
+2006-08-04 Sandro Santilli <address@hidden>
+
        * testsuite/actionscript.all/Makefile.am: added rule to cleanup
          temporary files created by new ming versions.
        * server/sprite_instance.cpp (init_builtins): don't init builtins

Index: server/character.h
===================================================================
RCS file: /sources/gnash/gnash/server/character.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- server/character.h  4 Aug 2006 14:45:52 -0000       1.10
+++ server/character.h  4 Aug 2006 15:30:36 -0000       1.11
@@ -207,7 +207,7 @@
                return get_relative_target_common(name);
        }
 
-    virtual int        get_current_frame() const { assert(0); return 0; }
+    virtual size_t     get_current_frame() const { assert(0); return 0; }
     virtual bool       has_looped() const { assert(0); return false; }
     virtual void       restart() { /*assert(0);*/ }
 

Index: server/movie_def_impl.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_def_impl.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- server/movie_def_impl.cpp   3 Aug 2006 22:19:59 -0000       1.15
+++ server/movie_def_impl.cpp   4 Aug 2006 15:30:36 -0000       1.16
@@ -382,15 +382,15 @@
        log_parse("frame rate = %f, frames = %d\n",
                m_frame_rate, m_frame_count);
 
-       // Only load first frame (what if the movie contains 0 frames ?)
-       // Other parts of the code will need to call ensure_frame_loaded(#)
-       // whenever in need to access a new frame
 #if 0
        size_t startup_frames = m_frame_count;
 #else
+       // Don't load any frame 
+       // Other parts of the code will need to call ensure_frame_loaded(#)
+       // whenever in need to access a new frame
        size_t startup_frames = 1; // always load first frame (must try w/out)
 #endif
-       if ( ! ensure_frame_loaded(startup_frames) )
+       if ( startup_frames && ! ensure_frame_loaded(startup_frames) )
        {
                log_error("Could not load to frame %u !", startup_frames);
                return false;
@@ -421,8 +421,29 @@
 movie_def_impl::ensure_frame_loaded(size_t framenum)
 {
        assert(_str.get() != NULL);
+
+       // Don't ask me to load more then available frames !
+       // (this might be due to malformed SWF (header reporting
+       //  less frames then available - still, check for it should
+       //  be implemented in tag loaders (possibly action executors).
        assert(framenum <= m_frame_count);
 
+       // We already loaded that frame...
+       if ( framenum <= m_loading_frame )
+       {
+               log_msg("Frame %u already loaded (we loaded %u/%u)",
+                       framenum, m_loading_frame, m_frame_count);
+               assert(0);
+               return true;
+       }
+#if 0 // debugging
+       else
+       {
+               log_msg("Loading of frame %u requested (we are at %u/%u)",
+                       framenum, m_loading_frame, m_frame_count);
+       }
+#endif
+
        stream& str=*_str;
        // when m_loading_frame is 1 we've read frame 1
        while ( m_loading_frame < framenum )
@@ -442,7 +463,11 @@
                {
                        // show frame tag -- advance to the next frame.
                        log_parse("  show_frame\n");
-                       m_loading_frame++;
+                       ++m_loading_frame;
+#if 0 // debugging
+                       log_msg("Loaded frame %u/%u",
+                               m_loading_frame, m_frame_count);
+#endif
                }
                else if (_tag_loaders.get(tag_type, &lf))
                 {
@@ -467,6 +492,7 @@
                                log_warning("hit SWF::END before reaching "
                                        "requested frame number %u",
                                        framenum);
+                               _loaded_bytes = str.get_position();
                                return false;
                        }
 
@@ -482,6 +508,23 @@
                }
        }
 
+       size_t cur_pos = (size_t)str.get_position();
+       //assert( _loaded_bytes < cur_pos )
+       if ( cur_pos < _loaded_bytes )
+       {
+               log_warning("After load of frame %u:\n"
+                       " current stream position: %u\n"
+                       " _loaded_bytes=%u\n"
+                       "(some tag triggered a seek-back?!)",
+                       m_loading_frame,
+                       cur_pos,
+                       _loaded_bytes);
+       }
+       else
+       {
+               _loaded_bytes = cur_pos;
+       }
+
        return true;
 
 }

Index: server/movie_def_impl.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_def_impl.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- server/movie_def_impl.h     3 Aug 2006 22:19:59 -0000       1.13
+++ server/movie_def_impl.h     4 Aug 2006 15:30:36 -0000       1.14
@@ -50,6 +50,7 @@
 #include "character_def.h" // for smart_ptr visibility of dtor
 #include "bitmap_character_def.h" // for smart_ptr visibility of dtor
 #include "resource.h" // for smart_ptr visibility of dtor
+#include "stream.h" // for get_bytes_loaded
 
 #include <map> // for CharacterDictionary
 #include <string>
@@ -195,6 +196,7 @@
        size_t  m_loading_frame;
        int     m_loading_sound_stream;
        uint32  m_file_length;
+       size_t  _loaded_bytes;
 
        jpeg::input*    m_jpeg_in;
 
@@ -220,6 +222,7 @@
                m_frame_count(0u),
                m_version(0),
                m_loading_frame(0u),
+               _loaded_bytes(0u),
                m_jpeg_in(0)
                {
                }
@@ -248,7 +251,29 @@
                return m_loading_frame;
        }
 
-       uint32  get_file_bytes() const { return m_file_length; }
+#if 0 // renamed to get_bytes_total
+       uint32  get_file_bytes() const {
+               return m_file_length;
+       }
+#endif
+
+       /// Get number of bytes loaded from input stream
+       uint32  get_bytes_loaded() const {
+#if 0 // temporarly disabled because broken
+               uint32 ret = _loaded_bytes;
+#else
+               uint32 ret = m_file_length;
+#endif
+               log_msg("get_bytes_loaded returning %u (loaded frame: %u/%u)",
+                       ret, m_loading_frame, m_frame_count);
+               return ret;
+       }
+
+       /// Get total number of bytes in input stream
+       uint32  get_bytes_total() const {
+               log_msg("get_bytes_total returning %u", m_file_length);
+               return m_file_length;
+       }
 
        /// Returns DO_CREATE_BITMAPS if we're supposed to
        /// initialize our bitmap infos, or DO_NOT_INIT_BITMAPS
@@ -408,7 +433,8 @@
 
        virtual const std::vector<execute_tag*>* get_init_actions(size_t 
frame_number)
        {
-               ensure_frame_loaded(frame_number);
+               assert(frame_number <= m_loading_frame);
+               //ensure_frame_loaded(frame_number);
                return &m_init_action_list[frame_number];
        }
 

Index: server/movie_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_definition.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- server/movie_definition.h   3 Aug 2006 22:19:59 -0000       1.7
+++ server/movie_definition.h   4 Aug 2006 15:30:36 -0000       1.8
@@ -88,6 +88,9 @@
        virtual size_t  get_frame_count() const = 0;
        virtual float   get_frame_rate() const = 0;
        
+       virtual size_t get_bytes_loaded() const = 0;
+       virtual size_t get_bytes_total() const = 0;
+       
        /// Create a playable movie instance from a def.
        //
        /// This calls add_ref() on the movie_interface internally.

Index: server/movie_interface.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_interface.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- server/movie_interface.h    3 Aug 2006 22:19:59 -0000       1.5
+++ server/movie_interface.h    4 Aug 2006 15:30:36 -0000       1.6
@@ -70,7 +70,7 @@
        virtual movie_definition*       get_movie_definition() = 0;
        
        /// Frame counts in this API are 0-based (unlike ActionScript)
-       virtual int     get_current_frame() const = 0;
+       virtual size_t  get_current_frame() const = 0;
        virtual bool    has_looped() const = 0;
        
        virtual void    restart() = 0;

Index: server/movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- server/movie_root.cpp       3 Aug 2006 22:19:59 -0000       1.10
+++ server/movie_root.cpp       4 Aug 2006 15:30:36 -0000       1.11
@@ -220,6 +220,7 @@
 {
 //            GNASH_REPORT_FUNCTION;
 
+
 //     if (m_on_event_load_called == false)
 //        {
             // Must do loading events.  For child sprites this is

Index: server/movie_root.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- server/movie_root.h 3 Aug 2006 22:19:59 -0000       1.9
+++ server/movie_root.h 4 Aug 2006 15:30:36 -0000       1.10
@@ -137,9 +137,21 @@
                return m_movie->get_movie_definition();
        }
 
+#if 0 // renamed to get_bytes_total
        uint32 get_file_bytes() const {
            return m_def->get_file_bytes();
        }
+#endif
+
+       /// Get number of bytes loaded from input stream
+       uint32 get_bytes_loaded() const {
+           return m_def->get_bytes_loaded();
+       }
+
+       /// Get total number of bytes in input stream
+       uint32 get_bytes_total() const {
+           return m_def->get_bytes_total();
+       }
 
        virtual void get_url(const char *url) {
                // SWFHandlers::ActionGetUrl calls get_url
@@ -155,7 +167,7 @@
        virtual void do_something(void *timer);
 
        /// 0-based!!
-       int get_current_frame() const {
+       size_t get_current_frame() const {
                return m_movie->get_current_frame();
        }
 

Index: server/sprite_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_definition.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/sprite_definition.h  3 Aug 2006 22:19:59 -0000       1.12
+++ server/sprite_definition.h  4 Aug 2006 15:30:36 -0000       1.13
@@ -68,6 +68,13 @@
        /// A sprite definition consists of a series control tags.
        ///
        /// @param m 
+       ///     the Top-Level movie_definition this sprite is read
+       ///     from (not a sprite_definition!)
+       ///
+       /// @param in
+       ///     The stream associated with the sprite. It is assumed
+       ///     to be already positioned right before the frame count
+       ///         
        sprite_definition(movie_definition* m, stream* in);
 
        /// Destructor, releases playlist data
@@ -82,8 +89,8 @@
        /// TODO: make it a static member, specific to sprite_definition
        SWF::TagLoadersTable& _tag_loaders;
 
-       /// Top-level movie (the one with a character_def)
-       /// (or is it just the parent?)
+       /// Top-level movie definition
+       /// (the definition read from SWF stream)
        movie_definition* m_movie_def;
 
        /// movie control events for each frame.
@@ -92,7 +99,7 @@
        // stores 0-based frame #'s
        stringi_hash<size_t> m_named_frames;
 
-       int m_frame_count;
+       size_t m_frame_count;
 
        size_t m_loading_frame;
 
@@ -105,8 +112,29 @@
                return m_frame_count;
        }
 
+       /// \brief
+       /// Return total bytes of the movie from which this sprite
+       /// has been read.
+       ///
+       virtual size_t get_bytes_total() const
+       {
+               return m_movie_def->get_bytes_total();
+       }
+
+       /// \brief
+       /// Return the number of bytes loaded from the stream of the
+       /// the movie from which this sprite is being read.
+       ///
+       virtual size_t get_bytes_loaded() const
+       {
+               return m_movie_def->get_bytes_loaded();
+       }
+
        virtual float   get_frame_rate() const { return 
m_movie_def->get_frame_rate(); }
+
+       // Return number of frames loaded (of current sprite)
        virtual size_t  get_loading_frame() const { return m_loading_frame; }
+
        virtual int     get_version() const { return 
m_movie_def->get_version(); }
 
        virtual void add_font(int /*id*/, font* /*ch*/)
@@ -302,7 +330,7 @@
        }
 
        /// \brief
-       /// Ensure framenum frames of parent movie_definition 
+       /// Ensure framenum frames of top-level movie_definition 
        /// are loaded (not frames of current sprite!)
        ///
        virtual bool ensure_frame_loaded(size_t framenum)
@@ -310,6 +338,11 @@
                return m_movie_def->ensure_frame_loaded(framenum);
        }
 
+       /// Return the top-level movie definition
+       /// (the definition read from SWF stream)
+       movie_definition* get_movie_definition() {
+               return m_movie_def;
+       }
 
 
 };

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -b -r1.25 -r1.26
--- server/sprite_instance.cpp  4 Aug 2006 15:16:10 -0000       1.25
+++ server/sprite_instance.cpp  4 Aug 2006 15:30:36 -0000       1.26
@@ -57,6 +57,7 @@
 #include "gnash.h"
 #include "Sprite.h"
 #include "sprite_instance.h"
+#include "movie_definition.h"
 #include "MovieClipLoader.h" // @@ temp hack for loading tests
 #include "as_function.h"
 #include "text.h"
@@ -203,7 +204,7 @@
        }
        assert(sprite);
 
-       fn.result->set_int(sprite->get_root()->get_file_bytes());
+       fn.result->set_int(sprite->get_bytes_loaded());
 }
 
 static void sprite_get_bytes_total(const fn_call& fn)
@@ -216,7 +217,8 @@
        }
        assert(sprite);
 
-       fn.result->set_int(sprite->get_root()->get_file_bytes());
+       // @@ horrible uh ?
+       fn.result->set_int(sprite->get_bytes_total());
 }
 
 static void sprite_load_movie(const fn_call& fn)
@@ -1163,6 +1165,8 @@
 
 void sprite_instance::advance_sprite(float delta_time)
 {
+       //GNASH_REPORT_FUNCTION;
+
        // mouse drag.
        character::do_mouse_drag();
 
@@ -1171,12 +1175,13 @@
                on_event(event_id::ENTER_FRAME);
        }
 
+       size_t frame_count = m_def->get_frame_count();
+
        // Update current and next frames.
        if (m_play_state == PLAY)
        {
                int prev_frame = m_current_frame;
 
-               int frame_count = m_def->get_frame_count();
                if ( (m_current_frame + 1) == frame_count && frame_count > 1 )
                {
 //                     m_display_list.reset();
@@ -1204,6 +1209,37 @@
 // _root movieclip advance
 void sprite_instance::advance_root(float delta_time)
 {
+       //GNASH_REPORT_FUNCTION;
+
+       assert ( get_root()->get_root_movie() == this );
+
+       // Load one more frame if available (even if not needed for
+       // display of the next one) - this is to use idle time for loading.
+       //
+       // We do this inside advance_root to make sure
+       // it's only for a root sprite (not a sprite defined
+       // by DefineSprite!)
+       //
+       movie_definition* md = get_movie_definition();
+       size_t framecount = md->get_frame_count();
+       size_t lastloaded = md->get_loading_frame();
+       size_t nextframe = lastloaded+1;
+       //log_msg("Framecount: %u, Lastloaded: %u", framecount, lastloaded);
+       if ( nextframe <= framecount )
+       {
+#if 0 // debugging
+               log_msg("Ensure load of frame %u/%u (last loaded is: %u)",
+                       nextframe, framecount, lastloaded);
+#endif
+               if ( ! md->ensure_frame_loaded(nextframe) )
+               {
+                       log_error("Could not advance to frame %d!",
+                               nextframe);
+                       // these kind of errors should be handled by callers
+                       assert(0);
+               }
+       }
+
        m_time_remainder += delta_time;
 
        // Check for the end of frame
@@ -1226,6 +1262,10 @@
 
                m_time_remainder = fmod(m_time_remainder, m_frame_time);
        }
+       else
+       {
+               log_msg("no time remained");
+       }
 }
 
 // child movieclip advance
@@ -1421,6 +1461,7 @@
        target_frame_number = iclamp(target_frame_number, 0,
                        m_def->get_frame_count() - 1);
 
+#if 0 // this should only be done if this instance is a movie_instance
        // target_frame_number is 0-based !
        if ( ! m_def->ensure_frame_loaded(target_frame_number+1) )
        {
@@ -1430,6 +1471,7 @@
                assert(0);
        
        }
+#endif
 
        if (target_frame_number < m_current_frame)
        {
@@ -1634,7 +1676,7 @@
 {
        //GNASH_REPORT_FUNCTION;
 
-       int frame_count = m_def->get_frame_count();
+       size_t frame_count = m_def->get_frame_count();
        if ( ++m_current_frame >= frame_count )
        {
                // Loop.
@@ -1646,16 +1688,11 @@
                }
        }
 
-       // m_current_frame is 0-based !
-       if ( ! m_def->ensure_frame_loaded(m_current_frame+1) )
-       {
-               log_error("Could not advance to frame %d!",
-                       m_current_frame+1);
-               // these kind of errors should be handled by callers
-               assert(0);
-       }
-
-       //log_msg("Frame %d/%d", m_current_frame, frame_count);
+#if 0 // debugging
+       log_msg("Frame %u/%u, bytes %u/%u",
+               m_current_frame, frame_count,
+               get_bytes_loaded(), get_bytes_total());
+#endif
 }
 
 /// Find a character hit by the given coordinates.

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/sprite_instance.h    3 Aug 2006 22:19:59 -0000       1.12
+++ server/sprite_instance.h    4 Aug 2006 15:30:36 -0000       1.13
@@ -106,6 +106,9 @@
        /// Get a pointer to the root sprite
        sprite_instance* get_root_movie();
 
+       /// \brief
+       /// Return the sprite_definition (or movie_definition)
+       /// from which this sprite_instance has been created
         movie_definition* get_movie_definition() {
                 return m_def.get_ptr();
         }
@@ -114,7 +117,7 @@
 
        float get_height();
 
-       int get_current_frame() const
+       size_t get_current_frame() const
        {
                return m_current_frame;
        }
@@ -124,6 +127,20 @@
                return m_def->get_frame_count();
        }
 
+       /// Return total number of bytes in the movie
+       /// (not sprite!)
+       size_t get_bytes_total() const
+       {
+               return m_def->get_bytes_total();
+       }
+
+       /// Return number of loaded bytes in the movie
+       /// (not sprite!)
+       size_t get_bytes_loaded() const
+       {
+               return m_def->get_bytes_loaded();
+       }
+
        /// Stop or play the sprite.
        void set_play_state(play_state s)
        {
@@ -443,7 +460,11 @@
 
        mouse_state m_mouse_state;
 
+       /// \brief
+       /// This is either sprite_definition (for sprites defined by
+       /// DefineSprite tag) or movie_def_impl (for the top-level movie).
        smart_ptr<movie_definition>     m_def;
+
        movie_root*     m_root;
 
        DisplayList     m_display_list;




reply via email to

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