[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv... |
Date: |
Wed, 09 Apr 2008 09:29:00 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 08/04/09 09:28:59
Modified files:
. : ChangeLog
server : sprite_instance.cpp
server/parser : sprite_definition.cpp sprite_definition.h
server/swf : tag_loaders.cpp
testsuite/misc-swfmill.all: zeroframe_definesprite.xml
Log message:
* server/parser/sprite_definition.h: overrides from public
virtuals
in base class can as well be public here; comment out the
assertion insisting in getPlaylist requiring a frame number <
the advertised number of frames (we must support advertising
less frames then available, in particular: 0).
* server/parser/sprite_definition.cpp (read): always warn about
malformed swf, not just the first time. It will stop at end of
parsing anyway.
* server/sprite_instance.cpp:
(stagePlacementCallback): still try to execute tags in first
frame,
even if there were no SHOWFRAME tags (fixes bug #22872).
(sprite_currentframe_get): return min between loaded frame
and current frame (well, yes, it seems real current frame may
be
> then loaded, in gnash model).
* server/swf/tag_loaders.cpp (sprite_loader): warn' here about
no frames advertised (so we have the character id).
* testsuite/misc-swfmill.all/zeroframe_definesprite.xml: test
that tags in first frame of a 0-advertised 0-showframe
sprite are still executed.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.6223&r2=1.6224
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.498&r2=1.499
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.cpp?cvsroot=gnash&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/gnash/server/parser/sprite_definition.h?cvsroot=gnash&r1=1.39&r2=1.40
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/tag_loaders.cpp?cvsroot=gnash&r1=1.193&r2=1.194
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-swfmill.all/zeroframe_definesprite.xml?cvsroot=gnash&r1=1.2&r2=1.3
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.6223
retrieving revision 1.6224
diff -u -b -r1.6223 -r1.6224
--- ChangeLog 8 Apr 2008 21:59:22 -0000 1.6223
+++ ChangeLog 9 Apr 2008 09:28:57 -0000 1.6224
@@ -1,3 +1,25 @@
+2008-04-09 Sandro Santilli <address@hidden>
+
+ * server/parser/sprite_definition.h: overrides from public virtuals
+ in base class can as well be public here; comment out the
+ assertion insisting in getPlaylist requiring a frame number <
+ the advertised number of frames (we must support advertising
+ less frames then available, in particular: 0).
+ * server/parser/sprite_definition.cpp (read): always warn about
+ malformed swf, not just the first time. It will stop at end of
+ parsing anyway.
+ * server/sprite_instance.cpp:
+ (stagePlacementCallback): still try to execute tags in first frame,
+ even if there were no SHOWFRAME tags (fixes bug #22872).
+ (sprite_currentframe_get): return min between loaded frame
+ and current frame (well, yes, it seems real current frame may be
+ > then loaded, in gnash model).
+ * server/swf/tag_loaders.cpp (sprite_loader): warn' here about
+ no frames advertised (so we have the character id).
+ * testsuite/misc-swfmill.all/zeroframe_definesprite.xml: test
+ that tags in first frame of a 0-advertised 0-showframe
+ sprite are still executed.
+
2008-04-08 Sandro Santilli <address@hidden>
* server/as_object.{cpp,h}: add init_readonly_property taking
Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.498
retrieving revision 1.499
diff -u -b -r1.498 -r1.499
--- server/sprite_instance.cpp 8 Apr 2008 21:59:23 -0000 1.498
+++ server/sprite_instance.cpp 9 Apr 2008 09:28:58 -0000 1.499
@@ -1818,7 +1818,7 @@
{
boost::intrusive_ptr<sprite_instance> ptr =
ensureType<sprite_instance>(fn.this_ptr);
- return as_value(ptr->get_current_frame() + 1);
+ return as_value(std::min(ptr->get_loaded_frames(), ptr->get_current_frame()
+ 1));
}
static as_value
@@ -2976,7 +2976,7 @@
{
testInvariant();
- assert(frame < get_loaded_frames());
+ //assert(frame < get_loaded_frames());
assert(typeflags);
@@ -3988,6 +3988,7 @@
// See testsuite/misc-swfmill.all/zeroframe_definesprite.swf
//m_def->ensure_frame_loaded(0);
+#if 0
// We might have loaded NO frames !
bool hasFrames = get_loaded_frames();
if ( ! hasFrames )
@@ -3996,6 +3997,7 @@
ONCE( log_swferror(_("stagePlacementCallback: no frames loaded for
sprite/movie %s"), getTarget()) );
);
}
+#endif
// We execute events immediately when the stage-placed character is dynamic.
// This is becase we assume that this means that the character is placed
during
@@ -4039,13 +4041,10 @@
assert(!_callingFrameActions); // or will not be queuing actions
if ( get_parent() == 0 )
{
- if ( hasFrames )
- {
#ifdef GNASH_DEBUG
log_debug(_("Executing tags of frame0 in sprite %s"), getTarget());
#endif
execute_frame_tags(0, TAG_DLIST|TAG_ACTION);
- }
if ( _vm.getSWFVersion() > 5 )
{
@@ -4064,14 +4063,11 @@
#endif
queueEvent(event_id::LOAD, movie_root::apDOACTION);
- if ( hasFrames )
- {
#ifdef GNASH_DEBUG
log_debug(_("Executing tags of frame0 in sprite %s"), getTarget());
#endif
execute_frame_tags(0, TAG_DLIST|TAG_ACTION);
}
- }
}
Index: server/parser/sprite_definition.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- server/parser/sprite_definition.cpp 3 Apr 2008 09:43:16 -0000 1.30
+++ server/parser/sprite_definition.cpp 9 Apr 2008 09:28:59 -0000 1.31
@@ -156,15 +156,14 @@
if ( m_frame_count > m_loading_frame )
{
IF_VERBOSE_MALFORMED_SWF(
- ONCE( log_swferror(_(SIZET_FMT " frames advertised in header,
but only " SIZET_FMT " SHOWFRAME tags "
- "found in define sprite. Is a common thing, will warn
only once."), m_frame_count, m_loading_frame) );
+ log_swferror(_("%d frames advertised in header, but only %d
SHOWFRAME tags "
+ "found in define sprite."), m_frame_count,
m_loading_frame );
);
// this should be safe
m_loading_frame = m_frame_count;
}
-
IF_VERBOSE_PARSE (
log_parse(_(" -- sprite END --"));
);
Index: server/parser/sprite_definition.h
===================================================================
RCS file: /sources/gnash/gnash/server/parser/sprite_definition.h,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -b -r1.39 -r1.40
--- server/parser/sprite_definition.h 3 Mar 2008 17:45:01 -0000 1.39
+++ server/parser/sprite_definition.h 9 Apr 2008 09:28:59 -0000 1.40
@@ -109,41 +109,14 @@
_timeline.getFrameDepths(frameno, depths);
}
-private:
-
- void read(stream* in);
-
- /// Tags loader table.
- //
- /// TODO: make it a static member, specific to sprite_definition
- SWF::TagLoadersTable& _tag_loaders;
-
- /// Top-level movie definition
- /// (the definition read from SWF stream)
- movie_definition* m_movie_def;
-
- typedef std::map<size_t, PlayList> PlayListMap;
-
- /// movie control events for each frame.
- PlayListMap m_playlist;
-
- // stores 0-based frame #'s
- typedef std::map<std::string, size_t> NamedFrameMap;
- NamedFrameMap m_named_frames;
-
- size_t m_frame_count;
-
- // Number of frames completely parsed
- size_t m_loading_frame;
-
- // overloads from movie_definition
+ // overload from movie_definition
virtual float get_width_pixels() const { return 1; }
+
+ // overload from movie_definition
virtual float get_height_pixels() const { return 1; }
- virtual size_t get_frame_count() const
- {
- return m_frame_count;
- }
+ // overload from movie_definition
+ virtual size_t get_frame_count() const { return m_frame_count; }
/// \brief
/// Return total bytes of the movie from which this sprite
@@ -278,6 +251,34 @@
character* parent, int id);
+private:
+
+ void read(stream* in);
+
+ /// Tags loader table.
+ //
+ /// TODO: make it a static member, specific to sprite_definition
+ SWF::TagLoadersTable& _tag_loaders;
+
+ /// Top-level movie definition
+ /// (the definition read from SWF stream)
+ movie_definition* m_movie_def;
+
+ typedef std::map<size_t, PlayList> PlayListMap;
+
+ /// movie control events for each frame.
+ PlayListMap m_playlist;
+
+ // stores 0-based frame #'s
+ typedef std::map<std::string, size_t> NamedFrameMap;
+ NamedFrameMap m_named_frames;
+
+ size_t m_frame_count;
+
+ // Number of frames completely parsed
+ size_t m_loading_frame;
+
+
// See dox in movie_definition.h
virtual void addControlTag(ControlTag* c)
{
@@ -295,7 +296,7 @@
{
// Don't access playlist of a frame which has not been
// completely parsed yet.
- assert(frame_number < m_loading_frame);
+ //assert(frame_number < m_loading_frame);
PlayListMap::const_iterator it = m_playlist.find(frame_number);
if ( it == m_playlist.end() ) return NULL;
Index: server/swf/tag_loaders.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/tag_loaders.cpp,v
retrieving revision 1.193
retrieving revision 1.194
diff -u -b -r1.193 -r1.194
--- server/swf/tag_loaders.cpp 26 Mar 2008 16:51:55 -0000 1.193
+++ server/swf/tag_loaders.cpp 9 Apr 2008 09:28:59 -0000 1.194
@@ -916,6 +916,12 @@
sprite_definition* ch = new sprite_definition(m, in);
//ch->read(in);
+ IF_VERBOSE_MALFORMED_SWF(
+ if ( ! ch->get_frame_count() )
+ log_swferror(_("Sprite %d advertise no frames"), character_id);
+ );
+
+
m->add_character(character_id, ch);
}
Index: testsuite/misc-swfmill.all/zeroframe_definesprite.xml
===================================================================
RCS file:
/sources/gnash/gnash/testsuite/misc-swfmill.all/zeroframe_definesprite.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- testsuite/misc-swfmill.all/zeroframe_definesprite.xml 26 Mar 2008
15:36:55 -0000 1.2
+++ testsuite/misc-swfmill.all/zeroframe_definesprite.xml 9 Apr 2008
09:28:59 -0000 1.3
@@ -10,7 +10,7 @@
| - _totalframes reflects what's advertised, no matter number of SHOWFRAME
|
-->
- <Header framerate="12" frames="1">
+ <Header framerate="12" frames="2">
<size>
<Rectangle left="0" right="12800" top="0" bottom="9600"/>
</size>
@@ -44,6 +44,64 @@
</DefineSprite>
<!--
+ | Definition of a 0-advertised frames, with NO SHOWFRAME tag
+ | but an action in it
+ -->
+ <DefineSprite objectID="4" frames="0">
+ <tags>
+ <DoAction>
+ <actions>
+ <PushData>
+ <items>
+ <StackString value="_root"/>
+ </items>
+ </PushData> <!-- [string:_root] -->
+ <GetVariable/> <!-- [movieclip:_root] -->
+ <PushData>
+ <items>
+ <StackString value="summary"/>
+ <StackString value="_root"/>
+ </items>
+ </PushData> <!--
[movieclip:_root],[string:summary],[string:_root] -->
+ <GetVariable/> <!--
[movieclip:_root],[string:summary],[movieclip:_root] -->
+ <PushData>
+ <items>
+ <StackString value="summary"/>
+ </items>
+ </PushData> <!--
[movieclip:_root],[string:summary],[movieclip:_root],[string:summary] -->
+ <GetMember/> <!--
[movieclip:_root],[string:summary],[string:a00b11c22] -->
+ <PushData>
+ <items>
+ <StackString value="d"/>
+ <StackString value="_framesloaded"/>
+ </items>
+ </PushData> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d],[string:_framesloaded]
-->
+ <GetVariable/> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d],[number:0] -->
+ <AddTyped/> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d0] -->
+ <PushData>
+ <items>
+ <StackString value="_totalframes"/>
+ </items>
+ </PushData> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d0],[string:_totalframes]
-->
+ <GetVariable/> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d0],[number:0] -->
+ <AddTyped/> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d00] -->
+ <PushData>
+ <items>
+ <StackString value="_currentframe"/>
+ </items>
+ </PushData> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d00],[string:_currentframe]
-->
+ <GetVariable/> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d00],[number:0]
-->
+ <AddTyped/> <!--
[movieclip:_root],[string:summary],[string:a00b11c22],[string:d000] -->
+ <AddTyped/> <!--
[movieclip:_root],[string:summary],[string:a00b11c22d000] -->
+ <SetMember/> <!-- EMPTY STACK -->
+ <EndAction/>
+ </actions>
+ </DoAction>
+ <End/>
+ </tags>
+ </DefineSprite>
+
+ <!--
| Place the zero-frames no-showframe sprite
-->
<PlaceObject2 replace="0" depth="1" objectID="1" name="zero_zero"
allflags1="1" allflags2="0">
@@ -180,18 +238,27 @@
</events>
</PlaceObject2>
+ <!--
+ | Place the zero-frames no-showframe sprite but action tag in it
+ -->
+ <PlaceObject2 replace="0" depth="4" objectID="4"
name="zero_zero_doaction" allflags1="0" allflags2="0">
+ </PlaceObject2>
+
+ <!-- Let a frame go by, so actions in object 4 (zero_zero_doaction) are
executed before we check here -->
+ <ShowFrame/>
+
<DoAction>
<actions>
<PushData>
<items>
- <StackString value="a00b11c22"/>
+ <StackString value="a00b11c22d000"/>
<StackString value="summary"/>
</items>
</PushData>
<GetVariable/>
<Duplicate/> <!-- .. debugging .. -->
- <Trace/> <!-- expect a00b11c22 -->
+ <Trace/> <!-- expect a00b11c22d000 -->
<EqualTyped/>
@@ -205,16 +272,16 @@
// NOTE: the number of characters in the next string push
// DOES matter in the BranchIfTrue tag above, so keep it
constant
-->
- <StackString value="FAILED: expected a00b11c22 ... "/>
+ <StackString value="FAILED: expected a00b11c22d000 "/>
</items>
</PushData>
<Trace/>
- <BranchAlways byteOffset="27"/> // get to end
+ <BranchAlways byteOffset="37"/> // get to end
// PASSED tracing
<PushData>
<items>
- <StackString value="PASSED: got a00b11c22"/>
+ <StackString value="PASSED: got a00b11c22d000 "/>
</items>
</PushData>
<Trace/>
@@ -227,6 +294,9 @@
</PushData>
<Trace/>
+ // don't loop forever..
+ <Stop/>
+
<EndAction/>
</actions>
</DoAction>
- [Gnash-commit] gnash ChangeLog server/sprite_instance.cpp serv...,
Sandro Santilli <=