gnash-commit
[Top][All Lists]
Advanced

[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"); 
 }
 




reply via email to

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