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. | 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. |
| 8 * All rights reserved. | 8 * All rights reserved. |
| 9 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) | 9 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) |
| 10 * | 10 * |
| (...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 849 if (this == table()->topSection()) | 849 if (this == table()->topSection()) |
| 850 m_rowPos[0] = table()->vBorderSpacing(); | 850 m_rowPos[0] = table()->vBorderSpacing(); |
| 851 else | 851 else |
| 852 m_rowPos[0] = 0; | 852 m_rowPos[0] = 0; |
| 853 | 853 |
| 854 SpanningLayoutTableCells rowSpanCells; | 854 SpanningLayoutTableCells rowSpanCells; |
| 855 #if ENABLE(ASSERT) | 855 #if ENABLE(ASSERT) |
| 856 HashSet<const LayoutTableCell*> uniqueCells; | 856 HashSet<const LayoutTableCell*> uniqueCells; |
| 857 #endif | 857 #endif |
| 858 | 858 |
| 859 // At fragmentainer breaks we need to prevent rowspanned cells (and whatever | |
| 860 // else) from distributing their extra height requirements over the rows that | |
| 861 // it spans. Otherwise we'd need to refragment afterwards. | |
| 862 unsigned indexOfFirstStretchableRow = 0; | |
| 863 | |
| 859 for (unsigned r = 0; r < m_grid.size(); r++) { | 864 for (unsigned r = 0; r < m_grid.size(); r++) { |
| 860 m_grid[r].baseline = -1; | 865 m_grid[r].baseline = -1; |
| 861 int baselineDescent = 0; | 866 int baselineDescent = 0; |
| 862 | 867 |
| 863 if (state.isPaginated() && m_grid[r].rowLayoutObject) | 868 if (state.isPaginated() && m_grid[r].rowLayoutObject) |
| 864 m_rowPos[r] += m_grid[r].rowLayoutObject->paginationStrut().ceil(); | 869 m_rowPos[r] += m_grid[r].rowLayoutObject->paginationStrut().ceil(); |
| 865 | 870 |
| 866 if (m_grid[r].logicalHeight.isSpecified()) { | 871 if (m_grid[r].logicalHeight.isSpecified()) { |
| 867 // Our base size is the biggest logical height from our cells' styles | 872 // Our base size is the biggest logical height from our cells' styles |
| 868 // (excluding row spanning cells). | 873 // (excluding row spanning cells). |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 881 unsigned totalCols = row.size(); | 886 unsigned totalCols = row.size(); |
| 882 LayoutTableCell* lastRowSpanCell = nullptr; | 887 LayoutTableCell* lastRowSpanCell = nullptr; |
| 883 | 888 |
| 884 for (unsigned c = 0; c < totalCols; c++) { | 889 for (unsigned c = 0; c < totalCols; c++) { |
| 885 CellStruct& current = cellAt(r, c); | 890 CellStruct& current = cellAt(r, c); |
| 886 for (unsigned i = 0; i < current.cells.size(); i++) { | 891 for (unsigned i = 0; i < current.cells.size(); i++) { |
| 887 cell = current.cells[i]; | 892 cell = current.cells[i]; |
| 888 if (current.inColSpan && cell->rowSpan() == 1) | 893 if (current.inColSpan && cell->rowSpan() == 1) |
| 889 continue; | 894 continue; |
| 890 | 895 |
| 891 if (cell->rowSpan() > 1) { | 896 if (r < indexOfFirstStretchableRow || |
| 897 (state.isPaginated() && | |
| 898 crossesPageBoundary( | |
| 899 LayoutUnit(m_rowPos[cell->rowIndex()]), | |
| 900 LayoutUnit(cell->logicalHeightForRowSizing())))) { | |
| 901 // Entering or extending a range of unstretchable rows. We enter this | |
| 902 // mode when a cell in a row crosses a fragmentainer boundary, and | |
| 903 // we'll stay in this mode until we get to a row where we're past all | |
| 904 // rowspanned cells that we encountered while in this mode. | |
| 905 DCHECK(state.isPaginated()); | |
| 906 unsigned rowIndexBelowCell = cell->rowIndex() + cell->rowSpan(); | |
| 907 indexOfFirstStretchableRow = | |
| 908 std::max(indexOfFirstStretchableRow, rowIndexBelowCell); | |
| 909 } else if (cell->rowSpan() > 1) { | |
| 892 // For row spanning cells, we only handle them for the first row they | 910 // For row spanning cells, we only handle them for the first row they |
| 893 // span. This ensures we take their baseline into account. | 911 // span. This ensures we take their baseline into account. |
| 894 if (lastRowSpanCell != cell && cell->rowIndex() == r) { | 912 if (lastRowSpanCell != cell && cell->rowIndex() == r) { |
| 895 #if ENABLE(ASSERT) | 913 #if ENABLE(ASSERT) |
| 896 ASSERT(!uniqueCells.contains(cell)); | 914 ASSERT(!uniqueCells.contains(cell)); |
| 897 uniqueCells.add(cell); | 915 uniqueCells.add(cell); |
| 898 #endif | 916 #endif |
| 899 | 917 |
| 900 rowSpanCells.append(cell); | 918 rowSpanCells.append(cell); |
| 901 lastRowSpanCell = cell; | 919 lastRowSpanCell = cell; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 912 m_rowPos[r + 1] = std::max( | 930 m_rowPos[r + 1] = std::max( |
| 913 m_rowPos[r + 1], m_rowPos[r] + cell->logicalHeightForRowSizing()); | 931 m_rowPos[r + 1], m_rowPos[r] + cell->logicalHeightForRowSizing()); |
| 914 | 932 |
| 915 // Find out the baseline. The baseline is set on the first row in a | 933 // Find out the baseline. The baseline is set on the first row in a |
| 916 // rowSpan. | 934 // rowSpan. |
| 917 if (cell->rowIndex() == r) | 935 if (cell->rowIndex() == r) |
| 918 updateBaselineForCell(cell, r, baselineDescent); | 936 updateBaselineForCell(cell, r, baselineDescent); |
| 919 } | 937 } |
| 920 } | 938 } |
| 921 | 939 |
| 940 if (r < indexOfFirstStretchableRow && m_grid[r].rowLayoutObject) { | |
| 941 // We're not allowed to resize this row. Just scratch what we've | |
| 942 // calculated so far, and use the height that we got during initial | |
| 943 // layout instead. | |
| 944 m_rowPos[r + 1] = | |
| 945 m_rowPos[r] + m_grid[r].rowLayoutObject->logicalHeight().toInt(); | |
| 946 } | |
| 947 | |
| 922 // Add the border-spacing to our final position. | 948 // Add the border-spacing to our final position. |
| 923 m_rowPos[r + 1] += borderSpacingForRow(r); | 949 m_rowPos[r + 1] += borderSpacingForRow(r); |
| 924 m_rowPos[r + 1] = std::max(m_rowPos[r + 1], m_rowPos[r]); | 950 m_rowPos[r + 1] = std::max(m_rowPos[r + 1], m_rowPos[r]); |
| 925 } | 951 } |
| 926 | 952 |
| 927 if (!rowSpanCells.isEmpty()) | 953 if (!rowSpanCells.isEmpty()) |
| 928 distributeRowSpanHeightToRows(rowSpanCells); | 954 distributeRowSpanHeightToRows(rowSpanCells); |
| 929 | 955 |
| 930 ASSERT(!needsLayout()); | 956 ASSERT(!needsLayout()); |
| 931 | 957 |
| (...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1967 unsigned rowIndex = rowObject.rowIndex(); | 1993 unsigned rowIndex = rowObject.rowIndex(); |
| 1968 DCHECK(rowIndex < m_grid.size()); | 1994 DCHECK(rowIndex < m_grid.size()); |
| 1969 int logicalHeight = 0; | 1995 int logicalHeight = 0; |
| 1970 const Row& row = m_grid[rowIndex].row; | 1996 const Row& row = m_grid[rowIndex].row; |
| 1971 unsigned cols = row.size(); | 1997 unsigned cols = row.size(); |
| 1972 for (unsigned colIndex = 0; colIndex < cols; colIndex++) { | 1998 for (unsigned colIndex = 0; colIndex < cols; colIndex++) { |
| 1973 const CellStruct& cellStruct = cellAt(rowIndex, colIndex); | 1999 const CellStruct& cellStruct = cellAt(rowIndex, colIndex); |
| 1974 const LayoutTableCell* cell = cellStruct.primaryCell(); | 2000 const LayoutTableCell* cell = cellStruct.primaryCell(); |
| 1975 if (!cell || cellStruct.inColSpan) | 2001 if (!cell || cellStruct.inColSpan) |
| 1976 continue; | 2002 continue; |
| 1977 // TODO(mstensho): Rowspanned cells also need to contribute to row heights | 2003 unsigned rowSpan = cell->rowSpan(); |
| 1978 // during the first layout pass, in order to get fragmentation right. | 2004 if (rowSpan == 1) { |
| 1979 if (cell->rowSpan() == 1) { | |
| 1980 logicalHeight = | 2005 logicalHeight = |
| 1981 std::max(logicalHeight, cell->logicalHeightForRowSizing()); | 2006 std::max(logicalHeight, cell->logicalHeightForRowSizing()); |
| 2007 continue; | |
| 2008 } | |
| 2009 unsigned rowIndexForCell = cell->rowIndex(); | |
| 2010 if (rowIndex == m_grid.size() - 1 || | |
| 2011 (rowSpan > 1 && rowIndex - rowIndexForCell == rowSpan - 1)) { | |
| 2012 // This is the last row of the rowspanned cell. Add extra height if | |
| 2013 // needed. | |
| 2014 if (LayoutTableRow* firstRowForCell = | |
| 2015 m_grid[rowIndexForCell].rowLayoutObject) { | |
| 2016 int rowLogicalTop = rowObject.logicalTop().round(); | |
| 2017 | |
| 2018 int minLogicalHeight = cell->logicalHeightForRowSizing(); | |
| 2019 // Subtract space provided by previous rows. | |
| 2020 minLogicalHeight -= | |
| 2021 rowLogicalTop - firstRowForCell->logicalTop().toInt(); | |
|
eae
2016/10/20 16:53:58
Above you round the logicalTop and here you floor
mstensho (USE GERRIT)
2016/10/20 19:05:56
Better use toInt() everywhere, unless there are go
| |
| 2022 | |
| 2023 logicalHeight = std::max(logicalHeight, minLogicalHeight); | |
| 2024 } | |
| 1982 } | 2025 } |
| 1983 } | 2026 } |
| 1984 | 2027 |
| 1985 if (m_grid[rowIndex].logicalHeight.isSpecified()) { | 2028 if (m_grid[rowIndex].logicalHeight.isSpecified()) { |
| 1986 LayoutUnit specifiedLogicalHeight = | 2029 LayoutUnit specifiedLogicalHeight = |
| 1987 minimumValueForLength(m_grid[rowIndex].logicalHeight, LayoutUnit()); | 2030 minimumValueForLength(m_grid[rowIndex].logicalHeight, LayoutUnit()); |
| 1988 logicalHeight = std::max(logicalHeight, specifiedLogicalHeight.toInt()); | 2031 logicalHeight = std::max(logicalHeight, specifiedLogicalHeight.toInt()); |
| 1989 } | 2032 } |
| 1990 return logicalHeight; | 2033 return logicalHeight; |
| 1991 } | 2034 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2074 // the header in all columns. | 2117 // the header in all columns. |
| 2075 // Note that this is in flow thread coordinates, not visual coordinates. The | 2118 // Note that this is in flow thread coordinates, not visual coordinates. The |
| 2076 // enclosing LayoutFlowThread will convert to visual coordinates. | 2119 // enclosing LayoutFlowThread will convert to visual coordinates. |
| 2077 if (table()->header() == this && isRepeatingHeaderGroup()) | 2120 if (table()->header() == this && isRepeatingHeaderGroup()) |
| 2078 rect.setHeight(table()->logicalHeight()); | 2121 rect.setHeight(table()->logicalHeight()); |
| 2079 return LayoutTableBoxComponent::mapToVisualRectInAncestorSpace(ancestor, rect, | 2122 return LayoutTableBoxComponent::mapToVisualRectInAncestorSpace(ancestor, rect, |
| 2080 flags); | 2123 flags); |
| 2081 } | 2124 } |
| 2082 | 2125 |
| 2083 } // namespace blink | 2126 } // namespace blink |
| OLD | NEW |