| Index: Source/WebCore/rendering/TextAutosizer.cpp
|
| ===================================================================
|
| --- Source/WebCore/rendering/TextAutosizer.cpp (revision 143930)
|
| +++ Source/WebCore/rendering/TextAutosizer.cpp (working copy)
|
| @@ -149,7 +149,10 @@
|
|
|
| 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 @@
|
| 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)
|
|
|