| Index: Source/WebCore/rendering/TextAutosizer.cpp
|
| ===================================================================
|
| --- Source/WebCore/rendering/TextAutosizer.cpp (revision 143927)
|
| +++ Source/WebCore/rendering/TextAutosizer.cpp (working copy)
|
| @@ -37,6 +37,7 @@
|
|
|
| #include <algorithm>
|
| #include <wtf/StdLibExtras.h>
|
| +#include <wtf/Vector.h>
|
|
|
| namespace WebCore {
|
|
|
| @@ -47,6 +48,7 @@
|
| IntSize minLayoutSize;
|
| };
|
|
|
| +// Represents cluster related data. Instances should not persist between calls to processSubtree.
|
| struct TextAutosizingClusterInfo {
|
| explicit TextAutosizingClusterInfo(RenderBlock* root)
|
| : root(root)
|
| @@ -61,6 +63,10 @@
|
| // Upper limit on the difference between the width of the cluster's block containing all
|
| // text and that of a narrow child before the child becomes a separate cluster.
|
| float maxAllowedDifferenceFromTextWidth;
|
| +
|
| + // Descendants of the cluster that are narrower than the block containing all text and must be
|
| + // processed together.
|
| + Vector<TextAutosizingClusterInfo> narrowDescendants;
|
| };
|
|
|
|
|
| @@ -150,6 +156,12 @@
|
| }
|
|
|
| processContainer(multiplier, container, clusterInfo, subtreeRoot, windowInfo);
|
| +
|
| + Vector<TextAutosizingClusterInfo>& narrowDescendants = clusterInfo.narrowDescendants;
|
| + for (size_t i = 0; i < narrowDescendants.size(); ++i) {
|
| + TextAutosizingClusterInfo& descendantClusterInfo = narrowDescendants[i];
|
| + processCluster(descendantClusterInfo, descendantClusterInfo.root, descendantClusterInfo.root, windowInfo);
|
| + }
|
| }
|
|
|
| void TextAutosizer::processContainer(float multiplier, RenderBlock* container, TextAutosizingClusterInfo& clusterInfo, RenderObject* subtreeRoot, const TextAutosizingWindowInfo& windowInfo)
|
| @@ -168,9 +180,13 @@
|
| // FIXME: Increase list marker size proportionately.
|
| } else if (isAutosizingContainer(descendant)) {
|
| RenderBlock* descendantBlock = toRenderBlock(descendant);
|
| - if (isAutosizingCluster(descendantBlock, clusterInfo)) {
|
| - TextAutosizingClusterInfo descendantClusterInfo(descendantBlock);
|
| + TextAutosizingClusterInfo descendantClusterInfo(descendantBlock);
|
| + if (isWiderDescendant(descendantBlock, clusterInfo) || isIndependentDescendant(descendantBlock))
|
| processCluster(descendantClusterInfo, descendantBlock, descendantBlock, windowInfo);
|
| + else if (isNarrowDescendant(descendantBlock, clusterInfo)) {
|
| + // Narrow descendants are processed together later to be able to apply the same multiplier
|
| + // to each of them if necessary.
|
| + clusterInfo.narrowDescendants.append(descendantClusterInfo);
|
| } else
|
| processContainer(multiplier, descendantBlock, clusterInfo, descendantBlock, windowInfo);
|
| }
|
|
|