| 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/TableCellPainter.h" | 5 #include "core/paint/TableCellPainter.h" |
| 6 | 6 |
| 7 #include "core/layout/LayoutTableCell.h" | 7 #include "core/layout/LayoutTableCell.h" |
| 8 #include "core/paint/BlockPainter.h" | 8 #include "core/paint/BlockPainter.h" |
| 9 #include "core/paint/BoxPainter.h" | 9 #include "core/paint/BoxPainter.h" |
| 10 #include "core/paint/LayoutObjectDrawingRecorder.h" | 10 #include "core/paint/LayoutObjectDrawingRecorder.h" |
| 11 #include "core/paint/PaintInfo.h" | 11 #include "core/paint/PaintInfo.h" |
| 12 #include "platform/graphics/GraphicsContextStateSaver.h" | 12 #include "platform/graphics/GraphicsContextStateSaver.h" |
| 13 | 13 |
| 14 namespace blink { | 14 namespace blink { |
| 15 | 15 |
| 16 inline const CollapsedBorderValue* TableCellPainter::cachedCollapsedLeftBorder(c
onst ComputedStyle& styleForCellFlow) const | 16 static const CollapsedBorderValue& collapsedLeftBorder(const ComputedStyle& styl
eForCellFlow, const LayoutTableCell::CollapsedBorderValues& values) |
| 17 { | 17 { |
| 18 if (styleForCellFlow.isHorizontalWritingMode()) { | 18 if (styleForCellFlow.isHorizontalWritingMode()) |
| 19 return styleForCellFlow.isLeftToRightDirection() | 19 return styleForCellFlow.isLeftToRightDirection() ? values.startBorder :
values.endBorder; |
| 20 ? m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableC
ell, CBSStart) | 20 return styleForCellFlow.isFlippedBlocksWritingMode() ? values.afterBorder :
values.beforeBorder; |
| 21 : m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableC
ell, CBSEnd); | |
| 22 } | |
| 23 return styleForCellFlow.isFlippedBlocksWritingMode() | |
| 24 ? m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableCell,
CBSAfter) | |
| 25 : m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableCell,
CBSBefore); | |
| 26 } | 21 } |
| 27 | 22 |
| 28 inline const CollapsedBorderValue* TableCellPainter::cachedCollapsedRightBorder(
const ComputedStyle& styleForCellFlow) const | 23 static const CollapsedBorderValue& collapsedRightBorder(const ComputedStyle& sty
leForCellFlow, const LayoutTableCell::CollapsedBorderValues& values) |
| 29 { | 24 { |
| 30 if (styleForCellFlow.isHorizontalWritingMode()) { | 25 if (styleForCellFlow.isHorizontalWritingMode()) |
| 31 return styleForCellFlow.isLeftToRightDirection() | 26 return styleForCellFlow.isLeftToRightDirection() ? values.endBorder : va
lues.startBorder; |
| 32 ? m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableC
ell, CBSEnd) | 27 return styleForCellFlow.isFlippedBlocksWritingMode() ? values.beforeBorder :
values.afterBorder; |
| 33 : m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableC
ell, CBSStart); | |
| 34 } | |
| 35 return styleForCellFlow.isFlippedBlocksWritingMode() | |
| 36 ? m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableCell,
CBSBefore) | |
| 37 : m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableCell,
CBSAfter); | |
| 38 } | 28 } |
| 39 | 29 |
| 40 inline const CollapsedBorderValue* TableCellPainter::cachedCollapsedTopBorder(co
nst ComputedStyle& styleForCellFlow) const | 30 static const CollapsedBorderValue& collapsedTopBorder(const ComputedStyle& style
ForCellFlow, const LayoutTableCell::CollapsedBorderValues& values) |
| 41 { | 31 { |
| 42 if (styleForCellFlow.isHorizontalWritingMode()) | 32 if (styleForCellFlow.isHorizontalWritingMode()) |
| 43 return m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTable
Cell, CBSBefore); | 33 return values.beforeBorder; |
| 44 return styleForCellFlow.isLeftToRightDirection() | 34 return styleForCellFlow.isLeftToRightDirection() ? values.startBorder : valu
es.endBorder; |
| 45 ? m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableCell,
CBSStart) | |
| 46 : m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableCell,
CBSEnd); | |
| 47 } | 35 } |
| 48 | 36 |
| 49 inline const CollapsedBorderValue* TableCellPainter::cachedCollapsedBottomBorder
(const ComputedStyle& styleForCellFlow) const | 37 static const CollapsedBorderValue& collapsedBottomBorder(const ComputedStyle& st
yleForCellFlow, const LayoutTableCell::CollapsedBorderValues& values) |
| 50 { | 38 { |
| 51 if (styleForCellFlow.isHorizontalWritingMode()) | 39 if (styleForCellFlow.isHorizontalWritingMode()) |
| 52 return m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTable
Cell, CBSAfter); | 40 return values.afterBorder; |
| 53 return styleForCellFlow.isLeftToRightDirection() | 41 return styleForCellFlow.isLeftToRightDirection() ? values.endBorder : values
.startBorder; |
| 54 ? m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableCell,
CBSEnd) | |
| 55 : m_layoutTableCell.section()->cachedCollapsedBorder(&m_layoutTableCell,
CBSStart); | |
| 56 } | 42 } |
| 57 | 43 |
| 58 void TableCellPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& pain
tOffset) | 44 void TableCellPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& pain
tOffset) |
| 59 { | 45 { |
| 60 BlockPainter(m_layoutTableCell).paint(paintInfo, paintOffset); | 46 BlockPainter(m_layoutTableCell).paint(paintInfo, paintOffset); |
| 61 } | 47 } |
| 62 | 48 |
| 63 static EBorderStyle collapsedBorderStyle(EBorderStyle style) | 49 static EBorderStyle collapsedBorderStyle(EBorderStyle style) |
| 64 { | 50 { |
| 65 if (style == BorderStyleOutset) | 51 if (style == BorderStyleOutset) |
| 66 return BorderStyleGroove; | 52 return BorderStyleGroove; |
| 67 if (style == BorderStyleInset) | 53 if (style == BorderStyleInset) |
| 68 return BorderStyleRidge; | 54 return BorderStyleRidge; |
| 69 return style; | 55 return style; |
| 70 } | 56 } |
| 71 | 57 |
| 72 void TableCellPainter::paintCollapsedBorders(const PaintInfo& paintInfo, const L
ayoutPoint& paintOffset, const CollapsedBorderValue& currentBorderValue) | 58 void TableCellPainter::paintCollapsedBorders(const PaintInfo& paintInfo, const L
ayoutPoint& paintOffset, const CollapsedBorderValue& currentBorderValue) |
| 73 { | 59 { |
| 74 if (m_layoutTableCell.style()->visibility() != VISIBLE) | 60 if (m_layoutTableCell.style()->visibility() != VISIBLE) |
| 75 return; | 61 return; |
| 76 | 62 |
| 63 const LayoutTableCell::CollapsedBorderValues* values = m_layoutTableCell.col
lapsedBorderValues(); |
| 64 if (!values) |
| 65 return; |
| 66 |
| 77 const ComputedStyle& styleForCellFlow = m_layoutTableCell.styleForCellFlow()
; | 67 const ComputedStyle& styleForCellFlow = m_layoutTableCell.styleForCellFlow()
; |
| 78 const CollapsedBorderValue* leftBorderValue = cachedCollapsedLeftBorder(styl
eForCellFlow); | 68 const CollapsedBorderValue& leftBorderValue = collapsedLeftBorder(styleForCe
llFlow, *values); |
| 79 const CollapsedBorderValue* rightBorderValue = cachedCollapsedRightBorder(st
yleForCellFlow); | 69 const CollapsedBorderValue& rightBorderValue = collapsedRightBorder(styleFor
CellFlow, *values); |
| 80 const CollapsedBorderValue* topBorderValue = cachedCollapsedTopBorder(styleF
orCellFlow); | 70 const CollapsedBorderValue& topBorderValue = collapsedTopBorder(styleForCell
Flow, *values); |
| 81 const CollapsedBorderValue* bottomBorderValue = cachedCollapsedBottomBorder(
styleForCellFlow); | 71 const CollapsedBorderValue& bottomBorderValue = collapsedBottomBorder(styleF
orCellFlow, *values); |
| 82 | 72 |
| 83 int displayItemType = DisplayItem::TableCollapsedBorderBase; | 73 int displayItemType = DisplayItem::TableCollapsedBorderBase; |
| 84 int topWidth = 0; | 74 if (topBorderValue.shouldPaint(currentBorderValue)) |
| 85 int bottomWidth = 0; | 75 displayItemType |= DisplayItem::TableCollapsedBorderTop; |
| 86 int leftWidth = 0; | 76 if (bottomBorderValue.shouldPaint(currentBorderValue)) |
| 87 int rightWidth = 0; | 77 displayItemType |= DisplayItem::TableCollapsedBorderBottom; |
| 88 if (topBorderValue) { | 78 if (leftBorderValue.shouldPaint(currentBorderValue)) |
| 89 if (topBorderValue->shouldPaint(currentBorderValue)) | 79 displayItemType |= DisplayItem::TableCollapsedBorderLeft; |
| 90 displayItemType |= DisplayItem::TableCollapsedBorderTop; | 80 if (rightBorderValue.shouldPaint(currentBorderValue)) |
| 91 topWidth = topBorderValue->width(); | 81 displayItemType |= DisplayItem::TableCollapsedBorderRight; |
| 92 } | |
| 93 if (bottomBorderValue) { | |
| 94 if (bottomBorderValue->shouldPaint(currentBorderValue)) | |
| 95 displayItemType |= DisplayItem::TableCollapsedBorderBottom; | |
| 96 bottomWidth = bottomBorderValue->width(); | |
| 97 } | |
| 98 if (leftBorderValue) { | |
| 99 if (leftBorderValue->shouldPaint(currentBorderValue)) | |
| 100 displayItemType |= DisplayItem::TableCollapsedBorderLeft; | |
| 101 leftWidth = leftBorderValue->width(); | |
| 102 } | |
| 103 if (rightBorderValue) { | |
| 104 if (rightBorderValue->shouldPaint(currentBorderValue)) | |
| 105 displayItemType |= DisplayItem::TableCollapsedBorderRight; | |
| 106 rightWidth = rightBorderValue->width(); | |
| 107 } | |
| 108 if (displayItemType == DisplayItem::TableCollapsedBorderBase) | 82 if (displayItemType == DisplayItem::TableCollapsedBorderBase) |
| 109 return; | 83 return; |
| 110 | 84 |
| 85 int topWidth = topBorderValue.width(); |
| 86 int bottomWidth = bottomBorderValue.width(); |
| 87 int leftWidth = leftBorderValue.width(); |
| 88 int rightWidth = rightBorderValue.width(); |
| 89 |
| 111 // Adjust our x/y/width/height so that we paint the collapsed borders at the
correct location. | 90 // Adjust our x/y/width/height so that we paint the collapsed borders at the
correct location. |
| 112 LayoutRect paintRect = paintBounds(paintOffset, AddOffsetFromParent); | 91 LayoutRect paintRect = paintBounds(paintOffset, AddOffsetFromParent); |
| 113 IntRect borderRect = pixelSnappedIntRect(paintRect.x() - leftWidth / 2, | 92 IntRect borderRect = pixelSnappedIntRect(paintRect.x() - leftWidth / 2, |
| 114 paintRect.y() - topWidth / 2, | 93 paintRect.y() - topWidth / 2, |
| 115 paintRect.width() + leftWidth / 2 + (rightWidth + 1) / 2, | 94 paintRect.width() + leftWidth / 2 + (rightWidth + 1) / 2, |
| 116 paintRect.height() + topWidth / 2 + (bottomWidth + 1) / 2); | 95 paintRect.height() + topWidth / 2 + (bottomWidth + 1) / 2); |
| 117 | 96 |
| 118 if (!paintInfo.cullRect().intersectsCullRect(borderRect)) | 97 if (!paintInfo.cullRect().intersectsCullRect(borderRect)) |
| 119 return; | 98 return; |
| 120 | 99 |
| 121 GraphicsContext& graphicsContext = paintInfo.context; | 100 GraphicsContext& graphicsContext = paintInfo.context; |
| 122 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(graphicsContext,
m_layoutTableCell, static_cast<DisplayItem::Type>(displayItemType))) | 101 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(graphicsContext,
m_layoutTableCell, static_cast<DisplayItem::Type>(displayItemType))) |
| 123 return; | 102 return; |
| 124 | 103 |
| 125 LayoutObjectDrawingRecorder recorder(graphicsContext, m_layoutTableCell, sta
tic_cast<DisplayItem::Type>(displayItemType), borderRect); | 104 LayoutObjectDrawingRecorder recorder(graphicsContext, m_layoutTableCell, sta
tic_cast<DisplayItem::Type>(displayItemType), borderRect); |
| 126 Color cellColor = m_layoutTableCell.resolveColor(CSSPropertyColor); | 105 Color cellColor = m_layoutTableCell.resolveColor(CSSPropertyColor); |
| 127 | 106 |
| 128 // We never paint diagonals at the joins. We simply let the border with the
highest | 107 // We never paint diagonals at the joins. We simply let the border with the
highest |
| 129 // precedence paint on top of borders with lower precedence. | 108 // precedence paint on top of borders with lower precedence. |
| 130 if (displayItemType & DisplayItem::TableCollapsedBorderTop) { | 109 if (displayItemType & DisplayItem::TableCollapsedBorderTop) { |
| 131 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.x(), borde
rRect.y(), borderRect.maxX(), borderRect.y() + topWidth, BSTop, | 110 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.x(), borde
rRect.y(), borderRect.maxX(), borderRect.y() + topWidth, BSTop, |
| 132 topBorderValue->color().resolve(cellColor), collapsedBorderStyle(top
BorderValue->style()), 0, 0, true); | 111 topBorderValue.color().resolve(cellColor), collapsedBorderStyle(topB
orderValue.style()), 0, 0, true); |
| 133 } | 112 } |
| 134 if (displayItemType & DisplayItem::TableCollapsedBorderBottom) { | 113 if (displayItemType & DisplayItem::TableCollapsedBorderBottom) { |
| 135 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.x(), borde
rRect.maxY() - bottomWidth, borderRect.maxX(), borderRect.maxY(), BSBottom, | 114 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.x(), borde
rRect.maxY() - bottomWidth, borderRect.maxX(), borderRect.maxY(), BSBottom, |
| 136 bottomBorderValue->color().resolve(cellColor), collapsedBorderStyle(
bottomBorderValue->style()), 0, 0, true); | 115 bottomBorderValue.color().resolve(cellColor), collapsedBorderStyle(b
ottomBorderValue.style()), 0, 0, true); |
| 137 } | 116 } |
| 138 if (displayItemType & DisplayItem::TableCollapsedBorderLeft) { | 117 if (displayItemType & DisplayItem::TableCollapsedBorderLeft) { |
| 139 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.x(), borde
rRect.y(), borderRect.x() + leftWidth, borderRect.maxY(), BSLeft, | 118 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.x(), borde
rRect.y(), borderRect.x() + leftWidth, borderRect.maxY(), BSLeft, |
| 140 leftBorderValue->color().resolve(cellColor), collapsedBorderStyle(le
ftBorderValue->style()), 0, 0, true); | 119 leftBorderValue.color().resolve(cellColor), collapsedBorderStyle(lef
tBorderValue.style()), 0, 0, true); |
| 141 } | 120 } |
| 142 if (displayItemType & DisplayItem::TableCollapsedBorderRight) { | 121 if (displayItemType & DisplayItem::TableCollapsedBorderRight) { |
| 143 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.maxX() - r
ightWidth, borderRect.y(), borderRect.maxX(), borderRect.maxY(), BSRight, | 122 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.maxX() - r
ightWidth, borderRect.y(), borderRect.maxX(), borderRect.maxY(), BSRight, |
| 144 rightBorderValue->color().resolve(cellColor), collapsedBorderStyle(r
ightBorderValue->style()), 0, 0, true); | 123 rightBorderValue.color().resolve(cellColor), collapsedBorderStyle(ri
ghtBorderValue.style()), 0, 0, true); |
| 145 } | 124 } |
| 146 } | 125 } |
| 147 | 126 |
| 148 void TableCellPainter::paintBackgroundsBehindCell(const PaintInfo& paintInfo, co
nst LayoutPoint& paintOffset, const LayoutObject* backgroundObject, DisplayItem:
:Type type) | 127 void TableCellPainter::paintBackgroundsBehindCell(const PaintInfo& paintInfo, co
nst LayoutPoint& paintOffset, const LayoutObject* backgroundObject, DisplayItem:
:Type type) |
| 149 { | 128 { |
| 150 if (!backgroundObject) | 129 if (!backgroundObject) |
| 151 return; | 130 return; |
| 152 | 131 |
| 153 if (m_layoutTableCell.style()->visibility() != VISIBLE) | 132 if (m_layoutTableCell.style()->visibility() != VISIBLE) |
| 154 return; | 133 return; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 LayoutRect TableCellPainter::paintBounds(const LayoutPoint& paintOffset, PaintBo
undOffsetBehavior paintBoundOffsetBehavior) | 217 LayoutRect TableCellPainter::paintBounds(const LayoutPoint& paintOffset, PaintBo
undOffsetBehavior paintBoundOffsetBehavior) |
| 239 { | 218 { |
| 240 LayoutPoint adjustedPaintOffset = paintOffset; | 219 LayoutPoint adjustedPaintOffset = paintOffset; |
| 241 if (paintBoundOffsetBehavior == AddOffsetFromParent) | 220 if (paintBoundOffsetBehavior == AddOffsetFromParent) |
| 242 adjustedPaintOffset.moveBy(m_layoutTableCell.location()); | 221 adjustedPaintOffset.moveBy(m_layoutTableCell.location()); |
| 243 return LayoutRect(adjustedPaintOffset, LayoutSize(m_layoutTableCell.pixelSna
ppedSize())); | 222 return LayoutRect(adjustedPaintOffset, LayoutSize(m_layoutTableCell.pixelSna
ppedSize())); |
| 244 } | 223 } |
| 245 | 224 |
| 246 } // namespace blink | 225 } // namespace blink |
| 247 | 226 |
| OLD | NEW |