Chromium Code Reviews| OLD | NEW |
|---|---|
| 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, 2013 Apple Inc. All r ights reserved. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. All r ights 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 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 478 if (cellIsFullyIncludedInOtherCell(cell1, cell2)) | 478 if (cellIsFullyIncludedInOtherCell(cell1, cell2)) |
| 479 return true; | 479 return true; |
| 480 // Sorting lower row index first because first we need to apply the extra he ight of spanning cell which | 480 // Sorting lower row index first because first we need to apply the extra he ight of spanning cell which |
| 481 // comes first in the table so lower rows's position would increment in sequ ence. | 481 // comes first in the table so lower rows's position would increment in sequ ence. |
| 482 if (!cellIsFullyIncludedInOtherCell(cell2, cell1)) | 482 if (!cellIsFullyIncludedInOtherCell(cell2, cell1)) |
| 483 return (cell1->rowIndex() < cell2->rowIndex()); | 483 return (cell1->rowIndex() < cell2->rowIndex()); |
| 484 | 484 |
| 485 return false; | 485 return false; |
| 486 } | 486 } |
| 487 | 487 |
| 488 bool RenderTableSection::isHeightNeededForRowHavingOnlySpanningCells(unsigned ro w) | 488 unsigned RenderTableSection::calcRowHeightHavingOnlySpanningCells(unsigned row, int& accumulatedPositionIncrease, unsigned effectedRowByExtraHeight, unsigned& e xtraHeightToPropagate, Vector<int>& rowsCountWithOnlySpanningCells) |
|
dsinclair
2014/10/15 21:37:41
s/rowsCountWithOnlySpanningCells/rowCountWithOnlyS
dsinclair
2014/10/15 21:37:42
How does accumulatedPositionIncrease relate to ext
dsinclair
2014/10/15 21:37:42
What does effectedRowByExtraHeight mean? Does it m
suchit.agrawal
2014/10/25 04:28:59
There is no relation between these 2.
extraHeight
dsinclair
2014/11/05 17:03:20
So, if I'm understanding correctly, accumulatedPos
a.suchit
2014/12/03 13:09:13
right.
| |
| 489 { | |
| 490 unsigned totalCols = m_grid[row].row.size(); | |
| 491 | |
| 492 if (!totalCols) | |
| 493 return false; | |
| 494 | |
| 495 for (unsigned col = 0; col < totalCols; col++) { | |
| 496 const CellStruct& rowSpanCell = cellAt(row, col); | |
| 497 | |
| 498 if (rowSpanCell.cells.size()) { | |
| 499 RenderTableCell* cell = rowSpanCell.cells[0]; | |
| 500 const unsigned rowIndex = cell->rowIndex(); | |
| 501 const unsigned rowSpan = cell->rowSpan(); | |
| 502 int totalRowSpanCellHeight = 0; | |
| 503 | |
| 504 for (unsigned row = 0; row < rowSpan; row++) { | |
| 505 unsigned actualRow = row + rowIndex; | |
| 506 totalRowSpanCellHeight += m_rowPos[actualRow + 1] - m_rowPos[act ualRow]; | |
| 507 } | |
| 508 totalRowSpanCellHeight -= borderSpacingForRow(rowIndex + rowSpan - 1 ); | |
| 509 | |
| 510 if (totalRowSpanCellHeight < cell->logicalHeightForRowSizing()) | |
| 511 return true; | |
| 512 } | |
| 513 } | |
| 514 | |
| 515 return false; | |
| 516 } | |
| 517 | |
| 518 unsigned RenderTableSection::calcRowHeightHavingOnlySpanningCells(unsigned row) | |
| 519 { | 489 { |
| 520 ASSERT(rowHasOnlySpanningCells(row)); | 490 ASSERT(rowHasOnlySpanningCells(row)); |
| 521 | 491 |
| 522 unsigned totalCols = m_grid[row].row.size(); | 492 unsigned totalCols = m_grid[row].row.size(); |
| 523 | 493 |
| 524 if (!totalCols) | 494 if (!totalCols) |
| 525 return 0; | 495 return 0; |
| 526 | 496 |
| 527 unsigned rowHeight = 0; | 497 unsigned rowHeight = 0; |
| 528 | 498 |
| 529 for (unsigned col = 0; col < totalCols; col++) { | 499 for (unsigned col = 0; col < totalCols; col++) { |
| 530 const CellStruct& rowSpanCell = cellAt(row, col); | 500 const CellStruct& rowSpanCell = cellAt(row, col); |
| 531 if (rowSpanCell.cells.size() && rowSpanCell.cells[0]->rowSpan() > 1) | 501 |
| 532 rowHeight = std::max(rowHeight, rowSpanCell.cells[0]->logicalHeightF orRowSizing() / rowSpanCell.cells[0]->rowSpan()); | 502 if (rowSpanCell.cells.size()) { |
|
dsinclair
2014/10/15 21:37:41
if (!rowSpanCell.cells.size())
continue;
a.suchit
2014/12/03 13:09:13
Done.
| |
| 503 RenderTableCell* cell = rowSpanCell.cells[0]; | |
| 504 | |
| 505 if (cell->rowSpan() > 1) { | |
|
dsinclair
2014/10/15 21:37:42
if (cell.rowSpan() <= 1)
continue;
a.suchit
2014/12/03 13:09:13
Done.
| |
| 506 const unsigned rowIndex = cell->rowIndex(); | |
| 507 const unsigned rowSpan = cell->rowSpan(); | |
|
dsinclair
2014/10/15 21:37:42
Can we rename these to cellRowIndex and cellRowSpa
a.suchit
2014/12/03 13:09:13
Done.
| |
| 508 | |
| 509 // As we are moving from top to bottom for calculating rows heig ht of row with only spanning cells | |
| 510 // and all previous rows are already processed so we need to fin d the number of rows with only | |
|
dsinclair
2014/10/15 21:37:41
This comment is difficult to process, does the bel
a.suchit
2014/12/03 13:09:13
Done.
| |
| 511 // spanning cells presents from current row to end of the spanni ng cell. | |
| 512 unsigned startRow = max(rowIndex, row); | |
| 513 unsigned endRow = rowIndex + rowSpan; | |
|
dsinclair
2014/10/15 21:37:42
Does this mean the endRow of our current cell, or
suchit.agrawal
2014/10/25 04:28:59
we can see it in 2 ways,
1. It is the row that com
| |
| 514 unsigned spanningCellsRowsCountHavingZeroHeight = 0; | |
| 515 | |
| 516 if (startRow) { | |
| 517 spanningCellsRowsCountHavingZeroHeight = rowsCountWithOnlySp anningCells[endRow - 1] - rowsCountWithOnlySpanningCells[startRow - 1]; | |
|
dsinclair
2014/10/15 21:37:42
Why is this startRow - 1 and not startRow?
suchit.agrawal
2014/10/25 04:28:59
000112223334
^ ^
4-3=1. Means 1 row with
| |
| 518 } else { | |
| 519 spanningCellsRowsCountHavingZeroHeight = (rowsCountWithOnlyS panningCells[endRow - 1] - rowsCountWithOnlySpanningCells[startRow]) + rowsCount WithOnlySpanningCells[0]; | |
|
dsinclair
2014/10/15 21:37:41
If I'm reading this correctly we're doing:
spanni
suchit.agrawal
2014/10/25 04:28:59
yes, we can remove subtraction and addition.
a.suchit
2014/12/03 13:09:13
Done.
| |
| 520 } | |
| 521 | |
| 522 int totalRowspanCellHeight = m_rowPos[endRow] - m_rowPos[rowInde x]; | |
|
dsinclair
2014/10/15 21:37:41
It's very confusing that we jump back and forth be
suchit.agrawal
2014/10/25 04:28:59
I will change |startRow| to |startRowforSpanningCe
a.suchit
2014/12/03 13:09:13
Done.
| |
| 523 | |
| 524 totalRowspanCellHeight -= borderSpacingForRow(endRow - 1); | |
| 525 | |
| 526 totalRowspanCellHeight += accumulatedPositionIncrease; | |
| 527 if (effectedRowByExtraHeight >= rowIndex && effectedRowByExtraHe ight < endRow) | |
| 528 totalRowspanCellHeight += extraHeightToPropagate; | |
| 529 | |
| 530 if (totalRowspanCellHeight < cell->logicalHeightForRowSizing()) { | |
| 531 unsigned extraHeightRequired = rowSpanCell.cells[0]->logical HeightForRowSizing() - totalRowspanCellHeight; | |
| 532 int remainder = extraHeightRequired % spanningCellsRowsCount HavingZeroHeight; | |
| 533 | |
| 534 if (remainder) | |
| 535 extraHeightRequired += spanningCellsRowsCountHavingZeroH eight - remainder; | |
| 536 | |
| 537 rowHeight = std::max(rowHeight, extraHeightRequired / spanni ngCellsRowsCountHavingZeroHeight); | |
|
dsinclair
2014/10/15 21:37:41
Wont' this fail to set rowHeight in the case where
dsinclair
2014/10/15 21:37:41
Can we ever have a case where spanningCellsRowsCou
suchit.agrawal
2014/10/25 04:28:59
rowHeight would be less than logicalHeightForRowSi
suchit.agrawal
2014/10/25 04:28:59
spanningCellsRowsCountHavingZeroHeight would not b
| |
| 538 } | |
| 539 } | |
| 540 } | |
| 533 } | 541 } |
| 534 | 542 |
| 535 return rowHeight; | 543 return rowHeight; |
| 536 } | 544 } |
| 537 | 545 |
| 538 void RenderTableSection::updateRowsHeightHavingOnlySpanningCells(RenderTableCell * cell, struct SpanningRowsHeight& spanningRowsHeight) | 546 void RenderTableSection::updateRowsHeightHavingOnlySpanningCells(RenderTableCell * cell, struct SpanningRowsHeight& spanningRowsHeight, unsigned& extraHeightToPr opagate, Vector<int>& rowsCountWithOnlySpanningCells) |
| 539 { | 547 { |
| 540 ASSERT(spanningRowsHeight.rowHeight.size()); | 548 ASSERT(spanningRowsHeight.rowHeight.size()); |
| 541 | 549 |
| 542 int accumulatedPositionIncrease = 0; | 550 int accumulatedPositionIncrease = 0; |
| 543 const unsigned rowSpan = cell->rowSpan(); | 551 const unsigned rowSpan = cell->rowSpan(); |
| 544 const unsigned rowIndex = cell->rowIndex(); | 552 const unsigned rowIndex = cell->rowIndex(); |
| 545 | 553 |
| 546 ASSERT_UNUSED(rowSpan, rowSpan == spanningRowsHeight.rowHeight.size()); | 554 ASSERT_UNUSED(rowSpan, rowSpan == spanningRowsHeight.rowHeight.size()); |
| 547 | 555 |
| 548 for (unsigned row = 0; row < spanningRowsHeight.rowHeight.size(); row++) { | 556 for (unsigned row = 0; row < spanningRowsHeight.rowHeight.size(); row++) { |
| 549 unsigned actualRow = row + rowIndex; | 557 unsigned actualRow = row + rowIndex; |
| 550 if (!spanningRowsHeight.rowHeight[row] && rowHasOnlySpanningCells(actual Row) && isHeightNeededForRowHavingOnlySpanningCells(actualRow)) { | 558 if (!spanningRowsHeight.rowHeight[row] && rowHasOnlySpanningCells(actual Row)) { |
| 551 spanningRowsHeight.rowHeight[row] = calcRowHeightHavingOnlySpanningC ells(actualRow); | 559 spanningRowsHeight.rowHeight[row] = calcRowHeightHavingOnlySpanningC ells(actualRow, accumulatedPositionIncrease, rowIndex + rowSpan, extraHeightToPr opagate, rowsCountWithOnlySpanningCells); |
|
dsinclair
2014/10/15 21:37:41
We set effectedRowByExtraHeight to rowIndex + rowS
suchit.agrawal
2014/10/25 04:28:59
In calcRowHeightHavingOnlySpanningCells(), We may
| |
| 552 accumulatedPositionIncrease += spanningRowsHeight.rowHeight[row]; | 560 accumulatedPositionIncrease += spanningRowsHeight.rowHeight[row]; |
| 553 } | 561 } |
| 554 m_rowPos[actualRow + 1] += accumulatedPositionIncrease; | 562 m_rowPos[actualRow + 1] += accumulatedPositionIncrease; |
| 555 } | 563 } |
| 556 | 564 |
| 557 spanningRowsHeight.totalRowsHeight += accumulatedPositionIncrease; | 565 spanningRowsHeight.totalRowsHeight += accumulatedPositionIncrease; |
| 558 } | 566 } |
| 559 | 567 |
| 560 // Distribute rowSpan cell height in rows those comes in rowSpan cell based on t he ratio of row's height if | 568 // Distribute rowSpan cell height in rows those comes in rowSpan cell based on t he ratio of row's height if |
| 561 // 1. RowSpan cell height is greater then the total height of rows in rowSpan ce ll | 569 // 1. RowSpan cell height is greater then the total height of rows in rowSpan ce ll |
| 562 void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& rowSpanCells) | 570 void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& rowSpanCells) |
| 563 { | 571 { |
| 564 ASSERT(rowSpanCells.size()); | 572 ASSERT(rowSpanCells.size()); |
| 565 | 573 |
| 566 // 'rowSpanCells' list is already sorted based on the cells rowIndex in asce nding order | 574 // 'rowSpanCells' list is already sorted based on the cells rowIndex in asce nding order |
| 567 // Arrange row spanning cell in the order in which we need to process first. | 575 // Arrange row spanning cell in the order in which we need to process first. |
| 568 std::sort(rowSpanCells.begin(), rowSpanCells.end(), compareRowSpanCellsInHei ghtDistributionOrder); | 576 std::sort(rowSpanCells.begin(), rowSpanCells.end(), compareRowSpanCellsInHei ghtDistributionOrder); |
| 569 | 577 |
| 570 unsigned extraHeightToPropagate = 0; | 578 unsigned extraHeightToPropagate = 0; |
| 571 unsigned lastRowIndex = 0; | 579 unsigned lastRowIndex = 0; |
| 572 unsigned lastRowSpan = 0; | 580 unsigned lastRowSpan = 0; |
| 573 | 581 |
| 582 Vector<int> rowsCountWithOnlySpanningCells; | |
| 583 | |
| 584 // At this stage, Height of the rows are zero for the one containing only sp anning cells. | |
|
dsinclair
2014/10/15 21:37:42
This comment doesn't make sense to me, can you re-
suchit.agrawal
2014/10/25 04:28:59
We are collecting the information of the rows with
| |
| 585 int count = 0; | |
| 586 for (unsigned row = 0; row < m_grid.size(); row++) { | |
| 587 if (rowHasOnlySpanningCells(row)) | |
| 588 count++; | |
| 589 rowsCountWithOnlySpanningCells.append(count); | |
|
dsinclair
2014/10/15 21:37:41
I'm not sure I understand what this is storing. We
suchit.agrawal
2014/10/25 04:28:59
yes, we are doing same here.
| |
| 590 } | |
| 591 | |
| 574 for (unsigned i = 0; i < rowSpanCells.size(); i++) { | 592 for (unsigned i = 0; i < rowSpanCells.size(); i++) { |
| 575 RenderTableCell* cell = rowSpanCells[i]; | 593 RenderTableCell* cell = rowSpanCells[i]; |
| 576 | 594 |
| 577 unsigned rowIndex = cell->rowIndex(); | 595 unsigned rowIndex = cell->rowIndex(); |
| 578 | 596 |
| 579 unsigned rowSpan = cell->rowSpan(); | 597 unsigned rowSpan = cell->rowSpan(); |
| 580 | 598 |
| 581 unsigned spanningCellEndIndex = rowIndex + rowSpan; | 599 unsigned spanningCellEndIndex = rowIndex + rowSpan; |
| 582 unsigned lastSpanningCellEndIndex = lastRowIndex + lastRowSpan; | 600 unsigned lastSpanningCellEndIndex = lastRowIndex + lastRowSpan; |
| 583 | 601 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 601 | 619 |
| 602 lastRowIndex = rowIndex; | 620 lastRowIndex = rowIndex; |
| 603 lastRowSpan = rowSpan; | 621 lastRowSpan = rowSpan; |
| 604 | 622 |
| 605 struct SpanningRowsHeight spanningRowsHeight; | 623 struct SpanningRowsHeight spanningRowsHeight; |
| 606 | 624 |
| 607 populateSpanningRowsHeightFromCell(cell, spanningRowsHeight); | 625 populateSpanningRowsHeightFromCell(cell, spanningRowsHeight); |
| 608 | 626 |
| 609 // Here we are handling only row(s) who have only rowspanning cells and do not have any empty cell. | 627 // Here we are handling only row(s) who have only rowspanning cells and do not have any empty cell. |
| 610 if (spanningRowsHeight.isAnyRowWithOnlySpanningCells) | 628 if (spanningRowsHeight.isAnyRowWithOnlySpanningCells) |
| 611 updateRowsHeightHavingOnlySpanningCells(cell, spanningRowsHeight); | 629 updateRowsHeightHavingOnlySpanningCells(cell, spanningRowsHeight, ex traHeightToPropagate, rowsCountWithOnlySpanningCells); |
| 612 | 630 |
| 613 // This code handle row(s) that have rowspanning cell(s) and at least on e empty cell. | 631 // This code handle row(s) that have rowspanning cell(s) and at least on e empty cell. |
| 614 // Such rows are not handled below and end up having a height of 0. That would mean | 632 // Such rows are not handled below and end up having a height of 0. That would mean |
| 615 // content overlapping if one of their cells has any content. To avoid t he problem, we | 633 // content overlapping if one of their cells has any content. To avoid t he problem, we |
| 616 // add all the remaining spanning cells' height to the last spanned row. | 634 // add all the remaining spanning cells' height to the last spanned row. |
| 617 // This means that we could grow a row past its 'height' or break percen tage spreading | 635 // This means that we could grow a row past its 'height' or break percen tage spreading |
| 618 // however this is better than overlapping content. | 636 // however this is better than overlapping content. |
| 619 // FIXME: Is there a better algorithm? | 637 // FIXME: Is there a better algorithm? |
| 620 if (!spanningRowsHeight.totalRowsHeight) { | 638 if (!spanningRowsHeight.totalRowsHeight) { |
| 621 if (spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing) | 639 if (spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing) |
| (...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1610 // FIXME: The table's direction should determine our row's direction, not th e section's (see bug 96691). | 1628 // FIXME: The table's direction should determine our row's direction, not th e section's (see bug 96691). |
| 1611 if (!style()->isLeftToRightDirection()) | 1629 if (!style()->isLeftToRightDirection()) |
| 1612 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] + horizontalBorderSpacing); | 1630 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] + horizontalBorderSpacing); |
| 1613 else | 1631 else |
| 1614 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont alBorderSpacing); | 1632 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont alBorderSpacing); |
| 1615 | 1633 |
| 1616 cell->setLogicalLocation(cellLocation); | 1634 cell->setLogicalLocation(cellLocation); |
| 1617 } | 1635 } |
| 1618 | 1636 |
| 1619 } // namespace blink | 1637 } // namespace blink |
| OLD | NEW |