| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
| 3 * | 3 * |
| 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
| 5 * | 5 * |
| 6 * Other contributors: | 6 * Other contributors: |
| 7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
| 8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
| 9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
| 10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
| (...skipping 928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 939 { | 939 { |
| 940 // Avoid painting descendants of the root layer when stylesheets haven't loa
ded. This eliminates FOUC. | 940 // Avoid painting descendants of the root layer when stylesheets haven't loa
ded. This eliminates FOUC. |
| 941 // It's ok not to draw, because later on, when all the stylesheets do load,
updateStyleSelector on the Document | 941 // It's ok not to draw, because later on, when all the stylesheets do load,
updateStyleSelector on the Document |
| 942 // will do a full paintInvalidationForWholeRenderer(). | 942 // will do a full paintInvalidationForWholeRenderer(). |
| 943 if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !laye
r->isRootLayer() && !layer->renderer()->isDocumentElement()) | 943 if (layer->renderer()->document().didLayoutWithPendingStylesheets() && !laye
r->isRootLayer() && !layer->renderer()->isDocumentElement()) |
| 944 return true; | 944 return true; |
| 945 | 945 |
| 946 return false; | 946 return false; |
| 947 } | 947 } |
| 948 | 948 |
| 949 static ShouldRespectOverflowClip shouldRespectOverflowClip(PaintLayerFlags paint
Flags, const RenderObject* renderer) | |
| 950 { | |
| 951 return (paintFlags & PaintLayerPaintingOverflowContents) ? IgnoreOverflowCli
p : RespectOverflowClip; | |
| 952 } | |
| 953 | |
| 954 void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo&
paintingInfo, PaintLayerFlags paintFlags) | 949 void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo&
paintingInfo, PaintLayerFlags paintFlags) |
| 955 { | 950 { |
| 956 // Non self-painting leaf layers don't need to be painted as their renderer(
) should properly paint itself. | 951 // Non self-painting leaf layers don't need to be painted as their renderer(
) should properly paint itself. |
| 957 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant()) | 952 if (!isSelfPaintingLayer() && !hasSelfPaintingLayerDescendant()) |
| 958 return; | 953 return; |
| 959 | 954 |
| 960 if (shouldSuppressPaintingLayer(this)) | 955 if (shouldSuppressPaintingLayer(this)) |
| 961 return; | 956 return; |
| 962 | 957 |
| 963 // If this layer is totally invisible then there is nothing to paint. | 958 // If this layer is totally invisible then there is nothing to paint. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 979 if (parent()) | 974 if (parent()) |
| 980 parent()->beginTransparencyLayers(context, paintingInfo.rootLaye
r, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.
paintBehavior); | 975 parent()->beginTransparencyLayers(context, paintingInfo.rootLaye
r, paintingInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.
paintBehavior); |
| 981 else | 976 else |
| 982 beginTransparencyLayers(context, paintingInfo.rootLayer, paintin
gInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehav
ior); | 977 beginTransparencyLayers(context, paintingInfo.rootLayer, paintin
gInfo.paintDirtyRect, paintingInfo.subPixelAccumulation, paintingInfo.paintBehav
ior); |
| 983 } | 978 } |
| 984 | 979 |
| 985 // Make sure the parent's clip rects have been calculated. | 980 // Make sure the parent's clip rects have been calculated. |
| 986 ClipRect clipRect = paintingInfo.paintDirtyRect; | 981 ClipRect clipRect = paintingInfo.paintDirtyRect; |
| 987 if (parent()) { | 982 if (parent()) { |
| 988 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlag
s & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects); | 983 ClipRectsContext clipRectsContext(paintingInfo.rootLayer, (paintFlag
s & PaintLayerUncachedClipRects) ? UncachedClipRects : PaintingClipRects); |
| 989 if (shouldRespectOverflowClip(paintFlags, renderer()) == IgnoreOverf
lowClip) | |
| 990 clipRectsContext.setIgnoreOverflowClip(); | |
| 991 clipRect = clipper().backgroundClipRect(clipRectsContext); | 984 clipRect = clipper().backgroundClipRect(clipRectsContext); |
| 992 clipRect.intersect(paintingInfo.paintDirtyRect); | 985 clipRect.intersect(paintingInfo.paintDirtyRect); |
| 993 | 986 |
| 994 // Push the parent coordinate space's clip. | 987 // Push the parent coordinate space's clip. |
| 995 parent()->clipToRect(paintingInfo, context, clipRect, paintFlags); | 988 parent()->clipToRect(paintingInfo, context, clipRect, paintFlags); |
| 996 } | 989 } |
| 997 | 990 |
| 998 paintLayerByApplyingTransform(context, paintingInfo, paintFlags); | 991 paintLayerByApplyingTransform(context, paintingInfo, paintFlags); |
| 999 | 992 |
| 1000 // Restore the clip. | 993 // Restore the clip. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1018 void RenderLayer::paintLayerContents(GraphicsContext* context, const LayerPainti
ngInfo& paintingInfo, PaintLayerFlags paintFlags) | 1011 void RenderLayer::paintLayerContents(GraphicsContext* context, const LayerPainti
ngInfo& paintingInfo, PaintLayerFlags paintFlags) |
| 1019 { | 1012 { |
| 1020 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); | 1013 ASSERT(isSelfPaintingLayer() || hasSelfPaintingLayerDescendant()); |
| 1021 | 1014 |
| 1022 bool haveTransparency = paintFlags & PaintLayerHaveTransparency; | 1015 bool haveTransparency = paintFlags & PaintLayerHaveTransparency; |
| 1023 bool isSelfPaintingLayer = this->isSelfPaintingLayer(); | 1016 bool isSelfPaintingLayer = this->isSelfPaintingLayer(); |
| 1024 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr
ollbars; | 1017 bool isPaintingOverlayScrollbars = paintFlags & PaintLayerPaintingOverlayScr
ollbars; |
| 1025 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing
ScrollingPhase; | 1018 bool isPaintingScrollingContent = paintFlags & PaintLayerPaintingCompositing
ScrollingPhase; |
| 1026 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi
tingForegroundPhase; | 1019 bool isPaintingCompositedForeground = paintFlags & PaintLayerPaintingComposi
tingForegroundPhase; |
| 1027 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi
tingBackgroundPhase; | 1020 bool isPaintingCompositedBackground = paintFlags & PaintLayerPaintingComposi
tingBackgroundPhase; |
| 1028 bool isPaintingOverflowContents = paintFlags & PaintLayerPaintingOverflowCon
tents; | |
| 1029 // Outline always needs to be painted even if we have no visible content. Al
so, | 1021 // Outline always needs to be painted even if we have no visible content. Al
so, |
| 1030 // the outline is painted in the background phase during composited scrollin
g. | 1022 // the outline is painted in the background phase during composited scrollin
g. |
| 1031 // If it were painted in the foreground phase, it would move with the scroll
ed | 1023 // If it were painted in the foreground phase, it would move with the scroll
ed |
| 1032 // content. When not composited scrolling, the outline is painted in the | 1024 // content. When not composited scrolling, the outline is painted in the |
| 1033 // foreground phase. Since scrolled contents are moved by paint invalidation
in this | 1025 // foreground phase. Since scrolled contents are moved by paint invalidation
in this |
| 1034 // case, the outline won't get 'dragged along'. | 1026 // case, the outline won't get 'dragged along'. |
| 1035 bool shouldPaintOutline = isSelfPaintingLayer && !isPaintingOverlayScrollbar
s | 1027 bool shouldPaintOutline = isSelfPaintingLayer && !isPaintingOverlayScrollbar
s |
| 1036 && ((isPaintingScrollingContent && isPaintingCompositedBackground) | 1028 && ((isPaintingScrollingContent && isPaintingCompositedBackground) |
| 1037 || (!isPaintingScrollingContent && isPaintingCompositedForeground)); | 1029 || (!isPaintingScrollingContent && isPaintingCompositedForeground)); |
| 1038 bool shouldPaintContent = isSelfPaintingLayer && !isPaintingOverlayScrollbar
s; | 1030 bool shouldPaintContent = isSelfPaintingLayer && !isPaintingOverlayScrollbar
s; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 LayerPaintingInfo localPaintingInfo(paintingInfo); | 1070 LayerPaintingInfo localPaintingInfo(paintingInfo); |
| 1079 bool deferredFiltersEnabled = renderer()->document().settings()->deferredFil
tersEnabled(); | 1071 bool deferredFiltersEnabled = renderer()->document().settings()->deferredFil
tersEnabled(); |
| 1080 FilterEffectRendererHelper filterPainter(filterRenderer() && paintsWithFilte
rs()); | 1072 FilterEffectRendererHelper filterPainter(filterRenderer() && paintsWithFilte
rs()); |
| 1081 | 1073 |
| 1082 LayerFragments layerFragments; | 1074 LayerFragments layerFragments; |
| 1083 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars)
{ | 1075 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars)
{ |
| 1084 // 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 | 1076 // 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 |
| 1085 // fragment should paint. | 1077 // fragment should paint. |
| 1086 collectFragments(layerFragments, localPaintingInfo.rootLayer, localPaint
ingInfo.paintDirtyRect, | 1078 collectFragments(layerFragments, localPaintingInfo.rootLayer, localPaint
ingInfo.paintDirtyRect, |
| 1087 (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : Pai
ntingClipRects, | 1079 (paintFlags & PaintLayerUncachedClipRects) ? UncachedClipRects : Pai
ntingClipRects, |
| 1088 shouldRespectOverflowClip(paintFlags, renderer()), &offsetFromRoot,
localPaintingInfo.subPixelAccumulation); | 1080 &offsetFromRoot, localPaintingInfo.subPixelAccumulation); |
| 1089 updatePaintingInfoForFragments(layerFragments, localPaintingInfo, paintF
lags, shouldPaintContent, &offsetFromRoot); | 1081 updatePaintingInfoForFragments(layerFragments, localPaintingInfo, paintF
lags, shouldPaintContent, &offsetFromRoot); |
| 1090 } | 1082 } |
| 1091 | 1083 |
| 1092 if (filterPainter.haveFilterEffect()) { | 1084 if (filterPainter.haveFilterEffect()) { |
| 1093 ASSERT(this->filterInfo()); | 1085 ASSERT(this->filterInfo()); |
| 1094 | 1086 |
| 1095 if (!rootRelativeBoundsComputed) | 1087 if (!rootRelativeBoundsComputed) |
| 1096 rootRelativeBounds = physicalBoundingBoxIncludingReflectionAndStacki
ngChildren(paintingInfo.rootLayer, offsetFromRoot); | 1088 rootRelativeBounds = physicalBoundingBoxIncludingReflectionAndStacki
ngChildren(paintingInfo.rootLayer, offsetFromRoot); |
| 1097 | 1089 |
| 1098 if (filterPainter.prepareFilterEffect(this, rootRelativeBounds, painting
Info.paintDirtyRect)) { | 1090 if (filterPainter.prepareFilterEffect(this, rootRelativeBounds, painting
Info.paintDirtyRect)) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1140 // is done by passing a nil paintingRoot down to our renderer (as if no pain
tingRoot was ever set). | 1132 // is done by passing a nil paintingRoot down to our renderer (as if no pain
tingRoot was ever set). |
| 1141 // Else, our renderer tree may or may not contain the painting root, so we p
ass that root along | 1133 // Else, our renderer tree may or may not contain the painting root, so we p
ass that root along |
| 1142 // so it will be tested against as we descend through the renderers. | 1134 // so it will be tested against as we descend through the renderers. |
| 1143 RenderObject* paintingRootForRenderer = 0; | 1135 RenderObject* paintingRootForRenderer = 0; |
| 1144 if (localPaintingInfo.paintingRoot && !renderer()->isDescendantOf(localPaint
ingInfo.paintingRoot)) | 1136 if (localPaintingInfo.paintingRoot && !renderer()->isDescendantOf(localPaint
ingInfo.paintingRoot)) |
| 1145 paintingRootForRenderer = localPaintingInfo.paintingRoot; | 1137 paintingRootForRenderer = localPaintingInfo.paintingRoot; |
| 1146 | 1138 |
| 1147 ASSERT(!(localPaintingInfo.paintBehavior & PaintBehaviorForceBlackText)); | 1139 ASSERT(!(localPaintingInfo.paintBehavior & PaintBehaviorForceBlackText)); |
| 1148 | 1140 |
| 1149 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPaintCo
ntent; | 1141 bool shouldPaintBackground = isPaintingCompositedBackground && shouldPaintCo
ntent; |
| 1150 bool shouldPaintNegZOrderList = (isPaintingScrollingContent && isPaintingOve
rflowContents) || (!isPaintingScrollingContent && isPaintingCompositedBackground
); | 1142 bool shouldPaintNegZOrderList = !isPaintingScrollingContent && isPaintingCom
positedBackground; |
| 1151 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPaintC
ontent; | 1143 bool shouldPaintOwnContents = isPaintingCompositedForeground && shouldPaintC
ontent; |
| 1152 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForeground
; | 1144 bool shouldPaintNormalFlowAndPosZOrderLists = isPaintingCompositedForeground
; |
| 1153 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; | 1145 bool shouldPaintOverlayScrollbars = isPaintingOverlayScrollbars; |
| 1154 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase)
&& shouldPaintContent && renderer()->hasMask(); | 1146 bool shouldPaintMask = (paintFlags & PaintLayerPaintingCompositingMaskPhase)
&& shouldPaintContent && renderer()->hasMask(); |
| 1155 | 1147 |
| 1156 // FIXME(sky): Get rid of PaintBehavior argument now that it's always Normal
. | 1148 // FIXME(sky): Get rid of PaintBehavior argument now that it's always Normal
. |
| 1157 PaintBehavior paintBehavior = PaintBehaviorNormal; | 1149 PaintBehavior paintBehavior = PaintBehaviorNormal; |
| 1158 | 1150 |
| 1159 if (shouldPaintBackground) { | 1151 if (shouldPaintBackground) { |
| 1160 paintBackgroundForFragments(layerFragments, context, transparencyLayerCo
ntext, paintingInfo.paintDirtyRect, haveTransparency, | 1152 paintBackgroundForFragments(layerFragments, context, transparencyLayerCo
ntext, paintingInfo.paintDirtyRect, haveTransparency, |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1237 LayerListMutationDetector mutationChecker(m_stackingNode.get()); | 1229 LayerListMutationDetector mutationChecker(m_stackingNode.get()); |
| 1238 #endif | 1230 #endif |
| 1239 | 1231 |
| 1240 RenderLayerStackingNodeIterator iterator(*m_stackingNode, childrenToVisit); | 1232 RenderLayerStackingNodeIterator iterator(*m_stackingNode, childrenToVisit); |
| 1241 while (RenderLayerStackingNode* child = iterator.next()) { | 1233 while (RenderLayerStackingNode* child = iterator.next()) { |
| 1242 child->layer()->paintLayer(context, paintingInfo, paintFlags); | 1234 child->layer()->paintLayer(context, paintingInfo, paintFlags); |
| 1243 } | 1235 } |
| 1244 } | 1236 } |
| 1245 | 1237 |
| 1246 void RenderLayer::collectFragments(LayerFragments& fragments, const RenderLayer*
rootLayer, const LayoutRect& dirtyRect, | 1238 void RenderLayer::collectFragments(LayerFragments& fragments, const RenderLayer*
rootLayer, const LayoutRect& dirtyRect, |
| 1247 ClipRectsCacheSlot clipRectsCacheSlot, ShouldRespectOverflowClip respectOver
flowClip, const LayoutPoint* offsetFromRoot, | 1239 ClipRectsCacheSlot clipRectsCacheSlot, const LayoutPoint* offsetFromRoot, |
| 1248 const LayoutSize& subPixelAccumulation, const LayoutRect* layerBoundingBox) | 1240 const LayoutSize& subPixelAccumulation, const LayoutRect* layerBoundingBox) |
| 1249 { | 1241 { |
| 1250 // For unpaginated layers, there is only one fragment. | 1242 // For unpaginated layers, there is only one fragment. |
| 1251 LayerFragment fragment; | 1243 LayerFragment fragment; |
| 1252 ClipRectsContext clipRectsContext(rootLayer, clipRectsCacheSlot, subPixelAcc
umulation); | 1244 ClipRectsContext clipRectsContext(rootLayer, clipRectsCacheSlot, subPixelAcc
umulation); |
| 1253 if (respectOverflowClip == IgnoreOverflowClip) | |
| 1254 clipRectsContext.setIgnoreOverflowClip(); | |
| 1255 clipper().calculateRects(clipRectsContext, dirtyRect, fragment.layerBounds,
fragment.backgroundRect, fragment.foregroundRect, fragment.outlineRect, offsetFr
omRoot); | 1245 clipper().calculateRects(clipRectsContext, dirtyRect, fragment.layerBounds,
fragment.backgroundRect, fragment.foregroundRect, fragment.outlineRect, offsetFr
omRoot); |
| 1256 fragments.append(fragment); | 1246 fragments.append(fragment); |
| 1257 } | 1247 } |
| 1258 | 1248 |
| 1259 void RenderLayer::updatePaintingInfoForFragments(LayerFragments& fragments, cons
t LayerPaintingInfo& localPaintingInfo, PaintLayerFlags localPaintFlags, | 1249 void RenderLayer::updatePaintingInfoForFragments(LayerFragments& fragments, cons
t LayerPaintingInfo& localPaintingInfo, PaintLayerFlags localPaintFlags, |
| 1260 bool shouldPaintContent, const LayoutPoint* offsetFromRoot) | 1250 bool shouldPaintContent, const LayoutPoint* offsetFromRoot) |
| 1261 { | 1251 { |
| 1262 ASSERT(offsetFromRoot); | 1252 ASSERT(offsetFromRoot); |
| 1263 for (size_t i = 0; i < fragments.size(); ++i) { | 1253 for (size_t i = 0; i < fragments.size(); ++i) { |
| 1264 LayerFragment& fragment = fragments.at(i); | 1254 LayerFragment& fragment = fragments.at(i); |
| 1265 fragment.shouldPaintContent = shouldPaintContent; | 1255 LayoutPoint newOffsetFromRoot = *offsetFromRoot; |
| 1266 if (this != localPaintingInfo.rootLayer || !(localPaintFlags & PaintLaye
rPaintingOverflowContents)) { | 1256 fragment.shouldPaintContent = shouldPaintContent && intersectsDamageRect
(fragment.layerBounds, fragment.backgroundRect.rect(), localPaintingInfo.rootLay
er, &newOffsetFromRoot); |
| 1267 LayoutPoint newOffsetFromRoot = *offsetFromRoot; | |
| 1268 fragment.shouldPaintContent &= intersectsDamageRect(fragment.layerBo
unds, fragment.backgroundRect.rect(), localPaintingInfo.rootLayer, &newOffsetFro
mRoot); | |
| 1269 } | |
| 1270 } | 1257 } |
| 1271 } | 1258 } |
| 1272 | 1259 |
| 1273 void RenderLayer::paintBackgroundForFragments(const LayerFragments& layerFragmen
ts, GraphicsContext* context, GraphicsContext* transparencyLayerContext, | 1260 void RenderLayer::paintBackgroundForFragments(const LayerFragments& layerFragmen
ts, GraphicsContext* context, GraphicsContext* transparencyLayerContext, |
| 1274 const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const L
ayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior, | 1261 const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const L
ayerPaintingInfo& localPaintingInfo, PaintBehavior paintBehavior, |
| 1275 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) | 1262 RenderObject* paintingRootForRenderer, PaintLayerFlags paintFlags) |
| 1276 { | 1263 { |
| 1277 for (size_t i = 0; i < layerFragments.size(); ++i) { | 1264 for (size_t i = 0; i < layerFragments.size(); ++i) { |
| 1278 const LayerFragment& fragment = layerFragments.at(i); | 1265 const LayerFragment& fragment = layerFragments.at(i); |
| 1279 if (!fragment.shouldPaintContent) | 1266 if (!fragment.shouldPaintContent) |
| (...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2201 } | 2188 } |
| 2202 } | 2189 } |
| 2203 | 2190 |
| 2204 void showLayerTree(const blink::RenderObject* renderer) | 2191 void showLayerTree(const blink::RenderObject* renderer) |
| 2205 { | 2192 { |
| 2206 if (!renderer) | 2193 if (!renderer) |
| 2207 return; | 2194 return; |
| 2208 showLayerTree(renderer->enclosingLayer()); | 2195 showLayerTree(renderer->enclosingLayer()); |
| 2209 } | 2196 } |
| 2210 #endif | 2197 #endif |
| OLD | NEW |