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

Side by Side Diff: Source/core/paint/LayerPainter.cpp

Issue 478333002: hasDescendantWithBlendMode should not be propagated outside the current stacking context. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 6 years, 2 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 unified diff | Download patch
« no previous file with comments | « PerformanceTests/Blending/resources/framerate.js ('k') | Source/core/rendering/RenderLayer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 #include "core/paint/LayerPainter.h" 6 #include "core/paint/LayerPainter.h"
7 7
8 #include "core/frame/Settings.h" 8 #include "core/frame/Settings.h"
9 #include "core/page/Page.h" 9 #include "core/page/Page.h"
10 #include "core/rendering/ClipPathOperation.h" 10 #include "core/rendering/ClipPathOperation.h"
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 LayerPainter(*m_renderLayer.parent()).restoreClip(context, paintingI nfo.paintDirtyRect, clipRect); 108 LayerPainter(*m_renderLayer.parent()).restoreClip(context, paintingI nfo.paintDirtyRect, clipRect);
109 109
110 return; 110 return;
111 } 111 }
112 112
113 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); 113 paintLayerContentsAndReflection(context, paintingInfo, paintFlags);
114 } 114 }
115 115
116 void LayerPainter::beginTransparencyLayers(GraphicsContext* context, const Rende rLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelA ccumulation, PaintBehavior paintBehavior) 116 void LayerPainter::beginTransparencyLayers(GraphicsContext* context, const Rende rLayer* rootLayer, const LayoutRect& paintDirtyRect, const LayoutSize& subPixelA ccumulation, PaintBehavior paintBehavior)
117 { 117 {
118 bool createTransparencyLayerForBlendMode = m_renderLayer.stackingNode()->isS tackingContext() && m_renderLayer.hasDescendantWithBlendMode(); 118 bool createTransparencyLayerForBlendMode = m_renderLayer.stackingNode()->isS tackingContext() && m_renderLayer.hasNonIsolatedDescendantWithBlendMode();
119 if ((m_renderLayer.paintsWithTransparency(paintBehavior) || m_renderLayer.pa intsWithBlendMode() || createTransparencyLayerForBlendMode) && m_renderLayer.use dTransparency()) 119 if ((m_renderLayer.paintsWithTransparency(paintBehavior) || m_renderLayer.pa intsWithBlendMode() || createTransparencyLayerForBlendMode) && m_renderLayer.use dTransparency())
120 return; 120 return;
121 121
122 RenderLayer* ancestor = m_renderLayer.transparentPaintingAncestor(); 122 RenderLayer* ancestor = m_renderLayer.transparentPaintingAncestor();
123 if (ancestor) 123 if (ancestor)
124 LayerPainter(*ancestor).beginTransparencyLayers(context, rootLayer, pain tDirtyRect, subPixelAccumulation, paintBehavior); 124 LayerPainter(*ancestor).beginTransparencyLayers(context, rootLayer, pain tDirtyRect, subPixelAccumulation, paintBehavior);
125 125
126 if (m_renderLayer.paintsWithTransparency(paintBehavior) || m_renderLayer.pai ntsWithBlendMode() || createTransparencyLayerForBlendMode) { 126 if (m_renderLayer.paintsWithTransparency(paintBehavior) || m_renderLayer.pai ntsWithBlendMode() || createTransparencyLayerForBlendMode) {
127 m_renderLayer.setUsedTransparency(true); 127 m_renderLayer.setUsedTransparency(true);
128 context->save(); 128 context->save();
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 paintingInfo.paintDirtyRect, context, clipperState)) { 240 paintingInfo.paintDirtyRect, context, clipperState)) {
241 // No need to post-apply the clipper if this failed. 241 // No need to post-apply the clipper if this failed.
242 resourceClipper = 0; 242 resourceClipper = 0;
243 } 243 }
244 } 244 }
245 } 245 }
246 } 246 }
247 247
248 // Blending operations must be performed only with the nearest ancestor stac king context. 248 // Blending operations must be performed only with the nearest ancestor stac king context.
249 // Note that there is no need to create a transparency layer if we're painti ng the root. 249 // Note that there is no need to create a transparency layer if we're painti ng the root.
250 bool createTransparencyLayerForBlendMode = !m_renderLayer.renderer()->isDocu mentElement() && m_renderLayer.stackingNode()->isStackingContext() && m_renderLa yer.hasDescendantWithBlendMode(); 250 bool createTransparencyLayerForBlendMode = !m_renderLayer.renderer()->isDocu mentElement() && m_renderLayer.stackingNode()->isStackingContext() && m_renderLa yer.hasNonIsolatedDescendantWithBlendMode();
251 251
252 if (createTransparencyLayerForBlendMode) 252 if (createTransparencyLayerForBlendMode)
253 beginTransparencyLayers(context, paintingInfo.rootLayer, paintingInfo.pa intDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior); 253 beginTransparencyLayers(context, paintingInfo.rootLayer, paintingInfo.pa intDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior);
254 254
255 LayerPaintingInfo localPaintingInfo(paintingInfo); 255 LayerPaintingInfo localPaintingInfo(paintingInfo);
256 bool haveFilterEffect = m_renderLayer.filterRenderer() && m_renderLayer.pain tsWithFilters(); 256 bool haveFilterEffect = m_renderLayer.filterRenderer() && m_renderLayer.pain tsWithFilters();
257 257
258 LayerFragments layerFragments; 258 LayerFragments layerFragments;
259 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) { 259 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) {
260 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment, as well as whether or not the content of each 260 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment, as well as whether or not the content of each
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 clipRect.intersect(parentClipRect); 841 clipRect.intersect(parentClipRect);
842 } 842 }
843 843
844 LayerPainter(*m_renderLayer.parent()).clipToRect(paintingInfo, context, clipRect, paintFlags); 844 LayerPainter(*m_renderLayer.parent()).clipToRect(paintingInfo, context, clipRect, paintFlags);
845 paintLayerByApplyingTransform(context, paintingInfo, paintFlags, fragmen t.paginationOffset); 845 paintLayerByApplyingTransform(context, paintingInfo, paintFlags, fragmen t.paginationOffset);
846 LayerPainter(*m_renderLayer.parent()).restoreClip(context, paintingInfo. paintDirtyRect, clipRect); 846 LayerPainter(*m_renderLayer.parent()).restoreClip(context, paintingInfo. paintDirtyRect, clipRect);
847 } 847 }
848 } 848 }
849 849
850 } // namespace blink 850 } // namespace blink
OLDNEW
« no previous file with comments | « PerformanceTests/Blending/resources/framerate.js ('k') | Source/core/rendering/RenderLayer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698