| 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/MultiColumnSetPainter.h" | 5 #include "core/paint/MultiColumnSetPainter.h" |
| 6 | 6 |
| 7 #include "core/layout/LayoutMultiColumnSet.h" | 7 #include "core/layout/LayoutMultiColumnSet.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" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 // anyway, thus making it impossible for them to overlap one another. It's a
lso really unlikely that the columns | 27 // anyway, thus making it impossible for them to overlap one another. It's a
lso really unlikely that the columns |
| 28 // would overlap another block. | 28 // would overlap another block. |
| 29 if (!m_layoutMultiColumnSet.flowThread() || (paintInfo.phase != PaintPhaseFo
reground && paintInfo.phase != PaintPhaseSelection)) | 29 if (!m_layoutMultiColumnSet.flowThread() || (paintInfo.phase != PaintPhaseFo
reground && paintInfo.phase != PaintPhaseSelection)) |
| 30 return; | 30 return; |
| 31 | 31 |
| 32 paintColumnRules(paintInfo, paintOffset); | 32 paintColumnRules(paintInfo, paintOffset); |
| 33 } | 33 } |
| 34 | 34 |
| 35 void MultiColumnSetPainter::paintColumnRules(const PaintInfo& paintInfo, const L
ayoutPoint& paintOffset) | 35 void MultiColumnSetPainter::paintColumnRules(const PaintInfo& paintInfo, const L
ayoutPoint& paintOffset) |
| 36 { | 36 { |
| 37 if (m_layoutMultiColumnSet.flowThread()->isLayoutPagedFlowThread()) | 37 Vector<LayoutRect> columnRuleBounds; |
| 38 return; | 38 if (!m_layoutMultiColumnSet.computeColumnRuleBounds(paintOffset, columnRuleB
ounds)) |
| 39 | |
| 40 const ComputedStyle& blockStyle = m_layoutMultiColumnSet.multiColumnBlockFlo
w()->styleRef(); | |
| 41 const Color& ruleColor = m_layoutMultiColumnSet.resolveColor(blockStyle, CSS
PropertyColumnRuleColor); | |
| 42 bool ruleTransparent = blockStyle.columnRuleIsTransparent(); | |
| 43 EBorderStyle ruleStyle = blockStyle.columnRuleStyle(); | |
| 44 LayoutUnit ruleThickness(blockStyle.columnRuleWidth()); | |
| 45 LayoutUnit colGap = m_layoutMultiColumnSet.columnGap(); | |
| 46 bool renderRule = ruleStyle > BorderStyleHidden && !ruleTransparent; | |
| 47 if (!renderRule) | |
| 48 return; | |
| 49 | |
| 50 unsigned colCount = m_layoutMultiColumnSet.actualColumnCount(); | |
| 51 if (colCount <= 1) | |
| 52 return; | 39 return; |
| 53 | 40 |
| 54 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfo.contex
t, m_layoutMultiColumnSet, DisplayItem::ColumnRules)) | 41 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfo.contex
t, m_layoutMultiColumnSet, DisplayItem::ColumnRules)) |
| 55 return; | 42 return; |
| 56 | 43 |
| 57 LayoutRect paintRect = m_layoutMultiColumnSet.visualOverflowRect(); | 44 LayoutRect paintRect = m_layoutMultiColumnSet.visualOverflowRect(); |
| 58 paintRect.moveBy(paintOffset); | 45 paintRect.moveBy(paintOffset); |
| 59 LayoutObjectDrawingRecorder drawingRecorder(paintInfo.context, m_layoutMulti
ColumnSet, DisplayItem::ColumnRules, paintRect); | 46 LayoutObjectDrawingRecorder drawingRecorder(paintInfo.context, m_layoutMulti
ColumnSet, DisplayItem::ColumnRules, paintRect); |
| 60 | 47 |
| 48 const ComputedStyle& blockStyle = m_layoutMultiColumnSet.multiColumnBlockFlo
w()->styleRef(); |
| 49 EBorderStyle ruleStyle = blockStyle.columnRuleStyle(); |
| 61 bool leftToRight = m_layoutMultiColumnSet.style()->isLeftToRightDirection(); | 50 bool leftToRight = m_layoutMultiColumnSet.style()->isLeftToRightDirection(); |
| 62 LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : m_layoutMult
iColumnSet.contentLogicalWidth(); | |
| 63 LayoutUnit ruleAdd = m_layoutMultiColumnSet.borderAndPaddingLogicalLeft(); | |
| 64 LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : m_layoutMultiColum
nSet.contentLogicalWidth(); | |
| 65 LayoutUnit inlineDirectionSize = m_layoutMultiColumnSet.pageLogicalWidth(); | |
| 66 BoxSide boxSide = m_layoutMultiColumnSet.isHorizontalWritingMode() | 51 BoxSide boxSide = m_layoutMultiColumnSet.isHorizontalWritingMode() |
| 67 ? leftToRight ? BSLeft : BSRight | 52 ? leftToRight ? BSLeft : BSRight |
| 68 : leftToRight ? BSTop : BSBottom; | 53 : leftToRight ? BSTop : BSBottom; |
| 54 const Color& ruleColor = m_layoutMultiColumnSet.resolveColor(blockStyle, CSS
PropertyColumnRuleColor); |
| 69 | 55 |
| 70 for (unsigned i = 0; i < colCount; i++) { | 56 for (auto& bound : columnRuleBounds) { |
| 71 // Move to the next position. | 57 IntRect pixelSnappedRuleRect = pixelSnappedIntRect(bound); |
| 72 if (leftToRight) { | 58 ObjectPainter::drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRec
t.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRe
ct.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, true); |
| 73 ruleLogicalLeft += inlineDirectionSize + colGap / 2; | |
| 74 currLogicalLeftOffset += inlineDirectionSize + colGap; | |
| 75 } else { | |
| 76 ruleLogicalLeft -= (inlineDirectionSize + colGap / 2); | |
| 77 currLogicalLeftOffset -= (inlineDirectionSize + colGap); | |
| 78 } | |
| 79 | |
| 80 // Now paint the column rule. | |
| 81 if (i < colCount - 1) { | |
| 82 LayoutUnit ruleLeft = m_layoutMultiColumnSet.isHorizontalWritingMode
() ? paintOffset.x() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffs
et.x() + m_layoutMultiColumnSet.borderLeft() + m_layoutMultiColumnSet.paddingLef
t(); | |
| 83 LayoutUnit ruleRight = m_layoutMultiColumnSet.isHorizontalWritingMod
e() ? ruleLeft + ruleThickness : ruleLeft + m_layoutMultiColumnSet.contentWidth(
); | |
| 84 LayoutUnit ruleTop = m_layoutMultiColumnSet.isHorizontalWritingMode(
) ? paintOffset.y() + m_layoutMultiColumnSet.borderTop() + m_layoutMultiColumnSe
t.paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd
; | |
| 85 LayoutUnit ruleBottom = m_layoutMultiColumnSet.isHorizontalWritingMo
de() ? ruleTop + m_layoutMultiColumnSet.contentHeight() : ruleTop + ruleThicknes
s; | |
| 86 IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(ruleLeft
, ruleTop, ruleRight, ruleBottom); | |
| 87 ObjectPainter::drawLineForBoxSide(paintInfo.context, pixelSnappedRul
eRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRu
leRect.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, true); | |
| 88 } | |
| 89 | |
| 90 ruleLogicalLeft = currLogicalLeftOffset; | |
| 91 } | 59 } |
| 92 } | 60 } |
| 93 | 61 |
| 94 } // namespace blink | 62 } // namespace blink |
| OLD | NEW |