Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1715)

Unified Diff: Source/core/rendering/RenderBlock.cpp

Issue 569683004: Factor painting code from RenderBlock into BlockPainter. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fixed Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderBlock.h ('k') | Source/core/rendering/RenderBox.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderBlock.cpp
diff --git a/Source/core/rendering/RenderBlock.cpp b/Source/core/rendering/RenderBlock.cpp
index 5d873a83ff09aba10beb5d9a24e06d69d593c644..10bfa8ee548153e3dad341bf5789c9ce853541fe 100644
--- a/Source/core/rendering/RenderBlock.cpp
+++ b/Source/core/rendering/RenderBlock.cpp
@@ -38,6 +38,7 @@
#include "core/frame/LocalFrame.h"
#include "core/frame/Settings.h"
#include "core/page/Page.h"
+#include "core/paint/BlockPainter.h"
#include "core/paint/BoxPainter.h"
#include "core/rendering/GraphicsContextAnnotator.h"
#include "core/rendering/HitTestLocation.h"
@@ -96,8 +97,6 @@ static TrackedDescendantsMap* gPercentHeightDescendantsMap = 0;
static TrackedContainerMap* gPositionedContainerMap = 0;
static TrackedContainerMap* gPercentHeightContainerMap = 0;
-typedef WTF::HashMap<RenderBlock*, OwnPtr<ListHashSet<RenderInline*> > > ContinuationOutlineTableMap;
-
typedef WTF::HashSet<RenderBlock*> DelayedUpdateScrollInfoSet;
static int gDelayUpdateScrollInfo = 0;
static DelayedUpdateScrollInfoSet* gDelayedUpdateScrollInfoSet = 0;
@@ -1758,369 +1757,17 @@ void RenderBlock::markForPaginationRelayoutIfNeeded(SubtreeLayoutScope& layoutSc
void RenderBlock::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
- ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this);
-
- LayoutPoint adjustedPaintOffset = paintOffset + location();
-
- PaintPhase phase = paintInfo.phase;
-
- LayoutRect overflowBox;
- // Check if we need to do anything at all.
- // FIXME: Could eliminate the isDocumentElement() check if we fix background painting so that the RenderView
- // paints the root's background.
- if (!isDocumentElement()) {
- overflowBox = overflowRectForPaintRejection();
- flipForWritingMode(overflowBox);
- overflowBox.moveBy(adjustedPaintOffset);
- if (!overflowBox.intersects(paintInfo.rect))
- return;
- }
-
- // There are some cases where not all clipped visual overflow is accounted for.
- // FIXME: reduce the number of such cases.
- ContentsClipBehavior contentsClipBehavior = ForceContentsClip;
- if (hasOverflowClip() && !hasControlClip() && !(shouldPaintSelectionGaps() && phase == PaintPhaseForeground) && !hasCaret())
- contentsClipBehavior = SkipContentsClipIfPossible;
-
- bool pushedClip = pushContentsClip(paintInfo, adjustedPaintOffset, contentsClipBehavior);
- {
- GraphicsContextCullSaver cullSaver(*paintInfo.context);
- // Cull if we have more than one child and we didn't already clip.
- bool shouldCull = document().settings()->containerCullingEnabled() && !pushedClip && !isDocumentElement()
- && firstChild() && lastChild() && firstChild() != lastChild();
- if (shouldCull)
- cullSaver.cull(overflowBox);
-
- paintObject(paintInfo, adjustedPaintOffset);
- }
- if (pushedClip)
- popContentsClip(paintInfo, phase, adjustedPaintOffset);
-
- // Our scrollbar widgets paint exactly when we tell them to, so that they work properly with
- // z-index. We paint after we painted the background/border, so that the scrollbars will
- // sit above the background/border.
- if (hasOverflowClip() && style()->visibility() == VISIBLE && (phase == PaintPhaseBlockBackground || phase == PaintPhaseChildBlockBackground) && paintInfo.shouldPaintWithinRoot(this) && !paintInfo.paintRootBackgroundOnly())
- layer()->scrollableArea()->paintOverflowControls(paintInfo.context, roundedIntPoint(adjustedPaintOffset), paintInfo.rect, false /* paintingOverlayControls */);
-}
-
-void RenderBlock::paintColumnRules(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
-{
- const Color& ruleColor = resolveColor(CSSPropertyWebkitColumnRuleColor);
- bool ruleTransparent = style()->columnRuleIsTransparent();
- EBorderStyle ruleStyle = style()->columnRuleStyle();
- LayoutUnit ruleThickness = style()->columnRuleWidth();
- LayoutUnit colGap = columnGap();
- bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent;
- if (!renderRule)
- return;
-
- ColumnInfo* colInfo = columnInfo();
- unsigned colCount = columnCount(colInfo);
-
- bool antialias = BoxPainter::shouldAntialiasLines(paintInfo.context);
-
- if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) {
- bool leftToRight = style()->isLeftToRightDirection();
- LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentLogicalWidth();
- LayoutUnit ruleAdd = logicalLeftOffsetForContent();
- LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogicalWidth();
- LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth();
- BoxSide boxSide = isHorizontalWritingMode()
- ? leftToRight ? BSLeft : BSRight
- : leftToRight ? BSTop : BSBottom;
-
- for (unsigned i = 0; i < colCount; i++) {
- // Move to the next position.
- if (leftToRight) {
- ruleLogicalLeft += inlineDirectionSize + colGap / 2;
- currLogicalLeftOffset += inlineDirectionSize + colGap;
- } else {
- ruleLogicalLeft -= (inlineDirectionSize + colGap / 2);
- currLogicalLeftOffset -= (inlineDirectionSize + colGap);
- }
-
- // Now paint the column rule.
- if (i < colCount - 1) {
- LayoutUnit ruleLeft = isHorizontalWritingMode() ? paintOffset.x() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd : paintOffset.x() + borderLeft() + paddingLeft();
- LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ruleThickness : ruleLeft + contentWidth();
- LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThickness / 2 + ruleAdd;
- LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + contentHeight() : ruleTop + ruleThickness;
- IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(ruleLeft, ruleTop, ruleRight, ruleBottom);
- drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, antialias);
- }
-
- ruleLogicalLeft = currLogicalLeftOffset;
- }
- } else {
- bool topToBottom = !style()->isFlippedBlocksWritingMode();
- LayoutUnit ruleLeft = isHorizontalWritingMode()
- ? borderLeft() + paddingLeft()
- : colGap / 2 - colGap - ruleThickness / 2 + borderBefore() + paddingBefore();
- LayoutUnit ruleWidth = isHorizontalWritingMode() ? contentWidth() : ruleThickness;
- LayoutUnit ruleTop = isHorizontalWritingMode()
- ? colGap / 2 - colGap - ruleThickness / 2 + borderBefore() + paddingBefore()
- : borderStart() + paddingStart();
- LayoutUnit ruleHeight = isHorizontalWritingMode() ? ruleThickness : contentHeight();
- LayoutRect ruleRect(ruleLeft, ruleTop, ruleWidth, ruleHeight);
-
- if (!topToBottom) {
- if (isHorizontalWritingMode())
- ruleRect.setY(height() - ruleRect.maxY());
- else
- ruleRect.setX(width() - ruleRect.maxX());
- }
-
- ruleRect.moveBy(paintOffset);
-
- BoxSide boxSide = isHorizontalWritingMode()
- ? topToBottom ? BSTop : BSBottom
- : topToBottom ? BSLeft : BSRight;
-
- LayoutSize step(0, topToBottom ? colInfo->columnHeight() + colGap : -(colInfo->columnHeight() + colGap));
- if (!isHorizontalWritingMode())
- step = step.transposedSize();
-
- for (unsigned i = 1; i < colCount; i++) {
- ruleRect.move(step);
- IntRect pixelSnappedRuleRect = pixelSnappedIntRect(ruleRect);
- drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY(), boxSide, ruleColor, ruleStyle, 0, 0, antialias);
- }
- }
-}
-
-void RenderBlock::paintColumnContents(PaintInfo& paintInfo, const LayoutPoint& paintOffset, bool paintingFloats)
-{
- // We need to do multiple passes, breaking up our child painting into strips.
- GraphicsContext* context = paintInfo.context;
- ColumnInfo* colInfo = columnInfo();
- unsigned colCount = columnCount(colInfo);
- if (!colCount)
- return;
- LayoutUnit currLogicalTopOffset = 0;
- LayoutUnit colGap = columnGap();
- for (unsigned i = 0; i < colCount; i++) {
- // For each rect, we clip to the rect, and then we adjust our coords.
- LayoutRect colRect = columnRectAt(colInfo, i);
- flipForWritingMode(colRect);
- LayoutUnit logicalLeftOffset = (isHorizontalWritingMode() ? colRect.x() : colRect.y()) - logicalLeftOffsetForContent();
- LayoutSize offset = isHorizontalWritingMode() ? LayoutSize(logicalLeftOffset, currLogicalTopOffset) : LayoutSize(currLogicalTopOffset, logicalLeftOffset);
- if (colInfo->progressionAxis() == ColumnInfo::BlockAxis) {
- if (isHorizontalWritingMode())
- offset.expand(0, colRect.y() - borderTop() - paddingTop());
- else
- offset.expand(colRect.x() - borderLeft() - paddingLeft(), 0);
- }
- colRect.moveBy(paintOffset);
- PaintInfo info(paintInfo);
- info.rect.intersect(enclosingIntRect(colRect));
-
- if (!info.rect.isEmpty()) {
- GraphicsContextStateSaver stateSaver(*context);
- LayoutRect clipRect(colRect);
-
- if (i < colCount - 1) {
- if (isHorizontalWritingMode())
- clipRect.expand(colGap / 2, 0);
- else
- clipRect.expand(0, colGap / 2);
- }
- // Each strip pushes a clip, since column boxes are specified as being
- // like overflow:hidden.
- // FIXME: Content and column rules that extend outside column boxes at the edges of the multi-column element
- // are clipped according to the 'overflow' property.
- context->clip(enclosingIntRect(clipRect));
-
- // Adjust our x and y when painting.
- LayoutPoint adjustedPaintOffset = paintOffset + offset;
- if (paintingFloats)
- paintFloats(info, adjustedPaintOffset, paintInfo.phase == PaintPhaseSelection || paintInfo.phase == PaintPhaseTextClip);
- else
- paintContents(info, adjustedPaintOffset);
- }
-
- LayoutUnit blockDelta = (isHorizontalWritingMode() ? colRect.height() : colRect.width());
- if (style()->isFlippedBlocksWritingMode())
- currLogicalTopOffset += blockDelta;
- else
- currLogicalTopOffset -= blockDelta;
- }
-}
-
-void RenderBlock::paintContents(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
-{
- // Avoid painting descendants of the root element when stylesheets haven't loaded. This eliminates FOUC.
- // It's ok not to draw, because later on, when all the stylesheets do load, styleResolverChanged() on the Document
- // will do a full paint invalidation.
- if (document().didLayoutWithPendingStylesheets() && !isRenderView())
- return;
-
- if (childrenInline())
- m_lineBoxes.paint(this, paintInfo, paintOffset);
- else {
- PaintPhase newPhase = (paintInfo.phase == PaintPhaseChildOutlines) ? PaintPhaseOutline : paintInfo.phase;
- newPhase = (newPhase == PaintPhaseChildBlockBackgrounds) ? PaintPhaseChildBlockBackground : newPhase;
-
- // We don't paint our own background, but we do let the kids paint their backgrounds.
- PaintInfo paintInfoForChild(paintInfo);
- paintInfoForChild.phase = newPhase;
- paintInfoForChild.updatePaintingRootForChildren(this);
- paintChildren(paintInfoForChild, paintOffset);
- }
+ BlockPainter(*this).paint(paintInfo, paintOffset);
}
void RenderBlock::paintChildren(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
- for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox())
- paintChild(child, paintInfo, paintOffset);
-}
-
-void RenderBlock::paintChild(RenderBox* child, PaintInfo& paintInfo, const LayoutPoint& paintOffset)
-{
- LayoutPoint childPoint = flipForWritingModeForChild(child, paintOffset);
- if (!child->hasSelfPaintingLayer() && !child->isFloating())
- child->paint(paintInfo, childPoint);
-}
-
-void RenderBlock::paintChildAsInlineBlock(RenderBox* child, PaintInfo& paintInfo, const LayoutPoint& paintOffset)
-{
- LayoutPoint childPoint = flipForWritingModeForChild(child, paintOffset);
- if (!child->hasSelfPaintingLayer() && !child->isFloating())
- paintAsInlineBlock(child, paintInfo, childPoint);
-}
-
-void RenderBlock::paintAsInlineBlock(RenderObject* renderer, PaintInfo& paintInfo, const LayoutPoint& childPoint)
-{
- if (paintInfo.phase != PaintPhaseForeground && paintInfo.phase != PaintPhaseSelection)
- return;
-
- // Paint all phases atomically, as though the element established its own
- // stacking context. (See Appendix E.2, section 7.2.1.4 on
- // inline block/table/replaced elements in the CSS2.1 specification.)
- // This is also used by other elements (e.g. flex items and grid items).
- bool preservePhase = paintInfo.phase == PaintPhaseSelection || paintInfo.phase == PaintPhaseTextClip;
- PaintInfo info(paintInfo);
- info.phase = preservePhase ? paintInfo.phase : PaintPhaseBlockBackground;
- renderer->paint(info, childPoint);
- if (!preservePhase) {
- info.phase = PaintPhaseChildBlockBackgrounds;
- renderer->paint(info, childPoint);
- info.phase = PaintPhaseFloat;
- renderer->paint(info, childPoint);
- info.phase = PaintPhaseForeground;
- renderer->paint(info, childPoint);
- info.phase = PaintPhaseOutline;
- renderer->paint(info, childPoint);
- }
-}
-
-static inline bool caretBrowsingEnabled(const Frame* frame)
-{
- Settings* settings = frame->settings();
- return settings && settings->caretBrowsingEnabled();
-}
-
-static inline bool hasCursorCaret(const FrameSelection& selection, const RenderBlock* block, bool caretBrowsing)
-{
- return selection.caretRenderer() == block && (selection.hasEditableStyle() || caretBrowsing);
-}
-
-static inline bool hasDragCaret(const DragCaretController& dragCaretController, const RenderBlock* block, bool caretBrowsing)
-{
- return dragCaretController.caretRenderer() == block && (dragCaretController.isContentEditable() || caretBrowsing);
-}
-
-bool RenderBlock::hasCaret() const
-{
- bool caretBrowsing = caretBrowsingEnabled(frame());
- return hasCursorCaret(frame()->selection(), this, caretBrowsing)
- || hasDragCaret(frame()->page()->dragCaretController(), this, caretBrowsing);
-}
-
-void RenderBlock::paintCarets(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
-{
- bool caretBrowsing = caretBrowsingEnabled(frame());
-
- FrameSelection& selection = frame()->selection();
- if (hasCursorCaret(selection, this, caretBrowsing)) {
- selection.paintCaret(paintInfo.context, paintOffset, paintInfo.rect);
- }
-
- DragCaretController& dragCaretController = frame()->page()->dragCaretController();
- if (hasDragCaret(dragCaretController, this, caretBrowsing)) {
- dragCaretController.paintDragCaret(frame(), paintInfo.context, paintOffset, paintInfo.rect);
- }
+ BlockPainter(*this).paintChildren(paintInfo, paintOffset);
}
void RenderBlock::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
{
- PaintPhase paintPhase = paintInfo.phase;
-
- // Adjust our painting position if we're inside a scrolled layer (e.g., an overflow:auto div).
- LayoutPoint scrolledOffset = paintOffset;
- if (hasOverflowClip())
- scrolledOffset.move(-scrolledContentOffset());
-
- // 1. paint background, borders etc
- if ((paintPhase == PaintPhaseBlockBackground || paintPhase == PaintPhaseChildBlockBackground) && style()->visibility() == VISIBLE) {
- if (hasBoxDecorationBackground())
- paintBoxDecorationBackground(paintInfo, paintOffset);
- if (hasColumns() && !paintInfo.paintRootBackgroundOnly())
- paintColumnRules(paintInfo, scrolledOffset);
- }
-
- if (paintPhase == PaintPhaseMask && style()->visibility() == VISIBLE) {
- paintMask(paintInfo, paintOffset);
- return;
- }
-
- if (paintPhase == PaintPhaseClippingMask && style()->visibility() == VISIBLE) {
- paintClippingMask(paintInfo, paintOffset);
- return;
- }
-
- // We're done. We don't bother painting any children.
- if (paintPhase == PaintPhaseBlockBackground || paintInfo.paintRootBackgroundOnly())
- return;
-
- // 2. paint contents
- if (paintPhase != PaintPhaseSelfOutline) {
- if (hasColumns())
- paintColumnContents(paintInfo, scrolledOffset);
- else
- paintContents(paintInfo, scrolledOffset);
- }
-
- // 3. paint selection
- // FIXME: Make this work with multi column layouts. For now don't fill gaps.
- bool isPrinting = document().printing();
- if (!isPrinting && !hasColumns())
- paintSelection(paintInfo, scrolledOffset); // Fill in gaps in selection on lines and between blocks.
-
- // 4. paint floats.
- if (paintPhase == PaintPhaseFloat || paintPhase == PaintPhaseSelection || paintPhase == PaintPhaseTextClip) {
- if (hasColumns())
- paintColumnContents(paintInfo, scrolledOffset, true);
- else
- paintFloats(paintInfo, scrolledOffset, paintPhase == PaintPhaseSelection || paintPhase == PaintPhaseTextClip);
- }
-
- // 5. paint outline.
- if ((paintPhase == PaintPhaseOutline || paintPhase == PaintPhaseSelfOutline) && style()->hasOutline() && style()->visibility() == VISIBLE) {
- // Don't paint focus ring for anonymous block continuation because the
- // inline element having outline-style:auto paints the whole focus ring.
- if (!style()->outlineStyleIsAuto() || !isAnonymousBlockContinuation())
- paintOutline(paintInfo, LayoutRect(paintOffset, size()));
- }
-
- // 6. paint continuation outlines.
- if ((paintPhase == PaintPhaseOutline || paintPhase == PaintPhaseChildOutlines))
- paintContinuationOutlines(paintInfo, paintOffset);
-
- // 7. paint caret.
- // If the caret's node's render object's containing block is this block, and the paint action is PaintPhaseForeground,
- // then paint the caret.
- if (paintPhase == PaintPhaseForeground)
- paintCarets(paintInfo, paintOffset);
+ BlockPainter(*this).paintObject(paintInfo, paintOffset);
}
RenderInline* RenderBlock::inlineElementContinuation() const
@@ -2140,7 +1787,7 @@ RenderBlock* RenderBlock::blockElementContinuation() const
return nextContinuation;
}
-static ContinuationOutlineTableMap* continuationOutlineTable()
+ContinuationOutlineTableMap* continuationOutlineTable()
{
DEFINE_STATIC_LOCAL(ContinuationOutlineTableMap, table, ());
return &table;
@@ -2162,65 +1809,6 @@ void RenderBlock::addContinuationWithOutline(RenderInline* flow)
continuations->add(flow);
}
-bool RenderBlock::paintsContinuationOutline(RenderInline* flow)
-{
- ContinuationOutlineTableMap* table = continuationOutlineTable();
- if (table->isEmpty())
- return false;
-
- ListHashSet<RenderInline*>* continuations = table->get(this);
- if (!continuations)
- return false;
-
- return continuations->contains(flow);
-}
-
-void RenderBlock::paintContinuationOutlines(PaintInfo& info, const LayoutPoint& paintOffset)
-{
- RenderInline* inlineCont = inlineElementContinuation();
- if (inlineCont && inlineCont->style()->hasOutline() && inlineCont->style()->visibility() == VISIBLE) {
- RenderInline* inlineRenderer = toRenderInline(inlineCont->node()->renderer());
- RenderBlock* cb = containingBlock();
-
- bool inlineEnclosedInSelfPaintingLayer = false;
- for (RenderBoxModelObject* box = inlineRenderer; box != cb; box = box->parent()->enclosingBoxModelObject()) {
- if (box->hasSelfPaintingLayer()) {
- inlineEnclosedInSelfPaintingLayer = true;
- break;
- }
- }
-
- // Do not add continuations for outline painting by our containing block if we are a relative positioned
- // anonymous block (i.e. have our own layer), paint them straightaway instead. This is because a block depends on renderers in its continuation table being
- // in the same layer.
- if (!inlineEnclosedInSelfPaintingLayer && !hasLayer())
- cb->addContinuationWithOutline(inlineRenderer);
- else if (!inlineRenderer->firstLineBox() || (!inlineEnclosedInSelfPaintingLayer && hasLayer()))
- inlineRenderer->paintOutline(info, paintOffset - locationOffset() + inlineRenderer->containingBlock()->location());
- }
-
- ContinuationOutlineTableMap* table = continuationOutlineTable();
- if (table->isEmpty())
- return;
-
- OwnPtr<ListHashSet<RenderInline*> > continuations = table->take(this);
- if (!continuations)
- return;
-
- LayoutPoint accumulatedPaintOffset = paintOffset;
- // Paint each continuation outline.
- ListHashSet<RenderInline*>::iterator end = continuations->end();
- for (ListHashSet<RenderInline*>::iterator it = continuations->begin(); it != end; ++it) {
- // Need to add in the coordinates of the intervening blocks.
- RenderInline* flow = *it;
- RenderBlock* block = flow->containingBlock();
- for ( ; block && block != this; block = block->containingBlock())
- accumulatedPaintOffset.moveBy(block->location());
- ASSERT(block);
- flow->paintOutline(info, accumulatedPaintOffset);
- }
-}
-
bool RenderBlock::shouldPaintSelectionGaps() const
{
return selectionState() != SelectionNone && style()->visibility() == VISIBLE && isSelectionRoot();
@@ -2273,30 +1861,6 @@ GapRects RenderBlock::selectionGapRectsForPaintInvalidation(const RenderLayerMod
return selectionGaps(this, offsetFromPaintInvalidationContainer, IntSize(), lastTop, lastLeft, lastRight);
}
-void RenderBlock::paintSelection(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
-{
- if (shouldPaintSelectionGaps() && paintInfo.phase == PaintPhaseForeground) {
- LayoutUnit lastTop = 0;
- LayoutUnit lastLeft = logicalLeftSelectionOffset(this, lastTop);
- LayoutUnit lastRight = logicalRightSelectionOffset(this, lastTop);
- GraphicsContextStateSaver stateSaver(*paintInfo.context);
-
- LayoutRect gapRectsBounds = selectionGaps(this, paintOffset, LayoutSize(), lastTop, lastLeft, lastRight, &paintInfo);
- if (!gapRectsBounds.isEmpty()) {
- RenderLayer* layer = enclosingLayer();
- gapRectsBounds.moveBy(-paintOffset);
- if (!hasLayer()) {
- LayoutRect localBounds(gapRectsBounds);
- flipForWritingMode(localBounds);
- gapRectsBounds = localToContainerQuad(FloatRect(localBounds), layer->renderer()).enclosingBoundingBox();
- if (layer->renderer()->hasOverflowClip())
- gapRectsBounds.move(layer->renderBox()->scrolledContentOffset());
- }
- layer->addBlockSelectionGapsBounds(gapRectsBounds);
- }
- }
-}
-
static void clipOutPositionedObjects(const PaintInfo* paintInfo, const LayoutPoint& offset, TrackedRendererListHashSet* positionedObjects)
{
if (!positionedObjects)
@@ -4803,6 +4367,19 @@ void RenderBlock::checkPositionedObjectsNeedLayout()
}
}
+bool RenderBlock::paintsContinuationOutline(RenderInline* flow)
+{
+ ContinuationOutlineTableMap* table = continuationOutlineTable();
+ if (table->isEmpty())
+ return false;
+
+ ListHashSet<RenderInline*>* continuations = table->get(this);
+ if (!continuations)
+ return false;
+
+ return continuations->contains(flow);
+}
+
#endif
#ifndef NDEBUG
« no previous file with comments | « Source/core/rendering/RenderBlock.h ('k') | Source/core/rendering/RenderBox.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698