Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 365 ASSERT(shouldHandleLayout()); | 365 ASSERT(shouldHandleLayout()); |
| 366 | 366 |
| 367 if (prepareForLayout(block) == StopLayout) | 367 if (prepareForLayout(block) == StopLayout) |
| 368 return; | 368 return; |
| 369 | 369 |
| 370 if (Cluster* cluster = maybeCreateCluster(block)) | 370 if (Cluster* cluster = maybeCreateCluster(block)) |
| 371 m_clusterStack.append(adoptPtr(cluster)); | 371 m_clusterStack.append(adoptPtr(cluster)); |
| 372 | 372 |
| 373 // Cells in auto-layout tables are handled separately by inflateAutoTable. | 373 // Cells in auto-layout tables are handled separately by inflateAutoTable. |
| 374 bool isAutoTableCell = block->isTableCell() && !toRenderTableCell(block)->ta ble()->style()->isFixedTableLayout(); | 374 bool isAutoTableCell = block->isTableCell() && !toRenderTableCell(block)->ta ble()->style()->isFixedTableLayout(); |
| 375 if (block->childrenInline() && block->firstChild() && !isAutoTableCell) | 375 if (!isAutoTableCell && !m_clusterStack.isEmpty()) |
| 376 inflate(block); | 376 inflate(block); |
| 377 } | 377 } |
| 378 | 378 |
| 379 void FastTextAutosizer::inflateListItem(RenderListItem* listItem, RenderListMark er* listItemMarker) | 379 void FastTextAutosizer::inflateListItem(RenderListItem* listItem, RenderListMark er* listItemMarker) |
| 380 { | 380 { |
| 381 if (!shouldHandleLayout()) | 381 if (!shouldHandleLayout()) |
| 382 return; | 382 return; |
| 383 ASSERT(listItem && listItemMarker); | 383 ASSERT(listItem && listItemMarker); |
| 384 | 384 |
| 385 if (prepareForLayout(listItem) == StopLayout) | 385 if (prepareForLayout(listItem) == StopLayout) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 434 #ifndef NDEBUG | 434 #ifndef NDEBUG |
| 435 m_blocksThatHaveBegunLayout.clear(); | 435 m_blocksThatHaveBegunLayout.clear(); |
| 436 #endif | 436 #endif |
| 437 // Tables can create two layout scopes for the same block so the isEmpty | 437 // Tables can create two layout scopes for the same block so the isEmpty |
| 438 // check below is needed to guard against endLayout being called twice. | 438 // check below is needed to guard against endLayout being called twice. |
| 439 } else if (!m_clusterStack.isEmpty() && currentCluster()->m_root == block) { | 439 } else if (!m_clusterStack.isEmpty() && currentCluster()->m_root == block) { |
| 440 m_clusterStack.removeLast(); | 440 m_clusterStack.removeLast(); |
| 441 } | 441 } |
| 442 } | 442 } |
| 443 | 443 |
| 444 void FastTextAutosizer::inflate(RenderBlock* block) | 444 void FastTextAutosizer::inflate(RenderBlock* block) |
|
pdr.
2014/06/05 20:13:49
I think this would be a little cleaner if this ret
skobes
2014/06/05 21:19:19
Done.
| |
| 445 { | 445 { |
| 446 float multiplier = 0; | |
| 447 inflateRecursive(block, multiplier); | |
| 448 } | |
| 449 | |
| 450 void FastTextAutosizer::inflateRecursive(RenderObject* parent, float& multiplier ) | |
| 451 { | |
| 446 Cluster* cluster = currentCluster(); | 452 Cluster* cluster = currentCluster(); |
| 447 float multiplier = 0; | 453 bool hasTextChild = false; |
| 448 RenderObject* descendant = block->firstChild(); | 454 |
| 449 while (descendant) { | 455 RenderObject* child = 0; |
| 450 // Skip block descendants because they will be inflate()'d on their own. | 456 if (parent->isRenderBlock() && parent->childrenInline()) |
|
pdr.
2014/06/05 20:13:49
The fast firstChild checks only remove a single vi
skobes
2014/06/05 21:19:20
We can't directly call parent->firstChild() becaus
| |
| 451 if (descendant->isRenderBlock()) { | 457 child = toRenderBlock(parent)->firstChild(); |
| 452 descendant = descendant->nextInPreOrderAfterChildren(block); | 458 else if (parent->isRenderInline()) |
| 453 continue; | 459 child = toRenderInline(parent)->firstChild(); |
| 454 } | 460 |
| 455 if (descendant->isText()) { | 461 while (child) { |
| 462 if (child->isText()) { | |
| 463 hasTextChild = true; | |
| 456 // We only calculate this multiplier on-demand to ensure the parent block of this text | 464 // We only calculate this multiplier on-demand to ensure the parent block of this text |
| 457 // has entered layout. | 465 // has entered layout. |
| 458 if (!multiplier) | 466 if (!multiplier) |
| 459 multiplier = cluster->m_flags & SUPPRESSING ? 1.0f : clusterMult iplier(cluster); | 467 multiplier = cluster->m_flags & SUPPRESSING ? 1.0f : clusterMult iplier(cluster); |
| 460 applyMultiplier(descendant, multiplier); | 468 applyMultiplier(child, multiplier); |
| 461 applyMultiplier(descendant->parent(), multiplier); // Parent handles line spacing. | |
| 462 // FIXME: Investigate why MarkOnlyThis is sufficient. | 469 // FIXME: Investigate why MarkOnlyThis is sufficient. |
| 463 if (descendant->parent()->isRenderInline()) | 470 if (parent->isRenderInline()) |
| 464 descendant->setPreferredLogicalWidthsDirty(MarkOnlyThis); | 471 child->setPreferredLogicalWidthsDirty(MarkOnlyThis); |
| 472 } else if (child->isRenderInline()) { | |
| 473 inflateRecursive(child, multiplier); | |
| 465 } | 474 } |
| 466 descendant = descendant->nextInPreOrder(block); | 475 child = child->nextSibling(); |
| 476 } | |
| 477 | |
| 478 if (hasTextChild) { | |
| 479 applyMultiplier(parent, multiplier); // Parent handles line spacing. | |
| 480 } else if (!parent->isListItem()) { | |
| 481 // For consistency, a block with no immediate text child should always h ave a | |
| 482 // multiplier of 1 (except for list items which are handled in inflateLi stItem). | |
| 483 applyMultiplier(parent, 1); | |
|
pdr.
2014/06/05 20:13:49
Should we only do this when textAutosizingMultipli
skobes
2014/06/05 21:19:19
applyMultiplier does this check.
| |
| 467 } | 484 } |
| 468 } | 485 } |
| 469 | 486 |
| 470 bool FastTextAutosizer::shouldHandleLayout() const | 487 bool FastTextAutosizer::shouldHandleLayout() const |
| 471 { | 488 { |
| 472 return m_pageInfo.m_settingEnabled && m_pageInfo.m_pageNeedsAutosizing && !m _updatePageInfoDeferred; | 489 return m_pageInfo.m_settingEnabled && m_pageInfo.m_pageNeedsAutosizing && !m _updatePageInfoDeferred; |
| 473 } | 490 } |
| 474 | 491 |
| 475 void FastTextAutosizer::updatePageInfoInAllFrames() | 492 void FastTextAutosizer::updatePageInfoInAllFrames() |
| 476 { | 493 { |
| (...skipping 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1110 FastTextAutosizer::DeferUpdatePageInfo::~DeferUpdatePageInfo() | 1127 FastTextAutosizer::DeferUpdatePageInfo::~DeferUpdatePageInfo() |
| 1111 { | 1128 { |
| 1112 if (FastTextAutosizer* textAutosizer = m_mainFrame->document()->fastTextAuto sizer()) { | 1129 if (FastTextAutosizer* textAutosizer = m_mainFrame->document()->fastTextAuto sizer()) { |
| 1113 ASSERT(textAutosizer->m_updatePageInfoDeferred); | 1130 ASSERT(textAutosizer->m_updatePageInfoDeferred); |
| 1114 textAutosizer->m_updatePageInfoDeferred = false; | 1131 textAutosizer->m_updatePageInfoDeferred = false; |
| 1115 textAutosizer->updatePageInfoInAllFrames(); | 1132 textAutosizer->updatePageInfoInAllFrames(); |
| 1116 } | 1133 } |
| 1117 } | 1134 } |
| 1118 | 1135 |
| 1119 } // namespace WebCore | 1136 } // namespace WebCore |
| OLD | NEW |