// the computed bsize for the cell, which descendants use for percent bsize calculations // it is the bsize (minus border, padding) of the cell's first in flow during its final // reflow without an unconstrained bsize. static nscoord CalcUnpaginatedBSize(nsPresContext* aPresContext, nsTableCellFrame& aCellFrame, nsTableFrame& aTableFrame, nscoord aBlockDirBorderPadding) { const nsTableCellFrame* firstCellInFlow = static_cast<nsTableCellFrame*>(aCellFrame.FirstInFlow()); nsTableFrame* firstTableInFlow = static_cast<nsTableFrame*>(aTableFrame.FirstInFlow()); nsTableRowFrame* row = static_cast<nsTableRowFrame*>(firstCellInFlow->GetParent()); nsTableRowGroupFrame* firstRGInFlow = static_cast<nsTableRowGroupFrame*>(row->GetParent()); int32_t rowIndex; firstCellInFlow->GetRowIndex(rowIndex); int32_t rowSpan = aTableFrame.GetEffectiveRowSpan(*firstCellInFlow); nscoord computedBSize = firstTableInFlow->GetRowSpacing(rowIndex, rowIndex + rowSpan - 1); computedBSize -= aBlockDirBorderPadding; int32_t rowX; for (row = firstRGInFlow->GetFirstRow(), rowX = 0; row; row = row->GetNextRow(), rowX++) { if (rowX > rowIndex + rowSpan - 1) { break; } else if (rowX >= rowIndex) { computedBSize += row->GetUnpaginatedBSize(aPresContext); } } return computedBSize; }
// the computed height for the cell, which descendants use for percent height calculations // it is the height (minus border, padding) of the cell's first in flow during its final // reflow without an unconstrained height. static nscoord CalcUnpaginagedHeight(nsPresContext* aPresContext, nsTableCellFrame& aCellFrame, nsTableFrame& aTableFrame, nscoord aVerticalBorderPadding) { const nsTableCellFrame* firstCellInFlow = static_cast<nsTableCellFrame*>(aCellFrame.FirstInFlow()); nsTableFrame* firstTableInFlow = static_cast<nsTableFrame*>(aTableFrame.FirstInFlow()); nsTableRowFrame* row = static_cast<nsTableRowFrame*>(firstCellInFlow->GetParent()); nsTableRowGroupFrame* firstRGInFlow = static_cast<nsTableRowGroupFrame*>(row->GetParent()); int32_t rowIndex; firstCellInFlow->GetRowIndex(rowIndex); int32_t rowSpan = aTableFrame.GetEffectiveRowSpan(*firstCellInFlow); nscoord cellSpacing = firstTableInFlow->GetCellSpacingX(); nscoord computedHeight = ((rowSpan - 1) * cellSpacing) - aVerticalBorderPadding; int32_t rowX; for (row = firstRGInFlow->GetFirstRow(), rowX = 0; row; row = row->GetNextRow(), rowX++) { if (rowX > rowIndex + rowSpan - 1) { break; } else if (rowX >= rowIndex) { computedHeight += row->GetUnpaginatedHeight(aPresContext); } } return computedHeight; }