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

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

Issue 801053005: [New Multicolumn] Render transformed layers into multiple fragments. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 11 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 | « Source/core/paint/LayerPainter.h ('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/paint/FilterPainter.h" 10 #include "core/paint/FilterPainter.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 78
79 // PaintLayerAppliedTransform is used in RenderReplica, to avoid applying th e transform twice. 79 // PaintLayerAppliedTransform is used in RenderReplica, to avoid applying th e transform twice.
80 if (m_renderLayer.paintsWithTransform(paintingInfo.paintBehavior) && !(paint Flags & PaintLayerAppliedTransform)) { 80 if (m_renderLayer.paintsWithTransform(paintingInfo.paintBehavior) && !(paint Flags & PaintLayerAppliedTransform)) {
81 paintLayerWithTransform(context, paintingInfo, paintFlags); 81 paintLayerWithTransform(context, paintingInfo, paintFlags);
82 return; 82 return;
83 } 83 }
84 84
85 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); 85 paintLayerContentsAndReflection(context, paintingInfo, paintFlags);
86 } 86 }
87 87
88 void LayerPainter::paintLayerContentsAndReflection(GraphicsContext* context, con st LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 88 void LayerPainter::paintLayerContentsAndReflection(GraphicsContext* context, con st LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags, FragmentPolicy f ragmentPolicy)
89 { 89 {
90 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL ayerDescendant()); 90 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL ayerDescendant());
91 91
92 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform) ; 92 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform) ;
93 93
94 // Paint the reflection first if we have one. 94 // Paint the reflection first if we have one.
95 if (m_renderLayer.reflectionInfo()) 95 if (m_renderLayer.reflectionInfo())
96 m_renderLayer.reflectionInfo()->paint(context, paintingInfo, localPaintF lags | PaintLayerPaintingReflection); 96 m_renderLayer.reflectionInfo()->paint(context, paintingInfo, localPaintF lags | PaintLayerPaintingReflection);
97 97
98 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; 98 localPaintFlags |= PaintLayerPaintingCompositingAllPhases;
99 paintLayerContents(context, paintingInfo, localPaintFlags); 99 paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolicy);
100 } 100 }
101 101
102 class ClipPathHelper { 102 class ClipPathHelper {
103 public: 103 public:
104 ClipPathHelper(GraphicsContext* context, const RenderLayer& renderLayer, con st LayerPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRe lativeBoundsComputed, 104 ClipPathHelper(GraphicsContext* context, const RenderLayer& renderLayer, con st LayerPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRe lativeBoundsComputed,
105 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) 105 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags)
106 : m_resourceClipper(0), m_clipStateSaver(*context, false), m_renderLayer (renderLayer), m_context(context) 106 : m_resourceClipper(0), m_clipStateSaver(*context, false), m_renderLayer (renderLayer), m_context(context)
107 { 107 {
108 RenderStyle* style = renderLayer.renderer()->style(); 108 RenderStyle* style = renderLayer.renderer()->style();
109 109
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 m_resourceClipper->postApplyStatefulResource(m_renderLayer.renderer( ), m_context, m_clipperState); 158 m_resourceClipper->postApplyStatefulResource(m_renderLayer.renderer( ), m_context, m_clipperState);
159 } 159 }
160 private: 160 private:
161 RenderSVGResourceClipper* m_resourceClipper; 161 RenderSVGResourceClipper* m_resourceClipper;
162 GraphicsContextStateSaver m_clipStateSaver; 162 GraphicsContextStateSaver m_clipStateSaver;
163 RenderSVGResourceClipper::ClipperState m_clipperState; 163 RenderSVGResourceClipper::ClipperState m_clipperState;
164 const RenderLayer& m_renderLayer; 164 const RenderLayer& m_renderLayer;
165 GraphicsContext* m_context; 165 GraphicsContext* m_context;
166 }; 166 };
167 167
168 void LayerPainter::paintLayerContents(GraphicsContext* context, const LayerPaint ingInfo& paintingInfo, PaintLayerFlags paintFlags) 168 void LayerPainter::paintLayerContents(GraphicsContext* context, const LayerPaint ingInfo& paintingInfo, PaintLayerFlags paintFlags, FragmentPolicy fragmentPolicy )
169 { 169 {
170 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL ayerDescendant()); 170 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL ayerDescendant());
171 ASSERT(!(paintFlags & PaintLayerAppliedTransform)); 171 ASSERT(!(paintFlags & PaintLayerAppliedTransform));
172 172
173 bool isSelfPaintingLayer = m_renderLayer.isSelfPaintingLayer(); 173 bool isSelfPaintingLayer = m_renderLayer.isSelfPaintingLayer();
174 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr ollbars; 174 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr ollbars;
175 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing ScrollingPhase; 175 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing ScrollingPhase;
176 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi tingForegroundPhase; 176 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi tingForegroundPhase;
177 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi tingBackgroundPhase; 177 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi tingBackgroundPhase;
178 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon tents; 178 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon tents;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 219
220 transparencyRecorder = adoptPtr(new TransparencyRecorder(context, m_rend erLayer.renderer()->displayItemClient(), 220 transparencyRecorder = adoptPtr(new TransparencyRecorder(context, m_rend erLayer.renderer()->displayItemClient(),
221 context->compositeOperation(), m_renderLayer.renderer()->style()->bl endMode(), m_renderLayer.renderer()->opacity(), context->compositeOperation())); 221 context->compositeOperation(), m_renderLayer.renderer()->style()->bl endMode(), m_renderLayer.renderer()->opacity(), context->compositeOperation()));
222 } 222 }
223 223
224 LayerPaintingInfo localPaintingInfo(paintingInfo); 224 LayerPaintingInfo localPaintingInfo(paintingInfo);
225 225
226 LayerFragments layerFragments; 226 LayerFragments layerFragments;
227 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) { 227 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars) {
228 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment. 228 // Collect the fragments. This will compute the clip rectangles and pain t offsets for each layer fragment.
229 m_renderLayer.collectFragments(layerFragments, localPaintingInfo.rootLay er, localPaintingInfo.paintDirtyRect, 229 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects ) ? UncachedClipRects : PaintingClipRects;
230 (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : Pai ntingClipRects, IgnoreOverlayScrollbarSize, 230 ShouldRespectOverflowClip respectOverflowClip = shouldRespectOverflowCli p(paintFlags, m_renderLayer.renderer());
231 shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()), &of fsetFromRoot, localPaintingInfo.subPixelAccumulation); 231 if (fragmentPolicy == ForceSingleFragment)
232 m_renderLayer.appendSingleFragmentIgnoringPagination(layerFragments, localPaintingInfo.rootLayer, localPaintingInfo.paintDirtyRect, cacheSlot, Ignor eOverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, localPaintingInfo.s ubPixelAccumulation);
233 else
234 m_renderLayer.collectFragments(layerFragments, localPaintingInfo.roo tLayer, localPaintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, localPaintingInfo.subPixelAccumulation);
232 if (shouldPaintContent) 235 if (shouldPaintContent)
233 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra gments, localPaintingInfo, paintFlags, offsetFromRoot); 236 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra gments, localPaintingInfo, paintFlags, offsetFromRoot);
234 } 237 }
235 238
236 bool selectionOnly = localPaintingInfo.paintBehavior & PaintBehaviorSelectio nOnly; 239 bool selectionOnly = localPaintingInfo.paintBehavior & PaintBehaviorSelectio nOnly;
237 // If this layer's renderer is a child of the paintingRoot, we render uncond itionally, which 240 // If this layer's renderer is a child of the paintingRoot, we render uncond itionally, which
238 // is done by passing a nil paintingRoot down to our renderer (as if no pain tingRoot was ever set). 241 // is done by passing a nil paintingRoot down to our renderer (as if no pain tingRoot was ever set).
239 // Else, our renderer tree may or may not contain the painting root, so we p ass that root along 242 // Else, our renderer tree may or may not contain the painting root, so we p ass that root along
240 // so it will be tested against as we descend through the renderers. 243 // so it will be tested against as we descend through the renderers.
241 RenderObject* paintingRootForRenderer = 0; 244 RenderObject* paintingRootForRenderer = 0;
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 if (parentLayer) { 371 if (parentLayer) {
369 ClipRect clipRectForFragment(clipRect); 372 ClipRect clipRectForFragment(clipRect);
370 clipRectForFragment.moveBy(fragment.paginationOffset); 373 clipRectForFragment.moveBy(fragment.paginationOffset);
371 clipRectForFragment.intersect(fragment.backgroundRect); 374 clipRectForFragment.intersect(fragment.backgroundRect);
372 if (clipRectForFragment.isEmpty()) 375 if (clipRectForFragment.isEmpty())
373 continue; 376 continue;
374 if (needsToClip(paintingInfo, clipRectForFragment)) 377 if (needsToClip(paintingInfo, clipRectForFragment))
375 clipRecorder = adoptPtr(new LayerClipRecorder(parentLayer->rende rer(), context, DisplayItem::ClipLayerParent, clipRectForFragment, &paintingInfo , fragment.paginationOffset, paintFlags)); 378 clipRecorder = adoptPtr(new LayerClipRecorder(parentLayer->rende rer(), context, DisplayItem::ClipLayerParent, clipRectForFragment, &paintingInfo , fragment.paginationOffset, paintFlags));
376 } 379 }
377 380
378 paintFragmentByApplyingTransform(context, paintingInfo, paintFlags, frag ment.paginationOffset); 381 paintFragmentByApplyingTransform(context, paintingInfo, paintFlags, frag ment.paginationOffset);
chrishtr 2015/01/15 18:49:47 It looks like a bunch of the complexity in this CL
mstensho (USE GERRIT) 2015/01/15 20:36:47 Sorry, I'm not sure if I understand. This CL isn't
379 } 382 }
380 } 383 }
381 384
382 void LayerPainter::paintFragmentByApplyingTransform(GraphicsContext* context, co nst LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags, const LayoutPoi nt& fragmentTranslation) 385 void LayerPainter::paintFragmentByApplyingTransform(GraphicsContext* context, co nst LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags, const LayoutPoi nt& fragmentTranslation)
383 { 386 {
384 // This involves subtracting out the position of the layer in our current co ordinate space, but preserving 387 // This involves subtracting out the position of the layer in our current co ordinate space, but preserving
385 // the accumulated error for sub-pixel layout. 388 // the accumulated error for sub-pixel layout.
386 LayoutPoint delta; 389 LayoutPoint delta;
387 m_renderLayer.convertToLayerCoords(paintingInfo.rootLayer, delta); 390 m_renderLayer.convertToLayerCoords(paintingInfo.rootLayer, delta);
388 delta.moveBy(fragmentTranslation); 391 delta.moveBy(fragmentTranslation);
389 TransformationMatrix transform(m_renderLayer.renderableTransform(paintingInf o.paintBehavior)); 392 TransformationMatrix transform(m_renderLayer.renderableTransform(paintingInf o.paintBehavior));
390 IntPoint roundedDelta = roundedIntPoint(delta); 393 IntPoint roundedDelta = roundedIntPoint(delta);
391 transform.translateRight(roundedDelta.x(), roundedDelta.y()); 394 transform.translateRight(roundedDelta.x(), roundedDelta.y());
392 LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation + (delta - roundedDelta); 395 LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation + (delta - roundedDelta);
393 396
394 TransformRecorder transformRecorder(*context, m_renderLayer.renderer()->disp layItemClient(), transform.toAffineTransform()); 397 TransformRecorder transformRecorder(*context, m_renderLayer.renderer()->disp layItemClient(), transform.toAffineTransform());
395 398
396 // Now do a paint with the root layer shifted to be us. 399 // Now do a paint with the root layer shifted to be us.
397 LayerPaintingInfo transformedPaintingInfo(&m_renderLayer, enclosingIntRect(t ransform.inverse().mapRect(paintingInfo.paintDirtyRect)), paintingInfo.paintBeha vior, 400 LayerPaintingInfo transformedPaintingInfo(&m_renderLayer, enclosingIntRect(t ransform.inverse().mapRect(paintingInfo.paintDirtyRect)), paintingInfo.paintBeha vior,
398 adjustedSubPixelAccumulation, paintingInfo.paintingRoot); 401 adjustedSubPixelAccumulation, paintingInfo.paintingRoot);
399 paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags ); 402 paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags , ForceSingleFragment);
chrishtr 2015/01/15 23:33:45 What I mean is that this call stack appears to be
mstensho (USE GERRIT) 2015/02/03 13:55:01 paintLayerWithTransform() collects fragment(s) for
400 } 403 }
401 404
402 void LayerPainter::paintChildren(unsigned childrenToVisit, GraphicsContext* cont ext, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 405 void LayerPainter::paintChildren(unsigned childrenToVisit, GraphicsContext* cont ext, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
403 { 406 {
404 if (!m_renderLayer.hasSelfPaintingLayerDescendant()) 407 if (!m_renderLayer.hasSelfPaintingLayerDescendant())
405 return; 408 return;
406 409
407 #if ENABLE(ASSERT) 410 #if ENABLE(ASSERT)
408 LayerListMutationDetector mutationChecker(m_renderLayer.stackingNode()); 411 LayerListMutationDetector mutationChecker(m_renderLayer.stackingNode());
409 #endif 412 #endif
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 if (!m_renderLayer.containsDirtyOverlayScrollbars()) 724 if (!m_renderLayer.containsDirtyOverlayScrollbars())
722 return; 725 return;
723 726
724 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot); 727 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot);
725 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); 728 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars);
726 729
727 m_renderLayer.setContainsDirtyOverlayScrollbars(false); 730 m_renderLayer.setContainsDirtyOverlayScrollbars(false);
728 } 731 }
729 732
730 } // namespace blink 733 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/rendering/RenderLayer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698