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

Side by Side Diff: Source/core/rendering/RenderTableSection.cpp

Issue 18050007: Height of fixed height cell is not proper when cell's row is under row spanning cell. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Review comments addressed Created 7 years, 5 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) 1997 Martin Jones (mjones@kde.org) 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org) 3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org) 4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org) 5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org) 6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved. 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) 8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 if (inColSpan) 248 if (inColSpan)
249 c.inColSpan = true; 249 c.inColSpan = true;
250 } 250 }
251 m_cCol++; 251 m_cCol++;
252 cSpan -= currentSpan; 252 cSpan -= currentSpan;
253 inColSpan = true; 253 inColSpan = true;
254 } 254 }
255 cell->setCol(table()->effColToCol(col)); 255 cell->setCol(table()->effColToCol(col));
256 } 256 }
257 257
258 void RenderTableSection::calcRowsHeightInRowSpan(RenderTableCell* cell, struct S panningRowsHeight& spanningRowsHeight)
Julien - ping for review 2013/07/16 17:22:13 Not a huge fan of the name (calc is an abbreviatio
a.suchit 2013/07/18 17:05:32 Done.
259 {
260 const unsigned rowSpan = cell->rowSpan();
261 const unsigned rowIndex = cell->rowIndex();
262
263 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing = cell->logicalHe ightForRowSizing();
264
265 spanningRowsHeight.rowHeight.resize(rowSpan);
266 spanningRowsHeight.totalRowsHeight = 0;
267 for (unsigned row = 0; row < rowSpan; row++) {
268 unsigned actualRow = row + rowIndex;
269 spanningRowsHeight.rowHeight[row] = m_rowPos[actualRow + 1] - m_rowPos[a ctualRow] - borderSpacingForRow(actualRow);
270 spanningRowsHeight.totalRowsHeight += spanningRowsHeight.rowHeight[row];
271 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing -= borderSpac ingForRow(actualRow);
272 }
273 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing += borderSpacingF orRow(rowIndex + rowSpan - 1);
Julien - ping for review 2013/07/16 17:22:13 This is typically the line of code that would requ
a.suchit 2013/07/18 17:05:32 Done.
274 }
275
276 void RenderTableSection::distributeExtraRowSpanHeightToPercentRows(RenderTableCe ll* cell, int tableHeight, int totalPercent, int& extraRowSpanningHeight)
277 {
278 if (!extraRowSpanningHeight || !totalPercent)
279 return;
280
281 const unsigned rowSpan = cell->rowSpan();
282 const unsigned rowIndex = cell->rowIndex();
283 int percent = min(totalPercent, 100);
284 int remainingRowSpanningHeight = extraRowSpanningHeight;
Julien - ping for review 2013/07/16 17:22:13 tableHeight + extraRowSpanningHeight is the only r
a.suchit 2013/07/18 17:05:32 Done.
285
286 int accumulatedPositionIncrease = 0;
287 for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) {
288 if (percent > 0 && remainingRowSpanningHeight > 0) {
289 if (m_grid[row].logicalHeight.isPercent()) {
290 int toAdd = (tableHeight + extraRowSpanningHeight) * m_grid[row] .logicalHeight.percent() / 100;
Julien - ping for review 2013/07/16 17:22:13 The whole algorithm really need some explanations,
291
292 toAdd = min(toAdd, remainingRowSpanningHeight);
293 accumulatedPositionIncrease += toAdd;
294 remainingRowSpanningHeight -= toAdd;
295 percent -= m_grid[row].logicalHeight.percent();
296 }
297 }
298 m_rowPos[row + 1] += accumulatedPositionIncrease;
299 }
300
301 extraRowSpanningHeight = remainingRowSpanningHeight;
302 }
303
304 void RenderTableSection::distributeExtraRowSpanHeightToAutoRows(RenderTableCell* cell, int totalAutoRowsHeight, int& extraRowSpanningHeight, Vector<int>& rowsHe ight)
305 {
306 if (!extraRowSpanningHeight || !totalAutoRowsHeight)
307 return;
308
309 const unsigned rowSpan = cell->rowSpan();
310 const unsigned rowIndex = cell->rowIndex();
311 int accumulatedPositionIncrease = 0;
312
313 for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) {
314 if (m_grid[row].logicalHeight.isAuto())
315 accumulatedPositionIncrease += (extraRowSpanningHeight * rowsHeight[ row - rowIndex]) / totalAutoRowsHeight;
316 m_rowPos[row + 1] += accumulatedPositionIncrease;
317 }
318
319 extraRowSpanningHeight -= accumulatedPositionIncrease;
320
321 // FIXME: In some cases extraRowSpanning height is remain which is very smal l and cannot be again distributed in
322 // spanning rows. So this remaining height added to last spanning row to mai ntain the spanning cell height and
323 // set extra row spanning height to 0.
324 // Value should be round properly in the algorithm.
325 m_rowPos[rowIndex + rowSpan] += extraRowSpanningHeight;
326 extraRowSpanningHeight = 0;
327 }
328
329 void RenderTableSection::distributeExtraRowSpanHeightToRemainingRows(RenderTable Cell* cell, int totalRemainingRowsHeight, int& extraRowSpanningHeight, Vector<in t>& rowsHeight)
330 {
331 if (!extraRowSpanningHeight || !totalRemainingRowsHeight)
332 return;
333
334 const unsigned rowSpan = cell->rowSpan();
335 const unsigned rowIndex = cell->rowIndex();
336 int accumulatedPositionIncrease = 0;
337
338 for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) {
339 if (!m_grid[row].logicalHeight.isPercent())
340 accumulatedPositionIncrease += (extraRowSpanningHeight * rowsHeight[ row - rowIndex]) / totalRemainingRowsHeight;
341 m_rowPos[row + 1] += accumulatedPositionIncrease;
342 }
343
344 extraRowSpanningHeight -= accumulatedPositionIncrease;
345
346 // FIXME: In some cases extraRowSpanning height is remain which is very smal l and cannot be again distributed in
347 // spanning rows. So this remaining height added to last spanning row to mai ntain the spanning cell height and
348 // set extra row spanning height to 0.
349 // Value should be round properly in the algorithm.
Julien - ping for review 2013/07/16 17:22:13 Can't we do the rounding properly instead of swipi
a.suchit 2013/07/18 17:05:32 Done.
350 m_rowPos[rowIndex + rowSpan] += extraRowSpanningHeight;
351 extraRowSpanningHeight = 0;
352 }
353
258 // Distribute rowSpan cell height in rows those comes in rowSpan cell based on t he ratio of row's height if 354 // Distribute rowSpan cell height in rows those comes in rowSpan cell based on t he ratio of row's height if
259 // 1. RowSpan cell height is greater then the total height of rows in rowSpan ce ll 355 // 1. RowSpan cell height is greater then the total height of rows in rowSpan ce ll
260 void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& rowSpanCells) 356 void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& rowSpanCells)
261 { 357 {
262 ASSERT(rowSpanCells.size()); 358 ASSERT(rowSpanCells.size());
263 359
264 // FIXME: For now, we handle the first rowspan cell in the table but this is wrong. 360 // FIXME: For now, we handle the first rowspan cell in the table but this is wrong.
265 RenderTableCell* cell = rowSpanCells[0]; 361 RenderTableCell* cell = rowSpanCells[0];
266 362
267 unsigned rowSpan = cell->rowSpan(); 363 unsigned rowSpan = cell->rowSpan();
268 unsigned rowIndex = cell->rowIndex();
269 int initialPos = m_rowPos[rowIndex + rowSpan];
270 364
271 int totalRowsHeight = 0; 365 struct SpanningRowsHeight spanningRowsHeight;
272 int rowSpanCellHeight = cell->logicalHeightForRowSizing();
273 Vector<int> rowsHeight(rowSpan);
274 366
275 // Getting height of rows in current rowSpan cell, getting total height of r ows and adjusting rowSpan cell height with border spacing. 367 calcRowsHeightInRowSpan(cell, spanningRowsHeight);
276 for (unsigned row = 0; row < rowSpan; row++) {
277 unsigned actualRow = row + rowIndex;
278 rowsHeight[row] = m_rowPos[actualRow + 1] - m_rowPos[actualRow] - border SpacingForRow(actualRow);
279 totalRowsHeight += rowsHeight[row];
280 rowSpanCellHeight -= borderSpacingForRow(actualRow);
281 }
282 rowSpanCellHeight += borderSpacingForRow(rowIndex + rowSpan - 1);
283 368
284 if (!totalRowsHeight || rowSpanCellHeight <= totalRowsHeight) 369 if (!spanningRowsHeight.totalRowsHeight || spanningRowsHeight.spanningCellHe ightIgnoringBorderSpacing <= spanningRowsHeight.totalRowsHeight)
285 return; 370 return;
286 371
287 // Recalculating the height of rows based on rowSpan cell height if rowSpan cell height is more than total height of rows. 372 unsigned rowIndex = cell->rowIndex();
288 int remainingHeight = rowSpanCellHeight; 373 int totalPercent = 0;
374 int totalAutoRowsHeight = 0;
375 int totalRemainingRowsHeight = spanningRowsHeight.totalRowsHeight;
289 376
377 // Calculate total percentage, total auto rows height and total rows height except percent rows.
290 for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) { 378 for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) {
291 int rowHeight = (rowSpanCellHeight * rowsHeight[row - rowIndex]) / total RowsHeight; 379 if (m_grid[row].logicalHeight.isPercent()) {
292 remainingHeight -= rowHeight; 380 totalPercent += m_grid[row].logicalHeight.percent();
293 m_rowPos[row + 1] = m_rowPos[row] + rowHeight + borderSpacingForRow(row) ; 381 totalRemainingRowsHeight -= spanningRowsHeight.rowHeight[row - rowIn dex];
382 } else if (m_grid[row].logicalHeight.isAuto()) {
383 totalAutoRowsHeight += spanningRowsHeight.rowHeight[row - rowIndex];
384 }
294 } 385 }
295 // Remaining height added in the last row under rowSpan cell 386
296 m_rowPos[rowIndex + rowSpan] += remainingHeight; 387 int initialPos = m_rowPos[rowIndex + rowSpan];
388 int extraRowSpanningHeight = spanningRowsHeight.spanningCellHeightIgnoringBo rderSpacing - spanningRowsHeight.totalRowsHeight;
389
390 distributeExtraRowSpanHeightToPercentRows(cell, m_rowPos[m_grid.size()], tot alPercent, extraRowSpanningHeight);
391 distributeExtraRowSpanHeightToAutoRows(cell, totalAutoRowsHeight, extraRowSp anningHeight, spanningRowsHeight.rowHeight);
392 distributeExtraRowSpanHeightToRemainingRows(cell, totalRemainingRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight);
297 393
Julien - ping for review 2013/07/16 17:22:13 The ASSERT was really important, what I wasn't hap
a.suchit 2013/07/18 17:05:32 Done.
298 // Getting total changed height in the table 394 // Getting total changed height in the table
299 unsigned changedHeight = changedHeight = m_rowPos[rowIndex + rowSpan] - init ialPos; 395 unsigned changedHeight = m_rowPos[rowIndex + rowSpan] - initialPos;
300 396
301 if (changedHeight) { 397 if (changedHeight) {
302 unsigned totalRows = m_grid.size(); 398 unsigned totalRows = m_grid.size();
303 399
304 // Apply changed height by rowSpan cells to rows present at the end of t he table 400 // Apply changed height by rowSpan cells to rows present at the end of t he table
305 for (unsigned row = rowIndex + rowSpan + 1; row <= totalRows; row++) 401 for (unsigned row = rowIndex + rowSpan + 1; row <= totalRows; row++)
306 m_rowPos[row] += changedHeight; 402 m_rowPos[row] += changedHeight;
307 } 403 }
308 } 404 }
309 405
(...skipping 1234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1544 info.addMember(logicalHeight, "logicalHeight"); 1640 info.addMember(logicalHeight, "logicalHeight");
1545 } 1641 }
1546 1642
1547 void RenderTableSection::CellStruct::reportMemoryUsage(MemoryObjectInfo* memoryO bjectInfo) const 1643 void RenderTableSection::CellStruct::reportMemoryUsage(MemoryObjectInfo* memoryO bjectInfo) const
1548 { 1644 {
1549 MemoryClassInfo info(memoryObjectInfo, this, PlatformMemoryTypes::Rendering) ; 1645 MemoryClassInfo info(memoryObjectInfo, this, PlatformMemoryTypes::Rendering) ;
1550 info.addMember(cells, "cells"); 1646 info.addMember(cells, "cells");
1551 } 1647 }
1552 1648
1553 } // namespace WebCore 1649 } // namespace WebCore
OLDNEW
« Source/core/rendering/RenderTableSection.h ('K') | « Source/core/rendering/RenderTableSection.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698