| 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 "core/paint/PaintLayerPainter.h" | 5 #include "core/paint/PaintLayerPainter.h" |
| 6 | 6 |
| 7 #include "core/frame/LocalFrame.h" | 7 #include "core/frame/LocalFrame.h" |
| 8 #include "core/layout/LayoutInline.h" | 8 #include "core/layout/LayoutInline.h" |
| 9 #include "core/layout/LayoutView.h" | 9 #include "core/layout/LayoutView.h" |
| 10 #include "core/paint/ClipPathClipper.h" | 10 #include "core/paint/ClipPathClipper.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 static ShouldRespectOverflowClipType shouldRespectOverflowClip( | 57 static ShouldRespectOverflowClipType shouldRespectOverflowClip( |
| 58 PaintLayerFlags paintFlags, | 58 PaintLayerFlags paintFlags, |
| 59 const LayoutObject* layoutObject) { | 59 const LayoutObject* layoutObject) { |
| 60 return (paintFlags & PaintLayerPaintingOverflowContents || | 60 return (paintFlags & PaintLayerPaintingOverflowContents || |
| 61 (paintFlags & PaintLayerPaintingChildClippingMaskPhase && | 61 (paintFlags & PaintLayerPaintingChildClippingMaskPhase && |
| 62 layoutObject->hasClipPath())) | 62 layoutObject->hasClipPath())) |
| 63 ? IgnoreOverflowClip | 63 ? IgnoreOverflowClip |
| 64 : RespectOverflowClip; | 64 : RespectOverflowClip; |
| 65 } | 65 } |
| 66 | 66 |
| 67 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayer( | 67 PaintResult PaintLayerPainter::paintLayer( |
| 68 GraphicsContext& context, | 68 GraphicsContext& context, |
| 69 const PaintLayerPaintingInfo& paintingInfo, | 69 const PaintLayerPaintingInfo& paintingInfo, |
| 70 PaintLayerFlags paintFlags) { | 70 PaintLayerFlags paintFlags) { |
| 71 // https://code.google.com/p/chromium/issues/detail?id=343772 | 71 // https://code.google.com/p/chromium/issues/detail?id=343772 |
| 72 DisableCompositingQueryAsserts disabler; | 72 DisableCompositingQueryAsserts disabler; |
| 73 | 73 |
| 74 if (m_paintLayer.compositingState() != NotComposited) { | 74 if (m_paintLayer.compositingState() != NotComposited) { |
| 75 if (paintingInfo.getGlobalPaintFlags() & | 75 if (paintingInfo.getGlobalPaintFlags() & |
| 76 GlobalPaintFlattenCompositingLayers) { | 76 GlobalPaintFlattenCompositingLayers) { |
| 77 // FIXME: ok, but what about GlobalPaintFlattenCompositingLayers? That's | 77 // FIXME: ok, but what about GlobalPaintFlattenCompositingLayers? That's |
| (...skipping 26 matching lines...) Expand all Loading... |
| 104 paintFlags |= PaintLayerHaveTransparency; | 104 paintFlags |= PaintLayerHaveTransparency; |
| 105 | 105 |
| 106 if (m_paintLayer.paintsWithTransform(paintingInfo.getGlobalPaintFlags()) && | 106 if (m_paintLayer.paintsWithTransform(paintingInfo.getGlobalPaintFlags()) && |
| 107 !(paintFlags & PaintLayerAppliedTransform)) | 107 !(paintFlags & PaintLayerAppliedTransform)) |
| 108 return paintLayerWithTransform(context, paintingInfo, paintFlags); | 108 return paintLayerWithTransform(context, paintingInfo, paintFlags); |
| 109 | 109 |
| 110 return paintLayerContentsCompositingAllPhases(context, paintingInfo, | 110 return paintLayerContentsCompositingAllPhases(context, paintingInfo, |
| 111 paintFlags); | 111 paintFlags); |
| 112 } | 112 } |
| 113 | 113 |
| 114 PaintLayerPainter::PaintResult | 114 PaintResult PaintLayerPainter::paintLayerContentsCompositingAllPhases( |
| 115 PaintLayerPainter::paintLayerContentsCompositingAllPhases( | |
| 116 GraphicsContext& context, | 115 GraphicsContext& context, |
| 117 const PaintLayerPaintingInfo& paintingInfo, | 116 const PaintLayerPaintingInfo& paintingInfo, |
| 118 PaintLayerFlags paintFlags, | 117 PaintLayerFlags paintFlags, |
| 119 FragmentPolicy fragmentPolicy) { | 118 FragmentPolicy fragmentPolicy) { |
| 120 DCHECK(m_paintLayer.isSelfPaintingLayer() || | 119 DCHECK(m_paintLayer.isSelfPaintingLayer() || |
| 121 m_paintLayer.hasSelfPaintingLayerDescendant()); | 120 m_paintLayer.hasSelfPaintingLayerDescendant()); |
| 122 | 121 |
| 123 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform); | 122 PaintLayerFlags localPaintFlags = paintFlags & ~(PaintLayerAppliedTransform); |
| 124 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; | 123 localPaintFlags |= PaintLayerPaintingCompositingAllPhases; |
| 125 return paintLayerContents(context, paintingInfo, localPaintFlags, | 124 return paintLayerContents(context, paintingInfo, localPaintFlags, |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 if (&clipRects != previousClipRects && | 200 if (&clipRects != previousClipRects && |
| 202 (!previousClipRects || clipRects != *previousClipRects)) { | 201 (!previousClipRects || clipRects != *previousClipRects)) { |
| 203 needsRepaint = true; | 202 needsRepaint = true; |
| 204 shouldClearEmptyPaintPhaseFlags = true; | 203 shouldClearEmptyPaintPhaseFlags = true; |
| 205 } | 204 } |
| 206 paintLayer.setPreviousPaintingClipRects(clipRects); | 205 paintLayer.setPreviousPaintingClipRects(clipRects); |
| 207 } | 206 } |
| 208 | 207 |
| 209 // Repaint if previously the layer might be clipped by paintDirtyRect and | 208 // Repaint if previously the layer might be clipped by paintDirtyRect and |
| 210 // paintDirtyRect changes. | 209 // paintDirtyRect changes. |
| 211 if (paintLayer.previousPaintResult() == | 210 if (paintLayer.previousPaintResult() == MayBeClippedByPaintDirtyRect && |
| 212 PaintLayerPainter::MayBeClippedByPaintDirtyRect && | |
| 213 paintLayer.previousPaintDirtyRect() != paintingInfo.paintDirtyRect) { | 211 paintLayer.previousPaintDirtyRect() != paintingInfo.paintDirtyRect) { |
| 214 needsRepaint = true; | 212 needsRepaint = true; |
| 215 shouldClearEmptyPaintPhaseFlags = true; | 213 shouldClearEmptyPaintPhaseFlags = true; |
| 216 } | 214 } |
| 217 paintLayer.setPreviousPaintDirtyRect(paintingInfo.paintDirtyRect); | 215 paintLayer.setPreviousPaintDirtyRect(paintingInfo.paintDirtyRect); |
| 218 | 216 |
| 219 // Repaint if scroll offset accumulation changes. | 217 // Repaint if scroll offset accumulation changes. |
| 220 if (paintingInfo.scrollOffsetAccumulation != | 218 if (paintingInfo.scrollOffsetAccumulation != |
| 221 paintLayer.previousScrollOffsetAccumulationForPainting()) { | 219 paintLayer.previousScrollOffsetAccumulationForPainting()) { |
| 222 needsRepaint = true; | 220 needsRepaint = true; |
| 223 shouldClearEmptyPaintPhaseFlags = true; | 221 shouldClearEmptyPaintPhaseFlags = true; |
| 224 } | 222 } |
| 225 paintLayer.setPreviousScrollOffsetAccumulationForPainting( | 223 paintLayer.setPreviousScrollOffsetAccumulationForPainting( |
| 226 paintingInfo.scrollOffsetAccumulation); | 224 paintingInfo.scrollOffsetAccumulation); |
| 227 | 225 |
| 228 return needsRepaint; | 226 return needsRepaint; |
| 229 } | 227 } |
| 230 | 228 |
| 231 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerContents( | 229 PaintResult PaintLayerPainter::paintLayerContents( |
| 232 GraphicsContext& context, | 230 GraphicsContext& context, |
| 233 const PaintLayerPaintingInfo& paintingInfoArg, | 231 const PaintLayerPaintingInfo& paintingInfoArg, |
| 234 PaintLayerFlags paintFlags, | 232 PaintLayerFlags paintFlags, |
| 235 FragmentPolicy fragmentPolicy) { | 233 FragmentPolicy fragmentPolicy) { |
| 236 DCHECK(m_paintLayer.isSelfPaintingLayer() || | 234 DCHECK(m_paintLayer.isSelfPaintingLayer() || |
| 237 m_paintLayer.hasSelfPaintingLayerDescendant()); | 235 m_paintLayer.hasSelfPaintingLayerDescendant()); |
| 238 DCHECK(!(paintFlags & PaintLayerAppliedTransform)); | 236 DCHECK(!(paintFlags & PaintLayerAppliedTransform)); |
| 239 | 237 |
| 240 bool isSelfPaintingLayer = m_paintLayer.isSelfPaintingLayer(); | 238 bool isSelfPaintingLayer = m_paintLayer.isSelfPaintingLayer(); |
| 241 bool isPaintingOverlayScrollbars = | 239 bool isPaintingOverlayScrollbars = |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 // fragment.layerBounds is set to the border box, not the bounding box, of | 541 // fragment.layerBounds is set to the border box, not the bounding box, of |
| 544 // the layer. | 542 // the layer. |
| 545 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, | 543 if (m_paintLayer.intersectsDamageRect(fragment.layerBounds, |
| 546 fragment.backgroundRect.rect(), | 544 fragment.backgroundRect.rect(), |
| 547 newOffsetFromRoot)) | 545 newOffsetFromRoot)) |
| 548 return true; | 546 return true; |
| 549 } | 547 } |
| 550 return false; | 548 return false; |
| 551 } | 549 } |
| 552 | 550 |
| 553 PaintLayerPainter::PaintResult PaintLayerPainter::paintLayerWithTransform( | 551 PaintResult PaintLayerPainter::paintLayerWithTransform( |
| 554 GraphicsContext& context, | 552 GraphicsContext& context, |
| 555 const PaintLayerPaintingInfo& paintingInfo, | 553 const PaintLayerPaintingInfo& paintingInfo, |
| 556 PaintLayerFlags paintFlags) { | 554 PaintLayerFlags paintFlags) { |
| 557 TransformationMatrix layerTransform = | 555 TransformationMatrix layerTransform = |
| 558 m_paintLayer.renderableTransform(paintingInfo.getGlobalPaintFlags()); | 556 m_paintLayer.renderableTransform(paintingInfo.getGlobalPaintFlags()); |
| 559 // If the transform can't be inverted, then don't paint anything. | 557 // If the transform can't be inverted, then don't paint anything. |
| 560 if (!layerTransform.isInvertible()) | 558 if (!layerTransform.isInvertible()) |
| 561 return FullyPainted; | 559 return FullyPainted; |
| 562 | 560 |
| 563 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer | 561 // FIXME: We should make sure that we don't walk past paintingInfo.rootLayer |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 } | 671 } |
| 674 } | 672 } |
| 675 if (paintFragmentByApplyingTransform(context, paintingInfo, paintFlags, | 673 if (paintFragmentByApplyingTransform(context, paintingInfo, paintFlags, |
| 676 fragment.paginationOffset) == | 674 fragment.paginationOffset) == |
| 677 MayBeClippedByPaintDirtyRect) | 675 MayBeClippedByPaintDirtyRect) |
| 678 result = MayBeClippedByPaintDirtyRect; | 676 result = MayBeClippedByPaintDirtyRect; |
| 679 } | 677 } |
| 680 return result; | 678 return result; |
| 681 } | 679 } |
| 682 | 680 |
| 683 PaintLayerPainter::PaintResult | 681 PaintResult PaintLayerPainter::paintFragmentByApplyingTransform( |
| 684 PaintLayerPainter::paintFragmentByApplyingTransform( | |
| 685 GraphicsContext& context, | 682 GraphicsContext& context, |
| 686 const PaintLayerPaintingInfo& paintingInfo, | 683 const PaintLayerPaintingInfo& paintingInfo, |
| 687 PaintLayerFlags paintFlags, | 684 PaintLayerFlags paintFlags, |
| 688 const LayoutPoint& fragmentTranslation) { | 685 const LayoutPoint& fragmentTranslation) { |
| 689 // This involves subtracting out the position of the layer in our current | 686 // This involves subtracting out the position of the layer in our current |
| 690 // coordinate space, but preserving the accumulated error for sub-pixel | 687 // coordinate space, but preserving the accumulated error for sub-pixel |
| 691 // layout. | 688 // layout. |
| 692 LayoutPoint delta; | 689 LayoutPoint delta; |
| 693 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, delta); | 690 m_paintLayer.convertToLayerCoords(paintingInfo.rootLayer, delta); |
| 694 delta.moveBy(fragmentTranslation); | 691 delta.moveBy(fragmentTranslation); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 715 paintingInfo.ancestorHasClipPathClipping; | 712 paintingInfo.ancestorHasClipPathClipping; |
| 716 | 713 |
| 717 // Remove skip root background flag when we're painting with a new root. | 714 // Remove skip root background flag when we're painting with a new root. |
| 718 if (&m_paintLayer != paintingInfo.rootLayer) | 715 if (&m_paintLayer != paintingInfo.rootLayer) |
| 719 paintFlags &= ~PaintLayerPaintingSkipRootBackground; | 716 paintFlags &= ~PaintLayerPaintingSkipRootBackground; |
| 720 | 717 |
| 721 return paintLayerContentsCompositingAllPhases( | 718 return paintLayerContentsCompositingAllPhases( |
| 722 context, transformedPaintingInfo, paintFlags, ForceSingleFragment); | 719 context, transformedPaintingInfo, paintFlags, ForceSingleFragment); |
| 723 } | 720 } |
| 724 | 721 |
| 725 PaintLayerPainter::PaintResult PaintLayerPainter::paintChildren( | 722 PaintResult PaintLayerPainter::paintChildren( |
| 726 unsigned childrenToVisit, | 723 unsigned childrenToVisit, |
| 727 GraphicsContext& context, | 724 GraphicsContext& context, |
| 728 const PaintLayerPaintingInfo& paintingInfo, | 725 const PaintLayerPaintingInfo& paintingInfo, |
| 729 PaintLayerFlags paintFlags) { | 726 PaintLayerFlags paintFlags) { |
| 730 PaintResult result = FullyPainted; | 727 PaintResult result = FullyPainted; |
| 731 if (!m_paintLayer.hasSelfPaintingLayerDescendant()) | 728 if (!m_paintLayer.hasSelfPaintingLayerDescendant()) |
| 732 return result; | 729 return result; |
| 733 | 730 |
| 734 #if ENABLE(ASSERT) | 731 #if ENABLE(ASSERT) |
| 735 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); | 732 LayerListMutationDetector mutationChecker(m_paintLayer.stackingNode()); |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1071 | 1068 |
| 1072 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, | 1069 PaintLayerPaintingInfo paintingInfo(&m_paintLayer, |
| 1073 LayoutRect(enclosingIntRect(damageRect)), | 1070 LayoutRect(enclosingIntRect(damageRect)), |
| 1074 paintFlags, LayoutSize()); | 1071 paintFlags, LayoutSize()); |
| 1075 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); | 1072 paintLayer(context, paintingInfo, PaintLayerPaintingOverlayScrollbars); |
| 1076 | 1073 |
| 1077 m_paintLayer.setContainsDirtyOverlayScrollbars(false); | 1074 m_paintLayer.setContainsDirtyOverlayScrollbars(false); |
| 1078 } | 1075 } |
| 1079 | 1076 |
| 1080 } // namespace blink | 1077 } // namespace blink |
| OLD | NEW |