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

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

Issue 2423403002: Set logical top and height of table rows and cells in the first layout pass. (Closed)
Patch Set: Created 4 years, 2 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
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutTableSection.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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, 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 925 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 ASSERT(!table()->needsSectionRecalc()); 936 ASSERT(!table()->needsSectionRecalc());
937 937
938 // addChild may over-grow m_grid but we don't want to throw away the memory 938 // addChild may over-grow m_grid but we don't want to throw away the memory
939 // too early as addChild can be called in a loop (e.g during parsing). Doing 939 // too early as addChild can be called in a loop (e.g during parsing). Doing
940 // it now ensures we have a stable-enough structure. 940 // it now ensures we have a stable-enough structure.
941 m_grid.shrinkToFit(); 941 m_grid.shrinkToFit();
942 942
943 LayoutState state(*this, locationOffset()); 943 LayoutState state(*this, locationOffset());
944 944
945 const Vector<int>& columnPos = table()->effectiveColumnPositions(); 945 const Vector<int>& columnPos = table()->effectiveColumnPositions();
946 LayoutUnit rowLogicalTop;
946 947
947 SubtreeLayoutScope layouter(*this); 948 SubtreeLayoutScope layouter(*this);
948 for (unsigned r = 0; r < m_grid.size(); ++r) { 949 for (unsigned r = 0; r < m_grid.size(); ++r) {
949 Row& row = m_grid[r].row; 950 Row& row = m_grid[r].row;
950 unsigned cols = row.size(); 951 unsigned cols = row.size();
951 // First, propagate our table layout's information to the cells. This will 952 // First, propagate our table layout's information to the cells. This will
952 // mark the row as needing layout if there was a column logical width 953 // mark the row as needing layout if there was a column logical width
953 // change. 954 // change.
954 for (unsigned startColumn = 0; startColumn < cols; ++startColumn) { 955 for (unsigned startColumn = 0; startColumn < cols; ++startColumn) {
955 CellStruct& current = row[startColumn]; 956 CellStruct& current = row[startColumn];
956 LayoutTableCell* cell = current.primaryCell(); 957 LayoutTableCell* cell = current.primaryCell();
957 if (!cell || current.inColSpan) 958 if (!cell || current.inColSpan)
958 continue; 959 continue;
959 960
960 unsigned endCol = startColumn; 961 unsigned endCol = startColumn;
961 unsigned cspan = cell->colSpan(); 962 unsigned cspan = cell->colSpan();
962 while (cspan && endCol < cols) { 963 while (cspan && endCol < cols) {
963 ASSERT(endCol < table()->effectiveColumns().size()); 964 ASSERT(endCol < table()->effectiveColumns().size());
964 cspan -= table()->effectiveColumns()[endCol].span; 965 cspan -= table()->effectiveColumns()[endCol].span;
965 endCol++; 966 endCol++;
966 } 967 }
967 int tableLayoutLogicalWidth = columnPos[endCol] - columnPos[startColumn] - 968 int tableLayoutLogicalWidth = columnPos[endCol] - columnPos[startColumn] -
968 table()->hBorderSpacing(); 969 table()->hBorderSpacing();
969 cell->setCellLogicalWidth(tableLayoutLogicalWidth, layouter); 970 cell->setCellLogicalWidth(tableLayoutLogicalWidth, layouter);
970 } 971 }
971 972
972 if (LayoutTableRow* rowLayoutObject = m_grid[r].rowLayoutObject) { 973 if (LayoutTableRow* rowLayoutObject = m_grid[r].rowLayoutObject) {
973 if (!rowLayoutObject->needsLayout()) 974 if (state.isPaginated()) {
974 markChildForPaginationRelayoutIfNeeded(*rowLayoutObject, layouter); 975 rowLayoutObject->setLogicalTop(rowLogicalTop);
976 if (!rowLayoutObject->needsLayout())
977 markChildForPaginationRelayoutIfNeeded(*rowLayoutObject, layouter);
978 }
975 rowLayoutObject->layoutIfNeeded(); 979 rowLayoutObject->layoutIfNeeded();
980 if (state.isPaginated()) {
981 rowLayoutObject->setLogicalHeight(
982 LayoutUnit(logicalHeightForRow(*rowLayoutObject)));
983 rowLogicalTop = rowLayoutObject->logicalBottom();
984 rowLogicalTop += LayoutUnit(table()->vBorderSpacing());
985 }
976 } 986 }
977 } 987 }
978 988
979 clearNeedsLayout(); 989 clearNeedsLayout();
980 } 990 }
981 991
982 void LayoutTableSection::distributeExtraLogicalHeightToPercentRows( 992 void LayoutTableSection::distributeExtraLogicalHeightToPercentRows(
983 int& extraLogicalHeight, 993 int& extraLogicalHeight,
984 int totalPercent) { 994 int totalPercent) {
985 if (!totalPercent) 995 if (!totalPercent)
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after
1968 1978
1969 // If the baseline moved, we may have to update the data for our row. Find 1979 // If the baseline moved, we may have to update the data for our row. Find
1970 // out the new baseline. 1980 // out the new baseline.
1971 if (cell.isBaselineAligned()) { 1981 if (cell.isBaselineAligned()) {
1972 int baseline = cell.cellBaselinePosition(); 1982 int baseline = cell.cellBaselinePosition();
1973 if (baseline > cell.borderBefore() + cell.paddingBefore()) 1983 if (baseline > cell.borderBefore() + cell.paddingBefore())
1974 m_grid[rowIndex].baseline = std::max(m_grid[rowIndex].baseline, baseline); 1984 m_grid[rowIndex].baseline = std::max(m_grid[rowIndex].baseline, baseline);
1975 } 1985 }
1976 } 1986 }
1977 1987
1988 int LayoutTableSection::logicalHeightForRow(
1989 const LayoutTableRow& rowObject) const {
1990 unsigned rowIndex = rowObject.rowIndex();
1991 int logicalHeight = 0;
1992 const Row& row = m_grid[rowIndex].row;
1993 unsigned cols = row.size();
1994 for (unsigned colIndex = 0; colIndex < cols; colIndex++) {
1995 const CellStruct& cellStruct = cellAt(rowIndex, colIndex);
1996 const LayoutTableCell* cell = cellStruct.primaryCell();
1997 if (!cell || cellStruct.inColSpan)
1998 continue;
1999 // TODO(mstensho): Rowspanned cells also need to contribute to row heights
2000 // during the first layout pass, in order to get fragmentation right.
2001 if (cell->rowSpan() == 1) {
2002 logicalHeight =
2003 std::max(logicalHeight, cell->logicalHeightForRowSizing());
2004 }
2005 }
2006 return logicalHeight;
2007 }
2008
1978 bool LayoutTableSection::isRepeatingHeaderGroup() const { 2009 bool LayoutTableSection::isRepeatingHeaderGroup() const {
1979 if (getPaginationBreakability() == LayoutBox::AllowAnyBreaks) 2010 if (getPaginationBreakability() == LayoutBox::AllowAnyBreaks)
1980 return false; 2011 return false;
1981 // TODO(rhogan): Should we paint a header repeatedly if it's self-painting? 2012 // TODO(rhogan): Should we paint a header repeatedly if it's self-painting?
1982 if (hasSelfPaintingLayer()) 2013 if (hasSelfPaintingLayer())
1983 return false; 2014 return false;
1984 LayoutUnit pageHeight = table()->pageLogicalHeightForOffset(LayoutUnit()); 2015 LayoutUnit pageHeight = table()->pageLogicalHeightForOffset(LayoutUnit());
1985 if (!pageHeight) 2016 if (!pageHeight)
1986 return false; 2017 return false;
1987 2018
(...skipping 23 matching lines...) Expand all
2011 // the header in all columns. 2042 // the header in all columns.
2012 // Note that this is in flow thread coordinates, not visual coordinates. The 2043 // Note that this is in flow thread coordinates, not visual coordinates. The
2013 // enclosing LayoutFlowThread will convert to visual coordinates. 2044 // enclosing LayoutFlowThread will convert to visual coordinates.
2014 if (table()->header() == this && isRepeatingHeaderGroup()) 2045 if (table()->header() == this && isRepeatingHeaderGroup())
2015 rect.setHeight(table()->logicalHeight()); 2046 rect.setHeight(table()->logicalHeight());
2016 return LayoutTableBoxComponent::mapToVisualRectInAncestorSpace(ancestor, rect, 2047 return LayoutTableBoxComponent::mapToVisualRectInAncestorSpace(ancestor, rect,
2017 flags); 2048 flags);
2018 } 2049 }
2019 2050
2020 } // namespace blink 2051 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutTableSection.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698