Index: third_party/WebKit/Source/core/paint/TableSectionPainter.cpp |
diff --git a/third_party/WebKit/Source/core/paint/TableSectionPainter.cpp b/third_party/WebKit/Source/core/paint/TableSectionPainter.cpp |
index e348496498c32d2cae0c4eeea0f1d30f0d812b3b..8065aa7dc27dece2724469983c99d2b062265a87 100644 |
--- a/third_party/WebKit/Source/core/paint/TableSectionPainter.cpp |
+++ b/third_party/WebKit/Source/core/paint/TableSectionPainter.cpp |
@@ -8,6 +8,8 @@ |
#include "core/layout/LayoutTableCol.h" |
#include "core/layout/LayoutTableRow.h" |
#include "core/paint/BoxClipper.h" |
+#include "core/paint/BoxPainter.h" |
+#include "core/paint/LayoutObjectDrawingRecorder.h" |
#include "core/paint/ObjectPainter.h" |
#include "core/paint/PaintInfo.h" |
#include "core/paint/TableCellPainter.h" |
@@ -125,12 +127,14 @@ void TableSectionPainter::paintObject(const PaintInfo& paintInfo, const LayoutPo |
PaintInfo paintInfoForDescendants = paintInfo.forDescendants(); |
if (shouldPaintSelfBlockBackground(paintInfo.phase)) { |
+ paintBoxShadow(paintInfo, paintOffset, Normal); |
for (unsigned r = dirtiedRows.start(); r < dirtiedRows.end(); r++) { |
for (unsigned c = dirtiedColumns.start(); c < dirtiedColumns.end(); c++) { |
if (const LayoutTableCell* cell = primaryCellToPaint(r, c, dirtiedRows, dirtiedColumns)) |
paintBackgroundsBehindCell(*cell, paintInfoForDescendants, paintOffset); |
} |
} |
+ paintBoxShadow(paintInfo, paintOffset, Inset); |
} |
if (paintInfo.phase == PaintPhaseSelfBlockBackgroundOnly) |
@@ -140,14 +144,18 @@ void TableSectionPainter::paintObject(const PaintInfo& paintInfo, const LayoutPo |
for (unsigned r = dirtiedRows.start(); r < dirtiedRows.end(); r++) { |
const LayoutTableRow* row = m_layoutTableSection.rowLayoutObjectAt(r); |
// If a row has a layer, we'll paint row background in TableRowPainter. |
- if (!row || row->hasSelfPaintingLayer() || !row->hasBackground()) |
+ if (!row || row->hasSelfPaintingLayer()) |
continue; |
TableRowPainter rowPainter(*row); |
- for (unsigned c = dirtiedColumns.start(); c < dirtiedColumns.end(); c++) { |
- if (const LayoutTableCell* cell = primaryCellToPaint(r, c, dirtiedRows, dirtiedColumns)) |
- rowPainter.paintBackgroundBehindCell(*cell, paintInfoForDescendants, paintOffset); |
+ rowPainter.paintBoxShadow(paintInfoForDescendants, paintOffset, Normal); |
+ if (row->hasBackground()) { |
+ for (unsigned c = dirtiedColumns.start(); c < dirtiedColumns.end(); c++) { |
+ if (const LayoutTableCell* cell = primaryCellToPaint(r, c, dirtiedRows, dirtiedColumns)) |
+ rowPainter.paintBackgroundBehindCell(*cell, paintInfoForDescendants, paintOffset); |
+ } |
} |
+ rowPainter.paintBoxShadow(paintInfoForDescendants, paintOffset, Inset); |
} |
} |
@@ -237,4 +245,19 @@ void TableSectionPainter::paintCell(const LayoutTableCell& cell, const PaintInfo |
} |
} |
+void TableSectionPainter::paintBoxShadow(const PaintInfo& paintInfo, const LayoutPoint& paintOffset, ShadowStyle shadowStyle) |
+{ |
+ DCHECK(shouldPaintSelfBlockBackground(paintInfo.phase)); |
+ if (!m_layoutTableSection.styleRef().boxShadow()) |
+ return; |
+ |
+ DisplayItem::Type type = shadowStyle == Normal ? DisplayItem::TableSectionBoxShadowNormal : DisplayItem::TableSectionBoxShadowInset; |
+ if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfo.context, m_layoutTableSection, type)) |
+ return; |
+ |
+ LayoutRect bounds = BoxPainter(m_layoutTableSection).boundsForDrawingRecorder(paintOffset); |
+ LayoutObjectDrawingRecorder recorder(paintInfo.context, m_layoutTableSection, type, bounds); |
+ BoxPainter::paintBoxShadow(paintInfo, LayoutRect(paintOffset, m_layoutTableSection.size()), m_layoutTableSection.styleRef(), shadowStyle); |
+} |
+ |
} // namespace blink |