Bug 1216843 - Part 13: Implement color accumulation in filter property. r?dholbert draft
authorHiroyuki Ikezoe <hiikezoe@mozilla-japan.org>
Mon, 12 Sep 2016 14:34:29 +0900
changeset 412526 0b43696f29baa94e704528e891f8b364e1e13b01
parent 412525 c1dc7d3b9c819420b0a1752dca4cbfe686fa79e5
child 412527 26c33ec0e44dff8b272ccc5040d0d259333ce714
push id29192
push userbmo:hiikezoe@mozilla-japan.org
push dateMon, 12 Sep 2016 05:39:50 +0000
reviewersdholbert
bugs1216843
milestone51.0a1
Bug 1216843 - Part 13: Implement color accumulation in filter property. r?dholbert MozReview-Commit-ID: LJNYUYNIdN2
layout/style/StyleAnimationValue.cpp
testing/web-platform/meta/web-animations/interfaces/KeyframeEffect/iterationComposite.html.ini
--- 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;
       }
deleted file mode 100644
--- a/testing/web-platform/meta/web-animations/interfaces/KeyframeEffect/iterationComposite.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[iterationComposite.html]
-  type: testharness
-  [iterationComposite of filter drop-shadow animation]
-    expected: FAIL
-