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

Side by Side Diff: third_party/WebKit/Source/core/layout/TableLayoutAlgorithmAuto.cpp

Issue 1656743002: Removing more implicit LayoutUnit construction (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2002 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2002 Lars Knoll (knoll@kde.org)
3 * (C) 2002 Dirk Mueller (mueller@kde.org) 3 * (C) 2002 Dirk Mueller (mueller@kde.org)
4 * Copyright (C) 2003, 2006, 2008, 2010 Apple Inc. All rights reserved. 4 * Copyright (C) 2003, 2006, 2008, 2010 Apple Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License. 9 * version 2 of the License.
10 * 10 *
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 return scale; 207 return scale;
208 } 208 }
209 209
210 void TableLayoutAlgorithmAuto::computeIntrinsicLogicalWidths(LayoutUnit& minWidt h, LayoutUnit& maxWidth) 210 void TableLayoutAlgorithmAuto::computeIntrinsicLogicalWidths(LayoutUnit& minWidt h, LayoutUnit& maxWidth)
211 { 211 {
212 TextAutosizer::TableLayoutScope textAutosizerTableLayoutScope(m_table); 212 TextAutosizer::TableLayoutScope textAutosizerTableLayoutScope(m_table);
213 213
214 fullRecalc(); 214 fullRecalc();
215 215
216 int spanMaxLogicalWidth = calcEffectiveLogicalWidth(); 216 int spanMaxLogicalWidth = calcEffectiveLogicalWidth();
217 minWidth = 0; 217 minWidth = LayoutUnit();
218 maxWidth = 0; 218 maxWidth = LayoutUnit();
219 float maxPercent = 0; 219 float maxPercent = 0;
220 float maxNonPercent = 0; 220 float maxNonPercent = 0;
221 bool scaleColumns = shouldScaleColumns(m_table); 221 bool scaleColumns = shouldScaleColumns(m_table);
222 222
223 // We substitute 0 percent by (epsilon / percentScaleFactor) percent in two places below to avoid division by zero. 223 // We substitute 0 percent by (epsilon / percentScaleFactor) percent in two places below to avoid division by zero.
224 // FIXME: Handle the 0% cases properly. 224 // FIXME: Handle the 0% cases properly.
225 const float epsilon = 1 / 128.0f; 225 const float epsilon = 1 / 128.0f;
226 226
227 float remainingPercent = 100; 227 float remainingPercent = 100;
228 for (size_t i = 0; i < m_layoutStruct.size(); ++i) { 228 for (size_t i = 0; i < m_layoutStruct.size(); ++i) {
229 minWidth += m_layoutStruct[i].effectiveMinLogicalWidth; 229 minWidth += m_layoutStruct[i].effectiveMinLogicalWidth;
230 maxWidth += m_layoutStruct[i].effectiveMaxLogicalWidth; 230 maxWidth += m_layoutStruct[i].effectiveMaxLogicalWidth;
231 if (scaleColumns) { 231 if (scaleColumns) {
232 if (m_layoutStruct[i].effectiveLogicalWidth.hasPercent()) { 232 if (m_layoutStruct[i].effectiveLogicalWidth.hasPercent()) {
233 float percent = std::min(static_cast<float>(m_layoutStruct[i].ef fectiveLogicalWidth.percent()), remainingPercent); 233 float percent = std::min(static_cast<float>(m_layoutStruct[i].ef fectiveLogicalWidth.percent()), remainingPercent);
234 float logicalWidth = static_cast<float>(m_layoutStruct[i].effect iveMaxLogicalWidth) * 100 / std::max(percent, epsilon); 234 float logicalWidth = static_cast<float>(m_layoutStruct[i].effect iveMaxLogicalWidth) * 100 / std::max(percent, epsilon);
235 maxPercent = std::max(logicalWidth, maxPercent); 235 maxPercent = std::max(logicalWidth, maxPercent);
236 remainingPercent -= percent; 236 remainingPercent -= percent;
237 } else { 237 } else {
238 maxNonPercent += m_layoutStruct[i].effectiveMaxLogicalWidth; 238 maxNonPercent += m_layoutStruct[i].effectiveMaxLogicalWidth;
239 } 239 }
240 } 240 }
241 } 241 }
242 242
243 if (scaleColumns) { 243 if (scaleColumns) {
244 maxNonPercent = maxNonPercent * 100 / std::max(remainingPercent, epsilon ); 244 maxNonPercent = maxNonPercent * 100 / std::max(remainingPercent, epsilon );
245 maxWidth = std::max<int>(maxWidth, static_cast<int>(std::min(maxNonPerce nt, static_cast<float>(tableMaxWidth)))); 245 maxWidth = std::max(maxWidth, LayoutUnit(std::min(maxNonPercent, static_ cast<float>(tableMaxWidth)))).floor();
246 maxWidth = std::max<int>(maxWidth, static_cast<int>(std::min(maxPercent, static_cast<float>(tableMaxWidth)))); 246 maxWidth = std::max(maxWidth, LayoutUnit(std::min(maxPercent, static_cas t<float>(tableMaxWidth)))).floor();
247 } 247 }
248 248
249 maxWidth = std::max<int>(maxWidth, spanMaxLogicalWidth); 249 maxWidth = std::max(maxWidth.floor(), spanMaxLogicalWidth);
250 } 250 }
251 251
252 void TableLayoutAlgorithmAuto::applyPreferredLogicalWidthQuirks(LayoutUnit& minW idth, LayoutUnit& maxWidth) const 252 void TableLayoutAlgorithmAuto::applyPreferredLogicalWidthQuirks(LayoutUnit& minW idth, LayoutUnit& maxWidth) const
253 { 253 {
254 Length tableLogicalWidth = m_table->style()->logicalWidth(); 254 Length tableLogicalWidth = m_table->style()->logicalWidth();
255 if (tableLogicalWidth.isFixed() && tableLogicalWidth.isPositive()) { 255 if (tableLogicalWidth.isFixed() && tableLogicalWidth.isPositive()) {
256 // |minWidth| is the result of measuring the intrinsic content's size. K eep it to 256 // |minWidth| is the result of measuring the intrinsic content's size. K eep it to
257 // make sure we are *never* smaller than the actual content. 257 // make sure we are *never* smaller than the actual content.
258 LayoutUnit minContentWidth = minWidth; 258 LayoutUnit minContentWidth = minWidth;
259 // FIXME: This line looks REALLY suspicious as it could allow the minimu m 259 // FIXME: This line looks REALLY suspicious as it could allow the minimu m
260 // preferred logical width to be smaller than the table content. This ha s 260 // preferred logical width to be smaller than the table content. This ha s
261 // to be cross-checked against other browsers. 261 // to be cross-checked against other browsers.
262 minWidth = maxWidth = std::max<int>(minWidth, tableLogicalWidth.value()) ; 262 minWidth = maxWidth = std::max<int>(minWidth.floor(), tableLogicalWidth. value());
263 263
264 const Length& styleMaxLogicalWidth = m_table->style()->logicalMaxWidth() ; 264 const Length& styleMaxLogicalWidth = m_table->style()->logicalMaxWidth() ;
265 if (styleMaxLogicalWidth.isFixed() && !styleMaxLogicalWidth.isNegative() ) { 265 if (styleMaxLogicalWidth.isFixed() && !styleMaxLogicalWidth.isNegative() ) {
266 minWidth = std::min<int>(minWidth, styleMaxLogicalWidth.value()); 266 minWidth = std::min<int>(minWidth.floor(), styleMaxLogicalWidth.valu e());
267 minWidth = std::max(minWidth, minContentWidth); 267 minWidth = std::max(minWidth, minContentWidth);
268 maxWidth = minWidth; 268 maxWidth = minWidth;
269 } 269 }
270 } 270 }
271 } 271 }
272 272
273 /* 273 /*
274 This method takes care of colspans. 274 This method takes care of colspans.
275 effWidth is the same as width for cells without colspans. If we have colspans, they get modified. 275 effWidth is the same as width for cells without colspans. If we have colspans, they get modified.
276 */ 276 */
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 default: 551 default:
552 break; 552 break;
553 } 553 }
554 } 554 }
555 555
556 // allocate width to percent cols 556 // allocate width to percent cols
557 if (available > 0 && havePercent) { 557 if (available > 0 && havePercent) {
558 for (size_t i = 0; i < nEffCols; ++i) { 558 for (size_t i = 0; i < nEffCols; ++i) {
559 Length& logicalWidth = m_layoutStruct[i].effectiveLogicalWidth; 559 Length& logicalWidth = m_layoutStruct[i].effectiveLogicalWidth;
560 if (logicalWidth.hasPercent()) { 560 if (logicalWidth.hasPercent()) {
561 int cellLogicalWidth = std::max<int>(m_layoutStruct[i].effective MinLogicalWidth, minimumValueForLength(logicalWidth, tableLogicalWidth)); 561 int cellLogicalWidth = std::max<int>(m_layoutStruct[i].effective MinLogicalWidth,
562 minimumValueForLength(logicalWidth, LayoutUnit(tableLogicalW idth)));
562 available += m_layoutStruct[i].computedLogicalWidth - cellLogica lWidth; 563 available += m_layoutStruct[i].computedLogicalWidth - cellLogica lWidth;
563 m_layoutStruct[i].computedLogicalWidth = cellLogicalWidth; 564 m_layoutStruct[i].computedLogicalWidth = cellLogicalWidth;
564 } 565 }
565 } 566 }
566 if (totalPercent > 100) { 567 if (totalPercent > 100) {
567 // remove overallocated space from the last columns 568 // remove overallocated space from the last columns
568 int excess = tableLogicalWidth * (totalPercent - 100) / 100; 569 int excess = tableLogicalWidth * (totalPercent - 100) / 100;
569 for (unsigned i = nEffCols; i; ) { 570 for (unsigned i = nEffCols; i; ) {
570 --i; 571 --i;
571 if (m_layoutStruct[i].effectiveLogicalWidth.hasPercent()) { 572 if (m_layoutStruct[i].effectiveLogicalWidth.hasPercent()) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 int reduce = available * minMaxDiff / logicalWidthBeyondMin; 692 int reduce = available * minMaxDiff / logicalWidthBeyondMin;
692 m_layoutStruct[i].computedLogicalWidth += reduce; 693 m_layoutStruct[i].computedLogicalWidth += reduce;
693 available -= reduce; 694 available -= reduce;
694 logicalWidthBeyondMin -= minMaxDiff; 695 logicalWidthBeyondMin -= minMaxDiff;
695 if (available >= 0) 696 if (available >= 0)
696 break; 697 break;
697 } 698 }
698 } 699 }
699 } 700 }
700 } // namespace blink 701 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698