Bug 1462497 - Part 3: Don't condition useOpacity on values that might change silently between paints (HasAnimationsForCompositor, and the will-change budget). r=hiro

MozReview-Commit-ID: Kry5YIAIAHt

--HG--
extra : rebase_source : ccc1085ad534da882a9f5ef03a5b7675bc39ed08
This commit is contained in:
Matt Woodrow 2018-05-23 11:03:42 +12:00
Родитель c77fe6d1bd
Коммит 44fcf86181
3 изменённых файлов: 11 добавлений и 1 удалений

Просмотреть файл

@ -2954,9 +2954,12 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder,
// layer (for async animations), see
// nsSVGIntegrationsUtils::PaintMaskAndClipPath or
// nsSVGIntegrationsUtils::PaintFilter.
// Use MayNeedActiveLayer to decide, since we don't want to condition the wrapping
// display item on values that might change silently between paints (opacity activity
// can depend on the will-change budget).
bool useOpacity = HasVisualOpacity(effectSet) &&
!nsSVGUtils::CanOptimizeOpacity(this) &&
(!usingSVGEffects || nsDisplayOpacity::NeedsActiveLayer(aBuilder, this));
(!usingSVGEffects || nsDisplayOpacity::MayNeedActiveLayer(this));
bool useBlendMode = effects->mMixBlendMode != NS_STYLE_BLEND_NORMAL;
bool useStickyPosition = disp->mPosition == NS_STYLE_POSITION_STICKY &&
IsScrollFrameActive(aBuilder,

Просмотреть файл

@ -6526,6 +6526,12 @@ nsDisplayOpacity::NeedsActiveLayer(nsDisplayListBuilder* aBuilder, nsIFrame* aFr
return false;
}
/* static */ bool
nsDisplayOpacity::MayNeedActiveLayer(nsIFrame* aFrame)
{
return ActiveLayerTracker::IsStyleMaybeAnimated(aFrame, eCSSProperty_opacity);
}
void
nsDisplayOpacity::ApplyOpacity(nsDisplayListBuilder* aBuilder,
float aOpacity,

Просмотреть файл

@ -5386,6 +5386,7 @@ public:
bool OpacityAppliedToChildren() const { return mOpacityAppliedToChildren; }
static bool NeedsActiveLayer(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame);
static bool MayNeedActiveLayer(nsIFrame* aFrame);
NS_DISPLAY_DECL_NAME("Opacity", TYPE_OPACITY)
virtual void WriteDebugInfo(std::stringstream& aStream) override;