зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1473136: Cache mNeedsActiveLayer once for nsDisplayOpacity. r=mattwoodrow
This commit is contained in:
Родитель
2a544047c6
Коммит
a95db7c11a
|
@ -2952,6 +2952,8 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
|
|||
aBuilder->EnterSVGEffectsContents(&hoistedScrollInfoItemsStorage);
|
||||
}
|
||||
|
||||
|
||||
bool needsActiveOpacityLayer = false;
|
||||
// We build an opacity item if it's not going to be drawn by SVG content, or
|
||||
// SVG effects. SVG effects won't handle the opacity if we want an active
|
||||
// layer (for async animations), see
|
||||
|
@ -2959,7 +2961,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
|
|||
// nsSVGIntegrationsUtils::PaintFilter.
|
||||
bool useOpacity = HasVisualOpacity(effectSet) &&
|
||||
!nsSVGUtils::CanOptimizeOpacity(this) &&
|
||||
(!usingSVGEffects || nsDisplayOpacity::NeedsActiveLayer(aBuilder, this));
|
||||
((needsActiveOpacityLayer = nsDisplayOpacity::NeedsActiveLayer(aBuilder, this)) || !usingSVGEffects);
|
||||
bool useBlendMode = effects->mMixBlendMode != NS_STYLE_BLEND_NORMAL;
|
||||
bool useStickyPosition = disp->mPosition == NS_STYLE_POSITION_STICKY &&
|
||||
IsScrollFrameActive(aBuilder,
|
||||
|
@ -3259,9 +3261,10 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
|
|||
// all descendant content, but some should not be clipped.
|
||||
DisplayListClipState::AutoSaveRestore opacityClipState(aBuilder);
|
||||
resultList.AppendToTop(
|
||||
MakeDisplayItem<nsDisplayOpacity>(aBuilder, this, &resultList,
|
||||
MakeDisplayItem<nsDisplayOpacity>(aBuilder, this, &resultList,
|
||||
containerItemASR,
|
||||
opacityItemForEventsAndPluginsOnly));
|
||||
opacityItemForEventsAndPluginsOnly,
|
||||
needsActiveOpacityLayer));
|
||||
if (aCreatedContainerItem) {
|
||||
*aCreatedContainerItem = true;
|
||||
}
|
||||
|
|
|
@ -6237,10 +6237,12 @@ nsresult nsDisplayWrapper::WrapListsInPlace(nsDisplayListBuilder* aBuilder,
|
|||
nsDisplayOpacity::nsDisplayOpacity(nsDisplayListBuilder* aBuilder,
|
||||
nsIFrame* aFrame, nsDisplayList* aList,
|
||||
const ActiveScrolledRoot* aActiveScrolledRoot,
|
||||
bool aForEventsAndPluginsOnly)
|
||||
bool aForEventsAndPluginsOnly,
|
||||
bool aNeedsActiveLayer)
|
||||
: nsDisplayWrapList(aBuilder, aFrame, aList, aActiveScrolledRoot, true)
|
||||
, mOpacity(aFrame->StyleEffects()->mOpacity)
|
||||
, mForEventsAndPluginsOnly(aForEventsAndPluginsOnly)
|
||||
, mNeedsActiveLayer(aNeedsActiveLayer)
|
||||
, mChildOpacityState(ChildOpacityState::Unknown)
|
||||
{
|
||||
MOZ_COUNT_CTOR(nsDisplayOpacity);
|
||||
|
@ -6434,7 +6436,7 @@ nsDisplayOpacity::ShouldFlattenAway(nsDisplayListBuilder* aBuilder)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (NeedsActiveLayer(aBuilder, mFrame) || mOpacity == 0.0) {
|
||||
if (mNeedsActiveLayer || mOpacity == 0.0) {
|
||||
// If our opacity is zero then we'll discard all descendant display items
|
||||
// except for layer event regions, so there's no point in doing this
|
||||
// optimization (and if we do do it, then invalidations of those descendants
|
||||
|
@ -6464,7 +6466,7 @@ nsDisplayOpacity::GetLayerState(nsDisplayListBuilder* aBuilder,
|
|||
return LAYER_INACTIVE;
|
||||
}
|
||||
|
||||
if (NeedsActiveLayer(aBuilder, mFrame)) {
|
||||
if (mNeedsActiveLayer) {
|
||||
// Returns LAYER_ACTIVE_FORCE to avoid flatterning the layer for async
|
||||
// animations.
|
||||
return LAYER_ACTIVE_FORCE;
|
||||
|
|
|
@ -5121,13 +5121,15 @@ public:
|
|||
nsDisplayOpacity(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
|
||||
nsDisplayList* aList,
|
||||
const ActiveScrolledRoot* aActiveScrolledRoot,
|
||||
bool aForEventsAndPluginsOnly);
|
||||
bool aForEventsAndPluginsOnly,
|
||||
bool aNeedsActiveLayer);
|
||||
|
||||
nsDisplayOpacity(nsDisplayListBuilder* aBuilder,
|
||||
const nsDisplayOpacity& aOther)
|
||||
: nsDisplayWrapList(aBuilder, aOther)
|
||||
, mOpacity(aOther.mOpacity)
|
||||
, mForEventsAndPluginsOnly(aOther.mForEventsAndPluginsOnly)
|
||||
, mNeedsActiveLayer(aOther.mNeedsActiveLayer)
|
||||
, mChildOpacityState(ChildOpacityState::Unknown)
|
||||
{
|
||||
// We should not try to merge flattened opacities.
|
||||
|
@ -5225,6 +5227,7 @@ private:
|
|||
// Opacity is applied to our children.
|
||||
Applied
|
||||
};
|
||||
bool mNeedsActiveLayer : 1;
|
||||
#ifndef __GNUC__
|
||||
ChildOpacityState mChildOpacityState : 2;
|
||||
#else
|
||||
|
|
Загрузка…
Ссылка в новой задаче