Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1102)

Unified Diff: Source/core/rendering/FastTextAutosizer.cpp

Issue 215503003: Reland text autosizing changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/FastTextAutosizer.cpp
diff --git a/Source/core/rendering/FastTextAutosizer.cpp b/Source/core/rendering/FastTextAutosizer.cpp
index 3f0f5573fecb952b4728169817acdf3908740cdd..b78ade35f56f76f09015361ce9402db3f1f151a2 100644
--- a/Source/core/rendering/FastTextAutosizer.cpp
+++ b/Source/core/rendering/FastTextAutosizer.cpp
@@ -234,10 +234,10 @@ FastTextAutosizer::FastTextAutosizer(const Document* document)
, m_frameWidth(0)
, m_layoutWidth(0)
, m_baseMultiplier(0)
- , m_pageAutosizingStatus(PageAutosizingStatusUnknown)
+ , m_pageNeedsAutosizing(false)
+ , m_previouslyAutosized(false)
, m_firstBlock(0)
#ifndef NDEBUG
- , m_renderViewInfoPrepared(false)
, m_blocksThatHaveBegunLayout()
#endif
, m_superclusters()
@@ -290,7 +290,7 @@ void FastTextAutosizer::prepareClusterStack(const RenderObject* renderer)
void FastTextAutosizer::beginLayout(RenderBlock* block)
{
- ASSERT(enabled() && m_pageAutosizingStatus == PageNeedsAutosizing);
+ ASSERT(enabled() && m_pageNeedsAutosizing);
#ifndef NDEBUG
m_blocksThatHaveBegunLayout.add(block);
#endif
@@ -316,7 +316,7 @@ void FastTextAutosizer::beginLayout(RenderBlock* block)
void FastTextAutosizer::inflateListItem(RenderListItem* listItem, RenderListMarker* listItemMarker)
{
- if (!enabled() || m_pageAutosizingStatus != PageNeedsAutosizing)
+ if (!enabled() || !m_pageNeedsAutosizing)
return;
ASSERT(listItem && listItemMarker);
#ifndef NDEBUG
@@ -379,11 +379,10 @@ void FastTextAutosizer::inflateTable(RenderTable* table)
void FastTextAutosizer::endLayout(RenderBlock* block)
{
- ASSERT(enabled() && m_pageAutosizingStatus == PageNeedsAutosizing);
+ ASSERT(enabled() && m_pageNeedsAutosizing);
if (block == m_firstBlock) {
m_firstBlock = 0;
- m_pageAutosizingStatus = PageAutosizingStatusUnknown;
m_clusterStack.clear();
m_superclusters.clear();
#ifndef NDEBUG
@@ -425,8 +424,28 @@ bool FastTextAutosizer::enabled()
return m_document->settings()->textAutosizingEnabled();
}
-void FastTextAutosizer::updateRenderViewInfo()
+void FastTextAutosizer::updatePageInfoInAllFrames()
{
+ if (!enabled())
+ return;
+
+ ASSERT(m_document->frame()->isMainFrame());
+
+ for (LocalFrame* frame = m_document->frame(); frame; frame = frame->tree().traverseNext()) {
+ if (FastTextAutosizer* textAutosizer = frame->document()->fastTextAutosizer())
+ textAutosizer->updatePageInfo();
+ }
+}
+
+void FastTextAutosizer::updatePageInfo()
+{
+ if (!enabled())
+ return;
+
+ int previousFrameWidth = m_frameWidth;
+ int previousLayoutWidth = m_layoutWidth;
+ float previousBaseMultiplier = m_baseMultiplier;
+
RenderView* renderView = toRenderView(m_document->renderer());
bool horizontalWritingMode = isHorizontalWritingMode(renderView->style()->writingMode());
@@ -448,12 +467,43 @@ void FastTextAutosizer::updateRenderViewInfo()
m_baseMultiplier *= deviceScaleAdjustment;
}
- m_pageAutosizingStatus = m_frameWidth && (m_baseMultiplier * (static_cast<float>(m_layoutWidth) / m_frameWidth) > 1.0f)
- ? PageNeedsAutosizing : PageDoesNotNeedAutosizing;
+ m_pageNeedsAutosizing = !!m_frameWidth
+ && (m_baseMultiplier * (static_cast<float>(m_layoutWidth) / m_frameWidth) > 1.0f);
-#ifndef NDEBUG
- m_renderViewInfoPrepared = true;
-#endif
+ // If we are no longer autosizing the page, we won't do anything during the next layout.
+ // Set all the multipliers back to 1 now.
+ if (!m_pageNeedsAutosizing && m_previouslyAutosized)
+ resetMultipliers();
+
+ // If page info has changed, multipliers may have changed. Force a layout to recompute them.
+ if (m_pageNeedsAutosizing
+ && (m_frameWidth != previousFrameWidth
+ || m_layoutWidth != previousLayoutWidth
+ || m_baseMultiplier != previousBaseMultiplier))
+ setAllTextNeedsLayout();
+}
+
+void FastTextAutosizer::resetMultipliers()
+{
+ RenderObject* renderer = m_document->renderer();
+ while (renderer) {
+ if (RenderStyle* style = renderer->style()) {
+ if (style->textAutosizingMultiplier() != 1)
+ applyMultiplier(renderer, 1, LayoutNeeded);
+ }
+ renderer = renderer->nextInPreOrder();
+ }
+ m_previouslyAutosized = false;
+}
+
+void FastTextAutosizer::setAllTextNeedsLayout()
+{
+ RenderObject* renderer = m_document->renderer();
+ while (renderer) {
+ if (renderer->isText())
+ renderer->setNeedsLayout();
+ renderer = renderer->nextInPreOrder();
+ }
}
bool FastTextAutosizer::clusterWouldHaveEnoughTextToAutosize(const RenderBlock* root, const RenderBlock* widthProvider)
@@ -621,7 +671,6 @@ const RenderBlock* FastTextAutosizer::deepestCommonAncestor(BlockSet& blocks)
float FastTextAutosizer::clusterMultiplier(Cluster* cluster)
{
- ASSERT(m_renderViewInfoPrepared);
if (!cluster->m_multiplier) {
if (cluster->m_root->isTable()
|| isIndependentDescendant(cluster->m_root)
@@ -790,7 +839,7 @@ const RenderObject* FastTextAutosizer::findTextLeaf(const RenderObject* parent,
return 0;
}
-void FastTextAutosizer::applyMultiplier(RenderObject* renderer, float multiplier)
+void FastTextAutosizer::applyMultiplier(RenderObject* renderer, float multiplier, RelayoutBehavior relayoutBehavior)
{
ASSERT(renderer);
RenderStyle* currentStyle = renderer->style();
@@ -801,7 +850,21 @@ void FastTextAutosizer::applyMultiplier(RenderObject* renderer, float multiplier
RefPtr<RenderStyle> style = RenderStyle::clone(currentStyle);
style->setTextAutosizingMultiplier(multiplier);
style->setUnique();
- renderer->setStyleInternal(style.release());
+
+ switch (relayoutBehavior) {
+ case AlreadyInLayout:
+ renderer->setStyleInternal(style.release());
+ if (renderer->isRenderBlock())
+ toRenderBlock(renderer)->invalidateLineHeight();
+ break;
+
+ case LayoutNeeded:
+ renderer->setStyle(style.release());
+ break;
+ }
+
+ if (multiplier != 1)
+ m_previouslyAutosized = true;
}
bool FastTextAutosizer::isWiderOrNarrowerDescendant(Cluster* cluster)
@@ -912,15 +975,7 @@ FastTextAutosizer::LayoutScope::LayoutScope(RenderBlock* block)
if (!m_textAutosizer)
return;
- if (!m_textAutosizer->enabled()) {
- m_textAutosizer = 0;
- return;
- }
-
- if (m_textAutosizer->m_pageAutosizingStatus == PageAutosizingStatusUnknown)
- m_textAutosizer->updateRenderViewInfo();
-
- if (m_textAutosizer->m_pageAutosizingStatus == PageNeedsAutosizing)
+ if (m_textAutosizer->enabled() && m_textAutosizer->m_pageNeedsAutosizing)
m_textAutosizer->beginLayout(m_block);
else
m_textAutosizer = 0;

Powered by Google App Engine
This is Rietveld 408576698