--- a/layout/style/StyleAnimationValue.cpp
+++ b/layout/style/StyleAnimationValue.cpp
@@ -1800,17 +1800,18 @@ AddDifferentTransformLists(double aCoeff
static bool
TransformFunctionsMatch(nsCSSKeyword func1, nsCSSKeyword func2)
{
return ToPrimitive(func1) == ToPrimitive(func2);
}
static UniquePtr<nsCSSValueList>
AddWeightedFilterFunctionImpl(double aCoeff1, const nsCSSValueList* aList1,
- double aCoeff2, const nsCSSValueList* aList2)
+ double aCoeff2, const nsCSSValueList* aList2,
+ ColorAdditionType aColorAdditionType)
{
// AddWeightedFilterFunction should be our only caller, and it should ensure
// that both args are non-null.
MOZ_ASSERT(aList1, "expected filter list");
MOZ_ASSERT(aList2, "expected filter list");
MOZ_ASSERT(aList1->mValue.GetUnit() == eCSSUnit_Function,
"expected function");
MOZ_ASSERT(aList2->mValue.GetUnit() == eCSSUnit_Function,
@@ -1875,50 +1876,54 @@ AddWeightedFilterFunctionImpl(double aCo
MOZ_ASSERT(!funcArg1.GetListValue()->mNext &&
!funcArg2.GetListValue()->mNext,
"drop-shadow filter func doesn't support lists");
UniquePtr<nsCSSValueList> shadowValue =
AddWeightedShadowItems(aCoeff1,
funcArg1.GetListValue()->mValue,
aCoeff2,
funcArg2.GetListValue()->mValue,
- ColorAdditionType::Clamped);
+ aColorAdditionType);
if (!shadowValue) {
return nullptr;
}
resultArg.AdoptListValue(Move(shadowValue));
break;
}
default:
MOZ_ASSERT(false, "unknown filter function");
return nullptr;
}
return resultList;
}
static UniquePtr<nsCSSValueList>
AddWeightedFilterFunction(double aCoeff1, const nsCSSValueList* aList1,
- double aCoeff2, const nsCSSValueList* aList2)
+ double aCoeff2, const nsCSSValueList* aList2,
+ ColorAdditionType aColorAdditionType)
{
MOZ_ASSERT(aList1 || aList2,
"one function list item must not be null");
// Note that one of our arguments could be null, indicating that
// it's the initial value. Rather than adding special null-handling
// logic, we just check for null values and replace them with
// 0 * the other value. That way, AddWeightedFilterFunctionImpl can assume
// its args are non-null.
if (!aList1) {
- return AddWeightedFilterFunctionImpl(aCoeff2, aList2, 0, aList2);
+ return AddWeightedFilterFunctionImpl(aCoeff2, aList2, 0, aList2,
+ aColorAdditionType);
}
if (!aList2) {
- return AddWeightedFilterFunctionImpl(aCoeff1, aList1, 0, aList1);
+ return AddWeightedFilterFunctionImpl(aCoeff1, aList1, 0, aList1,
+ aColorAdditionType);
}
- return AddWeightedFilterFunctionImpl(aCoeff1, aList1, aCoeff2, aList2);
+ return AddWeightedFilterFunctionImpl(aCoeff1, aList1, aCoeff2, aList2,
+ aColorAdditionType);
}
static inline uint32_t
ShapeArgumentCount(nsCSSKeyword aShapeFunction)
{
switch (aShapeFunction) {
case eCSSKeyword_circle:
return 2; // radius and center point
@@ -2423,30 +2428,32 @@ AddWeightedShadowList(double aCoeff1,
AppendToCSSValueList(result, Move(shadowValue), &tail);
}
}
return result;
}
static UniquePtr<nsCSSValueList>
AddWeightedFilterList(double aCoeff1, const nsCSSValueList* aList1,
- double aCoeff2, const nsCSSValueList* aList2)
+ double aCoeff2, const nsCSSValueList* aList2,
+ ColorAdditionType aColorAdditionType)
{
UniquePtr<nsCSSValueList> result;
nsCSSValueList* tail = nullptr;
while (aList1 || aList2) {
if ((aList1 && aList1->mValue.GetUnit() != eCSSUnit_Function) ||
(aList2 && aList2->mValue.GetUnit() != eCSSUnit_Function)) {
// If we don't have filter-functions, we must have filter-URLs, which
// we can't add or interpolate.
return nullptr;
}
UniquePtr<nsCSSValueList> resultFunction =
- AddWeightedFilterFunction(aCoeff1, aList1, aCoeff2, aList2);
+ AddWeightedFilterFunction(aCoeff1, aList1, aCoeff2, aList2,
+ aColorAdditionType);
if (!resultFunction) {
// filter function mismatch
return nullptr;
}
AppendToCSSValueList(result, Move(resultFunction), &tail);
// move to next aList items
@@ -2780,17 +2787,18 @@ StyleAnimationValue::AddWeighted(nsCSSPr
return false;
}
aResultValue.SetCSSValueArrayValue(result, eUnit_Shape);
return true;
}
case eUnit_Filter: {
UniquePtr<nsCSSValueList> result =
AddWeightedFilterList(aCoeff1, aValue1.GetCSSValueListValue(),
- aCoeff2, aValue2.GetCSSValueListValue());
+ aCoeff2, aValue2.GetCSSValueListValue(),
+ ColorAdditionType::Clamped);
if (!result) {
return false;
}
aResultValue.SetAndAdoptCSSValueListValue(result.release(),
eUnit_Filter);
return true;
}
@@ -2904,18 +2912,28 @@ bool
StyleAnimationValue::Accumulate(nsCSSPropertyID aProperty,
StyleAnimationValue& aDest,
const StyleAnimationValue& aValueToAccumulate,
uint64_t aCount)
{
Unit commonUnit =
GetCommonUnit(aProperty, aDest.GetUnit(), aValueToAccumulate.GetUnit());
switch (commonUnit) {
- // FIXME: implement them!
- //case eUnit_Filter:
+ case eUnit_Filter: {
+ UniquePtr<nsCSSValueList> result =
+ AddWeightedFilterList(1.0, aDest.GetCSSValueListValue(),
+ aCount, aValueToAccumulate.GetCSSValueListValue(),
+ ColorAdditionType::Unclamped);
+ if (!result) {
+ return false;
+ }
+
+ aDest.SetAndAdoptCSSValueListValue(result.release(), eUnit_Filter);
+ return true;
+ }
case eUnit_Shadow: {
UniquePtr<nsCSSValueList> result =
AddWeightedShadowList(1.0, aDest.GetCSSValueListValue(),
aCount, aValueToAccumulate.GetCSSValueListValue(),
ColorAdditionType::Unclamped);
if (!result) {
return false;
}