| Index: Source/core/rendering/FastTextAutosizer.cpp
|
| diff --git a/Source/core/rendering/FastTextAutosizer.cpp b/Source/core/rendering/FastTextAutosizer.cpp
|
| index fb9e2a42f12705ccf147c2ebc29c36552cb3c06f..02424cbf0f86c93f9a9b868874a9a456f13f2a8c 100644
|
| --- a/Source/core/rendering/FastTextAutosizer.cpp
|
| +++ b/Source/core/rendering/FastTextAutosizer.cpp
|
| @@ -58,7 +58,7 @@ void FastTextAutosizer::record(RenderBlock* block)
|
| if (!enabled())
|
| return;
|
|
|
| - if (!shouldBeClusterRoot(block))
|
| + if (!isFingerprintingCandidate(block))
|
| return;
|
|
|
| AtomicString fingerprint = computeFingerprint(block);
|
| @@ -81,8 +81,8 @@ void FastTextAutosizer::beginLayout(RenderBlock* block)
|
| if (block->isRenderView())
|
| prepareRenderViewInfo(toRenderView(block));
|
|
|
| - if (shouldBeClusterRoot(block))
|
| - m_clusterStack.append(getOrCreateCluster(block));
|
| + if (Cluster* cluster = maybeGetOrCreateCluster(block))
|
| + m_clusterStack.append(cluster);
|
|
|
| if (block->childrenInline())
|
| inflate(block);
|
| @@ -103,14 +103,13 @@ void FastTextAutosizer::inflate(RenderBlock* block)
|
| return;
|
| Cluster* cluster = m_clusterStack.last();
|
|
|
| - // localMultiplier is used to prevent inflation of some containers such as a row of links.
|
| - float localMultiplier = TextAutosizer::containerShouldBeAutosized(block) ? cluster->m_multiplier : 1;
|
| + float multiplier = cluster->m_autosize ? cluster->m_multiplier : 1.0f;
|
|
|
| for (InlineWalker walker(block); !walker.atEnd(); walker.advance()) {
|
| RenderObject* inlineObj = walker.current();
|
| if (inlineObj->isText()) {
|
| - applyMultiplier(inlineObj, localMultiplier);
|
| - applyMultiplier(inlineObj->parent(), localMultiplier); // Parent handles line spacing.
|
| + applyMultiplier(inlineObj, multiplier);
|
| + applyMultiplier(inlineObj->parent(), multiplier); // Parent handles line spacing.
|
| }
|
| }
|
| }
|
| @@ -147,7 +146,7 @@ void FastTextAutosizer::prepareRenderViewInfo(RenderView* renderView)
|
| #endif
|
| }
|
|
|
| -bool FastTextAutosizer::shouldBeClusterRoot(RenderBlock* block)
|
| +bool FastTextAutosizer::isFingerprintingCandidate(RenderBlock* block)
|
| {
|
| // FIXME: move the logic out of TextAutosizer.cpp into this class.
|
| return block->isRenderView()
|
| @@ -157,8 +156,8 @@ bool FastTextAutosizer::shouldBeClusterRoot(RenderBlock* block)
|
|
|
| bool FastTextAutosizer::clusterWantsAutosizing(RenderBlock* root)
|
| {
|
| - // FIXME: this should be slightly different.
|
| - return TextAutosizer::containerShouldBeAutosized(root);
|
| + // FIXME: this should call (or re-implement) TextAutosizer::clusterShouldBeAutosized.
|
| + return true;
|
| }
|
|
|
| AtomicString FastTextAutosizer::computeFingerprint(RenderBlock* block)
|
| @@ -167,26 +166,38 @@ AtomicString FastTextAutosizer::computeFingerprint(RenderBlock* block)
|
| return nullAtom;
|
| }
|
|
|
| -FastTextAutosizer::Cluster* FastTextAutosizer::getOrCreateCluster(RenderBlock* block)
|
| +FastTextAutosizer::Cluster* FastTextAutosizer::maybeGetOrCreateCluster(RenderBlock* block)
|
| {
|
| + if (!TextAutosizer::isAutosizingContainer(block))
|
| + return 0;
|
| +
|
| + bool isIndependentDescendant = TextAutosizer::isIndependentDescendant(block);
|
| +
|
| + // Create clusters to suppress / unsuppress autosizing based on containerShouldBeAutosized.
|
| + bool containerCanAutosize = TextAutosizer::containerShouldBeAutosized(block);
|
| + bool parentClusterCanAutosize = !m_clusterStack.isEmpty() && m_clusterStack.last()->m_autosize;
|
| +
|
| + // If the container would not alter the m_autosize bit, it doesn't need to be a cluster.
|
| + if (!isIndependentDescendant && containerCanAutosize == parentClusterCanAutosize)
|
| + return 0;
|
| +
|
| ClusterMap::AddResult addResult = m_clusters.add(block, PassOwnPtr<Cluster>());
|
| if (!addResult.isNewEntry)
|
| return addResult.iterator->value.get();
|
|
|
| AtomicString fingerprint = m_fingerprintMapper.get(block);
|
| if (fingerprint.isNull()) {
|
| - addResult.iterator->value = adoptPtr(createCluster(block));
|
| + float multiplier;
|
| + if (isIndependentDescendant)
|
| + multiplier = clusterWantsAutosizing(block) ? computeMultiplier(block) : 1.0f;
|
| + else
|
| + multiplier = m_clusterStack.last()->m_multiplier;
|
| + addResult.iterator->value = adoptPtr(new Cluster(block, containerCanAutosize, multiplier));
|
| return addResult.iterator->value.get();
|
| }
|
| return addSupercluster(fingerprint, block);
|
| }
|
|
|
| -FastTextAutosizer::Cluster* FastTextAutosizer::createCluster(RenderBlock* block)
|
| -{
|
| - float multiplier = clusterWantsAutosizing(block) ? computeMultiplier(block) : 1.0f;
|
| - return new Cluster(block, multiplier);
|
| -}
|
| -
|
| FastTextAutosizer::Cluster* FastTextAutosizer::addSupercluster(AtomicString fingerprint, RenderBlock* returnFor)
|
| {
|
| BlockSet& roots = m_fingerprintMapper.getBlocks(fingerprint);
|
| @@ -200,7 +211,7 @@ FastTextAutosizer::Cluster* FastTextAutosizer::addSupercluster(AtomicString fing
|
|
|
| Cluster* result = 0;
|
| for (BlockSet::iterator it = roots.begin(); it != roots.end(); ++it) {
|
| - Cluster* cluster = new Cluster(*it, multiplier);
|
| + Cluster* cluster = new Cluster(*it, TextAutosizer::containerShouldBeAutosized(*it), multiplier);
|
| m_clusters.set(*it, adoptPtr(cluster));
|
|
|
| if (*it == returnFor)
|
|
|