OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/paint/TableSectionPainter.h" | 5 #include "core/paint/TableSectionPainter.h" |
6 | 6 |
7 #include "core/layout/LayoutTableCell.h" | 7 #include "core/layout/LayoutTableCell.h" |
8 #include "core/layout/LayoutTableCol.h" | 8 #include "core/layout/LayoutTableCol.h" |
9 #include "core/layout/LayoutTableRow.h" | 9 #include "core/layout/LayoutTableRow.h" |
10 #include "core/paint/BoxClipper.h" | 10 #include "core/paint/BoxClipper.h" |
| 11 #include "core/paint/BoxPainter.h" |
| 12 #include "core/paint/LayoutObjectDrawingRecorder.h" |
11 #include "core/paint/ObjectPainter.h" | 13 #include "core/paint/ObjectPainter.h" |
12 #include "core/paint/PaintInfo.h" | 14 #include "core/paint/PaintInfo.h" |
13 #include "core/paint/TableCellPainter.h" | 15 #include "core/paint/TableCellPainter.h" |
14 #include "core/paint/TableRowPainter.h" | 16 #include "core/paint/TableRowPainter.h" |
15 #include <algorithm> | 17 #include <algorithm> |
16 | 18 |
17 namespace blink { | 19 namespace blink { |
18 | 20 |
19 inline const LayoutTableCell* TableSectionPainter::primaryCellToPaint(unsigned r
ow, unsigned column, const CellSpan& dirtiedRows, const CellSpan& dirtiedColumns
) const | 21 inline const LayoutTableCell* TableSectionPainter::primaryCellToPaint(unsigned r
ow, unsigned column, const CellSpan& dirtiedRows, const CellSpan& dirtiedColumns
) const |
20 { | 22 { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 | 120 |
119 CellSpan dirtiedRows = m_layoutTableSection.dirtiedRows(tableAlignedRect); | 121 CellSpan dirtiedRows = m_layoutTableSection.dirtiedRows(tableAlignedRect); |
120 CellSpan dirtiedColumns = m_layoutTableSection.dirtiedEffectiveColumns(table
AlignedRect); | 122 CellSpan dirtiedColumns = m_layoutTableSection.dirtiedEffectiveColumns(table
AlignedRect); |
121 | 123 |
122 if (dirtiedColumns.start() >= dirtiedColumns.end()) | 124 if (dirtiedColumns.start() >= dirtiedColumns.end()) |
123 return; | 125 return; |
124 | 126 |
125 PaintInfo paintInfoForDescendants = paintInfo.forDescendants(); | 127 PaintInfo paintInfoForDescendants = paintInfo.forDescendants(); |
126 | 128 |
127 if (shouldPaintSelfBlockBackground(paintInfo.phase)) { | 129 if (shouldPaintSelfBlockBackground(paintInfo.phase)) { |
| 130 paintBoxShadow(paintInfo, paintOffset, Normal); |
128 for (unsigned r = dirtiedRows.start(); r < dirtiedRows.end(); r++) { | 131 for (unsigned r = dirtiedRows.start(); r < dirtiedRows.end(); r++) { |
129 for (unsigned c = dirtiedColumns.start(); c < dirtiedColumns.end();
c++) { | 132 for (unsigned c = dirtiedColumns.start(); c < dirtiedColumns.end();
c++) { |
130 if (const LayoutTableCell* cell = primaryCellToPaint(r, c, dirti
edRows, dirtiedColumns)) | 133 if (const LayoutTableCell* cell = primaryCellToPaint(r, c, dirti
edRows, dirtiedColumns)) |
131 paintBackgroundsBehindCell(*cell, paintInfoForDescendants, p
aintOffset); | 134 paintBackgroundsBehindCell(*cell, paintInfoForDescendants, p
aintOffset); |
132 } | 135 } |
133 } | 136 } |
| 137 paintBoxShadow(paintInfo, paintOffset, Inset); |
134 } | 138 } |
135 | 139 |
136 if (paintInfo.phase == PaintPhaseSelfBlockBackgroundOnly) | 140 if (paintInfo.phase == PaintPhaseSelfBlockBackgroundOnly) |
137 return; | 141 return; |
138 | 142 |
139 if (shouldPaintDescendantBlockBackgrounds(paintInfo.phase)) { | 143 if (shouldPaintDescendantBlockBackgrounds(paintInfo.phase)) { |
140 for (unsigned r = dirtiedRows.start(); r < dirtiedRows.end(); r++) { | 144 for (unsigned r = dirtiedRows.start(); r < dirtiedRows.end(); r++) { |
141 const LayoutTableRow* row = m_layoutTableSection.rowLayoutObjectAt(r
); | 145 const LayoutTableRow* row = m_layoutTableSection.rowLayoutObjectAt(r
); |
142 // If a row has a layer, we'll paint row background in TableRowPaint
er. | 146 // If a row has a layer, we'll paint row background in TableRowPaint
er. |
143 if (!row || row->hasSelfPaintingLayer() || !row->hasBackground()) | 147 if (!row || row->hasSelfPaintingLayer()) |
144 continue; | 148 continue; |
145 | 149 |
146 TableRowPainter rowPainter(*row); | 150 TableRowPainter rowPainter(*row); |
147 for (unsigned c = dirtiedColumns.start(); c < dirtiedColumns.end();
c++) { | 151 rowPainter.paintBoxShadow(paintInfoForDescendants, paintOffset, Norm
al); |
148 if (const LayoutTableCell* cell = primaryCellToPaint(r, c, dirti
edRows, dirtiedColumns)) | 152 if (row->hasBackground()) { |
149 rowPainter.paintBackgroundBehindCell(*cell, paintInfoForDesc
endants, paintOffset); | 153 for (unsigned c = dirtiedColumns.start(); c < dirtiedColumns.end
(); c++) { |
| 154 if (const LayoutTableCell* cell = primaryCellToPaint(r, c, d
irtiedRows, dirtiedColumns)) |
| 155 rowPainter.paintBackgroundBehindCell(*cell, paintInfoFor
Descendants, paintOffset); |
| 156 } |
150 } | 157 } |
| 158 rowPainter.paintBoxShadow(paintInfoForDescendants, paintOffset, Inse
t); |
151 } | 159 } |
152 } | 160 } |
153 | 161 |
154 const HashSet<LayoutTableCell*>& overflowingCells = m_layoutTableSection.ove
rflowingCells(); | 162 const HashSet<LayoutTableCell*>& overflowingCells = m_layoutTableSection.ove
rflowingCells(); |
155 if (!m_layoutTableSection.hasMultipleCellLevels() && overflowingCells.isEmpt
y()) { | 163 if (!m_layoutTableSection.hasMultipleCellLevels() && overflowingCells.isEmpt
y()) { |
156 for (unsigned r = dirtiedRows.start(); r < dirtiedRows.end(); r++) { | 164 for (unsigned r = dirtiedRows.start(); r < dirtiedRows.end(); r++) { |
157 const LayoutTableRow* row = m_layoutTableSection.rowLayoutObjectAt(r
); | 165 const LayoutTableRow* row = m_layoutTableSection.rowLayoutObjectAt(r
); |
158 // TODO(crbug.com/577282): This painting order is inconsistent with
other outlines. | 166 // TODO(crbug.com/577282): This painting order is inconsistent with
other outlines. |
159 if (row && !row->hasSelfPaintingLayer() && shouldPaintSelfOutline(pa
intInfoForDescendants.phase)) | 167 if (row && !row->hasSelfPaintingLayer() && shouldPaintSelfOutline(pa
intInfoForDescendants.phase)) |
160 TableRowPainter(*row).paintOutline(paintInfoForDescendants, pain
tOffset); | 168 TableRowPainter(*row).paintOutline(paintInfoForDescendants, pain
tOffset); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 } | 238 } |
231 | 239 |
232 void TableSectionPainter::paintCell(const LayoutTableCell& cell, const PaintInfo
& paintInfoForCells, const LayoutPoint& paintOffset) | 240 void TableSectionPainter::paintCell(const LayoutTableCell& cell, const PaintInfo
& paintInfoForCells, const LayoutPoint& paintOffset) |
233 { | 241 { |
234 if (!cell.hasSelfPaintingLayer() && !cell.row()->hasSelfPaintingLayer()) { | 242 if (!cell.hasSelfPaintingLayer() && !cell.row()->hasSelfPaintingLayer()) { |
235 LayoutPoint cellPoint = m_layoutTableSection.flipForWritingModeForChild(
&cell, paintOffset); | 243 LayoutPoint cellPoint = m_layoutTableSection.flipForWritingModeForChild(
&cell, paintOffset); |
236 cell.paint(paintInfoForCells, cellPoint); | 244 cell.paint(paintInfoForCells, cellPoint); |
237 } | 245 } |
238 } | 246 } |
239 | 247 |
| 248 void TableSectionPainter::paintBoxShadow(const PaintInfo& paintInfo, const Layou
tPoint& paintOffset, ShadowStyle shadowStyle) |
| 249 { |
| 250 DCHECK(shouldPaintSelfBlockBackground(paintInfo.phase)); |
| 251 if (!m_layoutTableSection.styleRef().boxShadow()) |
| 252 return; |
| 253 |
| 254 DisplayItem::Type type = shadowStyle == Normal ? DisplayItem::TableSectionBo
xShadowNormal : DisplayItem::TableSectionBoxShadowInset; |
| 255 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfo.contex
t, m_layoutTableSection, type)) |
| 256 return; |
| 257 |
| 258 LayoutRect bounds = BoxPainter(m_layoutTableSection).boundsForDrawingRecorde
r(paintOffset); |
| 259 LayoutObjectDrawingRecorder recorder(paintInfo.context, m_layoutTableSection
, type, bounds); |
| 260 BoxPainter::paintBoxShadow(paintInfo, LayoutRect(paintOffset, m_layoutTableS
ection.size()), m_layoutTableSection.styleRef(), shadowStyle); |
| 261 } |
| 262 |
240 } // namespace blink | 263 } // namespace blink |
OLD | NEW |