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

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

Issue 898783003: Move rendering/RenderLayer* to layout/ (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/paint/PartPainter.cpp » ('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/layout/Layer.h"
9 #include "core/page/Page.h" 10 #include "core/page/Page.h"
10 #include "core/paint/CompositingRecorder.h" 11 #include "core/paint/CompositingRecorder.h"
11 #include "core/paint/FilterPainter.h" 12 #include "core/paint/FilterPainter.h"
12 #include "core/paint/LayerClipRecorder.h" 13 #include "core/paint/LayerClipRecorder.h"
13 #include "core/paint/ScrollableAreaPainter.h" 14 #include "core/paint/ScrollableAreaPainter.h"
14 #include "core/paint/Transform3DRecorder.h" 15 #include "core/paint/Transform3DRecorder.h"
15 #include "core/rendering/ClipPathOperation.h" 16 #include "core/rendering/ClipPathOperation.h"
16 #include "core/rendering/FilterEffectRenderer.h" 17 #include "core/rendering/FilterEffectRenderer.h"
17 #include "core/rendering/PaintInfo.h" 18 #include "core/rendering/PaintInfo.h"
18 #include "core/rendering/RenderBlock.h" 19 #include "core/rendering/RenderBlock.h"
19 #include "core/rendering/RenderLayer.h"
20 #include "core/rendering/RenderView.h" 20 #include "core/rendering/RenderView.h"
21 #include "core/rendering/svg/RenderSVGResourceClipper.h" 21 #include "core/rendering/svg/RenderSVGResourceClipper.h"
22 #include "platform/graphics/GraphicsLayer.h" 22 #include "platform/graphics/GraphicsLayer.h"
23 #include "platform/graphics/paint/ClipPathRecorder.h" 23 #include "platform/graphics/paint/ClipPathRecorder.h"
24 #include "platform/graphics/paint/CompositingDisplayItem.h" 24 #include "platform/graphics/paint/CompositingDisplayItem.h"
25 #include "platform/graphics/paint/DisplayItemList.h" 25 #include "platform/graphics/paint/DisplayItemList.h"
26 #include "platform/graphics/paint/Transform3DDisplayItem.h" 26 #include "platform/graphics/paint/Transform3DDisplayItem.h"
27 27
28 namespace blink { 28 namespace blink {
29 29
30 static inline bool shouldSuppressPaintingLayer(RenderLayer* layer) 30 static inline bool shouldSuppressPaintingLayer(Layer* layer)
31 { 31 {
32 // Avoid painting descendants of the root layer when stylesheets haven't loa ded. This eliminates FOUC. 32 // Avoid painting descendants of the root layer when stylesheets haven't loa ded. This eliminates FOUC.
33 // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document 33 // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document
34 // will do a full paintInvalidationForWholeRenderer(). 34 // will do a full paintInvalidationForWholeRenderer().
35 if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !laye r->isRootLayer() && !layer->renderer()->isDocumentElement()) 35 if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !laye r->isRootLayer() && !layer->renderer()->isDocumentElement())
36 return true; 36 return true;
37 37
38 return false; 38 return false;
39 } 39 }
40 40
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 // Paint the reflection first if we have one. 95 // Paint the reflection first if we have one.
96 if (m_renderLayer.reflectionInfo()) 96 if (m_renderLayer.reflectionInfo())
97 m_renderLayer.reflectionInfo()->paint(context, paintingInfo, localPaintF lags | PaintLayerPaintingReflection); 97 m_renderLayer.reflectionInfo()->paint(context, paintingInfo, localPaintF lags | PaintLayerPaintingReflection);
98 98
99 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; 99 localPaintFlags |= PaintLayerPaintingCompositingAllPhases;
100 paintLayerContents(context, paintingInfo, localPaintFlags); 100 paintLayerContents(context, paintingInfo, localPaintFlags);
101 } 101 }
102 102
103 class ClipPathHelper { 103 class ClipPathHelper {
104 public: 104 public:
105 ClipPathHelper(GraphicsContext* context, const RenderLayer& renderLayer, con st LayerPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRe lativeBoundsComputed, 105 ClipPathHelper(GraphicsContext* context, const Layer& renderLayer, const Lay erPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRelative BoundsComputed,
106 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) 106 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags)
107 : m_resourceClipper(0), m_clipStateSaver(*context, false), m_renderLayer (renderLayer), m_context(context) 107 : m_resourceClipper(0), m_clipStateSaver(*context, false), m_renderLayer (renderLayer), m_context(context)
108 { 108 {
109 const RenderStyle& style = renderLayer.renderer()->styleRef(); 109 const RenderStyle& style = renderLayer.renderer()->styleRef();
110 110
111 // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container. 111 // Clip-path, like border radius, must not be applied to the contents of a composited-scrolling container.
112 // It must, however, still be applied to the mask layer, so that the com positor can properly mask the 112 // It must, however, still be applied to the mask layer, so that the com positor can properly mask the
113 // scrolling contents and scrollbars. 113 // scrolling contents and scrollbars.
114 if (!renderLayer.renderer()->hasClipPath() || (renderLayer.needsComposit edScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase))) 114 if (!renderLayer.renderer()->hasClipPath() || (renderLayer.needsComposit edScrolling() && !(paintFlags & PaintLayerPaintingChildClippingMaskPhase)))
115 return; 115 return;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 ~ClipPathHelper() 156 ~ClipPathHelper()
157 { 157 {
158 if (m_resourceClipper) 158 if (m_resourceClipper)
159 m_resourceClipper->postApplyStatefulResource(m_renderLayer.renderer( ), m_context, m_clipperState); 159 m_resourceClipper->postApplyStatefulResource(m_renderLayer.renderer( ), m_context, m_clipperState);
160 } 160 }
161 private: 161 private:
162 RenderSVGResourceClipper* m_resourceClipper; 162 RenderSVGResourceClipper* m_resourceClipper;
163 GraphicsContextStateSaver m_clipStateSaver; 163 GraphicsContextStateSaver m_clipStateSaver;
164 OwnPtr<ClipPathRecorder> m_clipPathRecorder; 164 OwnPtr<ClipPathRecorder> m_clipPathRecorder;
165 RenderSVGResourceClipper::ClipperState m_clipperState; 165 RenderSVGResourceClipper::ClipperState m_clipperState;
166 const RenderLayer& m_renderLayer; 166 const Layer& m_renderLayer;
167 GraphicsContext* m_context; 167 GraphicsContext* m_context;
168 }; 168 };
169 169
170 void LayerPainter::paintLayerContents(GraphicsContext* context, const LayerPaint ingInfo& paintingInfo, PaintLayerFlags paintFlags) 170 void LayerPainter::paintLayerContents(GraphicsContext* context, const LayerPaint ingInfo& paintingInfo, PaintLayerFlags paintFlags)
171 { 171 {
172 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL ayerDescendant()); 172 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL ayerDescendant());
173 ASSERT(!(paintFlags & PaintLayerAppliedTransform)); 173 ASSERT(!(paintFlags & PaintLayerAppliedTransform));
174 174
175 bool isSelfPaintingLayer = m_renderLayer.isSelfPaintingLayer(); 175 bool isSelfPaintingLayer = m_renderLayer.isSelfPaintingLayer();
176 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr ollbars; 176 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr ollbars;
(...skipping 28 matching lines...) Expand all
205 bool rootRelativeBoundsComputed = false; 205 bool rootRelativeBoundsComputed = false;
206 206
207 // These helpers output clip and compositing operations using a RAII pattern . Stack-allocated-varibles are destructed in the reverse order of construction, 207 // These helpers output clip and compositing operations using a RAII pattern . Stack-allocated-varibles are destructed in the reverse order of construction,
208 // so they are nested properly. 208 // so they are nested properly.
209 ClipPathHelper clipPathHelper(context, m_renderLayer, paintingInfo, rootRela tiveBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags); 209 ClipPathHelper clipPathHelper(context, m_renderLayer, paintingInfo, rootRela tiveBounds, rootRelativeBoundsComputed, offsetFromRoot, paintFlags);
210 210
211 OwnPtr<CompositingRecorder> compositingRecorder; 211 OwnPtr<CompositingRecorder> compositingRecorder;
212 OwnPtr<LayerClipRecorder> clipRecorder; 212 OwnPtr<LayerClipRecorder> clipRecorder;
213 // Blending operations must be performed only with the nearest ancestor stac king context. 213 // Blending operations must be performed only with the nearest ancestor stac king context.
214 // Note that there is no need to composite if we're painting the root. 214 // Note that there is no need to composite if we're painting the root.
215 // FIXME: this should be unified further into RenderLayer::paintsWithTranspa rency(). 215 // FIXME: this should be unified further into Layer::paintsWithTransparency( ).
216 bool shouldCompositeForBlendMode = (!m_renderLayer.renderer()->isDocumentEle ment() || m_renderLayer.renderer()->isSVGRoot()) && m_renderLayer.stackingNode() ->isStackingContext() && m_renderLayer.hasNonIsolatedDescendantWithBlendMode(); 216 bool shouldCompositeForBlendMode = (!m_renderLayer.renderer()->isDocumentEle ment() || m_renderLayer.renderer()->isSVGRoot()) && m_renderLayer.stackingNode() ->isStackingContext() && m_renderLayer.hasNonIsolatedDescendantWithBlendMode();
217 if (shouldCompositeForBlendMode || m_renderLayer.paintsWithTransparency(pain tingInfo.paintBehavior)) { 217 if (shouldCompositeForBlendMode || m_renderLayer.paintsWithTransparency(pain tingInfo.paintBehavior)) {
218 clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, DisplayItem::TransparencyClip, 218 clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer(), context, DisplayItem::TransparencyClip,
219 m_renderLayer.paintingExtent(paintingInfo.rootLayer, paintingInfo.pa intDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior), 219 m_renderLayer.paintingExtent(paintingInfo.rootLayer, paintingInfo.pa intDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior),
220 &paintingInfo, LayoutPoint(), paintFlags)); 220 &paintingInfo, LayoutPoint(), paintFlags));
221 221
222 compositingRecorder = adoptPtr(new CompositingRecorder(context, m_render Layer.renderer()->displayItemClient(), 222 compositingRecorder = adoptPtr(new CompositingRecorder(context, m_render Layer.renderer()->displayItemClient(),
223 context->compositeOperationDeprecated(), m_renderLayer.renderer()->s tyle()->blendMode(), m_renderLayer.renderer()->opacity(), context->compositeOper ationDeprecated())); 223 context->compositeOperationDeprecated(), m_renderLayer.renderer()->s tyle()->blendMode(), m_renderLayer.renderer()->opacity(), context->compositeOper ationDeprecated()));
224 } 224 }
225 225
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 324
325 void LayerPainter::paintLayerWithTransform(GraphicsContext* context, const Layer PaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 325 void LayerPainter::paintLayerWithTransform(GraphicsContext* context, const Layer PaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
326 { 326 {
327 TransformationMatrix layerTransform = m_renderLayer.renderableTransform(pain tingInfo.paintBehavior); 327 TransformationMatrix layerTransform = m_renderLayer.renderableTransform(pain tingInfo.paintBehavior);
328 // If the transform can't be inverted, then don't paint anything. 328 // If the transform can't be inverted, then don't paint anything.
329 if (!layerTransform.isInvertible()) 329 if (!layerTransform.isInvertible())
330 return; 330 return;
331 331
332 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer here. 332 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer here.
333 // m_renderLayer may be the "root", and then we should avoid looking at its parent. 333 // m_renderLayer may be the "root", and then we should avoid looking at its parent.
334 RenderLayer* parentLayer = m_renderLayer.parent(); 334 Layer* parentLayer = m_renderLayer.parent();
335 335
336 ClipRect clipRect(LayoutRect::infiniteRect()); 336 ClipRect clipRect(LayoutRect::infiniteRect());
337 if (parentLayer) { 337 if (parentLayer) {
338 // Calculate the clip rectangle that the ancestors establish. 338 // Calculate the clip rectangle that the ancestors establish.
339 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOver layScrollbarSize); 339 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects, IgnoreOver layScrollbarSize);
340 if (shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()) == I gnoreOverflowClip) 340 if (shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()) == I gnoreOverflowClip)
341 clipRectsContext.setIgnoreOverflowClip(); 341 clipRectsContext.setIgnoreOverflowClip();
342 clipRect = m_renderLayer.clipper().backgroundClipRect(clipRectsContext); 342 clipRect = m_renderLayer.clipper().backgroundClipRect(clipRectsContext);
343 } 343 }
344 344
345 RenderLayer* paginationLayer = m_renderLayer.enclosingPaginationLayer(); 345 Layer* paginationLayer = m_renderLayer.enclosingPaginationLayer();
346 LayerFragments fragments; 346 LayerFragments fragments;
347 if (paginationLayer) { 347 if (paginationLayer) {
348 // FIXME: This is a mess. Look closely at this code and the code in Rend erLayer and fix any 348 // FIXME: This is a mess. Look closely at this code and the code in Laye r and fix any
349 // issues in it & refactor to make it obvious from code structure what i t does and that it's 349 // issues in it & refactor to make it obvious from code structure what i t does and that it's
350 // correct. 350 // correct.
351 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects ) ? UncachedClipRects : PaintingClipRects; 351 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects ) ? UncachedClipRects : PaintingClipRects;
352 ShouldRespectOverflowClip respectOverflowClip = shouldRespectOverflowCli p(paintFlags, m_renderLayer.renderer()); 352 ShouldRespectOverflowClip respectOverflowClip = shouldRespectOverflowCli p(paintFlags, m_renderLayer.renderer());
353 // Calculate the transformed bounding box in the current coordinate spac e, to figure out 353 // Calculate the transformed bounding box in the current coordinate spac e, to figure out
354 // which fragmentainers (e.g. columns) we need to visit. 354 // which fragmentainers (e.g. columns) we need to visit.
355 LayoutRect transformedExtent = RenderLayer::transparencyClipBox(&m_rende rLayer, paginationLayer, RenderLayer::PaintingTransparencyClipBox, RenderLayer:: RootOfTransparencyClipBox, paintingInfo.subPixelAccumulation, paintingInfo.paint Behavior); 355 LayoutRect transformedExtent = Layer::transparencyClipBox(&m_renderLayer , paginationLayer, Layer::PaintingTransparencyClipBox, Layer::RootOfTransparency ClipBox, paintingInfo.subPixelAccumulation, paintingInfo.paintBehavior);
356 // FIXME: we don't check if paginationLayer is within paintingInfo.rootL ayer here. 356 // FIXME: we don't check if paginationLayer is within paintingInfo.rootL ayer here.
357 paginationLayer->collectFragments(fragments, paintingInfo.rootLayer, pai ntingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflow Clip, 0, paintingInfo.subPixelAccumulation, &transformedExtent); 357 paginationLayer->collectFragments(fragments, paintingInfo.rootLayer, pai ntingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize, respectOverflow Clip, 0, paintingInfo.subPixelAccumulation, &transformedExtent);
358 } else { 358 } else {
359 // We don't need to collect any fragments in the regular way here. We ha ve already 359 // We don't need to collect any fragments in the regular way here. We ha ve already
360 // calculated a clip rectangle for the ancestry if it was needed, and cl ipping this 360 // calculated a clip rectangle for the ancestry if it was needed, and cl ipping this
361 // layer is something that can be done further down the path, when the t ransform has 361 // layer is something that can be done further down the path, when the t ransform has
362 // been applied. 362 // been applied.
363 LayerFragment fragment; 363 LayerFragment fragment;
364 fragment.backgroundRect = paintingInfo.paintDirtyRect; 364 fragment.backgroundRect = paintingInfo.paintDirtyRect;
365 fragments.append(fragment); 365 fragments.append(fragment);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 403
404 void LayerPainter::paintChildren(unsigned childrenToVisit, GraphicsContext* cont ext, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) 404 void LayerPainter::paintChildren(unsigned childrenToVisit, GraphicsContext* cont ext, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
405 { 405 {
406 if (!m_renderLayer.hasSelfPaintingLayerDescendant()) 406 if (!m_renderLayer.hasSelfPaintingLayerDescendant())
407 return; 407 return;
408 408
409 #if ENABLE(ASSERT) 409 #if ENABLE(ASSERT)
410 LayerListMutationDetector mutationChecker(m_renderLayer.stackingNode()); 410 LayerListMutationDetector mutationChecker(m_renderLayer.stackingNode());
411 #endif 411 #endif
412 412
413 RenderLayerStackingNodeIterator iterator(*m_renderLayer.stackingNode(), chil drenToVisit); 413 LayerStackingNodeIterator iterator(*m_renderLayer.stackingNode(), childrenTo Visit);
414 while (RenderLayerStackingNode* child = iterator.next()) { 414 while (LayerStackingNode* child = iterator.next()) {
415 LayerPainter childPainter(*child->layer()); 415 LayerPainter childPainter(*child->layer());
416 // If this RenderLayer should paint into its own backing or a grouped ba cking, that will be done via CompositedLayerMapping::paintContents() 416 // If this Layer should paint into its own backing or a grouped backing, that will be done via CompositedLayerMapping::paintContents()
417 // and CompositedLayerMapping::doPaintTask(). 417 // and CompositedLayerMapping::doPaintTask().
418 if (!childPainter.shouldPaintLayerInSoftwareMode(paintingInfo, paintFlag s)) 418 if (!childPainter.shouldPaintLayerInSoftwareMode(paintingInfo, paintFlag s))
419 continue; 419 continue;
420 420
421 if (!child->layer()->isPaginated()) 421 if (!child->layer()->isPaginated())
422 childPainter.paintLayer(context, paintingInfo, paintFlags); 422 childPainter.paintLayer(context, paintingInfo, paintFlags);
423 else 423 else
424 childPainter.paintPaginatedChildLayer(child->layer(), context, paint ingInfo, paintFlags); 424 childPainter.paintPaginatedChildLayer(child->layer(), context, paint ingInfo, paintFlags);
425 } 425 }
426 } 426 }
427 427
428 // FIXME: inline this. 428 // FIXME: inline this.
429 static bool paintForFixedRootBackground(const RenderLayer* layer, PaintLayerFlag s paintFlags) 429 static bool paintForFixedRootBackground(const Layer* layer, PaintLayerFlags pain tFlags)
430 { 430 {
431 return layer->renderer()->isDocumentElement() && (paintFlags & PaintLayerPai ntingRootBackgroundOnly); 431 return layer->renderer()->isDocumentElement() && (paintFlags & PaintLayerPai ntingRootBackgroundOnly);
432 } 432 }
433 433
434 bool LayerPainter::shouldPaintLayerInSoftwareMode(const LayerPaintingInfo& paint ingInfo, PaintLayerFlags paintFlags) 434 bool LayerPainter::shouldPaintLayerInSoftwareMode(const LayerPaintingInfo& paint ingInfo, PaintLayerFlags paintFlags)
435 { 435 {
436 DisableCompositingQueryAsserts disabler; 436 DisableCompositingQueryAsserts disabler;
437 437
438 return m_renderLayer.compositingState() == NotComposited 438 return m_renderLayer.compositingState() == NotComposited
439 || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers) 439 || (paintingInfo.paintBehavior & PaintBehaviorFlattenCompositingLayers)
(...skipping 13 matching lines...) Expand all
453 void LayerPainter::paintOverflowControlsForFragments(const LayerFragments& layer Fragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo, PaintLayerFlags paintFlags) 453 void LayerPainter::paintOverflowControlsForFragments(const LayerFragments& layer Fragments, GraphicsContext* context, const LayerPaintingInfo& localPaintingInfo, PaintLayerFlags paintFlags)
454 { 454 {
455 for (size_t i = 0; i < layerFragments.size(); ++i) { 455 for (size_t i = 0; i < layerFragments.size(); ++i) {
456 const LayerFragment& fragment = layerFragments.at(i); 456 const LayerFragment& fragment = layerFragments.at(i);
457 457
458 OwnPtr<LayerClipRecorder> clipRecorder; 458 OwnPtr<LayerClipRecorder> clipRecorder;
459 459
460 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) { 460 if (needsToClip(localPaintingInfo, fragment.backgroundRect)) {
461 clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer (), context, DisplayItem::ClipLayerOverflowControls, fragment.backgroundRect, &l ocalPaintingInfo, fragment.paginationOffset, paintFlags)); 461 clipRecorder = adoptPtr(new LayerClipRecorder(m_renderLayer.renderer (), context, DisplayItem::ClipLayerOverflowControls, fragment.backgroundRect, &l ocalPaintingInfo, fragment.paginationOffset, paintFlags));
462 } 462 }
463 if (RenderLayerScrollableArea* scrollableArea = m_renderLayer.scrollable Area()) 463 if (LayerScrollableArea* scrollableArea = m_renderLayer.scrollableArea() )
464 ScrollableAreaPainter(*scrollableArea).paintOverflowControls(context , roundedIntPoint(toPoint(fragment.layerBounds.location() - m_renderLayer.render BoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulat ion, m_renderLayer.compositingState()))), pixelSnappedIntRect(fragment.backgroun dRect.rect()), true); 464 ScrollableAreaPainter(*scrollableArea).paintOverflowControls(context , roundedIntPoint(toPoint(fragment.layerBounds.location() - m_renderLayer.render BoxLocation() + subPixelAccumulationIfNeeded(localPaintingInfo.subPixelAccumulat ion, m_renderLayer.compositingState()))), pixelSnappedIntRect(fragment.backgroun dRect.rect()), true);
465 } 465 }
466 } 466 }
467 467
468 static bool checkContainingBlockChainForPagination(RenderLayerModelObject* rende rer, RenderBox* ancestorColumnsRenderer) 468 static bool checkContainingBlockChainForPagination(LayoutLayerModelObject* rende rer, RenderBox* ancestorColumnsRenderer)
469 { 469 {
470 RenderView* view = renderer->view(); 470 RenderView* view = renderer->view();
471 RenderLayerModelObject* prevBlock = renderer; 471 LayoutLayerModelObject* prevBlock = renderer;
472 RenderBlock* containingBlock; 472 RenderBlock* containingBlock;
473 for (containingBlock = renderer->containingBlock(); 473 for (containingBlock = renderer->containingBlock();
474 containingBlock && containingBlock != view && containingBlock != ancesto rColumnsRenderer; 474 containingBlock && containingBlock != view && containingBlock != ancesto rColumnsRenderer;
475 containingBlock = containingBlock->containingBlock()) 475 containingBlock = containingBlock->containingBlock())
476 prevBlock = containingBlock; 476 prevBlock = containingBlock;
477 477
478 // If the columns block wasn't in our containing block chain, then we aren't paginated by it. 478 // If the columns block wasn't in our containing block chain, then we aren't paginated by it.
479 if (containingBlock != ancestorColumnsRenderer) 479 if (containingBlock != ancestorColumnsRenderer)
480 return false; 480 return false;
481 481
482 // If the previous block is absolutely positioned, then we can't be paginate d by the columns block. 482 // If the previous block is absolutely positioned, then we can't be paginate d by the columns block.
483 if (prevBlock->isOutOfFlowPositioned()) 483 if (prevBlock->isOutOfFlowPositioned())
484 return false; 484 return false;
485 485
486 // Otherwise we are paginated by the columns block. 486 // Otherwise we are paginated by the columns block.
487 return true; 487 return true;
488 } 488 }
489 489
490 void LayerPainter::paintPaginatedChildLayer(RenderLayer* childLayer, GraphicsCon text* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags ) 490 void LayerPainter::paintPaginatedChildLayer(Layer* childLayer, GraphicsContext* context, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags)
491 { 491 {
492 // We need to do multiple passes, breaking up our child layer into strips. 492 // We need to do multiple passes, breaking up our child layer into strips.
493 Vector<RenderLayer*> columnLayers; 493 Vector<Layer*> columnLayers;
494 RenderLayerStackingNode* ancestorNode = m_renderLayer.stackingNode()->isNorm alFlowOnly() ? m_renderLayer.parent()->stackingNode() : m_renderLayer.stackingNo de()->ancestorStackingContextNode(); 494 LayerStackingNode* ancestorNode = m_renderLayer.stackingNode()->isNormalFlow Only() ? m_renderLayer.parent()->stackingNode() : m_renderLayer.stackingNode()-> ancestorStackingContextNode();
495 for (RenderLayer* curr = childLayer->parent(); curr; curr = curr->parent()) { 495 for (Layer* curr = childLayer->parent(); curr; curr = curr->parent()) {
496 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina tion(childLayer->renderer(), curr->renderBox())) 496 if (curr->renderer()->hasColumns() && checkContainingBlockChainForPagina tion(childLayer->renderer(), curr->renderBox()))
497 columnLayers.append(curr); 497 columnLayers.append(curr);
498 if (curr->stackingNode() == ancestorNode) 498 if (curr->stackingNode() == ancestorNode)
499 break; 499 break;
500 } 500 }
501 501
502 // It is possible for paintLayer() to be called after the child layer ceases to be paginated but before 502 // It is possible for paintLayer() to be called after the child layer ceases to be paginated but before
503 // updatePaginationRecusive() is called and resets the isPaginated() flag, s ee <rdar://problem/10098679>. 503 // updatePaginationRecusive() is called and resets the isPaginated() flag, s ee <rdar://problem/10098679>.
504 // If this is the case, just bail out, since the upcoming call to updatePagi nationRecusive() will paint invalidate the layer. 504 // If this is the case, just bail out, since the upcoming call to updatePagi nationRecusive() will paint invalidate the layer.
505 // FIXME: Is this true anymore? This seems very suspicious. 505 // FIXME: Is this true anymore? This seems very suspicious.
506 if (!columnLayers.size()) 506 if (!columnLayers.size())
507 return; 507 return;
508 508
509 paintChildLayerIntoColumns(childLayer, context, paintingInfo, paintFlags, co lumnLayers, columnLayers.size() - 1); 509 paintChildLayerIntoColumns(childLayer, context, paintingInfo, paintFlags, co lumnLayers, columnLayers.size() - 1);
510 } 510 }
511 511
512 void LayerPainter::paintChildLayerIntoColumns(RenderLayer* childLayer, GraphicsC ontext* context, const LayerPaintingInfo& paintingInfo, 512 void LayerPainter::paintChildLayerIntoColumns(Layer* childLayer, GraphicsContext * context, const LayerPaintingInfo& paintingInfo,
513 PaintLayerFlags paintFlags, const Vector<RenderLayer*>& columnLayers, size_t colIndex) 513 PaintLayerFlags paintFlags, const Vector<Layer*>& columnLayers, size_t colIn dex)
514 { 514 {
515 RenderBlock* columnBlock = toRenderBlock(columnLayers[colIndex]->renderer()) ; 515 RenderBlock* columnBlock = toRenderBlock(columnLayers[colIndex]->renderer()) ;
516 516
517 ASSERT(columnBlock && columnBlock->hasColumns()); 517 ASSERT(columnBlock && columnBlock->hasColumns());
518 if (!columnBlock || !columnBlock->hasColumns()) 518 if (!columnBlock || !columnBlock->hasColumns())
519 return; 519 return;
520 520
521 LayoutPoint layerOffset; 521 LayoutPoint layerOffset;
522 // FIXME: It looks suspicious to call convertToLayerCoords here 522 // FIXME: It looks suspicious to call convertToLayerCoords here
523 // as canUseConvertToLayerCoords is true for this layer. 523 // as canUseConvertToLayerCoords is true for this layer.
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 if (!m_renderLayer.containsDirtyOverlayScrollbars()) 700 if (!m_renderLayer.containsDirtyOverlayScrollbars())
701 return; 701 return;
702 702
703 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot); 703 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect), paintBehavior, LayoutSize(), paintingRoot);
704 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); 704 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars);
705 705
706 m_renderLayer.setContainsDirtyOverlayScrollbars(false); 706 m_renderLayer.setContainsDirtyOverlayScrollbars(false);
707 } 707 }
708 708
709 } // namespace blink 709 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/paint/LayerPainter.h ('k') | Source/core/paint/PartPainter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698