[Text Autosizing] Combine narrow descendants of a cluster into groups that should...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Feb 2013 12:45:26 +0000 (12:45 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Feb 2013 12:45:26 +0000 (12:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=109825

Source/WebCore:

Enhancement of the approach introduced in https://bugs.webkit.org/show_bug.cgi?id=109573.
Instead of using the same text size multiplier for all narrow descendants of any autosizing
cluster, group the descendants by how much narrower they are than the cluster's
|blockContainingAllText| and process each group separately with a different multiplier for
each one.
For example, we want nested comments on the page to be autosized as a group but separately
from a sidebar on the same page.

Patch by Anton Vayvod <avayvod@chromium.org> on 2013-02-19
Reviewed by Kenneth Rohde Christiansen.

Updated the existing test to verify the patch.

* rendering/TextAutosizer.cpp:
(WebCore::TextAutosizer::processClusterInternal):

    Splits the narrow descendants of the autosizing cluster into groups before processing
    each group individually.

(WebCore::TextAutosizer::getNarrowDescendantsGroupedByWidth):

    Sorts the narrow descendants of the given cluster into groups, combining them by the
    difference between their content widths. If sorted by width, two consecutive nodes
    belong to the same group if their width difference is no greater than 100 CSS units.

* rendering/TextAutosizer.h:

    New method definitions.

LayoutTests:

Verify that narrow descendants are grouped and autosized separately according to the
difference between the descendant's width and the width of its enclosing cluster's
|blockContainingAllText|.

Patch by Anton Vayvod <avayvod@chromium.org> on 2013-02-19
Reviewed by Kenneth Rohde Christiansen.

* fast/text-autosizing/narrow-descendants-combined-expected.html:
* fast/text-autosizing/narrow-descendants-combined.html:

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

LayoutTests/ChangeLog
LayoutTests/fast/text-autosizing/narrow-descendants-combined-expected.html
LayoutTests/fast/text-autosizing/narrow-descendants-combined.html
Source/WebCore/ChangeLog
Source/WebCore/rendering/TextAutosizer.cpp
Source/WebCore/rendering/TextAutosizer.h

index 48d4781..33adcc4 100644 (file)
@@ -1,3 +1,17 @@
+2013-02-19  Anton Vayvod  <avayvod@chromium.org>
+
+        [Text Autosizing] Combine narrow descendants of a cluster into groups that should be autosized with the same multiplier.
+        https://bugs.webkit.org/show_bug.cgi?id=109825
+
+        Verify that narrow descendants are grouped and autosized separately according to the
+        difference between the descendant's width and the width of its enclosing cluster's
+        |blockContainingAllText|.
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        * fast/text-autosizing/narrow-descendants-combined-expected.html:
+        * fast/text-autosizing/narrow-descendants-combined.html:
+
 2013-02-19  Takashi Toyoshima  <toyoshim@chromium.org>
 
         Unreviewed, gardening for chromium.
index 48fc24b..3472b38 100644 (file)
@@ -12,14 +12,19 @@ body { width: 800px; margin: 0; overflow-y: hidden; }
 <body>
 
 <div style="font-size: 1.25rem">
+    <div style="width: 240px">
+        This text should be autosized to 20px computed font-size as it is combined with the next and the last narrow siblings and the maximum width is 400px.
+    </div>
     <div style="width: 320px">
-        This text should be autosized to 20px computed font-size as it is combined with its narrow siblings and the maximum width is 400px.
+        This text should be autosized to 20px computed font-size as it is combined with the first and the last narrow siblings and the maximum width is 400px.
     </div>
-    <div style="width: 400px">
-        This text should be autosized to 20px computed font-size as it is combined with its narrow siblings and the maximum width is 400px.
+    <div style="width: 560px; font-size: 1.75rem">
+        This text should be autosized to 28px computed font-size as it is combined into a separate group from its two siblings since it's significantly wider.<br>
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
     </div>
-    <div style="width: 240px">
-        This text should be autosized to 20px computed font-size as it is combined with its narrow siblings and the maximum width is 400px.
+    <div style="width: 400px">
+        This text should be autosized to 20px computed font-size as it is combined with the first and the second narrow siblings and the maximum width is 400px.<br>
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
     </div>
 </div>
 
index 5aac36b..4720e61 100644 (file)
@@ -21,14 +21,19 @@ if (window.internals) {
 <body>
 
 <div>
+    <div style="width: 240px">
+        This text should be autosized to 20px computed font-size as it is combined with the next and the last narrow siblings and the maximum width is 400px.
+    </div>
     <div style="width: 320px">
-        This text should be autosized to 20px computed font-size as it is combined with its narrow siblings and the maximum width is 400px.
+        This text should be autosized to 20px computed font-size as it is combined with the first and the last narrow siblings and the maximum width is 400px.
     </div>
-    <div style="width: 400px">
-        This text should be autosized to 20px computed font-size as it is combined with its narrow siblings and the maximum width is 400px.
+    <div style="width: 560px">
+        This text should be autosized to 28px computed font-size as it is combined into a separate group from its two siblings since it's significantly wider.<br>
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
     </div>
-    <div style="width: 240px">
-        This text should be autosized to 20px computed font-size as it is combined with its narrow siblings and the maximum width is 400px.
+    <div style="width: 400px">
+        This text should be autosized to 20px computed font-size as it is combined with the first and the second narrow siblings and the maximum width is 400px.<br>
+        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
     </div>
 </div>
 
index 48d287b..c201419 100644 (file)
@@ -1,3 +1,36 @@
+2013-02-19  Anton Vayvod  <avayvod@chromium.org>
+
+        [Text Autosizing] Combine narrow descendants of a cluster into groups that should be autosized with the same multiplier.
+        https://bugs.webkit.org/show_bug.cgi?id=109825
+
+        Enhancement of the approach introduced in https://bugs.webkit.org/show_bug.cgi?id=109573.
+        Instead of using the same text size multiplier for all narrow descendants of any autosizing
+        cluster, group the descendants by how much narrower they are than the cluster's
+        |blockContainingAllText| and process each group separately with a different multiplier for
+        each one.
+        For example, we want nested comments on the page to be autosized as a group but separately
+        from a sidebar on the same page.
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Updated the existing test to verify the patch.
+
+        * rendering/TextAutosizer.cpp:
+        (WebCore::TextAutosizer::processClusterInternal):
+
+            Splits the narrow descendants of the autosizing cluster into groups before processing
+            each group individually.
+
+        (WebCore::TextAutosizer::getNarrowDescendantsGroupedByWidth):
+
+            Sorts the narrow descendants of the given cluster into groups, combining them by the
+            difference between their content widths. If sorted by width, two consecutive nodes
+            belong to the same group if their width difference is no greater than 100 CSS units.
+
+        * rendering/TextAutosizer.h:
+
+            New method definitions.
+
 2013-02-18  Ilya Tikhonovsky  <loislo@chromium.org>
 
         Web Inspector: Native Memory Instrumentation: show user provided name property of the heap snapshot node.
index da6bd41..626a772 100644 (file)
@@ -149,7 +149,10 @@ void TextAutosizer::processClusterInternal(TextAutosizingClusterInfo& clusterInf
 
     processContainer(multiplier, container, clusterInfo, subtreeRoot, windowInfo);
 
-    processCompositeCluster(clusterInfo.narrowDescendants, windowInfo);
+    Vector<Vector<TextAutosizingClusterInfo> > narrowDescendantsGroups;
+    getNarrowDescendantsGroupedByWidth(clusterInfo, narrowDescendantsGroups);
+    for (size_t i = 0; i < narrowDescendantsGroups.size(); ++i)
+        processCompositeCluster(narrowDescendantsGroups[i], windowInfo);
 }
 
 void TextAutosizer::processCluster(TextAutosizingClusterInfo& clusterInfo, RenderBlock* container, RenderObject* subtreeRoot, const TextAutosizingWindowInfo& windowInfo)
@@ -556,6 +559,43 @@ const RenderObject* TextAutosizer::findFirstTextLeafNotInCluster(const RenderObj
     return 0;
 }
 
+namespace {
+
+// Compares the width of the specified cluster's roots in descending order.
+bool clusterWiderThanComparisonFn(const TextAutosizingClusterInfo& first, const TextAutosizingClusterInfo& second)
+{
+    return first.root->contentLogicalWidth() > second.root->contentLogicalWidth();
+}
+
+} // namespace
+
+void TextAutosizer::getNarrowDescendantsGroupedByWidth(const TextAutosizingClusterInfo& parentClusterInfo, Vector<Vector<TextAutosizingClusterInfo> >& groups)
+{
+    ASSERT(parentClusterInfo.blockContainingAllText);
+    ASSERT(groups.isEmpty());
+
+    Vector<TextAutosizingClusterInfo> clusterInfos(parentClusterInfo.narrowDescendants);
+    if (clusterInfos.isEmpty())
+        return;
+
+    std::sort(clusterInfos.begin(), clusterInfos.end(), &clusterWiderThanComparisonFn);
+    groups.grow(1);
+
+    // If the width difference between two consecutive elements of |clusterInfos| is greater than
+    // this empirically determined value, the next element should start a new group.
+    const float maxWidthDifferenceWithinGroup = 100;
+    for (size_t i = 0; i < clusterInfos.size(); ++i) {
+        groups.last().append(clusterInfos[i]);
+
+        if (i + 1 < clusterInfos.size()) {
+            float currentWidth = clusterInfos[i].root->contentLogicalWidth();
+            float nextWidth = clusterInfos[i + 1].root->contentLogicalWidth();
+            if (currentWidth - nextWidth > maxWidthDifferenceWithinGroup)
+                groups.grow(groups.size() + 1);
+        }
+    }
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(TEXT_AUTOSIZING)
index 6495a30..bb38baa 100644 (file)
@@ -91,6 +91,11 @@ private:
     // belong to any cluster.
     static const RenderObject* findFirstTextLeafNotInCluster(const RenderObject*, size_t& depth, TraversalDirection);
 
+    // Returns groups of narrow descendants of a given autosizing cluster. The groups are combined
+    // by the difference between the width of the descendant and the width of the parent cluster's
+    // |blockContainingAllText|.
+    static void getNarrowDescendantsGroupedByWidth(const TextAutosizingClusterInfo& parentClusterInfo, Vector<Vector<TextAutosizingClusterInfo> >&);
+
     Document* m_document;
 };