OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * Copyright (C) 2012 Apple Inc. All rights reserved. | 3 * Copyright (C) 2012 Apple Inc. All rights reserved. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 // Ignore box width in excess of the layout width, to avoid extreme mult
ipliers. | 142 // Ignore box width in excess of the layout width, to avoid extreme mult
ipliers. |
143 float logicalClusterWidth = std::min<float>(textWidth, logicalLayoutWidt
h); | 143 float logicalClusterWidth = std::min<float>(textWidth, logicalLayoutWidt
h); |
144 | 144 |
145 multiplier = logicalClusterWidth / logicalWindowWidth; | 145 multiplier = logicalClusterWidth / logicalWindowWidth; |
146 multiplier *= m_document->settings()->textAutosizingFontScaleFactor(); | 146 multiplier *= m_document->settings()->textAutosizingFontScaleFactor(); |
147 multiplier = std::max(1.0f, multiplier); | 147 multiplier = std::max(1.0f, multiplier); |
148 } | 148 } |
149 | 149 |
150 processContainer(multiplier, container, clusterInfo, subtreeRoot, windowInfo
); | 150 processContainer(multiplier, container, clusterInfo, subtreeRoot, windowInfo
); |
151 | 151 |
152 processCompositeCluster(clusterInfo.narrowDescendants, windowInfo); | 152 Vector<Vector<TextAutosizingClusterInfo> > narrowDescendantsGroups; |
| 153 getNarrowDescendantsGroupedByWidth(clusterInfo, narrowDescendantsGroups); |
| 154 for (size_t i = 0; i < narrowDescendantsGroups.size(); ++i) |
| 155 processCompositeCluster(narrowDescendantsGroups[i], windowInfo); |
153 } | 156 } |
154 | 157 |
155 void TextAutosizer::processCluster(TextAutosizingClusterInfo& clusterInfo, Rende
rBlock* container, RenderObject* subtreeRoot, const TextAutosizingWindowInfo& wi
ndowInfo) | 158 void TextAutosizer::processCluster(TextAutosizingClusterInfo& clusterInfo, Rende
rBlock* container, RenderObject* subtreeRoot, const TextAutosizingWindowInfo& wi
ndowInfo) |
156 { | 159 { |
157 // Many pages set a max-width on their content. So especially for the Render
View, instead of | 160 // Many pages set a max-width on their content. So especially for the Render
View, instead of |
158 // just taking the width of |cluster| we find the lowest common ancestor of
the first and last | 161 // just taking the width of |cluster| we find the lowest common ancestor of
the first and last |
159 // descendant text node of the cluster (i.e. the deepest wrapper block that
contains all the | 162 // descendant text node of the cluster (i.e. the deepest wrapper block that
contains all the |
160 // text), and use its width instead. | 163 // text), and use its width instead. |
161 clusterInfo.blockContainingAllText = findDeepestBlockContainingAllText(clust
erInfo.root); | 164 clusterInfo.blockContainingAllText = findDeepestBlockContainingAllText(clust
erInfo.root); |
162 float textWidth = clusterInfo.blockContainingAllText->contentLogicalWidth(); | 165 float textWidth = clusterInfo.blockContainingAllText->contentLogicalWidth(); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 if (leaf) | 552 if (leaf) |
550 return leaf; | 553 return leaf; |
551 } | 554 } |
552 child = (direction == FirstToLast) ? child->nextSibling() : child->previ
ousSibling(); | 555 child = (direction == FirstToLast) ? child->nextSibling() : child->previ
ousSibling(); |
553 } | 556 } |
554 --depth; | 557 --depth; |
555 | 558 |
556 return 0; | 559 return 0; |
557 } | 560 } |
558 | 561 |
| 562 namespace { |
| 563 |
| 564 // Compares the width of the specified cluster's roots in descending order. |
| 565 bool clusterWiderThanComparisonFn(const TextAutosizingClusterInfo& first, const
TextAutosizingClusterInfo& second) |
| 566 { |
| 567 return first.root->contentLogicalWidth() > second.root->contentLogicalWidth(
); |
| 568 } |
| 569 |
| 570 } // namespace |
| 571 |
| 572 void TextAutosizer::getNarrowDescendantsGroupedByWidth(const TextAutosizingClust
erInfo& parentClusterInfo, Vector<Vector<TextAutosizingClusterInfo> >& groups) |
| 573 { |
| 574 ASSERT(parentClusterInfo.blockContainingAllText); |
| 575 ASSERT(groups.isEmpty()); |
| 576 |
| 577 Vector<TextAutosizingClusterInfo> clusterInfos(parentClusterInfo.narrowDesce
ndants); |
| 578 if (clusterInfos.isEmpty()) |
| 579 return; |
| 580 |
| 581 std::sort(clusterInfos.begin(), clusterInfos.end(), &clusterWiderThanCompari
sonFn); |
| 582 groups.grow(1); |
| 583 |
| 584 // If the width difference between two consecutive elements of |clusterInfos
| is greater than |
| 585 // this empirically determined value, the next element should start a new gr
oup. |
| 586 const float maxWidthDifferenceWithinGroup = 100; |
| 587 for (size_t i = 0; i < clusterInfos.size(); ++i) { |
| 588 groups.last().append(clusterInfos[i]); |
| 589 |
| 590 if (i + 1 < clusterInfos.size()) { |
| 591 float currentWidth = clusterInfos[i].root->contentLogicalWidth(); |
| 592 float nextWidth = clusterInfos[i + 1].root->contentLogicalWidth(); |
| 593 if (currentWidth - nextWidth > maxWidthDifferenceWithinGroup) |
| 594 groups.grow(groups.size() + 1); |
| 595 } |
| 596 } |
| 597 } |
| 598 |
559 } // namespace WebCore | 599 } // namespace WebCore |
560 | 600 |
561 #endif // ENABLE(TEXT_AUTOSIZING) | 601 #endif // ENABLE(TEXT_AUTOSIZING) |
OLD | NEW |