OLD | NEW |
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/ClipPathOperation.h" | 9 #include "core/layout/ClipPathOperation.h" |
10 #include "core/layout/FilterEffectRenderer.h" | 10 #include "core/layout/FilterEffectRenderer.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 | 81 |
82 // PaintLayerAppliedTransform is used in RenderReplica, to avoid applying th
e transform twice. | 82 // PaintLayerAppliedTransform is used in RenderReplica, to avoid applying th
e transform twice. |
83 if (m_renderLayer.paintsWithTransform(paintingInfo.paintBehavior) && !(paint
Flags & PaintLayerAppliedTransform)) { | 83 if (m_renderLayer.paintsWithTransform(paintingInfo.paintBehavior) && !(paint
Flags & PaintLayerAppliedTransform)) { |
84 paintLayerWithTransform(context, paintingInfo, paintFlags); | 84 paintLayerWithTransform(context, paintingInfo, paintFlags); |
85 return; | 85 return; |
86 } | 86 } |
87 | 87 |
88 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); | 88 paintLayerContentsAndReflection(context, paintingInfo, paintFlags); |
89 } | 89 } |
90 | 90 |
91 void LayerPainter::paintLayerContentsAndReflection(GraphicsContext* context, con
st LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) | 91 void LayerPainter::paintLayerContentsAndReflection(GraphicsContext* context, con
st LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags, FragmentPolicy f
ragmentPolicy) |
92 { | 92 { |
93 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL
ayerDescendant()); | 93 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL
ayerDescendant()); |
94 | 94 |
95 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform)
; | 95 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform)
; |
96 | 96 |
97 // Paint the reflection first if we have one. | 97 // Paint the reflection first if we have one. |
98 if (m_renderLayer.reflectionInfo()) | 98 if (m_renderLayer.reflectionInfo()) |
99 m_renderLayer.reflectionInfo()->paint(context, paintingInfo, localPaintF
lags | PaintLayerPaintingReflection); | 99 m_renderLayer.reflectionInfo()->paint(context, paintingInfo, localPaintF
lags | PaintLayerPaintingReflection); |
100 | 100 |
101 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; | 101 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; |
102 paintLayerContents(context, paintingInfo, localPaintFlags); | 102 paintLayerContents(context, paintingInfo, localPaintFlags, fragmentPolicy); |
103 } | 103 } |
104 | 104 |
105 class ClipPathHelper { | 105 class ClipPathHelper { |
106 public: | 106 public: |
107 ClipPathHelper(GraphicsContext* context, const Layer& renderLayer, const Lay
erPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRelative
BoundsComputed, | 107 ClipPathHelper(GraphicsContext* context, const Layer& renderLayer, const Lay
erPaintingInfo& paintingInfo, LayoutRect& rootRelativeBounds, bool& rootRelative
BoundsComputed, |
108 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) | 108 const LayoutPoint& offsetFromRoot, PaintLayerFlags paintFlags) |
109 : m_resourceClipper(0), m_clipStateSaver(*context, false), m_renderLayer
(renderLayer), m_context(context) | 109 : m_resourceClipper(0), m_clipStateSaver(*context, false), m_renderLayer
(renderLayer), m_context(context) |
110 { | 110 { |
111 const RenderStyle& style = renderLayer.renderer()->styleRef(); | 111 const RenderStyle& style = renderLayer.renderer()->styleRef(); |
112 | 112 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 } | 162 } |
163 private: | 163 private: |
164 RenderSVGResourceClipper* m_resourceClipper; | 164 RenderSVGResourceClipper* m_resourceClipper; |
165 GraphicsContextStateSaver m_clipStateSaver; | 165 GraphicsContextStateSaver m_clipStateSaver; |
166 OwnPtr<ClipPathRecorder> m_clipPathRecorder; | 166 OwnPtr<ClipPathRecorder> m_clipPathRecorder; |
167 RenderSVGResourceClipper::ClipperState m_clipperState; | 167 RenderSVGResourceClipper::ClipperState m_clipperState; |
168 const Layer& m_renderLayer; | 168 const Layer& m_renderLayer; |
169 GraphicsContext* m_context; | 169 GraphicsContext* m_context; |
170 }; | 170 }; |
171 | 171 |
172 void LayerPainter::paintLayerContents(GraphicsContext* context, const LayerPaint
ingInfo& paintingInfo, PaintLayerFlags paintFlags) | 172 void LayerPainter::paintLayerContents(GraphicsContext* context, const LayerPaint
ingInfo& paintingInfo, PaintLayerFlags paintFlags, FragmentPolicy fragmentPolicy
) |
173 { | 173 { |
174 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL
ayerDescendant()); | 174 ASSERT(m_renderLayer.isSelfPaintingLayer() || m_renderLayer.hasSelfPaintingL
ayerDescendant()); |
175 ASSERT(!(paintFlags & PaintLayerAppliedTransform)); | 175 ASSERT(!(paintFlags & PaintLayerAppliedTransform)); |
176 | 176 |
177 bool isSelfPaintingLayer = m_renderLayer.isSelfPaintingLayer(); | 177 bool isSelfPaintingLayer = m_renderLayer.isSelfPaintingLayer(); |
178 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr
ollbars; | 178 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr
ollbars; |
179 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing
ScrollingPhase; | 179 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing
ScrollingPhase; |
180 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi
tingForegroundPhase; | 180 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi
tingForegroundPhase; |
181 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi
tingBackgroundPhase; | 181 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi
tingBackgroundPhase; |
182 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon
tents; | 182 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon
tents; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 | 223 |
224 compositingRecorder = adoptPtr(new CompositingRecorder(context, m_render
Layer.renderer()->displayItemClient(), | 224 compositingRecorder = adoptPtr(new CompositingRecorder(context, m_render
Layer.renderer()->displayItemClient(), |
225 context->compositeOperationDeprecated(), m_renderLayer.renderer()->s
tyle()->blendMode(), m_renderLayer.renderer()->opacity(), context->compositeOper
ationDeprecated())); | 225 context->compositeOperationDeprecated(), m_renderLayer.renderer()->s
tyle()->blendMode(), m_renderLayer.renderer()->opacity(), context->compositeOper
ationDeprecated())); |
226 } | 226 } |
227 | 227 |
228 LayerPaintingInfo localPaintingInfo(paintingInfo); | 228 LayerPaintingInfo localPaintingInfo(paintingInfo); |
229 | 229 |
230 LayerFragments layerFragments; | 230 LayerFragments layerFragments; |
231 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars)
{ | 231 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars)
{ |
232 // Collect the fragments. This will compute the clip rectangles and pain
t offsets for each layer fragment. | 232 // Collect the fragments. This will compute the clip rectangles and pain
t offsets for each layer fragment. |
233 m_renderLayer.collectFragments(layerFragments, localPaintingInfo.rootLay
er, localPaintingInfo.paintDirtyRect, | 233 ClipRectsCacheSlot cacheSlot = (paintFlags & PaintLayerUncachedClipRects
) ? UncachedClipRects : PaintingClipRects; |
234 (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : Pai
ntingClipRects, IgnoreOverlayScrollbarSize, | 234 ShouldRespectOverflowClip respectOverflowClip = shouldRespectOverflowCli
p(paintFlags, m_renderLayer.renderer()); |
235 shouldRespectOverflowClip(paintFlags, m_renderLayer.renderer()), &of
fsetFromRoot, localPaintingInfo.subPixelAccumulation); | 235 if (fragmentPolicy == ForceSingleFragment) |
| 236 m_renderLayer.appendSingleFragmentIgnoringPagination(layerFragments,
localPaintingInfo.rootLayer, localPaintingInfo.paintDirtyRect, cacheSlot, Ignor
eOverlayScrollbarSize, respectOverflowClip, &offsetFromRoot, localPaintingInfo.s
ubPixelAccumulation); |
| 237 else |
| 238 m_renderLayer.collectFragments(layerFragments, localPaintingInfo.roo
tLayer, localPaintingInfo.paintDirtyRect, cacheSlot, IgnoreOverlayScrollbarSize,
respectOverflowClip, &offsetFromRoot, localPaintingInfo.subPixelAccumulation); |
236 if (shouldPaintContent) | 239 if (shouldPaintContent) |
237 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra
gments, localPaintingInfo, paintFlags, offsetFromRoot); | 240 shouldPaintContent = atLeastOneFragmentIntersectsDamageRect(layerFra
gments, localPaintingInfo, paintFlags, offsetFromRoot); |
238 } | 241 } |
239 | 242 |
240 bool selectionOnly = localPaintingInfo.paintBehavior & PaintBehaviorSelectio
nOnly; | 243 bool selectionOnly = localPaintingInfo.paintBehavior & PaintBehaviorSelectio
nOnly; |
241 // If this layer's renderer is a child of the paintingRoot, we render uncond
itionally, which | 244 // If this layer's renderer is a child of the paintingRoot, we render uncond
itionally, which |
242 // is done by passing a nil paintingRoot down to our renderer (as if no pain
tingRoot was ever set). | 245 // is done by passing a nil paintingRoot down to our renderer (as if no pain
tingRoot was ever set). |
243 // Else, our renderer tree may or may not contain the painting root, so we p
ass that root along | 246 // Else, our renderer tree may or may not contain the painting root, so we p
ass that root along |
244 // so it will be tested against as we descend through the renderers. | 247 // so it will be tested against as we descend through the renderers. |
245 LayoutObject* paintingRootForRenderer = 0; | 248 LayoutObject* paintingRootForRenderer = 0; |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 TransformationMatrix transform(m_renderLayer.renderableTransform(paintingInf
o.paintBehavior)); | 397 TransformationMatrix transform(m_renderLayer.renderableTransform(paintingInf
o.paintBehavior)); |
395 IntPoint roundedDelta = roundedIntPoint(delta); | 398 IntPoint roundedDelta = roundedIntPoint(delta); |
396 transform.translateRight(roundedDelta.x(), roundedDelta.y()); | 399 transform.translateRight(roundedDelta.x(), roundedDelta.y()); |
397 LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation
+ (delta - roundedDelta); | 400 LayoutSize adjustedSubPixelAccumulation = paintingInfo.subPixelAccumulation
+ (delta - roundedDelta); |
398 | 401 |
399 Transform3DRecorder transform3DRecorder(*context, m_renderLayer.renderer()->
displayItemClient(), transform); | 402 Transform3DRecorder transform3DRecorder(*context, m_renderLayer.renderer()->
displayItemClient(), transform); |
400 | 403 |
401 // Now do a paint with the root layer shifted to be us. | 404 // Now do a paint with the root layer shifted to be us. |
402 LayerPaintingInfo transformedPaintingInfo(&m_renderLayer, enclosingIntRect(t
ransform.inverse().mapRect(paintingInfo.paintDirtyRect)), paintingInfo.paintBeha
vior, | 405 LayerPaintingInfo transformedPaintingInfo(&m_renderLayer, enclosingIntRect(t
ransform.inverse().mapRect(paintingInfo.paintDirtyRect)), paintingInfo.paintBeha
vior, |
403 adjustedSubPixelAccumulation, paintingInfo.paintingRoot); | 406 adjustedSubPixelAccumulation, paintingInfo.paintingRoot); |
404 paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags
); | 407 paintLayerContentsAndReflection(context, transformedPaintingInfo, paintFlags
, ForceSingleFragment); |
405 } | 408 } |
406 | 409 |
407 void LayerPainter::paintChildren(unsigned childrenToVisit, GraphicsContext* cont
ext, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) | 410 void LayerPainter::paintChildren(unsigned childrenToVisit, GraphicsContext* cont
ext, const LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) |
408 { | 411 { |
409 if (!m_renderLayer.hasSelfPaintingLayerDescendant()) | 412 if (!m_renderLayer.hasSelfPaintingLayerDescendant()) |
410 return; | 413 return; |
411 | 414 |
412 #if ENABLE(ASSERT) | 415 #if ENABLE(ASSERT) |
413 LayerListMutationDetector mutationChecker(m_renderLayer.stackingNode()); | 416 LayerListMutationDetector mutationChecker(m_renderLayer.stackingNode()); |
414 #endif | 417 #endif |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 if (!m_renderLayer.containsDirtyOverlayScrollbars()) | 713 if (!m_renderLayer.containsDirtyOverlayScrollbars()) |
711 return; | 714 return; |
712 | 715 |
713 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect),
paintBehavior, LayoutSize(), paintingRoot); | 716 LayerPaintingInfo paintingInfo(&m_renderLayer, enclosingIntRect(damageRect),
paintBehavior, LayoutSize(), paintingRoot); |
714 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); | 717 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); |
715 | 718 |
716 m_renderLayer.setContainsDirtyOverlayScrollbars(false); | 719 m_renderLayer.setContainsDirtyOverlayScrollbars(false); |
717 } | 720 } |
718 | 721 |
719 } // namespace blink | 722 } // namespace blink |
OLD | NEW |