Chromium Code Reviews| Index: third_party/WebKit/Source/core/paint/TableCellPainter.cpp |
| diff --git a/third_party/WebKit/Source/core/paint/TableCellPainter.cpp b/third_party/WebKit/Source/core/paint/TableCellPainter.cpp |
| index ec772402c33a84df07a352337fdd93e55a06a8e5..737c388cf4c5fe180728e07a0e62fdae7e2818cc 100644 |
| --- a/third_party/WebKit/Source/core/paint/TableCellPainter.cpp |
| +++ b/third_party/WebKit/Source/core/paint/TableCellPainter.cpp |
| @@ -11,45 +11,49 @@ |
| #include "core/paint/ObjectPainter.h" |
| #include "core/paint/PaintInfo.h" |
| #include "platform/graphics/GraphicsContextStateSaver.h" |
| +#include "platform/graphics/paint/DisplayItemCacheSkipper.h" |
| +#include "platform/graphics/paint/DrawingRecorder.h" |
| namespace blink { |
| static const CollapsedBorderValue& collapsedLeftBorder( |
| const ComputedStyle& styleForCellFlow, |
| const LayoutTableCell::CollapsedBorderValues& values) { |
| - if (styleForCellFlow.isHorizontalWritingMode()) |
| - return styleForCellFlow.isLeftToRightDirection() ? values.startBorder |
| - : values.endBorder; |
| - return styleForCellFlow.isFlippedBlocksWritingMode() ? values.afterBorder |
| - : values.beforeBorder; |
| + if (styleForCellFlow.isHorizontalWritingMode()) { |
| + return styleForCellFlow.isLeftToRightDirection() ? values.startBorder() |
| + : values.endBorder(); |
| + } |
| + return styleForCellFlow.isFlippedBlocksWritingMode() ? values.afterBorder() |
| + : values.beforeBorder(); |
| } |
| static const CollapsedBorderValue& collapsedRightBorder( |
| const ComputedStyle& styleForCellFlow, |
| const LayoutTableCell::CollapsedBorderValues& values) { |
| - if (styleForCellFlow.isHorizontalWritingMode()) |
| - return styleForCellFlow.isLeftToRightDirection() ? values.endBorder |
| - : values.startBorder; |
| - return styleForCellFlow.isFlippedBlocksWritingMode() ? values.beforeBorder |
| - : values.afterBorder; |
| + if (styleForCellFlow.isHorizontalWritingMode()) { |
| + return styleForCellFlow.isLeftToRightDirection() ? values.endBorder() |
| + : values.startBorder(); |
| + } |
| + return styleForCellFlow.isFlippedBlocksWritingMode() ? values.beforeBorder() |
| + : values.afterBorder(); |
| } |
| static const CollapsedBorderValue& collapsedTopBorder( |
| const ComputedStyle& styleForCellFlow, |
| const LayoutTableCell::CollapsedBorderValues& values) { |
| if (styleForCellFlow.isHorizontalWritingMode()) |
| - return values.beforeBorder; |
| - return styleForCellFlow.isLeftToRightDirection() ? values.startBorder |
| - : values.endBorder; |
| + return values.beforeBorder(); |
| + return styleForCellFlow.isLeftToRightDirection() ? values.startBorder() |
| + : values.endBorder(); |
| } |
| static const CollapsedBorderValue& collapsedBottomBorder( |
| const ComputedStyle& styleForCellFlow, |
| const LayoutTableCell::CollapsedBorderValues& values) { |
| if (styleForCellFlow.isHorizontalWritingMode()) |
| - return values.afterBorder; |
| - return styleForCellFlow.isLeftToRightDirection() ? values.endBorder |
| - : values.startBorder; |
| + return values.afterBorder(); |
| + return styleForCellFlow.isLeftToRightDirection() ? values.endBorder() |
| + : values.startBorder(); |
| } |
| void TableCellPainter::paint(const PaintInfo& paintInfo, |
| @@ -65,6 +69,16 @@ static EBorderStyle collapsedBorderStyle(EBorderStyle style) { |
| return style; |
| } |
| +const DisplayItemClient& TableCellPainter::displayItemClient() const { |
|
chrishtr
2016/10/19 01:13:21
The collapsed border values should only be used as
wkorman
2016/10/19 23:07:39
Done.
|
| + // TODO(wkorman): We may need to handle PaintInvalidationDelayedFull at all |
| + // callsites in this file that make use of |
| + // this client. http://crbug.com/657186 |
| + return m_layoutTableCell.usesTableAsDisplayItemClient() |
| + ? static_cast<const DisplayItemClient&>( |
| + *m_layoutTableCell.collapsedBorderValues()) |
| + : m_layoutTableCell; |
| +} |
| + |
| void TableCellPainter::paintCollapsedBorders( |
| const PaintInfo& paintInfo, |
| const LayoutPoint& paintOffset, |
| @@ -119,14 +133,15 @@ void TableCellPainter::paintCollapsedBorders( |
| paintRect.height() + topWidth / 2 + (bottomWidth + 1) / 2); |
| GraphicsContext& graphicsContext = paintInfo.context; |
| - if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible( |
| - graphicsContext, m_layoutTableCell, |
| + const DisplayItemClient& client = displayItemClient(); |
| + if (DrawingRecorder::useCachedDrawingIfPossible( |
| + graphicsContext, client, |
| static_cast<DisplayItem::Type>(displayItemType))) |
| return; |
| - LayoutObjectDrawingRecorder recorder( |
| - graphicsContext, m_layoutTableCell, |
| - static_cast<DisplayItem::Type>(displayItemType), borderRect); |
| + DrawingRecorder recorder(graphicsContext, client, |
| + static_cast<DisplayItem::Type>(displayItemType), |
| + borderRect); |
| Color cellColor = m_layoutTableCell.resolveColor(CSSPropertyColor); |
| // We never paint diagonals at the joins. We simply let the border with the |
| @@ -182,6 +197,8 @@ void TableCellPainter::paintContainerBackgroundBehindCell( |
| !m_layoutTableCell.firstChild()) |
| return; |
| + // TODO(wkorman): Investigate using displayItemClient() below. Currently |
| + // attempting breaks caching for some reason. |
|
wkorman
2016/10/19 00:52:43
Thoughts on why attempting to use displayItemClien
chrishtr
2016/10/19 01:13:21
I think you might be accidentally painting into th
|
| if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible( |
| paintInfo.context, m_layoutTableCell, type)) |
| return; |
| @@ -236,17 +253,17 @@ void TableCellPainter::paintBoxDecorationBackground( |
| !m_layoutTableCell.styleRef().boxShadow() && !needsToPaintBorder) |
| return; |
| - if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible( |
| - paintInfo.context, m_layoutTableCell, |
| - DisplayItem::kBoxDecorationBackground)) |
| + const DisplayItemClient& client = displayItemClient(); |
| + if (DrawingRecorder::useCachedDrawingIfPossible( |
| + paintInfo.context, client, DisplayItem::kBoxDecorationBackground)) |
| return; |
| LayoutRect visualOverflowRect = m_layoutTableCell.visualOverflowRect(); |
| visualOverflowRect.moveBy(paintOffset); |
| // TODO(chrishtr): the pixel-snapping here is likely incorrect. |
| - LayoutObjectDrawingRecorder recorder(paintInfo.context, m_layoutTableCell, |
| - DisplayItem::kBoxDecorationBackground, |
| - pixelSnappedIntRect(visualOverflowRect)); |
| + DrawingRecorder recorder(paintInfo.context, client, |
| + DisplayItem::kBoxDecorationBackground, |
| + pixelSnappedIntRect(visualOverflowRect)); |
| LayoutRect paintRect = paintRectNotIncludingVisualOverflow(paintOffset); |
| @@ -275,13 +292,17 @@ void TableCellPainter::paintMask(const PaintInfo& paintInfo, |
| !m_layoutTableCell.firstChild()) |
| return; |
| - if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible( |
| - paintInfo.context, m_layoutTableCell, paintInfo.phase)) |
| + const DisplayItemClient& client = displayItemClient(); |
| + if (DrawingRecorder::useCachedDrawingIfPossible( |
| + paintInfo.context, client, |
| + DisplayItem::paintPhaseToDrawingType(paintInfo.phase))) |
| return; |
| LayoutRect paintRect = paintRectNotIncludingVisualOverflow(paintOffset); |
| - LayoutObjectDrawingRecorder recorder(paintInfo.context, m_layoutTableCell, |
| - paintInfo.phase, paintRect); |
| + DrawingRecorder recorder( |
| + paintInfo.context, client, |
| + DisplayItem::paintPhaseToDrawingType(paintInfo.phase), |
| + FloatRect(paintRect)); |
| BoxPainter(m_layoutTableCell).paintMaskImages(paintInfo, paintRect); |
| } |