Changeset 169972 in webkit
- Timestamp:
- Jun 14, 2014, 10:40:49 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 5 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/compositing/masks/become-tiled-mask-expected.html (added)
-
LayoutTests/compositing/masks/become-tiled-mask.html (added)
-
LayoutTests/compositing/masks/cease-tiled-mask-expected.html (added)
-
LayoutTests/compositing/masks/cease-tiled-mask.html (added)
-
LayoutTests/compositing/masks/tiled-mask-expected.html (added)
-
LayoutTests/compositing/masks/tiled-mask.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/platform/graphics/GraphicsLayer.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/GraphicsLayer.h (modified) (2 diffs)
-
Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp (modified) (24 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r169965 r169972 1 2014-06-14 Simon Fraser <simon.fraser@apple.com> 2 3 Masks disappear when layers become tiled 4 https://bugs.webkit.org/show_bug.cgi?id=133892 5 <rdar://problem/17309793> 6 7 Reviewed by Tim Horton. 8 9 Tests for masking as they go into and out of tiled mode. 10 11 * compositing/masks/become-tiled-mask-expected.html: Added. 12 * compositing/masks/become-tiled-mask.html: Added. 13 * compositing/masks/cease-tiled-mask-expected.html: Added. 14 * compositing/masks/cease-tiled-mask.html: Added. 15 * compositing/masks/tiled-mask-expected.html: Added. 16 * compositing/masks/tiled-mask.html: Added. 17 1 18 2014-06-14 Commit Queue <commit-queue@webkit.org> 2 19 -
trunk/Source/WebCore/ChangeLog
r169970 r169972 1 2014-06-14 Simon Fraser <simon.fraser@apple.com> 2 3 Masks disappear when layers become tiled 4 https://bugs.webkit.org/show_bug.cgi?id=133892 5 <rdar://problem/17309793> 6 7 Reviewed by Tim Horton. 8 9 There were several problems with tiled mask layers. 10 11 First, when a layer became tiled it failed to re-apply the platform layer 12 for its mask; fixed by adding MaskLayerChanged to the set of flags in 13 swapFromOrToTiledLayer(). 14 15 Secondly, in CA, a mask layer's superlayer is the layer which is it masking, 16 so the if (oldLayer->superlayer())... code in swapFromOrToTiledLayer() would 17 erroneously try to swap out a sublayer on the superlayer with the mask. 18 19 Thirdly, the mask layer is updated after its host layer, but when the mask layer 20 become tiled, there was no code that updated the mask platform layer on its 21 host layer. Fix by: 22 1. setting a bit on a layer to note that it's being used as a mask. 23 2. setting the parent of such a layer to its host layer (mimicking CA) 24 3. when the mask becomes tiled, dirtying the MaskLayerChanged bit on 25 its parent and adding a clause to commitLayerChangesAfterSublayers() 26 to update the mask layer. 27 28 Finally, ASSERTION FAILED: owningGraphicsLayer()->isCommittingChanges() would 29 fire because we failed to set the m_isCommittingChanges flag while committing 30 the mask layer. Fix by moving the TemporaryChange<bool> that sets this flag 31 into commitLayerChangesBeforeSublayers() and commitLayerChangesAfterSublayers(). 32 33 Also used safe casts in more places in GraphicsLayerCA. 34 35 Tests: compositing/masks/become-tiled-mask.html 36 compositing/masks/cease-tiled-mask.html 37 compositing/masks/tiled-mask.html 38 39 * platform/graphics/GraphicsLayer.cpp: 40 (WebCore::GraphicsLayer::GraphicsLayer): 41 (WebCore::GraphicsLayer::removeFromParent): 42 (WebCore::GraphicsLayer::setMaskLayer): 43 * platform/graphics/GraphicsLayer.h: 44 (WebCore::GraphicsLayer::setIsMaskLayer): 45 (WebCore::GraphicsLayer::isMaskLayer): 46 (WebCore::GraphicsLayer::setMaskLayer): Deleted. 47 * platform/graphics/ca/GraphicsLayerCA.cpp: 48 (WebCore::GraphicsLayerCA::removeFromParent): 49 (WebCore::GraphicsLayerCA::setMaskLayer): 50 (WebCore::GraphicsLayerCA::recursiveVisibleRectChangeRequiresFlush): 51 (WebCore::GraphicsLayerCA::recursiveCommitChanges): 52 (WebCore::GraphicsLayerCA::commitLayerChangesBeforeSublayers): 53 (WebCore::GraphicsLayerCA::commitLayerChangesAfterSublayers): 54 (WebCore::GraphicsLayerCA::updateSublayerList): 55 (WebCore::GraphicsLayerCA::ensureStructuralLayer): 56 (WebCore::GraphicsLayerCA::updateMaskLayer): 57 (WebCore::GraphicsLayerCA::replicatedLayerRoot): 58 (WebCore::GraphicsLayerCA::createFilterAnimationsFromKeyframes): 59 (WebCore::GraphicsLayerCA::swapFromOrToTiledLayer): 60 (WebCore::GraphicsLayerCA::propagateLayerChangeToReplicas): 61 (WebCore::GraphicsLayerCA::fetchCloneLayers): 62 1 63 2014-06-14 peavo@outlook.com <peavo@outlook.com> 2 64 -
trunk/Source/WebCore/platform/graphics/GraphicsLayer.cpp
r169320 r169972 91 91 , m_showDebugBorder(false) 92 92 , m_showRepaintCounter(false) 93 , m_isMaskLayer(false) 93 94 , m_paintingPhase(GraphicsLayerPaintAllWithOverflowClip) 94 95 , m_contentsOrientation(CompositingCoordinatesTopDown) … … 261 262 } 262 263 263 setParent(0); 264 } 264 setParent(nullptr); 265 } 266 } 267 268 void GraphicsLayer::setMaskLayer(GraphicsLayer* layer) 269 { 270 if (layer == m_maskLayer) 271 return; 272 273 if (layer) { 274 layer->removeFromParent(); 275 layer->setParent(this); 276 layer->setIsMaskLayer(true); 277 } else if (m_maskLayer) { 278 m_maskLayer->setParent(nullptr); 279 m_maskLayer->setIsMaskLayer(false); 280 } 281 282 m_maskLayer = layer; 265 283 } 266 284 -
trunk/Source/WebCore/platform/graphics/GraphicsLayer.h
r168440 r169972 262 262 virtual void removeFromParent(); 263 263 264 // The parent() of a maskLayer is set to the layer being masked. 264 265 GraphicsLayer* maskLayer() const { return m_maskLayer; } 265 virtual void setMaskLayer(GraphicsLayer* layer) { m_maskLayer = layer; } 266 virtual void setMaskLayer(GraphicsLayer*); 267 268 void setIsMaskLayer(bool isMask) { m_isMaskLayer = isMask; } 269 bool isMaskLayer() const { return m_isMaskLayer; } 266 270 267 271 // The given layer will replicate this layer and its children; the replica renders behind this layer. … … 594 598 bool m_showDebugBorder : 1; 595 599 bool m_showRepaintCounter : 1; 600 bool m_isMaskLayer : 1; 596 601 597 602 GraphicsLayerPaintingPhase m_paintingPhase; -
trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp
r169690 r169972 457 457 { 458 458 if (m_parent) 459 static_cast<GraphicsLayerCA*>(m_parent)->noteSublayersChanged();459 toGraphicsLayerCA(m_parent)->noteSublayersChanged(); 460 460 GraphicsLayer::removeFromParent(); 461 461 } … … 472 472 473 473 if (m_replicatedLayer) 474 static_cast<GraphicsLayerCA*>(m_replicatedLayer)->propagateLayerChangeToReplicas();474 toGraphicsLayerCA(m_replicatedLayer)->propagateLayerChangeToReplicas(); 475 475 } 476 476 … … 1036 1036 1037 1037 if (m_maskLayer) { 1038 GraphicsLayerCA* maskLayerCA = static_cast<GraphicsLayerCA*>(m_maskLayer);1038 GraphicsLayerCA* maskLayerCA = toGraphicsLayerCA(m_maskLayer); 1039 1039 if (maskLayerCA->recursiveVisibleRectChangeRequiresFlush(localState)) 1040 1040 return true; … … 1045 1045 1046 1046 for (size_t i = 0; i < numChildren; ++i) { 1047 GraphicsLayerCA* curChild = static_cast<GraphicsLayerCA*>(childLayers[i]);1047 GraphicsLayerCA* curChild = toGraphicsLayerCA(childLayers[i]); 1048 1048 if (curChild->recursiveVisibleRectChangeRequiresFlush(localState)) 1049 1049 return true; … … 1051 1051 1052 1052 if (m_replicaLayer) 1053 if ( static_cast<GraphicsLayerCA*>(m_replicaLayer)->recursiveVisibleRectChangeRequiresFlush(localState))1053 if (toGraphicsLayerCA(m_replicaLayer)->recursiveVisibleRectChangeRequiresFlush(localState)) 1054 1054 return true; 1055 1055 … … 1151 1151 m_uncommittedChanges |= VisibleRectChanged; 1152 1152 m_visibleRect = visibleRect; 1153 1154 if (GraphicsLayerCA* maskLayer = toGraphicsLayerCA(m_maskLayer)) { 1155 // FIXME: this assumes that the mask layer has the same geometry as this layer (which is currently always true). 1156 maskLayer->m_uncommittedChanges |= VisibleRectChanged; 1157 maskLayer->m_visibleRect = visibleRect; 1158 } 1153 1159 } 1154 1160 … … 1188 1194 baseRelativePosition += m_position; 1189 1195 1190 { 1191 TemporaryChange<bool> committingChangesChange(m_isCommittingChanges, true); 1192 commitLayerChangesBeforeSublayers(childCommitState, pageScaleFactor, baseRelativePosition, oldVisibleRect); 1193 } 1196 commitLayerChangesBeforeSublayers(childCommitState, pageScaleFactor, baseRelativePosition, oldVisibleRect); 1194 1197 1195 1198 if (isRunningTransformAnimation()) { … … 1198 1201 } 1199 1202 1200 if (m_maskLayer) { 1201 GraphicsLayerCA* maskLayerCA = static_cast<GraphicsLayerCA*>(m_maskLayer); 1202 maskLayerCA->commitLayerChangesBeforeSublayers(childCommitState, pageScaleFactor, baseRelativePosition, maskLayerCA->visibleRect()); 1203 } 1203 if (GraphicsLayerCA* maskLayer = toGraphicsLayerCA(m_maskLayer)) 1204 maskLayer->commitLayerChangesBeforeSublayers(childCommitState, pageScaleFactor, baseRelativePosition, oldVisibleRect); 1204 1205 1205 1206 const Vector<GraphicsLayer*>& childLayers = children(); … … 1207 1208 1208 1209 for (size_t i = 0; i < numChildren; ++i) { 1209 GraphicsLayerCA* curChild = static_cast<GraphicsLayerCA*>(childLayers[i]);1210 GraphicsLayerCA* curChild = toGraphicsLayerCA(childLayers[i]); 1210 1211 curChild->recursiveCommitChanges(childCommitState, localState, pageScaleFactor, baseRelativePosition, affectedByPageScale); 1211 1212 } 1212 1213 1213 if (m_replicaLayer) 1214 static_cast<GraphicsLayerCA*>(m_replicaLayer)->recursiveCommitChanges(childCommitState, localState, pageScaleFactor, baseRelativePosition, affectedByPageScale); 1215 1216 if (m_maskLayer) 1217 static_cast<GraphicsLayerCA*>(m_maskLayer)->commitLayerChangesAfterSublayers(childCommitState); 1218 1219 { 1220 TemporaryChange<bool> committingChangesChange(m_isCommittingChanges, true); 1221 commitLayerChangesAfterSublayers(childCommitState); 1222 } 1214 if (GraphicsLayerCA* replicaLayer = toGraphicsLayerCA(m_replicaLayer)) 1215 replicaLayer->recursiveCommitChanges(childCommitState, localState, pageScaleFactor, baseRelativePosition, affectedByPageScale); 1216 1217 if (GraphicsLayerCA* maskLayer = toGraphicsLayerCA(m_maskLayer)) 1218 maskLayer->commitLayerChangesAfterSublayers(childCommitState); 1219 1220 commitLayerChangesAfterSublayers(childCommitState); 1223 1221 1224 1222 if (affectedByTransformAnimation && m_layer->layerType() == PlatformCALayer::LayerTypeTiledBackingLayer) … … 1271 1269 void GraphicsLayerCA::commitLayerChangesBeforeSublayers(CommitState& commitState, float pageScaleFactor, const FloatPoint& positionRelativeToBase, const FloatRect& oldVisibleRect) 1272 1270 { 1271 TemporaryChange<bool> committingChangesChange(m_isCommittingChanges, true); 1272 1273 1273 ++commitState.treeDepth; 1274 1274 if (m_structuralLayer) … … 1365 1365 updateContentsRects(); 1366 1366 1367 if (m_uncommittedChanges & MaskLayerChanged) 1367 if (m_uncommittedChanges & MaskLayerChanged) { 1368 1368 updateMaskLayer(); 1369 // If the mask layer becomes tiled it can set this flag again. Clear the flag so that 1370 // commitLayerChangesAfterSublayers doesn't update the mask again in the normal case. 1371 m_uncommittedChanges &= ~MaskLayerChanged; 1372 } 1369 1373 1370 1374 if (m_uncommittedChanges & ContentsNeedsDisplay) … … 1398 1402 if (!m_uncommittedChanges) 1399 1403 return; 1404 1405 TemporaryChange<bool> committingChangesChange(m_isCommittingChanges, true); 1406 1407 if (m_uncommittedChanges & MaskLayerChanged) 1408 updateMaskLayer(); 1400 1409 1401 1410 if (m_uncommittedChanges & ChildrenChanged) … … 1442 1451 if (m_structuralLayer) { 1443 1452 if (m_replicaLayer) 1444 structuralLayerChildren.append( static_cast<GraphicsLayerCA*>(m_replicaLayer)->primaryLayer());1453 structuralLayerChildren.append(toGraphicsLayerCA(m_replicaLayer)->primaryLayer()); 1445 1454 1446 1455 structuralLayerChildren.append(m_layer); … … 1457 1466 size_t numChildren = childLayers.size(); 1458 1467 for (size_t i = 0; i < numChildren; ++i) { 1459 GraphicsLayerCA* curChild = static_cast<GraphicsLayerCA*>(childLayers[i]);1468 GraphicsLayerCA* curChild = toGraphicsLayerCA(childLayers[i]); 1460 1469 PlatformCALayer* childLayer = curChild->layerForSuperlayer(); 1461 1470 childListForSublayers.append(childLayer); … … 1742 1751 // We've changed the layer that our parent added to its sublayer list, so tell it to update 1743 1752 // sublayers again in its commitLayerChangesAfterSublayers(). 1744 static_cast<GraphicsLayerCA*>(parent())->noteSublayersChanged(DontScheduleFlush);1753 toGraphicsLayerCA(parent())->noteSublayersChanged(DontScheduleFlush); 1745 1754 1746 1755 // Set properties of m_layer to their default values, since these are expressed on on the structural layer. … … 2036 2045 void GraphicsLayerCA::updateMaskLayer() 2037 2046 { 2038 PlatformCALayer* maskCALayer = m_maskLayer ? static_cast<GraphicsLayerCA*>(m_maskLayer)->primaryLayer() : 0;2047 PlatformCALayer* maskCALayer = m_maskLayer ? toGraphicsLayerCA(m_maskLayer)->primaryLayer() : 0; 2039 2048 m_layer->setMask(maskCALayer); 2040 2049 2041 LayerMap* maskLayerCloneMap = m_maskLayer ? static_cast<GraphicsLayerCA*>(m_maskLayer)->primaryLayerClones() : 0;2050 LayerMap* maskLayerCloneMap = m_maskLayer ? toGraphicsLayerCA(m_maskLayer)->primaryLayerClones() : 0; 2042 2051 2043 2052 if (LayerMap* layerCloneMap = m_layerClones.get()) { … … 2092 2101 return 0; 2093 2102 2094 GraphicsLayerCA* replicatedLayer = static_cast<GraphicsLayerCA*>(m_replicatedLayer);2103 GraphicsLayerCA* replicatedLayer = toGraphicsLayerCA(m_replicatedLayer); 2095 2104 2096 2105 RefPtr<PlatformCALayer> clonedLayerRoot = replicatedLayer->fetchCloneLayers(this, replicaState, RootCloneLevel); … … 2424 2433 if (listIndex < 0) 2425 2434 return false; 2426 2435 2427 2436 const FilterOperations& operations = static_cast<const FilterAnimationValue&>(valueList.at(listIndex)).value(); 2428 2437 // Make sure the platform layer didn't fallback to using software filter compositing instead. … … 3007 3016 #endif 3008 3017 3009 // Skip this step if we don't have a superlayer. This is probably a benign 3010 // case that happens while restructuring the layer tree, and also occurs with 3011 // WebKit2 page overlays, which can become tiled but are out-of-tree. 3012 if (oldLayer->superlayer()) 3018 if (isMaskLayer()) { 3019 // A mask layer's superlayer is the layer that it masks. Set the MaskLayerChanged dirty bit 3020 // so that the parent will fix up the platform layers in commitLayerChangesAfterSublayers(). 3021 if (GraphicsLayer* parentLayer = parent()) 3022 toGraphicsLayerCA(parentLayer)->noteLayerPropertyChanged(MaskLayerChanged); 3023 } else if (oldLayer->superlayer()) { 3024 // Skip this step if we don't have a superlayer. This is probably a benign 3025 // case that happens while restructuring the layer tree, and also occurs with 3026 // WebKit2 page overlays, which can become tiled but are out-of-tree. 3013 3027 oldLayer->superlayer()->replaceSublayer(oldLayer.get(), m_layer.get()); 3028 } 3014 3029 3015 3030 m_uncommittedChanges |= ChildrenChanged … … 3024 3039 | AcceleratesDrawingChanged 3025 3040 | FiltersChanged 3041 | MaskLayerChanged 3026 3042 | OpacityChanged 3027 3043 | DebugIndicatorsChanged; … … 3144 3160 { 3145 3161 for (GraphicsLayer* currLayer = this; currLayer; currLayer = currLayer->parent()) { 3146 GraphicsLayerCA* currLayerCA = static_cast<GraphicsLayerCA*>(currLayer);3162 GraphicsLayerCA* currLayerCA = toGraphicsLayerCA(currLayer); 3147 3163 if (!currLayerCA->hasCloneLayers()) 3148 3164 break; 3149 3165 3150 3166 if (currLayerCA->replicaLayer()) 3151 static_cast<GraphicsLayerCA*>(currLayerCA->replicaLayer())->noteLayerPropertyChanged(ReplicatedLayerChanged);3167 toGraphicsLayerCA(currLayerCA->replicaLayer())->noteLayerPropertyChanged(ReplicatedLayerChanged); 3152 3168 } 3153 3169 } … … 3162 3178 3163 3179 if (m_maskLayer) { 3164 RefPtr<PlatformCALayer> maskClone = static_cast<GraphicsLayerCA*>(m_maskLayer)->fetchCloneLayers(replicaRoot, replicaState, IntermediateCloneLevel);3180 RefPtr<PlatformCALayer> maskClone = toGraphicsLayerCA(m_maskLayer)->fetchCloneLayers(replicaRoot, replicaState, IntermediateCloneLevel); 3165 3181 primaryLayer->setMask(maskClone.get()); 3166 3182 } … … 3189 3205 // We have nested replicas. Ask the replica layer for a clone of its contents. 3190 3206 replicaState.setBranchType(ReplicaState::ReplicaBranch); 3191 replicaLayer = static_cast<GraphicsLayerCA*>(m_replicaLayer)->fetchCloneLayers(replicaRoot, replicaState, RootCloneLevel);3207 replicaLayer = toGraphicsLayerCA(m_replicaLayer)->fetchCloneLayers(replicaRoot, replicaState, RootCloneLevel); 3192 3208 replicaState.setBranchType(ReplicaState::ChildBranch); 3193 3209 } … … 3222 3238 size_t numChildren = childLayers.size(); 3223 3239 for (size_t i = 0; i < numChildren; ++i) { 3224 GraphicsLayerCA* curChild = static_cast<GraphicsLayerCA*>(childLayers[i]);3240 GraphicsLayerCA* curChild = toGraphicsLayerCA(childLayers[i]); 3225 3241 3226 3242 RefPtr<PlatformCALayer> childLayer = curChild->fetchCloneLayers(replicaRoot, replicaState, IntermediateCloneLevel);
Note:
See TracChangeset
for help on using the changeset viewer.