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

Unified Diff: Source/core/paint/ClipRecorder.cpp

Issue 744163002: Enable fast/images with slimming paint (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix compile Created 6 years, 1 month 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
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

Powered by Google App Engine
This is Rietveld 408576698