[Top][All Lists]
[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, ¤tly_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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash ChangeLog server/character.h server/impl....,
Sandro Santilli <=