Index: Source/core/rendering/RenderObject.cpp |
diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp |
index a6df2caec37d4f08d9c73a00f56d20f0db39bc8a..ff85e413b4df4c068907dd33525f5abdc684a32c 100644 |
--- a/Source/core/rendering/RenderObject.cpp |
+++ b/Source/core/rendering/RenderObject.cpp |
@@ -1367,7 +1367,7 @@ void RenderObject::repaintUsingContainer(const RenderLayerModelObject* repaintCo |
RenderView* v = view(); |
if (repaintContainer->isRenderView()) { |
ASSERT(repaintContainer == v); |
- bool viewHasCompositedLayer = v->hasLayer() && v->layer()->isComposited(); |
+ bool viewHasCompositedLayer = v->hasLayer() && v->layer()->compositingState() == PaintsIntoOwnBacking; |
if (!viewHasCompositedLayer) { |
IntRect repaintRectangle = r; |
if (viewHasCompositedLayer && v->layer()->transform()) |
@@ -1378,7 +1378,7 @@ void RenderObject::repaintUsingContainer(const RenderLayerModelObject* repaintCo |
} |
if (v->usesCompositing()) { |
- ASSERT(repaintContainer->hasLayer() && repaintContainer->layer()->isComposited()); |
+ ASSERT(repaintContainer->hasLayer() && repaintContainer->layer()->compositingState() == PaintsIntoOwnBacking); |
repaintContainer->layer()->setBackingNeedsRepaintInRect(r); |
} |
} |
@@ -1743,12 +1743,15 @@ void RenderObject::setAnimatableStyle(PassRefPtr<RenderStyle> style) |
StyleDifference RenderObject::adjustStyleDifference(StyleDifference diff, unsigned contextSensitiveProperties) const |
{ |
- // If transform changed, and we are not composited, need to do a layout. |
+ // If transform changed, and the layer does not paint into its own separate backing, then we need to do a layout. |
+ // FIXME: The comment above is what the code does, but it is technically not following spec. This means we will |
+ // not to layout for 3d transforms, but we should be invoking a simplified relayout. Is it possible we are avoiding |
+ // doing this for some performance reason at this time? |
if (contextSensitiveProperties & ContextSensitivePropertyTransform) { |
// Text nodes share style with their parents but transforms don't apply to them, |
// hence the !isText() check. |
// FIXME: when transforms are taken into account for overflow, we will need to do a layout. |
- if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer()->isComposited())) { |
+ if (!isText() && (!hasLayer() || toRenderLayerModelObject(this)->layer()->compositingState() != PaintsIntoOwnBacking)) { |
// We need to set at least SimplifiedLayout, but if PositionedMovementOnly is already set |
// then we actually need SimplifiedLayoutAndPositionedMovement. |
if (!hasLayer()) |
@@ -1761,18 +1764,17 @@ StyleDifference RenderObject::adjustStyleDifference(StyleDifference diff, unsign |
diff = StyleDifferenceRecompositeLayer; |
} |
- // If opacity changed, and we are not composited, need to repaint (also |
+ // If opacity or filters changed, and the layer does not paint into its own separate backing, then we need to repaint (also |
// ignoring text nodes) |
if (contextSensitiveProperties & ContextSensitivePropertyOpacity) { |
- if (!isText() && (!hasLayer() || !toRenderLayerModelObject(this)->layer()->isComposited())) |
+ if (!isText() && (!hasLayer() || toRenderLayerModelObject(this)->layer()->compositingState() != PaintsIntoOwnBacking)) |
diff = StyleDifferenceRepaintLayer; |
else if (diff < StyleDifferenceRecompositeLayer) |
diff = StyleDifferenceRecompositeLayer; |
} |
- |
if ((contextSensitiveProperties & ContextSensitivePropertyFilter) && hasLayer()) { |
RenderLayer* layer = toRenderLayerModelObject(this)->layer(); |
- if (!layer->isComposited() || layer->paintsWithFilters()) |
+ if (layer->compositingState() != PaintsIntoOwnBacking || layer->paintsWithFilters()) |
diff = StyleDifferenceRepaintLayer; |
else if (diff < StyleDifferenceRecompositeLayer) |
diff = StyleDifferenceRecompositeLayer; |
@@ -2733,9 +2735,9 @@ void RenderObject::updateDragState(bool dragOn) |
curr->updateDragState(dragOn); |
} |
-bool RenderObject::isComposited() const |
+CompositingState RenderObject::compositingState() const |
{ |
- return hasLayer() && toRenderLayerModelObject(this)->layer()->isComposited(); |
+ return hasLayer() ? toRenderLayerModelObject(this)->layer()->compositingState() : NotComposited; |
} |
bool RenderObject::hitTest(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestFilter hitTestFilter) |