Index: Source/core/rendering/FastTextAutosizer.cpp |
diff --git a/Source/core/rendering/FastTextAutosizer.cpp b/Source/core/rendering/FastTextAutosizer.cpp |
index 7d9c5172dc9c58b62cd208684b087fa016f9e9ae..79fc28ac96ce53a90fa6010dd9b68a25363bb1d3 100644 |
--- a/Source/core/rendering/FastTextAutosizer.cpp |
+++ b/Source/core/rendering/FastTextAutosizer.cpp |
@@ -63,6 +63,7 @@ FastTextAutosizer::FastTextAutosizer(const Document* document) |
, m_frameWidth(0) |
, m_layoutWidth(0) |
, m_baseMultiplier(0) |
+ , m_pageNeedsAutosizing(PageNeedsAutosizing_Unknown) |
, m_firstBlock(0) |
#ifndef NDEBUG |
, m_renderViewInfoPrepared(false) |
@@ -121,9 +122,8 @@ void FastTextAutosizer::beginLayout(RenderBlock* block) |
#endif |
if (!m_firstBlock) { |
- prepareRenderViewInfo(); |
- prepareClusterStack(block->parent()); |
m_firstBlock = block; |
+ prepareClusterStack(block->parent()); |
} else if (block == currentCluster()->m_root) { |
// Ignore beginLayout on the same block twice. |
// This can happen with paginated overflow. |
@@ -140,6 +140,11 @@ void FastTextAutosizer::beginLayout(RenderBlock* block) |
inflate(block); |
} |
+bool FastTextAutosizer::isInLayout() const |
+{ |
+ return !!m_firstBlock; |
+} |
+ |
void FastTextAutosizer::inflateListItem(RenderListItem* listItem, RenderListMarker* listItemMarker) |
{ |
if (!enabled()) |
@@ -229,14 +234,29 @@ void FastTextAutosizer::inflate(RenderBlock* block) |
bool FastTextAutosizer::enabled() |
{ |
- if (!m_document->settings() || !m_document->page() || m_document->printing()) |
+ if (!m_document->settings() |
+ || !m_document->page() |
+ || m_document->printing() |
+ || !m_document->settings()->textAutosizingEnabled()) |
return false; |
- return m_document->settings()->textAutosizingEnabled(); |
+ if (m_pageNeedsAutosizing == PageNeedsAutosizing_Unknown) |
+ updateRenderViewInfo(); |
+ |
+ if (m_pageNeedsAutosizing == PageNeedsAutosizing_No) |
+ return false; |
+ |
+ return true; |
} |
-void FastTextAutosizer::prepareRenderViewInfo() |
+void FastTextAutosizer::updateRenderViewInfo() |
{ |
+ if (!m_document->settings() |
pdr.
2014/03/01 05:16:43
Having these checks in two places doesn't seem rig
|
+ || !m_document->page() |
+ || m_document->printing() |
+ || !m_document->settings()->textAutosizingEnabled()) |
+ return; |
+ |
RenderView* renderView = toRenderView(m_document->renderer()); |
bool horizontalWritingMode = isHorizontalWritingMode(renderView->style()->writingMode()); |
@@ -257,6 +277,14 @@ void FastTextAutosizer::prepareRenderViewInfo() |
float deviceScaleAdjustment = m_document->settings()->deviceScaleAdjustment(); |
m_baseMultiplier *= deviceScaleAdjustment; |
} |
+ |
+ if (m_frameWidth) { |
+ m_pageNeedsAutosizing = (m_baseMultiplier * (static_cast<float>(m_layoutWidth) / m_frameWidth) > 1.0f) |
+ ? PageNeedsAutosizing_Yes : PageNeedsAutosizing_No; |
+ } else { |
+ m_pageNeedsAutosizing = PageNeedsAutosizing_Unknown; |
+ } |
+ |
#ifndef NDEBUG |
m_renderViewInfoPrepared = true; |
#endif |
@@ -279,8 +307,8 @@ bool FastTextAutosizer::clusterWouldHaveEnoughTextToAutosize(const RenderBlock* |
bool FastTextAutosizer::clusterHasEnoughTextToAutosize(Cluster* cluster, const RenderBlock* widthProvider) |
{ |
- if (cluster->m_hasEnoughTextToAutosize != Unknown) |
- return cluster->m_hasEnoughTextToAutosize == Yes; |
+ if (cluster->m_hasEnoughTextToAutosize != HasEnoughTextToAutosize_Unknown) |
+ return cluster->m_hasEnoughTextToAutosize == HasEnoughTextToAutosize_Yes; |
const RenderBlock* root = cluster->m_root; |
if (!widthProvider) |
@@ -288,12 +316,12 @@ bool FastTextAutosizer::clusterHasEnoughTextToAutosize(Cluster* cluster, const R |
// TextAreas and user-modifiable areas get a free pass to autosize regardless of text content. |
if (root->isTextArea() || (root->style() && root->style()->userModify() != READ_ONLY)) { |
- cluster->m_hasEnoughTextToAutosize = Yes; |
+ cluster->m_hasEnoughTextToAutosize = HasEnoughTextToAutosize_Yes; |
return true; |
} |
if (!TextAutosizer::containerShouldBeAutosized(root)) { |
- cluster->m_hasEnoughTextToAutosize = No; |
+ cluster->m_hasEnoughTextToAutosize = HasEnoughTextToAutosize_No; |
return false; |
} |
@@ -321,14 +349,14 @@ bool FastTextAutosizer::clusterHasEnoughTextToAutosize(Cluster* cluster, const R |
length += toRenderText(descendant)->text().stripWhiteSpace().length() * descendant->style()->specifiedFontSize(); |
if (length >= minimumTextLengthToAutosize) { |
- cluster->m_hasEnoughTextToAutosize = Yes; |
+ cluster->m_hasEnoughTextToAutosize = HasEnoughTextToAutosize_Yes; |
return true; |
} |
} |
descendant = descendant->nextInPreOrder(root); |
} |
- cluster->m_hasEnoughTextToAutosize = No; |
+ cluster->m_hasEnoughTextToAutosize = HasEnoughTextToAutosize_No; |
return false; |
} |
@@ -518,7 +546,7 @@ float FastTextAutosizer::multiplierFromBlock(const RenderBlock* block) |
// Block width, in CSS pixels. |
float blockWidth = widthFromBlock(block); |
- float multiplier = min(blockWidth, static_cast<float>(m_layoutWidth)) / m_frameWidth; |
+ float multiplier = m_frameWidth ? min(blockWidth, static_cast<float>(m_layoutWidth)) / m_frameWidth : 1.0f; |
return max(m_baseMultiplier * multiplier, 1.0f); |
} |
@@ -703,4 +731,25 @@ RenderObject* FastTextAutosizer::nextChildSkippingChildrenOfBlocks(const RenderO |
return current->nextInPreOrderAfterChildren(stayWithin); |
} |
+FastTextAutosizer::LayoutScope::LayoutScope(RenderBlock* block) |
+ : m_textAutosizer(block->document().fastTextAutosizer()) |
+ , m_block(block) |
+{ |
+ if (m_textAutosizer) { |
+ if (!m_textAutosizer->isInLayout()) |
+ m_textAutosizer->updateRenderViewInfo(); |
pdr.
2014/03/01 05:16:43
Won't the enabled check below handle calling updat
|
+ |
+ if (m_textAutosizer->enabled()) |
+ m_textAutosizer->beginLayout(m_block); |
+ else |
+ m_textAutosizer = 0; |
+ } |
+} |
+ |
+FastTextAutosizer::LayoutScope::~LayoutScope() |
+{ |
+ if (m_textAutosizer) |
+ m_textAutosizer->endLayout(m_block); |
+} |
+ |
} // namespace WebCore |