--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -2433,17 +2433,17 @@ CanvasRenderingContext2D::ParseFilter(co
RefPtr<nsStyleContext> sc =
ResolveStyleForFilter(aString, presShell, parentContext, aError);
if (!sc) {
return false;
}
- aFilterChain = sc->StyleSVGReset()->mFilters;
+ aFilterChain = sc->StyleEffects()->mFilters;
return true;
}
void
CanvasRenderingContext2D::SetFilter(const nsAString& aFilter, ErrorResult& aError)
{
nsTArray<nsStyleFilter> filterChain;
if (ParseFilter(aFilter, filterChain, aError)) {
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -5677,17 +5677,17 @@ ComputeEffectsRect(nsIFrame* aFrame, con
const nsSize& aNewSize)
{
nsRect r = aOverflowRect;
if (aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT) {
// For SVG frames, we only need to account for filters.
// TODO: We could also take account of clipPath and mask to reduce the
// visual overflow, but that's not essential.
- if (aFrame->StyleSVGReset()->HasFilters()) {
+ if (aFrame->StyleEffects()->HasFilters()) {
aFrame->Properties().
Set(nsIFrame::PreEffectsBBoxProperty(), new nsRect(r));
r = nsSVGUtils::GetPostFilterVisualOverflowRect(aFrame, aOverflowRect);
}
return r;
}
// box-shadow
--- a/layout/style/StyleAnimationValue.cpp
+++ b/layout/style/StyleAnimationValue.cpp
@@ -3532,19 +3532,19 @@ StyleAnimationValue::ExtractComputedValu
case eCSSProperty_mask_size: {
const nsStyleImageLayers& layers =
static_cast<const nsStyleSVGReset*>(styleStruct)->mMask;
ExtractImageLayerSizePairList(layers, aComputedValue);
break;
}
#endif
case eCSSProperty_filter: {
- const nsStyleSVGReset *svgReset =
- static_cast<const nsStyleSVGReset*>(styleStruct);
- const nsTArray<nsStyleFilter>& filters = svgReset->mFilters;
+ const nsStyleEffects* effects =
+ static_cast<const nsStyleEffects*>(styleStruct);
+ const nsTArray<nsStyleFilter>& filters = effects->mFilters;
nsAutoPtr<nsCSSValueList> result;
nsCSSValueList **resultTail = getter_Transfers(result);
for (uint32_t i = 0; i < filters.Length(); ++i) {
nsCSSValueList *item = new nsCSSValueList;
*resultTail = item;
resultTail = &item->mNext;
const nsStyleFilter& filter = filters[i];
int32_t type = filter.GetType();
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -4007,17 +4007,17 @@ CSS_PROP_SVG(
fill_rule,
FillRule,
CSS_PROPERTY_PARSE_VALUE,
"",
VARIANT_HK,
kFillRuleKTable,
offsetof(nsStyleSVG, mFillRule),
eStyleAnimType_EnumU8)
-CSS_PROP_SVGRESET(
+CSS_PROP_EFFECTS(
filter,
filter,
Filter,
CSS_PROPERTY_PARSE_FUNCTION |
CSS_PROPERTY_CREATES_STACKING_CONTEXT |
CSS_PROPERTY_FIXPOS_CB,
"",
0,
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -6002,17 +6002,17 @@ nsComputedDOMStyle::CreatePrimitiveValue
value->SetString(filterFunctionString);
return value.forget();
}
already_AddRefed<CSSValue>
nsComputedDOMStyle::DoGetFilter()
{
- const nsTArray<nsStyleFilter>& filters = StyleSVGReset()->mFilters;
+ const nsTArray<nsStyleFilter>& filters = StyleEffects()->mFilters;
if (filters.IsEmpty()) {
RefPtr<nsROCSSPrimitiveValue> value = new nsROCSSPrimitiveValue;
value->SetIdent(eCSSKeyword_none);
return value.forget();
}
RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -9696,52 +9696,16 @@ nsRuleNode::ComputeSVGResetData(void* aS
// vector-effect: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForVectorEffect(),
svgReset->mVectorEffect,
conditions,
SETDSC_ENUMERATED | SETDSC_UNSET_INITIAL,
parentSVGReset->mVectorEffect,
NS_STYLE_VECTOR_EFFECT_NONE, 0, 0, 0, 0);
- // filter: url, none, inherit
- const nsCSSValue* filterValue = aRuleData->ValueForFilter();
- switch (filterValue->GetUnit()) {
- case eCSSUnit_Null:
- break;
- case eCSSUnit_None:
- case eCSSUnit_Initial:
- case eCSSUnit_Unset:
- svgReset->mFilters.Clear();
- break;
- case eCSSUnit_Inherit:
- conditions.SetUncacheable();
- svgReset->mFilters = parentSVGReset->mFilters;
- break;
- case eCSSUnit_List:
- case eCSSUnit_ListDep: {
- svgReset->mFilters.Clear();
- const nsCSSValueList* cur = filterValue->GetListValue();
- while (cur) {
- nsStyleFilter styleFilter;
- if (!SetStyleFilterToCSSValue(&styleFilter, cur->mValue, aContext,
- mPresContext, conditions)) {
- svgReset->mFilters.Clear();
- break;
- }
- MOZ_ASSERT(styleFilter.GetType() != NS_STYLE_FILTER_NONE,
- "filter should be set");
- svgReset->mFilters.AppendElement(styleFilter);
- cur = cur->mNext;
- }
- break;
- }
- default:
- NS_NOTREACHED("unexpected unit");
- }
-
// mask-type: enum, inherit, initial
SetDiscrete(*aRuleData->ValueForMaskType(),
svgReset->mMaskType,
conditions,
SETDSC_ENUMERATED | SETDSC_UNSET_INITIAL,
parentSVGReset->mMaskType,
NS_STYLE_MASK_TYPE_LUMINANCE, 0, 0, 0, 0);
@@ -9920,16 +9884,52 @@ nsRuleNode::ComputeEffectsData(void* aSt
const nsRuleData* aRuleData,
nsStyleContext* aContext,
nsRuleNode* aHighestNode,
const RuleDetail aRuleDetail,
const RuleNodeCacheConditions aConditions)
{
COMPUTE_START_RESET(Effects, effects, parentEffects)
+ // filter: url, none, inherit
+ const nsCSSValue* filterValue = aRuleData->ValueForFilter();
+ switch (filterValue->GetUnit()) {
+ case eCSSUnit_Null:
+ break;
+ case eCSSUnit_None:
+ case eCSSUnit_Initial:
+ case eCSSUnit_Unset:
+ effects->mFilters.Clear();
+ break;
+ case eCSSUnit_Inherit:
+ conditions.SetUncacheable();
+ effects->mFilters = parentEffects->mFilters;
+ break;
+ case eCSSUnit_List:
+ case eCSSUnit_ListDep: {
+ effects->mFilters.Clear();
+ const nsCSSValueList* cur = filterValue->GetListValue();
+ while (cur) {
+ nsStyleFilter styleFilter;
+ if (!SetStyleFilterToCSSValue(&styleFilter, cur->mValue, aContext,
+ mPresContext, conditions)) {
+ effects->mFilters.Clear();
+ break;
+ }
+ MOZ_ASSERT(styleFilter.GetType() != NS_STYLE_FILTER_NONE,
+ "filter should be set");
+ effects->mFilters.AppendElement(styleFilter);
+ cur = cur->mNext;
+ }
+ break;
+ }
+ default:
+ NS_NOTREACHED("unexpected unit");
+ }
+
// box-shadow: none, list, inherit, initial
const nsCSSValue* boxShadowValue = aRuleData->ValueForBoxShadow();
switch (boxShadowValue->GetUnit()) {
case eCSSUnit_Null:
break;
case eCSSUnit_Initial:
case eCSSUnit_Unset:
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -1337,17 +1337,16 @@ nsStyleSVGReset::~nsStyleSVGReset()
nsStyleSVGReset::nsStyleSVGReset(const nsStyleSVGReset& aSource)
: mMask(aSource.mMask)
{
MOZ_COUNT_CTOR(nsStyleSVGReset);
mStopColor = aSource.mStopColor;
mFloodColor = aSource.mFloodColor;
mLightingColor = aSource.mLightingColor;
mClipPath = aSource.mClipPath;
- mFilters = aSource.mFilters;
mStopOpacity = aSource.mStopOpacity;
mFloodOpacity = aSource.mFloodOpacity;
mDominantBaseline = aSource.mDominantBaseline;
mVectorEffect = aSource.mVectorEffect;
mMaskType = aSource.mMaskType;
}
void nsStyleSVGReset::Destroy(nsPresContext* aContext) {
@@ -1357,29 +1356,21 @@ void nsStyleSVGReset::Destroy(nsPresCont
aContext->PresShell()->
FreeByObjectID(mozilla::eArenaObjectID_nsStyleSVGReset, this);
}
nsChangeHint nsStyleSVGReset::CalcDifference(const nsStyleSVGReset& aOther) const
{
nsChangeHint hint = nsChangeHint(0);
- if (HasFilters() != aOther.HasFilters()) {
- // A change from/to being a containing block for position:fixed.
- NS_UpdateHint(hint, nsChangeHint_UpdateContainingBlock);
- }
-
- if (mClipPath != aOther.mClipPath ||
- mFilters != aOther.mFilters) {
+ if (mClipPath != aOther.mClipPath) {
NS_UpdateHint(hint, nsChangeHint_UpdateEffects);
NS_UpdateHint(hint, nsChangeHint_RepaintFrame);
- // We only actually need to update the overflow area for filter
- // changes. However, clip-path changes require that we update
- // the PreEffectsBBoxProperty, which is done during overflow
- // computation.
+ // clip-path changes require that we update the PreEffectsBBoxProperty,
+ // which is done during overflow computation.
NS_UpdateHint(hint, nsChangeHint_UpdateOverflow);
}
if (mDominantBaseline != aOther.mDominantBaseline) {
// XXXjwatt: why NS_STYLE_HINT_REFLOW? Isn't that excessive?
NS_UpdateHint(hint, NS_STYLE_HINT_REFLOW);
} else if (mVectorEffect != aOther.mVectorEffect) {
// Stroke currently affects nsSVGPathGeometryFrame::mRect, and
@@ -3971,17 +3962,18 @@ nsStyleEffects::nsStyleEffects(StyleStru
, mOpacity(1.0f)
, mClipFlags(NS_STYLE_CLIP_AUTO)
, mMixBlendMode(NS_STYLE_BLEND_NORMAL)
{
MOZ_COUNT_CTOR(nsStyleEffects);
}
nsStyleEffects::nsStyleEffects(const nsStyleEffects& aSource)
- : mBoxShadow(aSource.mBoxShadow)
+ : mFilters(aSource.mFilters)
+ , mBoxShadow(aSource.mBoxShadow)
, mClip(aSource.mClip)
, mOpacity(aSource.mOpacity)
, mClipFlags(aSource.mClipFlags)
, mMixBlendMode(aSource.mMixBlendMode)
{
MOZ_COUNT_CTOR(nsStyleEffects);
}
@@ -4027,16 +4019,27 @@ nsStyleEffects::CalcDifference(const nsS
} else {
hint |= nsChangeHint_UpdateOpacityLayer;
if ((mOpacity == 1.0f) != (aOther.mOpacity == 1.0f)) {
hint |= nsChangeHint_UpdateUsesOpacity;
}
}
}
+ if (HasFilters() != aOther.HasFilters()) {
+ // A change from/to being a containing block for position:fixed.
+ hint |= nsChangeHint_UpdateContainingBlock;
+ }
+
+ if (mFilters != aOther.mFilters) {
+ hint |= nsChangeHint_UpdateEffects |
+ nsChangeHint_RepaintFrame |
+ nsChangeHint_UpdateOverflow;
+ }
+
if (mMixBlendMode != aOther.mMixBlendMode) {
hint |= nsChangeHint_RepaintFrame;
}
if (!hint &&
!mClip.IsEqualEdges(aOther.mClip)) {
hint |= nsChangeHint_NeutralChange;
}
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -3483,43 +3483,37 @@ struct nsStyleSVGReset
AllocateByObjectID(mozilla::eArenaObjectID_nsStyleSVGReset, sz);
}
void Destroy(nsPresContext* aContext);
nsChangeHint CalcDifference(const nsStyleSVGReset& aOther) const;
static nsChangeHint MaxDifference() {
return nsChangeHint_UpdateEffects |
nsChangeHint_UpdateOverflow |
- nsChangeHint_UpdateContainingBlock |
nsChangeHint_NeutralChange |
NS_STYLE_HINT_REFLOW;
}
static nsChangeHint DifferenceAlwaysHandledForDescendants() {
// CalcDifference never returns the reflow hints that are sometimes
// handled for descendants as hints not handled for descendants.
return nsChangeHint_NeedReflow |
nsChangeHint_ReflowChangesSizeOrPosition |
nsChangeHint_ClearAncestorIntrinsics;
}
- bool HasFilters() const {
- return !mFilters.IsEmpty();
- }
-
bool HasClipPath() const {
return mClipPath.GetType() != NS_STYLE_CLIP_PATH_NONE;
}
bool HasNonScalingStroke() const {
return mVectorEffect == NS_STYLE_VECTOR_EFFECT_NON_SCALING_STROKE;
}
nsStyleImageLayers mMask;
nsStyleClipPath mClipPath; // [reset]
- nsTArray<nsStyleFilter> mFilters; // [reset]
nscolor mStopColor; // [reset]
nscolor mFloodColor; // [reset]
nscolor mLightingColor; // [reset]
float mStopOpacity; // [reset]
float mFloodOpacity; // [reset]
uint8_t mDominantBaseline; // [reset] see nsStyleConsts.h
@@ -3577,26 +3571,33 @@ struct nsStyleEffects
nsChangeHint CalcDifference(const nsStyleEffects& aOther) const;
static nsChangeHint MaxDifference() {
return nsChangeHint_AllReflowHints |
nsChangeHint_UpdateOverflow |
nsChangeHint_SchedulePaint |
nsChangeHint_RepaintFrame |
nsChangeHint_UpdateOpacityLayer |
nsChangeHint_UpdateUsesOpacity |
+ nsChangeHint_UpdateContainingBlock |
+ nsChangeHint_UpdateEffects |
nsChangeHint_NeutralChange;
}
static nsChangeHint DifferenceAlwaysHandledForDescendants() {
// CalcDifference never returns the reflow hints that are sometimes
// handled for descendants as hints not handled for descendants.
return nsChangeHint_NeedReflow |
nsChangeHint_ReflowChangesSizeOrPosition |
nsChangeHint_ClearAncestorIntrinsics;
}
+ bool HasFilters() const {
+ return !mFilters.IsEmpty();
+ }
+
+ nsTArray<nsStyleFilter> mFilters; // [reset]
RefPtr<nsCSSShadowArray> mBoxShadow; // [reset] nullptr for 'none'
nsRect mClip; // [reset] offsets from UL border edge
float mOpacity; // [reset]
uint8_t mClipFlags; // [reset] see nsStyleConsts.h
uint8_t mMixBlendMode; // [reset] see nsStyleConsts.h
};
#endif /* nsStyleStruct_h___ */
--- a/layout/style/nsStyleStructInlines.h
+++ b/layout/style/nsStyleStructInlines.h
@@ -140,17 +140,17 @@ nsStyleDisplay::IsFixedPosContainingBloc
{
// NOTE: Any CSS properties that influence the output of this function
// should have the CSS_PROPERTY_FIXPOS_CB set on them.
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
"unexpected aContextFrame");
return (IsContainPaint() || HasTransform(aContextFrame) ||
HasPerspectiveStyle() ||
(mWillChangeBitField & NS_STYLE_WILL_CHANGE_FIXPOS_CB) ||
- aContextFrame->StyleSVGReset()->HasFilters()) &&
+ aContextFrame->StyleEffects()->HasFilters()) &&
!aContextFrame->IsSVGText();
}
bool
nsStyleDisplay::IsAbsPosContainingBlock(const nsIFrame* aContextFrame) const
{
NS_ASSERTION(aContextFrame->StyleDisplay() == this,
"unexpected aContextFrame");
--- a/layout/svg/nsFilterInstance.cpp
+++ b/layout/svg/nsFilterInstance.cpp
@@ -58,17 +58,17 @@ UserSpaceMetricsForFrame(nsIFrame* aFram
nsresult
nsFilterInstance::PaintFilteredFrame(nsIFrame *aFilteredFrame,
DrawTarget* aDrawTarget,
const gfxMatrix& aTransform,
nsSVGFilterPaintCallback *aPaintCallback,
const nsRegion *aDirtyArea)
{
- auto& filterChain = aFilteredFrame->StyleSVGReset()->mFilters;
+ auto& filterChain = aFilteredFrame->StyleEffects()->mFilters;
UniquePtr<UserSpaceMetrics> metrics = UserSpaceMetricsForFrame(aFilteredFrame);
nsFilterInstance instance(aFilteredFrame, aFilteredFrame->GetContent(), *metrics,
filterChain, aPaintCallback, aTransform,
aDirtyArea, nullptr, nullptr, nullptr);
if (!instance.IsInitialized()) {
return NS_OK;
}
return instance.Render(aDrawTarget);
@@ -78,17 +78,17 @@ nsRegion
nsFilterInstance::GetPostFilterDirtyArea(nsIFrame *aFilteredFrame,
const nsRegion& aPreFilterDirtyRegion)
{
if (aPreFilterDirtyRegion.IsEmpty()) {
return nsRegion();
}
gfxMatrix unused; // aPaintTransform arg not used since we're not painting
- auto& filterChain = aFilteredFrame->StyleSVGReset()->mFilters;
+ auto& filterChain = aFilteredFrame->StyleEffects()->mFilters;
UniquePtr<UserSpaceMetrics> metrics = UserSpaceMetricsForFrame(aFilteredFrame);
nsFilterInstance instance(aFilteredFrame, aFilteredFrame->GetContent(), *metrics,
filterChain, nullptr, unused, nullptr,
&aPreFilterDirtyRegion);
if (!instance.IsInitialized()) {
return nsRegion();
}
@@ -98,17 +98,17 @@ nsFilterInstance::GetPostFilterDirtyArea
return instance.ComputePostFilterDirtyRegion();
}
nsRegion
nsFilterInstance::GetPreFilterNeededArea(nsIFrame *aFilteredFrame,
const nsRegion& aPostFilterDirtyRegion)
{
gfxMatrix unused; // aPaintTransform arg not used since we're not painting
- auto& filterChain = aFilteredFrame->StyleSVGReset()->mFilters;
+ auto& filterChain = aFilteredFrame->StyleEffects()->mFilters;
UniquePtr<UserSpaceMetrics> metrics = UserSpaceMetricsForFrame(aFilteredFrame);
nsFilterInstance instance(aFilteredFrame, aFilteredFrame->GetContent(), *metrics,
filterChain, nullptr, unused,
&aPostFilterDirtyRegion);
if (!instance.IsInitialized()) {
return nsRect();
}
@@ -129,17 +129,17 @@ nsFilterInstance::GetPostFilterBounds(ns
nsRegion preFilterRegion;
nsRegion* preFilterRegionPtr = nullptr;
if (aPreFilterBounds) {
preFilterRegion = *aPreFilterBounds;
preFilterRegionPtr = &preFilterRegion;
}
gfxMatrix unused; // aPaintTransform arg not used since we're not painting
- auto& filterChain = aFilteredFrame->StyleSVGReset()->mFilters;
+ auto& filterChain = aFilteredFrame->StyleEffects()->mFilters;
UniquePtr<UserSpaceMetrics> metrics = UserSpaceMetricsForFrame(aFilteredFrame);
nsFilterInstance instance(aFilteredFrame, aFilteredFrame->GetContent(), *metrics,
filterChain, nullptr, unused, nullptr,
preFilterRegionPtr, aPreFilterBounds,
aOverrideBBox);
if (!instance.IsInitialized()) {
return nsRect();
}
--- a/layout/svg/nsSVGEffects.cpp
+++ b/layout/svg/nsSVGEffects.cpp
@@ -466,25 +466,25 @@ GetEffectProperty(nsIURI *aURI, nsIFrame
NS_ADDREF(prop);
props.Set(aProperty, static_cast<nsISupports*>(prop));
return prop;
}
static nsSVGFilterProperty*
GetOrCreateFilterProperty(nsIFrame *aFrame)
{
- const nsStyleSVGReset* style = aFrame->StyleSVGReset();
- if (!style->HasFilters())
+ const nsStyleEffects* effects = aFrame->StyleEffects();
+ if (!effects->HasFilters())
return nullptr;
FrameProperties props = aFrame->Properties();
nsSVGFilterProperty *prop = props.Get(nsSVGEffects::FilterProperty());
if (prop)
return prop;
- prop = new nsSVGFilterProperty(style->mFilters, aFrame);
+ prop = new nsSVGFilterProperty(effects->mFilters, aFrame);
if (!prop)
return nullptr;
NS_ADDREF(prop);
props.Set(nsSVGEffects::FilterProperty(), prop);
return prop;
}
nsSVGMarkerProperty *
@@ -663,17 +663,17 @@ nsSVGEffects::UpdateEffects(nsIFrame *aF
}
}
nsSVGFilterProperty *
nsSVGEffects::GetFilterProperty(nsIFrame *aFrame)
{
NS_ASSERTION(!aFrame->GetPrevContinuation(), "aFrame should be first continuation");
- if (!aFrame->StyleSVGReset()->HasFilters())
+ if (!aFrame->StyleEffects()->HasFilters())
return nullptr;
return static_cast<nsSVGFilterProperty *>
(aFrame->Properties().Get(FilterProperty()));
}
void
nsSVGRenderingObserverList::InvalidateAll()
--- a/layout/svg/nsSVGForeignObjectFrame.cpp
+++ b/layout/svg/nsSVGForeignObjectFrame.cpp
@@ -372,17 +372,17 @@ nsSVGForeignObjectFrame::ReflowSVG()
// Make sure we have our filter property (if any) before calling
// FinishAndStoreOverflow (subsequent filter changes are handled off
// nsChangeHint_UpdateEffects):
nsSVGEffects::UpdateEffects(this);
}
// If we have a filter, we need to invalidate ourselves because filter
// output can change even if none of our descendants need repainting.
- if (StyleSVGReset()->HasFilters()) {
+ if (StyleEffects()->HasFilters()) {
InvalidateFrame();
}
// TODO: once we support |overflow:visible| on foreignObject, then we will
// need to take account of our descendants here.
nsRect overflow = nsRect(nsPoint(0,0), mRect.Size());
nsOverflowAreas overflowAreas(overflow, overflow);
FinishAndStoreOverflow(overflowAreas, mRect.Size());
--- a/layout/svg/nsSVGInnerSVGFrame.cpp
+++ b/layout/svg/nsSVGInnerSVGFrame.cpp
@@ -115,17 +115,17 @@ nsSVGInnerSVGFrame::ReflowSVG()
static_cast<SVGSVGElement*>(mContent)->
GetAnimatedLengthValues(&x, &y, &width, &height, nullptr);
mRect = nsLayoutUtils::RoundGfxRectToAppRect(
gfxRect(x, y, width, height),
PresContext()->AppUnitsPerCSSPixel());
// If we have a filter, we need to invalidate ourselves because filter
// output can change even if none of our descendants need repainting.
- if (StyleSVGReset()->HasFilters()) {
+ if (StyleEffects()->HasFilters()) {
InvalidateFrame();
}
nsSVGInnerSVGFrameBase::ReflowSVG();
}
void
nsSVGInnerSVGFrame::NotifySVGChanged(uint32_t aFlags)
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -150,19 +150,19 @@ GetPreEffectsVisualOverflowUnion(nsIFram
bool
nsSVGIntegrationUtils::UsingEffectsForFrame(const nsIFrame* aFrame)
{
// Even when SVG display lists are disabled, returning true for SVG frames
// does not adversely affect any of our callers. Therefore we don't bother
// checking the SDL prefs here, since we don't know if we're being called for
// painting or hit-testing anyway.
const nsStyleSVGReset *style = aFrame->StyleSVGReset();
- bool hasValidLayers = style->mMask.HasLayerWithImage();
-
- return (style->HasFilters() || style->HasClipPath() || hasValidLayers);
+ return aFrame->StyleEffects()->HasFilters() ||
+ style->HasClipPath() ||
+ style->mMask.HasLayerWithImage();
}
// For non-SVG frames, this gives the offset to the frame's "user space".
// For SVG frames, this returns a zero offset.
static nsPoint
GetOffsetToBoundingBox(nsIFrame* aFrame)
{
if ((aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT)) {
--- a/layout/svg/nsSVGUseFrame.cpp
+++ b/layout/svg/nsSVGUseFrame.cpp
@@ -191,17 +191,17 @@ nsSVGUseFrame::ReflowSVG()
static_cast<SVGUseElement*>(mContent)->
GetAnimatedLengthValues(&x, &y, nullptr);
mRect.MoveTo(nsLayoutUtils::RoundGfxRectToAppRect(
gfxRect(x, y, 0.0, 0.0),
PresContext()->AppUnitsPerCSSPixel()).TopLeft());
// If we have a filter, we need to invalidate ourselves because filter
// output can change even if none of our descendants need repainting.
- if (StyleSVGReset()->HasFilters()) {
+ if (StyleEffects()->HasFilters()) {
InvalidateFrame();
}
nsSVGUseFrameBase::ReflowSVG();
}
void
nsSVGUseFrame::NotifySVGChanged(uint32_t aFlags)
--- a/layout/svg/nsSVGUtils.cpp
+++ b/layout/svg/nsSVGUtils.cpp
@@ -1120,17 +1120,17 @@ nsSVGUtils::CanOptimizeOpacity(nsIFrame
if (!(aFrame->GetStateBits() & NS_FRAME_SVG_LAYOUT)) {
return false;
}
nsIAtom *type = aFrame->GetType();
if (type != nsGkAtoms::svgImageFrame &&
type != nsGkAtoms::svgPathGeometryFrame) {
return false;
}
- if (aFrame->StyleSVGReset()->HasFilters()) {
+ if (aFrame->StyleEffects()->HasFilters()) {
return false;
}
// XXX The SVG WG is intending to allow fill, stroke and markers on <image>
if (type == nsGkAtoms::svgImageFrame) {
return true;
}
const nsStyleSVG *style = aFrame->StyleSVG();
if (style->HasMarker()) {