Bug 1248913 - Make nsDisplayBlendContainer active or inactive based on its contents. r=mattwoodrow a=ritu

MozReview-Commit-ID: GN0084Rrmlm
This commit is contained in:
Markus Stange 2016-03-08 14:39:07 -05:00
parent 46fecc69df
commit 6325001bf3

View File

@ -4004,6 +4004,15 @@ RequiredLayerStateForChildren(nsDisplayListBuilder* aBuilder,
}
LayerState state = i->GetLayerState(aBuilder, aManager, aParameters);
if (state == LAYER_ACTIVE && i->GetType() == nsDisplayItem::TYPE_BLEND_MODE) {
// nsDisplayBlendMode always returns LAYER_ACTIVE to ensure that the
// blending operation happens in the intermediate surface of its parent
// display item (usually an nsDisplayBlendContainer). But this does not
// mean that it needs all its ancestor display items to become active.
// So we ignore its layer state and look at its children instead.
state = RequiredLayerStateForChildren(aBuilder, aManager, aParameters,
*i->GetSameCoordinateSystemChildren(), i->GetAnimatedGeometryRoot());
}
if ((state == LAYER_ACTIVE || state == LAYER_ACTIVE_FORCE) &&
state > result) {
result = state;
@ -4445,7 +4454,7 @@ nsDisplayBlendContainer::GetLayerState(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
const ContainerLayerParameters& aParameters)
{
return mozilla::LAYER_ACTIVE;
return RequiredLayerStateForChildren(aBuilder, aManager, aParameters, mList, GetAnimatedGeometryRoot());
}
bool nsDisplayBlendContainer::TryMerge(nsDisplayItem* aItem) {