| Index: Source/core/paint/ClipRecorder.cpp
|
| diff --git a/Source/core/paint/ClipRecorder.cpp b/Source/core/paint/ClipRecorder.cpp
|
| index 5c2e696bd3bd547ed5b772bfc43cce85e125acee..7aa6bead920b2b5d5acf85c33507207e5bbbc2e7 100644
|
| --- a/Source/core/paint/ClipRecorder.cpp
|
| +++ b/Source/core/paint/ClipRecorder.cpp
|
| @@ -5,100 +5,75 @@
|
| #include "config.h"
|
| #include "core/paint/ClipRecorder.h"
|
|
|
| -#include "core/rendering/ClipRect.h"
|
| -#include "core/rendering/RenderLayer.h"
|
| +#include "core/paint/ViewDisplayList.h"
|
| +#include "core/rendering/PaintInfo.h"
|
| +#include "core/rendering/RenderLayerModelObject.h"
|
| #include "core/rendering/RenderView.h"
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| -#include "platform/geometry/IntRect.h"
|
| -#include "platform/graphics/GraphicsContext.h"
|
|
|
| namespace blink {
|
|
|
| -void ClipDisplayItem::replay(GraphicsContext* context)
|
| +ClipRecorder::ClipRecorder(RenderLayerModelObject& canvas, const PaintInfo& paintInfo, const LayoutRect& clipRect)
|
| + : m_clipRect(clipRect)
|
| + , m_paintInfo(paintInfo)
|
| + , m_canvas(canvas)
|
| {
|
| - context->save();
|
| - context->clip(m_clipRect);
|
| - for (RoundedRect roundedRect : m_roundedRectClips)
|
| - context->clipRoundedRect(roundedRect);
|
| -}
|
| + DisplayItem::Type type = paintPhaseToClipType(paintInfo.phase);
|
| + OwnPtr<ClipDisplayItem> clipDisplayItem = adoptPtr(new ClipDisplayItem(&m_canvas, type, pixelSnappedIntRect(clipRect)));
|
|
|
| -void EndClipDisplayItem::replay(GraphicsContext* context)
|
| -{
|
| - context->restore();
|
| -}
|
| -
|
| -ClipRecorder::ClipRecorder(const RenderLayerModelObject* renderer, GraphicsContext* graphicsContext, DisplayItem::Type clipType, const ClipRect& clipRect,
|
| - const LayerPaintingInfo* localPaintingInfo, const LayoutPoint& fragmentOffset, PaintLayerFlags paintFlags, BorderRadiusClippingRule rule)
|
| - : m_graphicsContext(graphicsContext)
|
| - , m_renderer(renderer)
|
| -{
|
| - IntRect snappedClipRect = pixelSnappedIntRect(clipRect.rect());
|
| - OwnPtr<ClipDisplayItem> clipDisplayItem = adoptPtr(new ClipDisplayItem(renderer, clipType, snappedClipRect));
|
| - if (localPaintingInfo && clipRect.hasRadius())
|
| - collectRoundedRectClips(*renderer->layer(), *localPaintingInfo, graphicsContext, fragmentOffset, paintFlags, rule, clipDisplayItem->roundedRectClips());
|
| - if (!RuntimeEnabledFeatures::slimmingPaintEnabled()) {
|
| - clipDisplayItem->replay(graphicsContext);
|
| - } else {
|
| - m_renderer->view()->viewDisplayList().add(clipDisplayItem.release());
|
| - }
|
| -}
|
| -
|
| -static bool inContainingBlockChain(RenderLayer* startLayer, RenderLayer* endLayer)
|
| -{
|
| - if (startLayer == endLayer)
|
| - return true;
|
| -
|
| - RenderView* view = startLayer->renderer()->view();
|
| - for (RenderBlock* currentBlock = startLayer->renderer()->containingBlock(); currentBlock && currentBlock != view; currentBlock = currentBlock->containingBlock()) {
|
| - if (currentBlock->layer() == endLayer)
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -void ClipRecorder::collectRoundedRectClips(RenderLayer& renderLayer, const LayerPaintingInfo& localPaintingInfo, GraphicsContext* context, const LayoutPoint& fragmentOffset, PaintLayerFlags paintFlags,
|
| - BorderRadiusClippingRule rule, Vector<RoundedRect>& roundedRectClips)
|
| -{
|
| - // If the clip rect has been tainted by a border radius, then we have to walk up our layer chain applying the clips from
|
| - // any layers with overflow. The condition for being able to apply these clips is that the overflow object be in our
|
| - // containing block chain so we check that also.
|
| - for (RenderLayer* layer = rule == IncludeSelfForBorderRadius ? &renderLayer : renderLayer.parent(); layer; layer = layer->parent()) {
|
| - // Composited scrolling layers handle border-radius clip in the compositor via a mask layer. We do not
|
| - // want to apply a border-radius clip to the layer contents itself, because that would require re-rastering
|
| - // every frame to update the clip. We only want to make sure that the mask layer is properly clipped so
|
| - // that it can in turn clip the scrolled contents in the compositor.
|
| - if (layer->needsCompositedScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))
|
| - break;
|
| -
|
| - if (layer->renderer()->hasOverflowClip() && layer->renderer()->style()->hasBorderRadius() && inContainingBlockChain(&renderLayer, layer)) {
|
| - LayoutPoint delta(fragmentOffset);
|
| - layer->convertToLayerCoords(localPaintingInfo.rootLayer, delta);
|
| - roundedRectClips.append(layer->renderer()->style()->getRoundedInnerBorderFor(LayoutRect(delta, LayoutSize(layer->size()))));
|
| - }
|
| -
|
| - if (layer == localPaintingInfo.rootLayer)
|
| - break;
|
| - }
|
| + if (RuntimeEnabledFeatures::slimmingPaintEnabled())
|
| + m_canvas.view()->viewDisplayList().add(clipDisplayItem.release());
|
| + else
|
| + clipDisplayItem->replay(paintInfo.context);
|
| }
|
|
|
| ClipRecorder::~ClipRecorder()
|
| {
|
| + OwnPtr<EndClipDisplayItem> endClipDisplayItem = adoptPtr(new EndClipDisplayItem(&m_canvas));
|
| +
|
| if (RuntimeEnabledFeatures::slimmingPaintEnabled()) {
|
| - OwnPtr<EndClipDisplayItem> endClip = adoptPtr(new EndClipDisplayItem(m_renderer));
|
| - m_renderer->view()->viewDisplayList().add(endClip.release());
|
| + m_canvas.view()->viewDisplayList().add(endClipDisplayItem.release());
|
| } else {
|
| - m_graphicsContext->restore();
|
| + endClipDisplayItem->replay(m_paintInfo.context);
|
| }
|
| }
|
|
|
| -#ifndef NDEBUG
|
| -WTF::String ClipDisplayItem::asDebugString() const
|
| +DisplayItem::Type ClipRecorder::paintPhaseToClipType(PaintPhase paintPhase)
|
| {
|
| - return String::format("{%s, type: \"%s\", clipRect: [%d,%d,%d,%d]}",
|
| - rendererDebugString(renderer()).utf8().data(), typeAsDebugString(type()).utf8().data(),
|
| - m_clipRect.x(), m_clipRect.y(), m_clipRect.width(), m_clipRect.height());
|
| + switch (paintPhase) {
|
| + case PaintPhaseChildBlockBackgrounds:
|
| + return DisplayItem::ClipBoxChildBlockBackgrounds;
|
| + break;
|
| + case PaintPhaseFloat:
|
| + return DisplayItem::ClipBoxFloat;
|
| + break;
|
| + case PaintPhaseForeground:
|
| + return DisplayItem::ClipBoxChildBlockBackgrounds;
|
| + break;
|
| + case PaintPhaseChildOutlines:
|
| + return DisplayItem::ClipBoxChildOutlines;
|
| + break;
|
| + case PaintPhaseSelection:
|
| + return DisplayItem::ClipBoxSelection;
|
| + break;
|
| + case PaintPhaseCollapsedTableBorders:
|
| + return DisplayItem::ClipBoxCollapsedTableBorders;
|
| + break;
|
| + case PaintPhaseTextClip:
|
| + return DisplayItem::ClipBoxTextClip;
|
| + break;
|
| + case PaintPhaseClippingMask:
|
| + return DisplayItem::ClipBoxClippingMask;
|
| + break;
|
| + case PaintPhaseChildBlockBackground:
|
| + case PaintPhaseOutline:
|
| + case PaintPhaseBlockBackground:
|
| + case PaintPhaseSelfOutline:
|
| + case PaintPhaseMask:
|
| + ASSERT_NOT_REACHED();
|
| + }
|
| + // This should never happen.
|
| + return DisplayItem::ClipBoxForeground;
|
| }
|
| -#endif
|
|
|
| } // namespace blink
|
|
|