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

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

Issue 757183003: Revert of Enable fast/images with slimming paint (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 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
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/paint/TransparencyDisplayItem.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/paint/LayerPainter.cpp
diff --git a/Source/core/paint/LayerPainter.cpp b/Source/core/paint/LayerPainter.cpp
index 0d815861c0155c14512cbcb7dbb6f4b272e01af9..75b7acc4e7f73fd552822ee1503ecb3020268799 100644
--- a/Source/core/paint/LayerPainter.cpp
+++ b/Source/core/paint/LayerPainter.cpp
@@ -8,7 +8,6 @@
#include "core/frame/Settings.h"
#include "core/page/Page.h"
#include "core/paint/FilterPainter.h"
-#include "core/paint/LayerClipRecorder.h"
#include "core/paint/TransformDisplayItem.h"
#include "core/paint/TransparencyDisplayItem.h"
#include "core/rendering/ClipPathOperation.h"
@@ -79,6 +78,47 @@
paintLayerContentsAndReflection(context, paintingInfo, paintFlags);
}
+
+class TransparencyLayerHelper {
+public:
+ TransparencyLayerHelper(GraphicsContext* context, RenderLayer& renderLayer, const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelAccumulation, PaintBehavior paintBehavior)
+ : m_transparencyLayerInProgress(false)
+ , m_context(context)
+ , m_renderLayer(renderLayer)
+ {
+ // Blending operations must be performed only with the nearest ancestor stacking context.
+ // Note that there is no need to create a transparency layer if we're painting the root.
+ // FIXME: this should be unified further into RenderLayer::paintsWithTransparency().
+ bool shouldUseTransparencyLayerForBlendMode = !renderLayer.renderer()->isDocumentElement() && renderLayer.stackingNode()->isStackingContext() && renderLayer.hasNonIsolatedDescendantWithBlendMode();
+ if (!shouldUseTransparencyLayerForBlendMode && !renderLayer.paintsWithTransparency(paintBehavior))
+ return;
+
+ OwnPtr<BeginTransparencyDisplayItem> beginTransparencyDisplayItem = adoptPtr(new BeginTransparencyDisplayItem(
+ renderLayer.renderer(), DisplayItem::BeginTransparency, renderLayer.paintingExtent(rootLayer, paintDirtyRect, subPixelAccumulation, paintBehavior),
+ renderLayer.renderer()->style()->blendMode(), renderLayer.renderer()->opacity()));
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled())
+ renderLayer.renderer()->view()->viewDisplayList().add(beginTransparencyDisplayItem.release());
+ else
+ beginTransparencyDisplayItem->replay(context);
+
+ m_transparencyLayerInProgress = true;
+ }
+
+ ~TransparencyLayerHelper()
+ {
+ if (!m_transparencyLayerInProgress)
+ return;
+ OwnPtr<EndTransparencyDisplayItem> endTransparencyDisplayItem = adoptPtr(new EndTransparencyDisplayItem(m_renderLayer.renderer(), DisplayItem::EndTransparency));
+ if (RuntimeEnabledFeatures::slimmingPaintEnabled())
+ m_renderLayer.renderer()->view()->viewDisplayList().add(endTransparencyDisplayItem.release());
+ else
+ endTransparencyDisplayItem->replay(m_context);
+ }
+private:
+ bool m_transparencyLayerInProgress;
+ GraphicsContext* m_context;
+ const RenderLayer& m_renderLayer;
+};
void LayerPainter::paintLayerContentsAndReflection(GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
{
@@ -203,21 +243,7 @@
// These helpers output clip and transparency layers using a RAII pattern. Stack-allocated-varibles are destructed in the reverse order of construction,
// so they are nested properly.
ClipPathHelper clipPathHelper(context, m_renderLayer, paintingInfo, rootRelativeBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags);
-
- OwnPtr<TransparencyRecorder> transparencyRecorder;
- OwnPtr<LayerClipRecorder> clipRecorder;
- // Blending operations must be performed only with the nearest ancestor stacking context.
- // Note that there is no need to create a transparency layer if we're painting the root.
- // FIXME: this should be unified further into RenderLayer::paintsWithTransparency().
- bool shouldUseTransparencyLayerForBlendMode = !m_renderLayer.renderer()->isDocumentElement() && m_renderLayer.stackingNode()->isStackingContext() && m_renderLayer.hasNonIsolatedDescendantWithBlendMode();
- if (shouldUseTransparencyLayerForBlendMode || m_renderLayer.paintsWithTransparency(paintingInfo.paintBehavior)) {
- clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, DisplayItem::TransparencyClip,
- m_renderLayer.paintingExtent(paintingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior),
- &paintingInfo, LayoutPoint(), paintFlags));
-
- transparencyRecorder = adoptPtr(new TransparencyRecorder(context, m_renderLayer.renderer(), DisplayItem::BeginTransparency,
- m_renderLayer.renderer()->style()->blendMode(), m_renderLayer.renderer()->opacity()));
- }
+ TransparencyLayerHelper transparencyLayerHelper(context, m_renderLayer, paintingInfo.rootLayer, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior);
LayerPaintingInfo localPaintingInfo(paintingInfo);
@@ -362,7 +388,7 @@
}
for (const auto& fragment: fragments) {
- OwnPtr<LayerClipRecorder> clipRecorder;
+ OwnPtr<ClipRecorder> clipRecorder;
if (parentLayer) {
ClipRect clipRectForFragment(clipRect);
clipRectForFragment.moveBy(fragment.paginationOffset);
@@ -370,7 +396,7 @@
if (clipRectForFragment.isEmpty())
continue;
if (needsToClip(paintingInfo, clipRectForFragment))
- clipRecorder = adoptPtr(new LayerClipRecorder(parentLayer->renderer(), context, DisplayItem::ClipLayerParent, clipRectForFragment, &paintingInfo, fragment.paginationOffset, paintFlags));
+ clipRecorder = adoptPtr(new ClipRecorder(parentLayer->renderer(), context, DisplayItem::ClipLayerParent, clipRectForFragment, &paintingInfo, fragment.paginationOffset, paintFlags));
}
paintFragmentByApplyingTransform(context, paintingInfo, paintFlags, fragment.paginationOffset);
@@ -466,10 +492,10 @@
for (size_t i = 0; i < layerFragments.size(); ++i) {
const LayerFragment& fragment = layerFragments.at(i);
- OwnPtr<LayerClipRecorder> clipRecorder;
+ OwnPtr<ClipRecorder> clipRecorder;
if (needsToClip(localPaintingInfo, fragment.backgroundRect)) {
- clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, DisplayItem::ClipLayerOverflowControls, fragment.backgroundRect, &localPaintingInfo, fragment.paginationOffset, paintFlags));
+ clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), context, DisplayItem::ClipLayerOverflowControls, fragment.backgroundRect, &localPaintingInfo, fragment.paginationOffset, paintFlags));
}
if (RenderLayerScrollableArea* scrollableArea = m_renderLayer.scrollableArea())
scrollableArea->paintOverflowControls(context, roundedIntPoint(toPoint(fragment.layerBounds.location() - m_renderLayer.renderBoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulation, m_renderLayer.compositingState()))), pixelSnappedIntRect(fragment.backgroundRect.rect()), true);
@@ -618,9 +644,9 @@
void LayerPainter::paintFragmentWithPhase(PaintPhase phase, const LayerFragment& fragment, GraphicsContext* context, const ClipRect& clipRect, const LayerPaintingInfo& paintingInfo, PaintBehavior paintBehavior, RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags, ClipState clipState)
{
- OwnPtr<LayerClipRecorder> clipRecorder;
+ OwnPtr<ClipRecorder> clipRecorder;
if (clipState != HasClipped && paintingInfo.clipToDirtyRect && needsToClip(paintingInfo, clipRect)) {
- LayerClipRecorder::BorderRadiusClippingRule clippingRule = LayerClipRecorder::IncludeSelfForBorderRadius;
+ ClipRecorder::BorderRadiusClippingRule clippingRule = ClipRecorder::IncludeSelfForBorderRadius;
DisplayItem::Type clipType = DisplayItem::ClipLayerFragmentFloat;
switch (phase) {
case PaintPhaseFloat:
@@ -639,15 +665,15 @@
break;
case PaintPhaseBlockBackground:
clipType = DisplayItem::ClipLayerBackground;
- clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; // Background painting will handle clipping to self.
+ clippingRule = ClipRecorder::DoNotIncludeSelfForBorderRadius; // Background painting will handle clipping to self.
break;
case PaintPhaseSelfOutline:
clipType = DisplayItem::ClipLayerFragmentOutline;
- clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius;
+ clippingRule = ClipRecorder::DoNotIncludeSelfForBorderRadius;
break;
case PaintPhaseMask:
clipType = DisplayItem::ClipLayerFragmentMask;
- clippingRule = LayerClipRecorder::DoNotIncludeSelfForBorderRadius; // Mask painting will handle clipping to self.
+ clippingRule = ClipRecorder::DoNotIncludeSelfForBorderRadius; // Mask painting will handle clipping to self.
break;
case PaintPhaseClippingMask:
clipType = DisplayItem::ClipLayerFragmentClippingMask;
@@ -656,7 +682,7 @@
ASSERT_NOT_REACHED();
}
- clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, clipType, clipRect, &paintingInfo, fragment.paginationOffset, paintFlags, clippingRule));
+ clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), context, clipType, clipRect, &paintingInfo, fragment.paginationOffset, paintFlags, clippingRule));
}
PaintInfo paintInfo(context, pixelSnappedIntRect(clipRect.rect()), phase, paintBehavior, paintingRootForRenderer, 0, paintingInfo.rootLayer->renderer());
@@ -679,9 +705,9 @@
// Optimize clipping for the single fragment case.
bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() == 1 && !layerFragments[0].foregroundRect.isEmpty();
ClipState clipState = HasNotClipped;
- OwnPtr<LayerClipRecorder> clipRecorder;
+ OwnPtr<ClipRecorder> clipRecorder;
if (shouldClip && needsToClip(localPaintingInfo, layerFragments[0].foregroundRect)) {
- clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, DisplayItem::ClipLayerForeground, layerFragments[0].foregroundRect, &localPaintingInfo, layerFragments[0].paginationOffset, paintFlags));
+ clipRecorder = adoptPtr(new ClipRecorder(m_renderLayer.renderer(), context, DisplayItem::ClipLayerForeground, layerFragments[0].foregroundRect, &localPaintingInfo, layerFragments[0].paginationOffset, paintFlags));
clipState = HasClipped;
}
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/paint/TransparencyDisplayItem.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698