[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: |
Thu, 28 Dec 2006 01:44:10 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 06/12/28 01:44:10
Modified files:
. : ChangeLog
server : sprite_instance.cpp sprite_instance.h
server/swf : tag_loaders.cpp
testsuite/misc-ming.all: loop_test-Runner.cpp
place_object_testrunner.cpp
Log message:
* server/sprite_instance.{h,cpp}: cleanup and document
add_display_object method reintroducing use of
the replace_if_depth_is_occupied parameter.
* server/swf/tag_loaders.cpp (place_object_2::execute): don't
let new characters replace existing ones at same depth
when placing them. This fixes all existing testcases
in misc-ming.all.
* testsuite/misc-ming.all/: loop_test-Runner.cpp,
place_object_testrunner.cpp: don't expect failures.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2006&r2=1.2007
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.116&r2=1.117
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.h?cvsroot=gnash&r1=1.51&r2=1.52
http://cvs.savannah.gnu.org/viewcvs/gnash/server/swf/tag_loaders.cpp?cvsroot=gnash&r1=1.67&r2=1.68
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/loop_test-Runner.cpp?cvsroot=gnash&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/place_object_testrunner.cpp?cvsroot=gnash&r1=1.1&r2=1.2
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.2006
retrieving revision 1.2007
diff -u -b -r1.2006 -r1.2007
--- ChangeLog 28 Dec 2006 00:39:59 -0000 1.2006
+++ ChangeLog 28 Dec 2006 01:44:09 -0000 1.2007
@@ -1,5 +1,17 @@
2006-12-28 Sandro Santilli <address@hidden>
+ * server/sprite_instance.{h,cpp}: cleanup and document
+ add_display_object method reintroducing use of
+ the replace_if_depth_is_occupied parameter.
+ * server/swf/tag_loaders.cpp (place_object_2::execute): don't
+ let new characters replace existing ones at same depth
+ when placing them. This fixes all existing testcases
+ in misc-ming.all.
+ * testsuite/misc-ming.all/: loop_test-Runner.cpp,
+ place_object_testrunner.cpp: don't expect failures.
+
+2006-12-28 Sandro Santilli <address@hidden>
+
* testsuite/misc-ming.all/: Makefile.am, place_object_test.c,
place_object_testrunner.cpp: new test by Zou Lunkai for
depth replacement and automatic runner for it (by myself).
Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.116
retrieving revision 1.117
diff -u -b -r1.116 -r1.117
--- server/sprite_instance.cpp 24 Dec 2006 20:07:22 -0000 1.116
+++ server/sprite_instance.cpp 28 Dec 2006 01:44:09 -0000 1.117
@@ -2445,7 +2445,7 @@
const char* name,
const std::vector<swf_event*>& event_handlers,
uint16_t depth,
- bool /* replace_if_depth_is_occupied */,
+ bool replace_if_depth_is_occupied,
const cxform& color_transform, const matrix& matrix,
float ratio, uint16_t clip_depth)
{
@@ -2455,71 +2455,63 @@
character_def* cdef = m_def->get_character_def(character_id);
if (cdef == NULL)
{
- log_error("sprite::add_display_object(): unknown cid =
%d\n", character_id);
+ IF_VERBOSE_MALFORMED_SWF(
+ log_warning("sprite_instance::add_display_object(): "
+ "unknown cid = %d", character_id);
+ );
return NULL;
}
- // If we already have this object on this
- // plane, then move it instead of replacing
- // it.
+ std::string instance_name;
+ if ( name ) instance_name = name;
+
character* existing_char =
m_display_list.get_character_at_depth(depth);
- if (existing_char
- && existing_char->get_id() == character_id
- && ((name == NULL && existing_char->get_name().length() == 0)
- || (name && existing_char->get_name() == name)))
- {
-// IF_VERBOSE_DEBUG(log_msg("add changed to move on depth
%d\n", depth));//xxxxxx
- // compare events
- const Events& existing_events =
existing_char->get_event_handlers();
-size_t n = event_handlers.size();
-if (existing_events.size() == n)
-{
- bool same_events = true;
- for (size_t i = 0; i < n; i++)
- {
- Events::const_iterator it =
existing_events.find(event_handlers[i]->m_event);
- if ( it != existing_events.end() )
+
+ if (existing_char)
{
- as_value result = it->second;
- // compare actionscipt in event
- if (event_handlers[i]->m_method == result)
+ // If we already have this object on this
+ // plane, then move it instead of replacing it.
+ //
+ // TODO: we need a testcase for this !
+ // (maybe we should abort and wait for
+ // someone to scream about it...)
+ //
+ if ( existing_char->get_id() == character_id &&
+ instance_name == existing_char->get_name() &&
+ sameEvents(existing_char->get_event_handlers(),
+ event_handlers) )
{
- continue;
- }
- }
- same_events = false;
- break;
+ move_display_object(depth, true, color_transform,
+ true, matrix, ratio, clip_depth);
+ return NULL;
}
- if (same_events)
+ // If we've been asked NOT to replace existing chars just
+ // return NULL now
+ if ( ! replace_if_depth_is_occupied )
{
- move_display_object(depth, true, color_transform, true, matrix,
ratio, clip_depth);
return NULL;
}
-}
}
- //printf("%s: character %s, id is %d, count is %d\n", __FUNCTION__,
existing_char->get_name(), character_id,m_display_list.get_character_count());
// FIXME:
+ //printf("%s: character %s, id is %d, count is %d\n", __FUNCTION__,
existing_char->get_name(), character_id,m_display_list.get_character_count());
assert(cdef);
- boost::intrusive_ptr<character> ch =
cdef->create_character_instance(this,
- character_id);
+ boost::intrusive_ptr<character> ch =
cdef->create_character_instance(this, character_id);
assert(ch.get() != NULL);
// Syntetize an instance name if this character doesn't have one
// TODO: check if we need to do this *only* for sprite characters
// also, consider asking for "nextInstanceName" to the
character
// definition...
- std::string instance_name;
- if ( name ) instance_name = name;
- else instance_name = getNextUnnamedInstanceName();
+ if ( instance_name.empty() ) instance_name =
getNextUnnamedInstanceName();
ch->set_name(instance_name.c_str());
// Attach event handlers (if any).
- {for (int i = 0, n = event_handlers.size(); i < n; i++)
+ for (size_t i = 0, n = event_handlers.size(); i < n; i++)
{
event_handlers[i]->attach_to(ch.get());
- }}
+ }
m_display_list.place_character(
ch.get(),
@@ -3067,4 +3059,26 @@
return ss.str();
}
+/* private static */
+bool
+sprite_instance::sameEvents(const Events& eventsMap, const SWFEventsVector&
eventsVect)
+{
+ size_t n = eventsVect.size();
+ if (eventsMap.size() != n) return false;
+
+ for (size_t i = 0; i < n; i++)
+ {
+ Events::const_iterator it =
eventsMap.find(eventsVect[i]->m_event);
+
+ if ( it == eventsMap.end() ) return false;
+
+ as_value result = it->second;
+ // compare actionscipt in event
+ if (eventsVect[i]->m_method != result) return false;
+ }
+
+ return true;
+
+}
+
} // namespace gnash
Index: server/sprite_instance.h
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.h,v
retrieving revision 1.51
retrieving revision 1.52
diff -u -b -r1.51 -r1.52
--- server/sprite_instance.h 21 Dec 2006 12:06:52 -0000 1.51
+++ server/sprite_instance.h 28 Dec 2006 01:44:09 -0000 1.52
@@ -17,7 +17,7 @@
//
//
-/* $Id: sprite_instance.h,v 1.51 2006/12/21 12:06:52 strk Exp $ */
+/* $Id: sprite_instance.h,v 1.52 2006/12/28 01:44:09 strk Exp $ */
// Stateful live Sprite instance
@@ -61,9 +61,13 @@
public:
typedef std::list<action_buffer*> ActionList;
+
// definition must match movie_definition::PlayList
typedef std::vector<execute_tag*> PlayList;
+ typedef std::vector<swf_event*> SWFEventsVector;
+
+
/// @param root
/// The "relative" _root of this sprite, which is the
/// instance of top-level sprite defined by the same
@@ -292,8 +296,11 @@
/// @param depth
/// The depth to assign to the newly created instance.
///
- /// @param replace_if_dept_is_occupied
- /// unused, always true
+ /// @param replace_if_depth_is_occupied
+ /// If true, any existing character at the given depth will be
+ /// replaced by the new one. If false, the presence of a character
+ /// at the target depth will make this call a no-op, and NULL
+ /// will be returned.
///
/// @param color_transform
/// The color transform to apply to the newly created instance.
@@ -305,10 +312,16 @@
///
/// @param clip_depth
///
+ /// @return
+ /// A pointer to the character being added or NULL
+ /// if this call results in a move of an existing character
+ /// or in a no-op due to replace_if_depth_is_occupied being
+ /// false.
+ ///
character* add_display_object(
uint16_t character_id,
const char* name,
- const std::vector<swf_event*>& event_handlers,
+ const SWFEventsVector& event_handlers,
uint16_t depth,
bool replace_if_depth_is_occupied,
const cxform& color_transform,
@@ -640,6 +653,15 @@
/// Build the _target member recursive on parent
std::string computeTargetPath() const;
+ /// Compare two events sets
+ //
+ /// @return
+ /// true if the two sets contain the same values, false otherwise.
+ /// Note that in the eventsMap, only the value is compared, and
+ /// the key is discarded.
+ ///
+ static bool sameEvents(const Events& eventsMap, const SWFEventsVector&
eventsVect);
+
protected:
/// \brief
Index: server/swf/tag_loaders.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/swf/tag_loaders.cpp,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -b -r1.67 -r1.68
--- server/swf/tag_loaders.cpp 22 Dec 2006 09:39:44 -0000 1.67
+++ server/swf/tag_loaders.cpp 28 Dec 2006 01:44:09 -0000 1.68
@@ -18,7 +18,7 @@
//
//
-/* $Id: tag_loaders.cpp,v 1.67 2006/12/22 09:39:44 strk Exp $ */
+/* $Id: tag_loaders.cpp,v 1.68 2006/12/28 01:44:09 strk Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1062,7 +1062,7 @@
m_name,
m_event_handlers,
m_depth,
- m_tag_type != 4, // original place_object doesn't do
replacement
+ false, // m_tag_type != SWF::PLACEOBJECT, // original
place_object doesn't do replacement
m_color_transform,
m_matrix,
m_ratio,
Index: testsuite/misc-ming.all/loop_test-Runner.cpp
===================================================================
RCS file: /sources/gnash/gnash/testsuite/misc-ming.all/loop_test-Runner.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/misc-ming.all/loop_test-Runner.cpp 26 Dec 2006 14:30:03
-0000 1.1
+++ testsuite/misc-ming.all/loop_test-Runner.cpp 28 Dec 2006 01:44:09
-0000 1.2
@@ -119,13 +119,13 @@
// we expect depths to be swapped again
tester.advance();
check_equals(root->get_current_frame(), 29);
- xcheck_equals(movieClip1->get_depth(), 1);
- xcheck_equals(movieClip2->get_depth(), 2);
+ check_equals(movieClip1->get_depth(), 1);
+ check_equals(movieClip2->get_depth(), 2);
// .. and the new deptsh to be kept at restart
tester.advance();
check_equals(root->get_current_frame(), 0);
- xcheck_equals(movieClip1->get_depth(), 1);
- xcheck_equals(movieClip2->get_depth(), 2);
+ check_equals(movieClip1->get_depth(), 1);
+ check_equals(movieClip2->get_depth(), 2);
}
Index: testsuite/misc-ming.all/place_object_testrunner.cpp
===================================================================
RCS file:
/sources/gnash/gnash/testsuite/misc-ming.all/place_object_testrunner.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- testsuite/misc-ming.all/place_object_testrunner.cpp 28 Dec 2006 00:39:59
-0000 1.1
+++ testsuite/misc-ming.all/place_object_testrunner.cpp 28 Dec 2006 01:44:09
-0000 1.2
@@ -70,7 +70,6 @@
const character* ch = tester.findDisplayItemByDepth(*root, 3);
check(ch);
- xcheck_equals(ch->get_name(), "sh1"); // gnash fails here in that it
lets 'sh2'
- // replace existing char at depth
3
+ check_equals(ch->get_name(), "sh1");
}