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/impl....


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/character.h server/impl....
Date: Thu, 03 Aug 2006 22:19:59 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Sandro Santilli <strk>  06/08/03 22:19:59

Modified files:
        .              : ChangeLog 
        server         : character.h impl.cpp movie.h movie_def_impl.cpp 
                         movie_def_impl.h movie_definition.h 
                         movie_interface.h movie_root.cpp movie_root.h 
                         sprite_definition.cpp sprite_definition.h 
                         sprite_instance.cpp sprite_instance.h 
        server/swf     : ASHandlers.cpp 

Log message:
                * server/character.h, server/impl.cpp, server/movie.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.cpp, server/sprite_definition.h,
                  server/sprite_instance.cpp, server/sprite_instance.h,
                  server/swf/ASHandlers.cpp:
                  Implemented incremental loading of movie (streaming);
                  fixed lots of references to frame numbers to be expressed
                  with size_t type rather then int.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.579&r2=1.580
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.h?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/impl.cpp?cvsroot=gnash&r1=1.48&r2=1.49
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie.h?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_def_impl.cpp?cvsroot=gnash&r1=1.14&r2=1.15
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_def_impl.h?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_definition.h?cvsroot=gnash&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_interface.h?cvsroot=gnash&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.h?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_definition.cpp?cvsroot=gnash&r1=1.8&r2=1.9
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_definition.h?cvsroot=gnash&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.11&r2=1.12
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/ASHandlers.cpp?cvsroot=gnash&r1=1.41&r2=1.42

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.579
retrieving revision 1.580
diff -u -b -r1.579 -r1.580
--- ChangeLog   3 Aug 2006 20:10:00 -0000       1.579
+++ ChangeLog   3 Aug 2006 22:19:58 -0000       1.580
@@ -1,5 +1,19 @@
 2006-08-03 Sandro Santilli <address@hidden>
 
+       * server/character.h, server/impl.cpp, server/movie.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.cpp, server/sprite_definition.h,
+         server/sprite_instance.cpp, server/sprite_instance.h,
+         server/swf/ASHandlers.cpp:
+         Implemented incremental loading of movie (streaming);
+         fixed lots of references to frame numbers to be expressed
+         with size_t type rather then int.
+       
+
+2006-08-03 Sandro Santilli <address@hidden>
+
        * server/swf/tag_loaders.cpp: warn only once and avoid parsing
          tags when no GST sound backend is selected and unsupported sound
          tags are encountered.

Index: server/character.h
===================================================================
RCS file: /sources/gnash/gnash/server/character.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/character.h  7 Jul 2006 01:01:11 -0000       1.8
+++ server/character.h  3 Aug 2006 22:19:59 -0000       1.9
@@ -216,7 +216,7 @@
 //     printf("%s:\n", __PRETTY_FUNCTION__); // FIXME:
     }  // for buttons and sprites
 
-    virtual void       goto_frame(int /*target_frame*/) {}
+    virtual void       goto_frame(size_t /*target_frame*/) {}
 
     virtual bool       get_accept_anim_moves() const { return true; }
 

Index: server/impl.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/impl.cpp,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -b -r1.48 -r1.49
--- server/impl.cpp     3 Aug 2006 19:16:37 -0000       1.48
+++ server/impl.cpp     3 Aug 2006 22:19:59 -0000       1.49
@@ -786,7 +786,7 @@
            // @@ Maybe we should allow the user to specify some
            // safety margin on scaled shapes.
 
-           int last_frame = m->get_current_frame();
+           size_t last_frame = m->get_current_frame();
            m->advance(0.010f);
            m->display();
 
@@ -813,7 +813,7 @@
            else if (m->get_current_frame() < last_frame)
                {
                    // Hm, apparently we looped back.  Skip ahead...
-                   log_error("loop back; jumping to frame %d\n", last_frame);
+                   log_error("loop back; jumping to frame %u\n", last_frame);
                    m->goto_frame(last_frame + 1);
                }
            else

Index: server/movie.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/movie.h      27 Jul 2006 00:15:22 -0000      1.12
+++ server/movie.h      3 Aug 2006 22:19:59 -0000       1.13
@@ -204,7 +204,7 @@
                assert(0);
        }
 
-       virtual void goto_frame(int /*target_frame_number*/)
+       virtual void goto_frame(size_t /*target_frame_number*/)
        {
                assert(0);
        }

Index: server/movie_def_impl.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_def_impl.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- server/movie_def_impl.cpp   3 Aug 2006 19:16:37 -0000       1.14
+++ server/movie_def_impl.cpp   3 Aug 2006 22:19:59 -0000       1.15
@@ -141,9 +141,9 @@
         }}
 
     // Release init action data.
-    {for (int i = 0, n = m_init_action_list.size(); i < n; i++)
+    {for (size_t i = 0, n = m_init_action_list.size(); i < n; i++)
         {
-            for (int j = 0, m = m_init_action_list[i].size(); j < m; j++)
+            for (size_t j = 0, m = m_init_action_list[i].size(); j < m; j++)
                 {
                     delete m_init_action_list[i][j];
                 }
@@ -316,21 +316,24 @@
 movie_def_impl::read(tu_file* in, const std::string& url)
 {
 
-       assert(_url == "");
+       // we only read a movie once (well, headers at least)
+       assert(_str.get() == NULL);
+
        if ( url == "" ) _url = "<anonymous>";
        else _url = url;
 
     uint32_t   file_start_pos = in->get_position();
     uint32_t   header = in->read_le32();
     m_file_length = in->read_le32();
-    uint32_t   file_end_pos = file_start_pos + m_file_length;
+       _swf_end_pos = file_start_pos + m_file_length;
 
     m_version = (header >> 24) & 255;
     if ((header & 0x0FFFFFF) != 0x00535746
         && (header & 0x0FFFFFF) != 0x00535743)
         {
             // ERROR
-            log_error("gnash::movie_def_impl::read() -- file does not start 
with a SWF header!\n");
+               log_error("gnash::movie_def_impl::read() -- "
+                       "file does not start with a SWF header!\n");
             return false;
         }
     bool       compressed = (header & 255) == 'C';
@@ -341,7 +344,8 @@
     if (compressed)
         {
 #if TU_CONFIG_LINK_TO_ZLIB == 0
-            log_error("movie_def_impl::read(): unable to read zipped SWF data; 
TU_CONFIG_LINK_TO_ZLIB is 0\n");
+               log_error("movie_def_impl::read(): unable to read "
+                       "zipped SWF data; TU_CONFIG_LINK_TO_ZLIB is 0\n");
             return false;
 #endif
 
@@ -349,19 +353,21 @@
             original_in = in;
 
             // Uncompress the input as we read it.
-            in = zlib_adapter::make_inflater(original_in);
+               _zlib_file.reset(zlib_adapter::make_inflater(original_in));
+               in = _zlib_file.get();
 
             // Subtract the size of the 8-byte header, since
             // it's not included in the compressed
             // stream length.
-            file_end_pos = m_file_length - 8;
+               _swf_end_pos = m_file_length - 8;
         }
 
-    stream     str(in);
+       //stream str(in);
+       _str.reset(new stream(in));
 
-    m_frame_size.read(&str);
-    m_frame_rate = str.read_u16() / 256.0f;
-    m_frame_count = str.read_u16();
+       m_frame_size.read(_str.get());
+       m_frame_rate = _str->read_u16() / 256.0f;
+       m_frame_count = _str->read_u16();
 
                // hack
                // Vitaly: I am not assured that it correctly
@@ -373,15 +379,61 @@
     if (dbglogfile.getParserDump()) {
         m_frame_size.print();
     }
-    log_parse("frame rate = %f, frames = %d\n", m_frame_rate, m_frame_count);
+       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
+       size_t startup_frames = 1; // always load first frame (must try w/out)
+#endif
+       if ( ! ensure_frame_loaded(startup_frames) )
+       {
+               log_error("Could not load to frame %u !", startup_frames);
+               return false;
+       }
+
+       if (m_jpeg_in)
+        {
+            delete m_jpeg_in;
+            m_jpeg_in = NULL;
+        }
+
+// automatically deleted at movie_def_impl removal, can't delete here
+// as we will keep reading from it while playing
+#if 0
+       if (original_in)
+        {
+            // Done with the zlib_adapter.
+            delete in;
+        }
+#endif
+
+       return true;
+}
 
-    while ((uint32_t) str.get_position() < file_end_pos)
+
+// 0-based frame number
+bool
+movie_def_impl::ensure_frame_loaded(size_t framenum)
+{
+       assert(_str.get() != NULL);
+       assert(framenum <= m_frame_count);
+
+       stream& str=*_str;
+       // when m_loading_frame is 1 we've read frame 1
+       while ( m_loading_frame < framenum )
+// (uint32_t) str.get_position() < _swf_end_pos)
     {
             SWF::tag_type tag_type = str.open_tag();
 
             if (s_progress_function != NULL)
                 {
-                    s_progress_function((uint32_t) str.get_position(), 
file_end_pos);
+                       s_progress_function((uint32_t)str.get_position(),
+                               _swf_end_pos);
                 }
 
             SWF::TagLoadersTable::loader_function lf = NULL;
@@ -397,8 +449,9 @@
                     // call the tag loader.  The tag loader should add
                     // characters or tags to the movie data structure.
                     (*lf)(&str, tag_type, this);
-
-                } else {
+               }
+               else
+               {
                     // no tag loader for this tag type.
                     log_parse("*** no tag loader for type %d\n", tag_type);
                     if (dbglogfile.getParserDump()) {
@@ -410,30 +463,27 @@
 
             if (tag_type == SWF::END)
                 {
-                    if ((unsigned int) str.get_position() != file_end_pos)
-                        {
-                            // Safety break, so we don't read past the end of 
the
-                            // movie.
-                            log_msg("warning: hit stream-end tag, but not at 
the "
-                                    "end of the file yet; stopping for 
safety\n");
-                            break;
-                        }
-                }
+                       if ( m_loading_frame < framenum ) {
+                               log_warning("hit SWF::END before reaching "
+                                       "requested frame number %u",
+                                       framenum);
+                               return false;
         }
 
-    if (m_jpeg_in)
+                       if ((unsigned int) str.get_position() != _swf_end_pos)
         {
-            delete m_jpeg_in;
-            m_jpeg_in = NULL;
+                               // Safety break, so we don't read past
+                               // the end of the  movie.
+                               log_warning("hit stream-end tag, "
+                                       "but not at the advertised SWF end; "
+                                       "stopping for safety.");
+                               break;
+                       }
         }
-
-    if (original_in)
-        {
-            // Done with the zlib_adapter.
-            delete in;
         }
 
        return true;
+
 }
 
 

Index: server/movie_def_impl.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_def_impl.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- server/movie_def_impl.h     3 Aug 2006 19:16:37 -0000       1.12
+++ server/movie_def_impl.h     3 Aug 2006 22:19:59 -0000       1.13
@@ -170,7 +170,7 @@
        std::vector<std::vector<execute_tag*> >    m_init_action_list;
 
        /// 0-based frame #'s
-       stringi_hash<int> m_named_frames;
+       stringi_hash<size_t> m_named_frames;
 
        stringi_hash<smart_ptr<resource> > m_exports;
 
@@ -190,9 +190,9 @@
 
        rect    m_frame_size;
        float   m_frame_rate;
-       int     m_frame_count;
+       size_t  m_frame_count;
        int     m_version;
-       int     m_loading_frame;
+       size_t  m_loading_frame;
        int     m_loading_sound_stream;
        uint32  m_file_length;
 
@@ -200,6 +200,15 @@
 
        std::string _url;
 
+       std::auto_ptr<stream> _str;
+
+       tu_file* in;
+
+       std::auto_ptr<tu_file> _zlib_file;
+
+       /// swf end position (as read from header)
+       unsigned int _swf_end_pos;
+
 public:
        movie_def_impl(create_bitmaps_flag cbf,
                        create_font_shapes_flag cfs)
@@ -208,9 +217,9 @@
                m_create_bitmaps(cbf),
                m_create_font_shapes(cfs),
                m_frame_rate(30.0f),
-               m_frame_count(0),
+               m_frame_count(0u),
                m_version(0),
-               m_loading_frame(0),
+               m_loading_frame(0u),
                m_jpeg_in(0)
                {
                }
@@ -218,7 +227,7 @@
        ~movie_def_impl();
 
        // ...
-       int     get_frame_count() const { return m_frame_count; }
+       size_t get_frame_count() const { return m_frame_count; }
        float   get_frame_rate() const { return m_frame_rate; }
        const rect& get_frame_size() const { return m_frame_size; }
 
@@ -234,7 +243,7 @@
 
        virtual int     get_version() const { return m_version; }
 
-       virtual int     get_loading_frame() const
+       virtual size_t  get_loading_frame() const
        {
                return m_loading_frame;
        }
@@ -330,7 +339,7 @@
        character_def*  get_character_def(int character_id);
 
        /// Returns 0-based frame #
-       bool get_labeled_frame(const char* label, int* frame_number)
+       bool get_labeled_frame(const char* label, size_t* frame_number)
        {
                return m_named_frames.get(label, frame_number);
        }
@@ -367,7 +376,7 @@
        /// kept in this object.
        void    add_frame_name(const char* name)
        {
-           assert(m_loading_frame >= 0 && m_loading_frame < m_frame_count);
+           assert(m_loading_frame < m_frame_count);
 
            tu_string   n = name;
 
@@ -392,9 +401,16 @@
            return m_jpeg_in;
        }
 
-       virtual const std::vector<execute_tag*>& get_playlist(int frame_number) 
{ return m_playlist[frame_number]; }
+       virtual const std::vector<execute_tag*>& get_playlist(size_t 
frame_number)
+       {
+               return m_playlist[frame_number];
+       }
 
-       virtual const std::vector<execute_tag*>*get_init_actions(int 
frame_number) { return &m_init_action_list[frame_number]; }
+       virtual const std::vector<execute_tag*>* get_init_actions(size_t 
frame_number)
+       {
+               ensure_frame_loaded(frame_number);
+               return &m_init_action_list[frame_number];
+       }
 
        /// Read (w/out playing) a Movie definition from an SWF file.
        //
@@ -413,6 +429,12 @@
        ///
        bool read(tu_file *in, const std::string& url);
 
+       /// \brief
+       /// Ensure that frame number 'framenum' (1-based offset)
+       /// has been loaded (load on demand).
+       ///
+       bool ensure_frame_loaded(size_t framenum);
+
        /// Fill up *fonts with fonts that we own.
        void get_owned_fonts(std::vector<font*>* fonts);
 

Index: server/movie_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_definition.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- server/movie_definition.h   24 Jul 2006 18:59:40 -0000      1.6
+++ server/movie_definition.h   3 Aug 2006 22:19:59 -0000       1.7
@@ -85,7 +85,7 @@
        virtual int     get_version() const = 0;
        virtual float   get_width_pixels() const = 0;
        virtual float   get_height_pixels() const = 0;
-       virtual int     get_frame_count() const = 0;
+       virtual size_t  get_frame_count() const = 0;
        virtual float   get_frame_rate() const = 0;
        
        /// Create a playable movie instance from a def.
@@ -172,8 +172,8 @@
 
        // From movie_definition_sub
 
-       virtual const std::vector<execute_tag*>&        get_playlist(int 
frame_number) = 0;
-       virtual const std::vector<execute_tag*>*        get_init_actions(int 
frame_number) = 0;
+       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 smart_ptr<resource>     get_exported_resource(const tu_string& 
symbol) = 0;
 
 
@@ -187,13 +187,13 @@
        ///
        virtual character_def*  get_character_def(int id) = 0;
 
-       virtual bool    get_labeled_frame(const char* label, int* frame_number) 
= 0;
+       virtual bool get_labeled_frame(const char* label, size_t* frame_number) 
= 0;
 
        //
        // For use during creation.
        //
 
-       virtual int     get_loading_frame() const = 0;
+       virtual size_t  get_loading_frame() const = 0;
 
        virtual void    add_character(int id, character_def* ch) = 0;
 
@@ -244,6 +244,14 @@
        /// Return the URL of the SWF stream this definition has been read
        /// from.
        virtual const std::string& get_url() const = 0;
+
+       /// \brief
+       /// Ensure that frame number 'framenum' (1-based offset)
+       /// has been loaded (load on demand).
+       //
+       /// @return false on error (like not enough frames available).
+       ///
+       virtual bool ensure_frame_loaded(size_t framenum) = 0;
 };
 
 } // namespace gnash

Index: server/movie_interface.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_interface.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- server/movie_interface.h    27 Jul 2006 00:15:22 -0000      1.4
+++ server/movie_interface.h    3 Aug 2006 22:19:59 -0000       1.5
@@ -75,7 +75,7 @@
        
        virtual void    restart() = 0;
        virtual void    advance(float delta_time) = 0;
-       virtual void    goto_frame(int frame_number) = 0;
+       virtual void    goto_frame(size_t frame_number) = 0;
        /// Returns true if labeled frame is found.
        virtual bool    goto_labeled_frame(const char* label) = 0;
        virtual void    display() = 0;

Index: server/movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- server/movie_root.cpp       30 Jul 2006 01:09:24 -0000      1.9
+++ server/movie_root.cpp       3 Aug 2006 22:19:59 -0000       1.10
@@ -296,7 +296,7 @@
 bool
 movie_root::goto_labeled_frame(const char* label)
 {
-    int        target_frame = -1;
+       size_t target_frame;
     if (m_def->get_labeled_frame(label, &target_frame))
         {
             goto_frame(target_frame);
@@ -304,7 +304,8 @@
         }
     else
         {
-            log_action("ERROR: movie_impl::goto_labeled_frame('%s') unknown 
label\n", label);
+               log_error("ERROR: movie_impl::goto_labeled_frame('%s') "
+                       " unknown label\n", label);
             return false;
         }
 }

Index: server/movie_root.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.h,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/movie_root.h 30 Jul 2006 01:09:24 -0000      1.8
+++ server/movie_root.h 3 Aug 2006 22:19:59 -0000       1.9
@@ -199,7 +199,7 @@
        void    advance(float delta_time);
 
        /// 0-based!!
-       void goto_frame(int target_frame_number) {
+       void goto_frame(size_t target_frame_number) {
                m_movie->goto_frame(target_frame_number);
        }
 

Index: server/sprite_definition.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_definition.cpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- server/sprite_definition.cpp        1 Jul 2006 20:44:10 -0000       1.8
+++ server/sprite_definition.cpp        3 Aug 2006 22:19:59 -0000       1.9
@@ -139,11 +139,11 @@
        assert(m_loading_frame >= 0 && m_loading_frame < m_frame_count);
 
        tu_string n = name;
-       int currently_assigned = 0;
+       size_t currently_assigned = 0;
        if (m_named_frames.get(n, &currently_assigned) == true)
        {
                log_error("add_frame_name(%d, '%s') -- frame name "
-                       "already assigned to frame %d; overriding\n",
+                       "already assigned to frame %u; overriding\n",
                        m_loading_frame,
                        name, currently_assigned);
        }

Index: server/sprite_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_definition.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- server/sprite_definition.h  24 Jul 2006 18:59:40 -0000      1.11
+++ server/sprite_definition.h  3 Aug 2006 22:19:59 -0000       1.12
@@ -55,6 +55,7 @@
 /// \brief
 /// Holds the immutable data for a sprite, as read from
 /// as SWF stream.
+/// @@ should *not* derive from movie_definition, probably!
 ///
 class sprite_definition : public movie_definition
 {
@@ -89,18 +90,23 @@
        std::vector<std::vector<execute_tag*> > m_playlist;
 
        // stores 0-based frame #'s
-       stringi_hash<int> m_named_frames;
+       stringi_hash<size_t> m_named_frames;
 
        int m_frame_count;
 
-       int m_loading_frame;
+       size_t m_loading_frame;
 
        // overloads from movie_definition
        virtual float   get_width_pixels() const { return 1; }
        virtual float   get_height_pixels() const { return 1; }
-       virtual int     get_frame_count() const { return m_frame_count; }
+
+       virtual size_t  get_frame_count() const
+       {
+               return m_frame_count;
+       }
+
        virtual float   get_frame_rate() const { return 
m_movie_def->get_frame_rate(); }
-       virtual int     get_loading_frame() const { return m_loading_frame; }
+       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*/)
@@ -271,13 +277,13 @@
        virtual void    add_frame_name(const char* name);
 
        /// Returns 0-based frame #
-       bool    get_labeled_frame(const char* label, int* frame_number)
+       bool    get_labeled_frame(const char* label, size_t* frame_number)
        {
            return m_named_frames.get(label, frame_number);
        }
 
        /// frame_number is 0-based
-       const std::vector<execute_tag*>& get_playlist(int frame_number)
+       const std::vector<execute_tag*>& get_playlist(size_t frame_number)
        {
            return m_playlist[frame_number];
        }
@@ -285,8 +291,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(
-                       int /*frame_number*/)
+       virtual const std::vector<execute_tag*>* get_init_actions(size_t 
/*frame_number*/)
        {
            return NULL;
        }
@@ -296,6 +301,17 @@
            return m_movie_def->get_url();
        }
 
+       /// \brief
+       /// Ensure framenum frames of parent movie_definition 
+       /// are loaded (not frames of current sprite!)
+       ///
+       virtual bool ensure_frame_loaded(size_t framenum)
+       {
+               return m_movie_def->ensure_frame_loaded(framenum);
+       }
+
+
+
 };
 
 

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- server/sprite_instance.cpp  26 Jul 2006 11:52:01 -0000      1.22
+++ server/sprite_instance.cpp  3 Aug 2006 22:19:59 -0000       1.23
@@ -127,7 +127,7 @@
        }
 
        // Convert to 0-based
-       int target_frame = int(fn.arg(0).to_number() - 1);
+       size_t target_frame = size_t(fn.arg(0).to_number() - 1);
 
        sprite->goto_frame(target_frame);
        sprite->set_play_state(movie_interface::PLAY);
@@ -150,7 +150,7 @@
        }
 
        // Convert to 0-based
-       int target_frame = int(fn.arg(0).to_number() - 1);
+       size_t target_frame = size_t(fn.arg(0).to_number() - 1);
 
        sprite->goto_frame(target_frame);
        sprite->set_play_state(movie_interface::STOP);
@@ -166,8 +166,8 @@
        }
        assert(sprite);
 
-       int frame_count = sprite->get_frame_count();
-       int current_frame = sprite->get_current_frame();
+       size_t frame_count = sprite->get_frame_count();
+       size_t current_frame = sprite->get_current_frame();
        if (current_frame < frame_count)
        {
            sprite->goto_frame(current_frame + 1);
@@ -185,7 +185,7 @@
        }
        assert(sprite);
 
-       int current_frame = sprite->get_current_frame();
+       size_t current_frame = sprite->get_current_frame();
        if (current_frame > 0)
        {
            sprite->goto_frame(current_frame - 1);
@@ -725,7 +725,7 @@
 ///
 void sprite_instance::call_frame_actions(const as_value& frame_spec)
 {
-       int     frame_number = -1;
+       size_t  frame_number;
 
        // Figure out what frame to call.
        if (frame_spec.get_type() == as_value::STRING)
@@ -733,16 +733,16 @@
                if (m_def->get_labeled_frame(frame_spec.to_string(), 
&frame_number) == false)
                {
                        // Try converting to integer.
-                       frame_number = (int) frame_spec.to_number();
+                       frame_number = (size_t)frame_spec.to_number();
                }
        }
        else
        {
                // convert from 1-based to 0-based
-               frame_number = (int) frame_spec.to_number() - 1;
+               frame_number = (size_t) frame_spec.to_number() - 1;
        }
 
-       if (frame_number < 0 || frame_number >= m_def->get_frame_count())
+       if (frame_number >= m_def->get_frame_count())
        {
                    // No dice.
                    log_error("call_frame('%s') -- unknown frame\n", 
frame_spec.to_string());
@@ -1412,15 +1412,26 @@
 }
 
 void
-sprite_instance::goto_frame(int target_frame_number)
+sprite_instance::goto_frame(size_t target_frame_number)
 {
 //                     IF_VERBOSE_DEBUG(log_msg("sprite::goto_frame(%d)\n", 
target_frame_number));//xxxxx
 
-           target_frame_number = iclamp(target_frame_number, 0, 
m_def->get_frame_count() - 1);
+       target_frame_number = iclamp(target_frame_number, 0,
+                       m_def->get_frame_count() - 1);
+
+       // target_frame_number is 0-based !
+       if ( ! m_def->ensure_frame_loaded(target_frame_number+1) )
+       {
+               log_error("Could not advance to frame %d (for goto_frame).",
+                       target_frame_number+1);
+               // these kind of errors should be handled by callers
+               assert(0);
+       
+       }
 
            if (target_frame_number < m_current_frame)
                {
-                   for (int f = m_current_frame; f > target_frame_number; f--)
+               for (size_t f = m_current_frame; f>target_frame_number; --f)
                        {
                            execute_frame_tags_reverse(f);
                        }
@@ -1431,7 +1442,7 @@
                }
            else if (target_frame_number > m_current_frame)
                {
-                   for (int f = m_current_frame + 1; f < target_frame_number; 
f++)
+               for (size_t f = m_current_frame+1; f<target_frame_number; ++f)
                        {
                            execute_frame_tags(f, true);
                        }
@@ -1449,7 +1460,7 @@
 
 bool sprite_instance::goto_labeled_frame(const char* label)
 {
-    int        target_frame = -1;
+       size_t target_frame;
     if (m_def->get_labeled_frame(label, &target_frame))
        {
            goto_frame(target_frame);
@@ -1457,7 +1468,8 @@
        }
     else
        {
-            log_action("ERROR: movie_impl::goto_labeled_frame('%s') unknown 
label\n", label);
+               log_error("movie_impl::goto_labeled_frame('%s') "
+                       "unknown label\n", label);
            return false;
        }
 }
@@ -1632,6 +1644,15 @@
                }
        }
 
+       // 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);
 }
 

Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- server/sprite_instance.h    7 Jul 2006 01:01:11 -0000       1.11
+++ server/sprite_instance.h    3 Aug 2006 22:19:59 -0000       1.12
@@ -119,7 +119,7 @@
                return m_current_frame;
        }
 
-       int get_frame_count() const
+       size_t get_frame_count() const
        {
                return m_def->get_frame_count();
        }
@@ -216,7 +216,7 @@
        /// 0-based frame numbers!! 
        ///(in contrast to ActionScript and Flash MX)
        ///
-       void    goto_frame(int target_frame_number);
+       void    goto_frame(size_t target_frame_number);
 
 
        /// Look up the labeled frame, and jump to it.
@@ -452,7 +452,7 @@
        std::vector<action_buffer*>     m_action_list;
 
        play_state      m_play_state;
-       int             m_current_frame;
+       size_t          m_current_frame;
        float           m_time_remainder;
        bool            m_update_frame;
        bool            m_has_looped;

Index: server/swf/ASHandlers.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/ASHandlers.cpp,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -b -r1.41 -r1.42
--- server/swf/ASHandlers.cpp   3 Aug 2006 16:50:05 -0000       1.41
+++ server/swf/ASHandlers.cpp   3 Aug 2006 22:19:59 -0000       1.42
@@ -670,7 +670,7 @@
 #endif
 
        dbglogfile << __PRETTY_FUNCTION__
-               << ": unimplemented (no need until we play while reading)"
+               << ": unimplemented (we need to implement!!)"
                << endl;
 }
 
@@ -1310,7 +1310,9 @@
 
        env.drop(1);
        
-       dbglogfile << __PRETTY_FUNCTION__ << ": unimplemented!" << endl;
+       dbglogfile << __PRETTY_FUNCTION__ 
+                  << ": unimplemented (we need to implement!!)"
+                  << endl;
 }
 
 void




reply via email to

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