gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/dlist.cpp


From: Zou Lunkai
Subject: [Gnash-commit] gnash ChangeLog server/dlist.cpp
Date: Tue, 21 Aug 2007 11:22:17 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Zou Lunkai <zoulunkai>  07/08/21 11:22:17

Modified files:
        .              : ChangeLog 
        server         : dlist.cpp 

Log message:
        * server/dlist.cpp: update display(), for masks. It should work better, 
at least for agg renderer.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4053&r2=1.4054
http://cvs.savannah.gnu.org/viewcvs/gnash/server/dlist.cpp?cvsroot=gnash&r1=1.75&r2=1.76

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.4053
retrieving revision 1.4054
diff -u -b -r1.4053 -r1.4054
--- ChangeLog   21 Aug 2007 03:49:41 -0000      1.4053
+++ ChangeLog   21 Aug 2007 11:22:17 -0000      1.4054
@@ -2,6 +2,10 @@
 
         * server/swf.h: Add new tag values for SWF 9 support.
 
+2007-08-21 Zou Lunkai <address@hidden>
+       
+       * server/dlist.cpp: update display(), for masks, please check.
+       
 2007-08-21 Sandro Santilli <address@hidden>
 
        * server/edit_text_character.cpp (add_invalidated_bounds): use

Index: server/dlist.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/dlist.cpp,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -b -r1.75 -r1.76
--- server/dlist.cpp    9 Aug 2007 12:18:05 -0000       1.75
+++ server/dlist.cpp    21 Aug 2007 11:22:17 -0000      1.76
@@ -27,6 +27,7 @@
 #include <typeinfo>
 #include <iostream>
 #include <algorithm>
+#include <stack>
 
 namespace gnash {
 
@@ -762,71 +763,52 @@
 DisplayList::display()
 {
        //GNASH_REPORT_FUNCTION;
+    std::stack<int> clipDepthStack;
        
-//             printf(".");
-
-       bool masked = false;
-       int highest_masked_layer = 0;
-       
-       //log_msg(_("number of objects to be drawn %d"), 
m_display_object_array.size());
-       
-       for( iterator it = _characters.begin(),
-                       endIt = _characters.end();
+    for( iterator it = _characters.begin(), endIt = _characters.end();
                it != endIt; ++it)
        {
-               DisplayItem& dobj = *it;
-
-               //character*    ch = dobj.m_character.get();
-               character*      ch = dobj.get();
-
+        character* ch = it->get();
                assert(ch);
 
                if (ch->get_visible() == false)
                {
+            // avoid stale old_invalidated_rect
+            ch->clear_invalidated(); 
                        // Don't display.
-                       ch->clear_invalidated(); // avoid stale 
old_invalidated_rect
+            // TODO: test invisible characters as masks
                        continue;
                }
 
-               // check whether a previous mask should be disabled
-               if (masked)
-               {
-                       if (ch->get_depth() > highest_masked_layer)
+        int depth = ch->get_depth();
+        // Discard useless masks
+        while(!clipDepthStack.empty() && (depth > clipDepthStack.top()))
                        {
-//                                     log_msg(_("disabled mask before drawing 
depth %d"), ch->get_depth());
-                               masked = false;
-                               // turn off mask
+            clipDepthStack.pop();
                                render::disable_mask();
                        }
-               }
 
-               // check whether this object should become mask
-               // (see bug #20527 for the "&& !masked" condition)
-               if (ch->isMask() && !masked)
+        int clipDepth = ch->get_clip_depth();
+        // Push a new mask to the masks stack
+        if(clipDepth != character::noClipDepthValue)
                {
-                       //log_msg(_("begin submit mask"));
+            clipDepthStack.push(clipDepth);
                        render::begin_submit_mask();
                }
                
                ch->display();
 
-               // if this object should have become a mask,
-               // inform the renderer that it now has all
-               // information about it
-               if (ch->isMask() && !masked)
+        // Notify the renderer that mask drawing has finished.
+        if (ch->isMask())
                {
-                       //log_msg(_("end submit mask"));
                        render::end_submit_mask();
-                       highest_masked_layer = ch->get_clip_depth();
-                       masked = true;
-               }
        }
+    } //end of for
        
-       if (masked)
+    // Discard any remaining masks
+    while(!clipDepthStack.empty())
        {
-               // If a mask masks the scene all the way up to the highest
-               // layer, it will not be disabled at the end of drawing
-               // the display list, so disable it manually.
+        clipDepthStack.pop();
                render::disable_mask();
        }
 }




reply via email to

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