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 614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 if (cell->rowSpan() == 1) { | 625 if (cell->rowSpan() == 1) { |
626 baselineDescent = std::max(baselineDescent, cell->logicalHeightForRo
wSizing() - baselinePosition); | 626 baselineDescent = std::max(baselineDescent, cell->logicalHeightForRo
wSizing() - baselinePosition); |
627 cellStartRowBaselineDescent = baselineDescent; | 627 cellStartRowBaselineDescent = baselineDescent; |
628 } | 628 } |
629 m_rowPos[row + 1] = std::max<int>(m_rowPos[row + 1], m_rowPos[row] + m_g
rid[row].baseline + cellStartRowBaselineDescent); | 629 m_rowPos[row + 1] = std::max<int>(m_rowPos[row + 1], m_rowPos[row] + m_g
rid[row].baseline + cellStartRowBaselineDescent); |
630 } | 630 } |
631 } | 631 } |
632 | 632 |
633 int RenderTableSection::calcRowLogicalHeight() | 633 int RenderTableSection::calcRowLogicalHeight() |
634 { | 634 { |
635 #ifndef NDEBUG | 635 #if ENABLE(ASSERT) |
636 SetLayoutNeededForbiddenScope layoutForbiddenScope(*this); | 636 SetLayoutNeededForbiddenScope layoutForbiddenScope(*this); |
637 #endif | 637 #endif |
638 | 638 |
639 ASSERT(!needsLayout()); | 639 ASSERT(!needsLayout()); |
640 | 640 |
641 RenderTableCell* cell; | 641 RenderTableCell* cell; |
642 | 642 |
643 // FIXME: This shouldn't use the same constructor as RenderView. | 643 // FIXME: This shouldn't use the same constructor as RenderView. |
644 LayoutState state(*this); | 644 LayoutState state(*this); |
645 | 645 |
646 m_rowPos.resize(m_grid.size() + 1); | 646 m_rowPos.resize(m_grid.size() + 1); |
647 | 647 |
648 // We ignore the border-spacing on any non-top section as it is already incl
uded in the previous section's last row position. | 648 // We ignore the border-spacing on any non-top section as it is already incl
uded in the previous section's last row position. |
649 if (this == table()->topSection()) | 649 if (this == table()->topSection()) |
650 m_rowPos[0] = table()->vBorderSpacing(); | 650 m_rowPos[0] = table()->vBorderSpacing(); |
651 else | 651 else |
652 m_rowPos[0] = 0; | 652 m_rowPos[0] = 0; |
653 | 653 |
654 SpanningRenderTableCells rowSpanCells; | 654 SpanningRenderTableCells rowSpanCells; |
655 #ifndef NDEBUG | 655 #if ENABLE(ASSERT) |
656 HashSet<const RenderTableCell*> uniqueCells; | 656 HashSet<const RenderTableCell*> uniqueCells; |
657 #endif | 657 #endif |
658 | 658 |
659 for (unsigned r = 0; r < m_grid.size(); r++) { | 659 for (unsigned r = 0; r < m_grid.size(); r++) { |
660 m_grid[r].baseline = 0; | 660 m_grid[r].baseline = 0; |
661 LayoutUnit baselineDescent = 0; | 661 LayoutUnit baselineDescent = 0; |
662 | 662 |
663 // Our base size is the biggest logical height from our cells' styles (e
xcluding row spanning cells). | 663 // Our base size is the biggest logical height from our cells' styles (e
xcluding row spanning cells). |
664 m_rowPos[r + 1] = std::max(m_rowPos[r] + minimumValueForLength(m_grid[r]
.logicalHeight, 0).round(), 0); | 664 m_rowPos[r + 1] = std::max(m_rowPos[r] + minimumValueForLength(m_grid[r]
.logicalHeight, 0).round(), 0); |
665 | 665 |
666 Row& row = m_grid[r].row; | 666 Row& row = m_grid[r].row; |
667 unsigned totalCols = row.size(); | 667 unsigned totalCols = row.size(); |
668 RenderTableCell* lastRowSpanCell = 0; | 668 RenderTableCell* lastRowSpanCell = 0; |
669 | 669 |
670 for (unsigned c = 0; c < totalCols; c++) { | 670 for (unsigned c = 0; c < totalCols; c++) { |
671 CellStruct& current = cellAt(r, c); | 671 CellStruct& current = cellAt(r, c); |
672 for (unsigned i = 0; i < current.cells.size(); i++) { | 672 for (unsigned i = 0; i < current.cells.size(); i++) { |
673 cell = current.cells[i]; | 673 cell = current.cells[i]; |
674 if (current.inColSpan && cell->rowSpan() == 1) | 674 if (current.inColSpan && cell->rowSpan() == 1) |
675 continue; | 675 continue; |
676 | 676 |
677 if (cell->rowSpan() > 1) { | 677 if (cell->rowSpan() > 1) { |
678 // For row spanning cells, we only handle them for the first
row they span. This ensures we take their baseline into account. | 678 // For row spanning cells, we only handle them for the first
row they span. This ensures we take their baseline into account. |
679 if (lastRowSpanCell != cell && cell->rowIndex() == r) { | 679 if (lastRowSpanCell != cell && cell->rowIndex() == r) { |
680 #ifndef NDEBUG | 680 #if ENABLE(ASSERT) |
681 ASSERT(!uniqueCells.contains(cell)); | 681 ASSERT(!uniqueCells.contains(cell)); |
682 uniqueCells.add(cell); | 682 uniqueCells.add(cell); |
683 #endif | 683 #endif |
684 | 684 |
685 rowSpanCells.append(cell); | 685 rowSpanCells.append(cell); |
686 lastRowSpanCell = cell; | 686 lastRowSpanCell = cell; |
687 | 687 |
688 // Find out the baseline. The baseline is set on the fir
st row in a rowSpan. | 688 // Find out the baseline. The baseline is set on the fir
st row in a rowSpan. |
689 updateBaselineForCell(cell, r, baselineDescent); | 689 updateBaselineForCell(cell, r, baselineDescent); |
690 } | 690 } |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 return extraLogicalHeight - remainingExtraLogicalHeight; | 860 return extraLogicalHeight - remainingExtraLogicalHeight; |
861 } | 861 } |
862 | 862 |
863 static bool shouldFlexCellChild(RenderObject* cellDescendant) | 863 static bool shouldFlexCellChild(RenderObject* cellDescendant) |
864 { | 864 { |
865 return cellDescendant->isReplaced() || (cellDescendant->isBox() && toRenderB
ox(cellDescendant)->scrollsOverflow()); | 865 return cellDescendant->isReplaced() || (cellDescendant->isBox() && toRenderB
ox(cellDescendant)->scrollsOverflow()); |
866 } | 866 } |
867 | 867 |
868 void RenderTableSection::layoutRows() | 868 void RenderTableSection::layoutRows() |
869 { | 869 { |
870 #ifndef NDEBUG | 870 #if ENABLE(ASSERT) |
871 SetLayoutNeededForbiddenScope layoutForbiddenScope(*this); | 871 SetLayoutNeededForbiddenScope layoutForbiddenScope(*this); |
872 #endif | 872 #endif |
873 | 873 |
874 ASSERT(!needsLayout()); | 874 ASSERT(!needsLayout()); |
875 | 875 |
876 // FIXME: Changing the height without a layout can change the overflow so it
seems wrong. | 876 // FIXME: Changing the height without a layout can change the overflow so it
seems wrong. |
877 | 877 |
878 unsigned totalRows = m_grid.size(); | 878 unsigned totalRows = m_grid.size(); |
879 | 879 |
880 // Set the width of our section now. The rows will also be this width. | 880 // Set the width of our section now. The rows will also be this width. |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1023 unsigned totalRows = m_grid.size(); | 1023 unsigned totalRows = m_grid.size(); |
1024 unsigned nEffCols = table()->numEffCols(); | 1024 unsigned nEffCols = table()->numEffCols(); |
1025 computeOverflowFromCells(totalRows, nEffCols); | 1025 computeOverflowFromCells(totalRows, nEffCols); |
1026 } | 1026 } |
1027 | 1027 |
1028 void RenderTableSection::computeOverflowFromCells(unsigned totalRows, unsigned n
EffCols) | 1028 void RenderTableSection::computeOverflowFromCells(unsigned totalRows, unsigned n
EffCols) |
1029 { | 1029 { |
1030 unsigned totalCellsCount = nEffCols * totalRows; | 1030 unsigned totalCellsCount = nEffCols * totalRows; |
1031 unsigned maxAllowedOverflowingCellsCount = totalCellsCount < gMinTableSizeTo
UseFastPaintPathWithOverflowingCell ? 0 : gMaxAllowedOverflowingCellRatioForFast
PaintPath * totalCellsCount; | 1031 unsigned maxAllowedOverflowingCellsCount = totalCellsCount < gMinTableSizeTo
UseFastPaintPathWithOverflowingCell ? 0 : gMaxAllowedOverflowingCellRatioForFast
PaintPath * totalCellsCount; |
1032 | 1032 |
1033 #ifndef NDEBUG | 1033 #if ENABLE(ASSERT) |
1034 bool hasOverflowingCell = false; | 1034 bool hasOverflowingCell = false; |
1035 #endif | 1035 #endif |
1036 // Now that our height has been determined, add in overflow from cells. | 1036 // Now that our height has been determined, add in overflow from cells. |
1037 for (unsigned r = 0; r < totalRows; r++) { | 1037 for (unsigned r = 0; r < totalRows; r++) { |
1038 for (unsigned c = 0; c < nEffCols; c++) { | 1038 for (unsigned c = 0; c < nEffCols; c++) { |
1039 CellStruct& cs = cellAt(r, c); | 1039 CellStruct& cs = cellAt(r, c); |
1040 RenderTableCell* cell = cs.primaryCell(); | 1040 RenderTableCell* cell = cs.primaryCell(); |
1041 if (!cell || cs.inColSpan) | 1041 if (!cell || cs.inColSpan) |
1042 continue; | 1042 continue; |
1043 if (r < totalRows - 1 && cell == primaryCellAt(r + 1, c)) | 1043 if (r < totalRows - 1 && cell == primaryCellAt(r + 1, c)) |
1044 continue; | 1044 continue; |
1045 addOverflowFromChild(cell); | 1045 addOverflowFromChild(cell); |
1046 #ifndef NDEBUG | 1046 #if ENABLE(ASSERT) |
1047 hasOverflowingCell |= cell->hasVisualOverflow(); | 1047 hasOverflowingCell |= cell->hasVisualOverflow(); |
1048 #endif | 1048 #endif |
1049 if (cell->hasVisualOverflow() && !m_forceSlowPaintPathWithOverflowin
gCell) { | 1049 if (cell->hasVisualOverflow() && !m_forceSlowPaintPathWithOverflowin
gCell) { |
1050 m_overflowingCells.add(cell); | 1050 m_overflowingCells.add(cell); |
1051 if (m_overflowingCells.size() > maxAllowedOverflowingCellsCount)
{ | 1051 if (m_overflowingCells.size() > maxAllowedOverflowingCellsCount)
{ |
1052 // We need to set m_forcesSlowPaintPath only if there is a l
east one overflowing cells as the hit testing code rely on this information. | 1052 // We need to set m_forcesSlowPaintPath only if there is a l
east one overflowing cells as the hit testing code rely on this information. |
1053 m_forceSlowPaintPathWithOverflowingCell = true; | 1053 m_forceSlowPaintPathWithOverflowingCell = true; |
1054 // The slow path does not make any use of the overflowing ce
lls info, don't hold on to the memory. | 1054 // The slow path does not make any use of the overflowing ce
lls info, don't hold on to the memory. |
1055 m_overflowingCells.clear(); | 1055 m_overflowingCells.clear(); |
1056 } | 1056 } |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1410 CellStruct& current = cellAt(r, c); | 1410 CellStruct& current = cellAt(r, c); |
1411 RenderTableCell* cell = current.primaryCell(); | 1411 RenderTableCell* cell = current.primaryCell(); |
1412 if (!cell || (r > dirtiedRows.start() && primaryCellAt(r
- 1, c) == cell) || (c > dirtiedColumns.start() && primaryCellAt(r, c - 1) == c
ell)) | 1412 if (!cell || (r > dirtiedRows.start() && primaryCellAt(r
- 1, c) == cell) || (c > dirtiedColumns.start() && primaryCellAt(r, c - 1) == c
ell)) |
1413 continue; | 1413 continue; |
1414 paintCell(cell, paintInfo, paintOffset); | 1414 paintCell(cell, paintInfo, paintOffset); |
1415 } | 1415 } |
1416 } | 1416 } |
1417 } | 1417 } |
1418 } else { | 1418 } else { |
1419 // The overflowing cells should be scarce to avoid adding a lot of c
ells to the HashSet. | 1419 // The overflowing cells should be scarce to avoid adding a lot of c
ells to the HashSet. |
1420 #ifndef NDEBUG | 1420 #if ENABLE(ASSERT) |
1421 unsigned totalRows = m_grid.size(); | 1421 unsigned totalRows = m_grid.size(); |
1422 unsigned totalCols = table()->columns().size(); | 1422 unsigned totalCols = table()->columns().size(); |
1423 ASSERT(m_overflowingCells.size() < totalRows * totalCols * gMaxAllow
edOverflowingCellRatioForFastPaintPath); | 1423 ASSERT(m_overflowingCells.size() < totalRows * totalCols * gMaxAllow
edOverflowingCellRatioForFastPaintPath); |
1424 #endif | 1424 #endif |
1425 | 1425 |
1426 // To make sure we properly repaint the section, we repaint all the
overflowing cells that we collected. | 1426 // To make sure we properly repaint the section, we repaint all the
overflowing cells that we collected. |
1427 Vector<RenderTableCell*> cells; | 1427 Vector<RenderTableCell*> cells; |
1428 copyToVector(m_overflowingCells, cells); | 1428 copyToVector(m_overflowingCells, cells); |
1429 | 1429 |
1430 HashSet<RenderTableCell*> spanningCells; | 1430 HashSet<RenderTableCell*> spanningCells; |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1705 // FIXME: The table's direction should determine our row's direction, not th
e section's (see bug 96691). | 1705 // FIXME: The table's direction should determine our row's direction, not th
e section's (see bug 96691). |
1706 if (!style()->isLeftToRightDirection()) | 1706 if (!style()->isLeftToRightDirection()) |
1707 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta
ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] +
horizontalBorderSpacing); | 1707 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta
ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] +
horizontalBorderSpacing); |
1708 else | 1708 else |
1709 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont
alBorderSpacing); | 1709 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont
alBorderSpacing); |
1710 | 1710 |
1711 cell->setLogicalLocation(cellLocation); | 1711 cell->setLogicalLocation(cellLocation); |
1712 } | 1712 } |
1713 | 1713 |
1714 } // namespace WebCore | 1714 } // namespace WebCore |
OLD | NEW |