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

Unified Diff: third_party/WebKit/Source/core/paint/TableRowPainter.cpp

Issue 2786463004: Paint backgrounds of a table section/row in one display item (Closed)
Patch Set: - Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/paint/TableRowPainter.cpp
diff --git a/third_party/WebKit/Source/core/paint/TableRowPainter.cpp b/third_party/WebKit/Source/core/paint/TableRowPainter.cpp
index cada3bcffac6db71fdbbf0ae0fca539d43727125..f08d3d1e21cf0837d70c3c1d6af1f9b342de823a 100644
--- a/third_party/WebKit/Source/core/paint/TableRowPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/TableRowPainter.cpp
@@ -26,23 +26,21 @@ void TableRowPainter::paint(const PaintInfo& paintInfo,
if (paintInfo.phase == PaintPhaseSelfOutlineOnly)
return;
- PaintInfo paintInfoForCells = paintInfo.forDescendants();
if (shouldPaintSelfBlockBackground(paintInfo.phase)) {
- paintBoxShadow(paintInfo, paintOffset, Normal);
- if (m_layoutTableRow.styleRef().hasBackground()) {
- // Paint row background of behind the cells.
- for (LayoutTableCell* cell = m_layoutTableRow.firstCell(); cell;
- cell = cell->nextCell())
- TableCellPainter(*cell).paintContainerBackgroundBehindCell(
- paintInfoForCells, paintOffset, m_layoutTableRow,
- DisplayItem::kTableCellBackgroundFromRow);
- }
- paintBoxShadow(paintInfo, paintOffset, Inset);
+ const auto* section = m_layoutTableRow.section();
+ LayoutRect cullRect = LayoutRect(paintInfo.cullRect().m_rect);
+ cullRect.moveBy(m_layoutTableRow.physicalLocation(section));
+ LayoutRect logicalRectInSection =
+ section->logicalRectForWritingModeAndDirection(cullRect);
+ CellSpan dirtiedColumns =
+ section->dirtiedEffectiveColumns(logicalRectInSection);
+ paintBoxDecorationBackground(paintInfo, paintOffset, dirtiedColumns);
}
if (paintInfo.phase == PaintPhaseSelfBlockBackgroundOnly)
return;
+ PaintInfo paintInfoForCells = paintInfo.forDescendants();
for (LayoutTableCell* cell = m_layoutTableRow.firstCell(); cell;
cell = cell->nextCell()) {
if (!cell->hasSelfPaintingLayer())
@@ -57,18 +55,26 @@ void TableRowPainter::paintOutline(const PaintInfo& paintInfo,
ObjectPainter(m_layoutTableRow).paintOutline(paintInfo, adjustedPaintOffset);
}
-void TableRowPainter::paintBoxShadow(const PaintInfo& paintInfo,
- const LayoutPoint& paintOffset,
- ShadowStyle shadowStyle) {
- DCHECK(shouldPaintSelfBlockBackground(paintInfo.phase));
- if (!m_layoutTableRow.styleRef().boxShadow())
+void TableRowPainter::paintBoxDecorationBackground(
+ const PaintInfo& paintInfo,
+ const LayoutPoint& paintOffset,
+ const CellSpan& dirtiedColumns) {
+ bool hasBackground = m_layoutTableRow.styleRef().hasBackground();
+ bool hasBoxShadow = m_layoutTableRow.styleRef().boxShadow();
+ if (!hasBackground && !hasBoxShadow)
return;
- DisplayItem::Type type = shadowStyle == Normal
- ? DisplayItem::kTableRowBoxShadowNormal
- : DisplayItem::kTableRowBoxShadowInset;
+ const auto* section = m_layoutTableRow.section();
+ PaintResult paintResult =
+ dirtiedColumns == section->fullTableEffectiveColumnSpan()
+ ? FullyPainted
+ : MayBeClippedByPaintDirtyRect;
+ m_layoutTableRow.getMutableForPainting().updatePaintResult(
+ paintResult, paintInfo.cullRect());
+
if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(
- paintInfo.context, m_layoutTableRow, type))
+ paintInfo.context, m_layoutTableRow,
+ DisplayItem::kBoxDecorationBackground))
return;
LayoutPoint adjustedPaintOffset = paintOffset + m_layoutTableRow.location();
@@ -76,12 +82,25 @@ void TableRowPainter::paintBoxShadow(const PaintInfo& paintInfo,
BoxPainter(m_layoutTableRow)
.boundsForDrawingRecorder(paintInfo, adjustedPaintOffset);
LayoutObjectDrawingRecorder recorder(paintInfo.context, m_layoutTableRow,
- type, bounds);
+ DisplayItem::kBoxDecorationBackground,
+ bounds);
LayoutRect paintRect(adjustedPaintOffset, m_layoutTableRow.size());
- if (shadowStyle == Normal) {
+
+ if (hasBoxShadow) {
BoxPainter::paintNormalBoxShadow(paintInfo, paintRect,
m_layoutTableRow.styleRef());
- } else {
+ }
+
+ if (hasBackground) {
+ PaintInfo paintInfoForCells = paintInfo.forDescendants();
+ for (auto c = dirtiedColumns.start(); c < dirtiedColumns.end(); c++) {
+ if (const auto* cell =
+ section->originatingCellAt(m_layoutTableRow.rowIndex(), c))
+ paintBackgroundBehindCell(*cell, paintInfoForCells, paintOffset);
+ }
+ }
+
+ if (hasBoxShadow) {
// TODO(wangxianzhu): Calculate the inset shadow bounds by insetting
// paintRect by half widths of collapsed borders.
BoxPainter::paintInsetBoxShadow(paintInfo, paintRect,
@@ -93,14 +112,17 @@ void TableRowPainter::paintBackgroundBehindCell(
const LayoutTableCell& cell,
const PaintInfo& paintInfo,
const LayoutPoint& paintOffset) {
- DCHECK(m_layoutTableRow.styleRef().hasBackground() &&
- !m_layoutTableRow.hasSelfPaintingLayer());
- LayoutPoint cellPoint =
- m_layoutTableRow.section()->flipForWritingModeForChild(&cell,
- paintOffset);
+ DCHECK(m_layoutTableRow.styleRef().hasBackground());
+ LayoutPoint cellPoint = paintOffset;
+ // If the row is self painting, paintOffset is in row's coordinates, so
+ // doesn't need to flip in section's blocks direction. A row doesn't have
+ // flipped blocks direction.
+ if (!m_layoutTableRow.hasSelfPaintingLayer()) {
+ cellPoint = m_layoutTableRow.section()->flipForWritingModeForChild(
+ &cell, cellPoint);
+ }
TableCellPainter(cell).paintContainerBackgroundBehindCell(
- paintInfo, cellPoint, m_layoutTableRow,
- DisplayItem::kTableCellBackgroundFromRow);
+ paintInfo, cellPoint, m_layoutTableRow);
}
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/paint/TableRowPainter.h ('k') | third_party/WebKit/Source/core/paint/TableSectionPainter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698