Fix for bug 13432, determineFlowSpacing is O(n^2).
authorhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 21 Apr 2007 22:31:09 +0000 (22:31 +0000)
committerhyatt <hyatt@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 21 Apr 2007 22:31:09 +0000 (22:31 +0000)
        Reviewed by aroben

        * rendering/InlineBox.cpp:
        (WebCore::InlineBox::nextOnLineExists):
        (WebCore::InlineBox::prevOnLineExists):
        * rendering/InlineBox.h:
        (WebCore::InlineBox::InlineBox):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@20998 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/rendering/InlineBox.cpp
WebCore/rendering/InlineBox.h

index e786f69..f8d0fe9 100644 (file)
@@ -1,3 +1,15 @@
+2007-04-21  David Hyatt  <hyatt@apple.com>
+
+        Fix for bug 13432, determineFlowSpacing is O(n^2).
+
+        Reviewed by aroben
+
+        * rendering/InlineBox.cpp:
+        (WebCore::InlineBox::nextOnLineExists):
+        (WebCore::InlineBox::prevOnLineExists):
+        * rendering/InlineBox.h:
+        (WebCore::InlineBox::InlineBox):
+
 2007-04-21  Lamar Goddard <lamargoddard@gmail.com>
 
         Reviewed by Darin.
index ac17abe..5286743 100644 (file)
@@ -179,24 +179,32 @@ RootInlineBox* InlineBox::root()
 
 bool InlineBox::nextOnLineExists() const
 {
-    if (!parent())
-        return false;
-    
-    if (nextOnLine())
-        return true;
-    
-    return parent()->nextOnLineExists();
+    if (!m_determinedIfNextOnLineExists) {
+        m_determinedIfNextOnLineExists = true;
+
+        if (!parent())
+            m_nextOnLineExists = false;
+        else if (nextOnLine())
+            m_nextOnLineExists = true;
+        else
+            m_nextOnLineExists = parent()->nextOnLineExists();
+    }
+    return m_nextOnLineExists;
 }
 
 bool InlineBox::prevOnLineExists() const
 {
-    if (!parent())
-        return false;
-    
-    if (prevOnLine())
-        return true;
-    
-    return parent()->prevOnLineExists();
+    if (!m_determinedIfPrevOnLineExists) {
+        m_determinedIfPrevOnLineExists = true;
+        
+        if (!parent())
+            m_prevOnLineExists = false;
+        else if (prevOnLine())
+            m_prevOnLineExists = true;
+        else
+            m_prevOnLineExists = parent()->prevOnLineExists();
+    }
+    return m_prevOnLineExists;
 }
 
 InlineBox* InlineBox::firstLeafChild()
index 69a0afc..f06fbae 100644 (file)
@@ -58,6 +58,10 @@ public:
         , m_hasEllipsisBox(false)
         , m_reversed(false)
         , m_treatAsText(true)
+        , m_determinedIfNextOnLineExists(false)
+        , m_determinedIfPrevOnLineExists(false)
+        , m_nextOnLineExists(false)
+        , m_prevOnLineExists(false)
         , m_toAdd(0)
     {
     }
@@ -85,6 +89,10 @@ public:
         , m_hasEllipsisBox(false)
         , m_reversed(false)
         , m_treatAsText(true)
+        , m_determinedIfNextOnLineExists(false)
+        , m_determinedIfPrevOnLineExists(false)
+        , m_nextOnLineExists(false)
+        , m_prevOnLineExists(false)
         , m_toAdd(0)
     {
     }
@@ -233,6 +241,10 @@ public: // FIXME: Would like to make this protected, but methods are accessing t
     bool m_reversed : 1;
     bool m_dirOverride : 1;
     bool m_treatAsText : 1; // Whether or not to treat a <br> as text for the purposes of line height.
+    mutable bool m_determinedIfNextOnLineExists : 1;
+    mutable bool m_determinedIfPrevOnLineExists : 1;
+    mutable bool m_nextOnLineExists : 1;
+    mutable bool m_prevOnLineExists : 1;
     int m_toAdd : 13; // for justified text
 };