OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2012 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
11 * documentation and/or other materials provided with the distribution. | 11 * documentation and/or other materials provided with the distribution. |
12 * | 12 * |
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY | 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 */ | 24 */ |
25 | 25 |
26 #include "config.h" | 26 #include "config.h" |
27 #include "core/rendering/RenderMultiColumnSet.h" | 27 #include "core/rendering/RenderMultiColumnSet.h" |
28 | 28 |
29 #include "core/paint/BoxPainter.h" | 29 #include "core/paint/BoxPainter.h" |
| 30 #include "core/paint/MultiColumnSetPainter.h" |
30 #include "core/paint/ObjectPainter.h" | 31 #include "core/paint/ObjectPainter.h" |
31 #include "core/rendering/PaintInfo.h" | 32 #include "core/rendering/PaintInfo.h" |
32 #include "core/rendering/RenderLayer.h" | 33 #include "core/rendering/RenderLayer.h" |
33 #include "core/rendering/RenderMultiColumnFlowThread.h" | 34 #include "core/rendering/RenderMultiColumnFlowThread.h" |
34 | 35 |
35 namespace blink { | 36 namespace blink { |
36 | 37 |
37 RenderMultiColumnSet::RenderMultiColumnSet(RenderFlowThread* flowThread) | 38 RenderMultiColumnSet::RenderMultiColumnSet(RenderFlowThread* flowThread) |
38 : RenderRegion(0, flowThread) | 39 : RenderRegion(0, flowThread) |
39 , m_columnHeight(0) | 40 , m_columnHeight(0) |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 if (!isLeftmostColumn) | 415 if (!isLeftmostColumn) |
415 overflowRect.shiftYEdgeTo(portionRect.y() - colGap / 2); | 416 overflowRect.shiftYEdgeTo(portionRect.y() - colGap / 2); |
416 if (!isRightmostColumn) | 417 if (!isRightmostColumn) |
417 overflowRect.shiftMaxYEdgeTo(portionRect.maxY() + colGap - colGap /
2); | 418 overflowRect.shiftMaxYEdgeTo(portionRect.maxY() + colGap - colGap /
2); |
418 } | 419 } |
419 return overflowRect; | 420 return overflowRect; |
420 } | 421 } |
421 | 422 |
422 void RenderMultiColumnSet::paintObject(PaintInfo& paintInfo, const LayoutPoint&
paintOffset) | 423 void RenderMultiColumnSet::paintObject(PaintInfo& paintInfo, const LayoutPoint&
paintOffset) |
423 { | 424 { |
424 if (style()->visibility() != VISIBLE) | 425 MultiColumnSetPainter(*this).paintObject(paintInfo, paintOffset); |
425 return; | |
426 | |
427 RenderBlockFlow::paintObject(paintInfo, paintOffset); | |
428 | |
429 // FIXME: Right now we're only painting in the foreground phase. | |
430 // Columns should technically respect phases and allow for background/float/
foreground overlap etc., just like | |
431 // RenderBlocks do. Note this is a pretty minor issue, since the old column
implementation clipped columns | |
432 // anyway, thus making it impossible for them to overlap one another. It's a
lso really unlikely that the columns | |
433 // would overlap another block. | |
434 if (!m_flowThread || !isValid() || (paintInfo.phase != PaintPhaseForeground
&& paintInfo.phase != PaintPhaseSelection)) | |
435 return; | |
436 | |
437 paintColumnRules(paintInfo, paintOffset); | |
438 } | |
439 | |
440 void RenderMultiColumnSet::paintColumnRules(PaintInfo& paintInfo, const LayoutPo
int& paintOffset) | |
441 { | |
442 if (flowThread()->isRenderPagedFlowThread()) | |
443 return; | |
444 | |
445 RenderStyle* blockStyle = multiColumnBlockFlow()->style(); | |
446 const Color& ruleColor = resolveColor(blockStyle, CSSPropertyWebkitColumnRul
eColor); | |
447 bool ruleTransparent = blockStyle->columnRuleIsTransparent(); | |
448 EBorderStyle ruleStyle = blockStyle->columnRuleStyle(); | |
449 LayoutUnit ruleThickness = blockStyle->columnRuleWidth(); | |
450 LayoutUnit colGap = columnGap(); | |
451 bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent; | |
452 if (!renderRule) | |
453 return; | |
454 | |
455 unsigned colCount = actualColumnCount(); | |
456 if (colCount <= 1) | |
457 return; | |
458 | |
459 bool antialias = BoxPainter::shouldAntialiasLines(paintInfo.context); | |
460 | |
461 bool leftToRight = style()->isLeftToRightDirection(); | |
462 LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentLogic
alWidth(); | |
463 LayoutUnit ruleAdd = borderAndPaddingLogicalLeft(); | |
464 LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogicalWidt
h(); | |
465 LayoutUnit inlineDirectionSize = pageLogicalWidth(); | |
466 BoxSide boxSide = isHorizontalWritingMode() | |
467 ? leftToRight ? BSLeft : BSRight | |
468 : leftToRight ? BSTop : BSBottom; | |
469 | |
470 for (unsigned i = 0; i < colCount; i++) { | |
471 // Move to the next position. | |
472 if (leftToRight) { | |
473 ruleLogicalLeft += inlineDirectionSize + colGap / 2; | |
474 currLogicalLeftOffset += inlineDirectionSize + colGap; | |
475 } else { | |
476 ruleLogicalLeft -= (inlineDirectionSize + colGap / 2); | |
477 currLogicalLeftOffset -= (inlineDirectionSize + colGap); | |
478 } | |
479 | |
480 // Now paint the column rule. | |
481 if (i < colCount - 1) { | |
482 LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x() +
ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffset.x() + borderLeft() +
paddingLeft(); | |
483 LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ruleTh
ickness : ruleLeft + contentWidth(); | |
484 LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + b
orderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThickness /
2 + ruleAdd; | |
485 LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + conten
tHeight() : ruleTop + ruleThickness; | |
486 IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(ruleLeft
, ruleTop, ruleRight, ruleBottom); | |
487 ObjectPainter::drawLineForBoxSide(paintInfo.context, pixelSnappedRul
eRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRu
leRect.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, antialias); | |
488 } | |
489 | |
490 ruleLogicalLeft = currLogicalLeftOffset; | |
491 } | |
492 } | 426 } |
493 | 427 |
494 void RenderMultiColumnSet::paintInvalidationForFlowThreadContent(const LayoutRec
t& paintInvalidationRect) const | 428 void RenderMultiColumnSet::paintInvalidationForFlowThreadContent(const LayoutRec
t& paintInvalidationRect) const |
495 { | 429 { |
496 // Figure out the start and end columns and only check within that range so
that we don't walk the | 430 // Figure out the start and end columns and only check within that range so
that we don't walk the |
497 // entire column set. Put the paint invalidation rect into flow thread coord
inates by flipping it first. | 431 // entire column set. Put the paint invalidation rect into flow thread coord
inates by flipping it first. |
498 LayoutRect flowThreadPaintInvalidationRect(paintInvalidationRect); | 432 LayoutRect flowThreadPaintInvalidationRect(paintInvalidationRect); |
499 flowThread()->flipForWritingMode(flowThreadPaintInvalidationRect); | 433 flowThread()->flipForWritingMode(flowThreadPaintInvalidationRect); |
500 | 434 |
501 // Now we can compare this rect with the flow thread portions owned by each
column. First let's | 435 // Now we can compare this rect with the flow thread portions owned by each
column. First let's |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 | 620 |
687 void RenderMultiColumnSet::detachRegion() | 621 void RenderMultiColumnSet::detachRegion() |
688 { | 622 { |
689 if (m_flowThread) { | 623 if (m_flowThread) { |
690 m_flowThread->removeRegionFromThread(this); | 624 m_flowThread->removeRegionFromThread(this); |
691 m_flowThread = 0; | 625 m_flowThread = 0; |
692 } | 626 } |
693 } | 627 } |
694 | 628 |
695 } | 629 } |
OLD | NEW |