Bug 1286150 - Part 2: Support difference restrictions on AddShapeFunction. draft
authorBoris Chiou <boris.chiou@gmail.com>
Wed, 26 Oct 2016 18:01:41 +0800
changeset 432445 858632584ef656f9d6be50d3bc6ce07a68a3b9ea
parent 432444 52e910adeac71f22750afcbd3895932d9707a826
child 432446 d5b707d5136b470cd88d581de962bf88e5ab87d3
push id34315
push userbmo:boris.chiou@gmail.com
push dateWed, 02 Nov 2016 03:24:03 +0000
bugs1286150
milestone52.0a1
Bug 1286150 - Part 2: Support difference restrictions on AddShapeFunction. We want to reuse AddShapeFunction for calculating the distance, so add one more argument to enable/disable the default restrictions, so we can reuse AddShapeFunction to get the differences, which may be negative values, between two shape functions. MozReview-Commit-ID: FgzOnPzyyAQ
layout/style/StyleAnimationValue.cpp
--- a/layout/style/StyleAnimationValue.cpp
+++ b/layout/style/StyleAnimationValue.cpp
@@ -2145,20 +2145,26 @@ AddCSSValuePairList(nsCSSPropertyID aPro
 
   if (aList1 || aList2) {
     return nullptr; // We can't interpolate lists of different lengths
   }
 
   return result;
 }
 
+enum class Restrictions {
+  Enable,
+  Disable
+};
+
 static already_AddRefed<nsCSSValue::Array>
 AddShapeFunction(nsCSSPropertyID aProperty,
                  double aCoeff1, const nsCSSValue::Array* aArray1,
-                 double aCoeff2, const nsCSSValue::Array* aArray2)
+                 double aCoeff2, const nsCSSValue::Array* aArray2,
+                 Restrictions aRestriction = Restrictions::Enable)
 {
   MOZ_ASSERT(aArray1 && aArray1->Count() == 2, "expected shape function");
   MOZ_ASSERT(aArray2 && aArray2->Count() == 2, "expected shape function");
   MOZ_ASSERT(aArray1->Item(0).GetUnit() == eCSSUnit_Function,
              "expected function");
   MOZ_ASSERT(aArray2->Item(0).GetUnit() == eCSSUnit_Function,
              "expected function");
   MOZ_ASSERT(aArray1->Item(1).GetUnit() == eCSSUnit_Enumerated,
@@ -2180,29 +2186,33 @@ AddShapeFunction(nsCSSPropertyID aProper
   RefPtr<nsCSSValue::Array> result = nsCSSValue::Array::Create(2);
 
   nsCSSValue::Array* resultFuncArgs =
     result->Item(0).InitFunction(shapeFuncName,
                                  ShapeArgumentCount(shapeFuncName));
   switch (shapeFuncName) {
     case eCSSKeyword_ellipse:
       // Add ellipses' |ry| values (but fail if we encounter an enum):
-      if (!AddCSSValuePixelPercentCalc(CSS_PROPERTY_VALUE_NONNEGATIVE,
+      if (!AddCSSValuePixelPercentCalc(aRestriction == Restrictions::Enable
+                                         ? CSS_PROPERTY_VALUE_NONNEGATIVE
+                                         : 0,
                                        GetCommonUnit(aProperty,
                                                      func1->Item(2).GetUnit(),
                                                      func2->Item(2).GetUnit()),
                                        aCoeff1, func1->Item(2),
                                        aCoeff2, func2->Item(2),
                                        resultFuncArgs->Item(2))) {
         return nullptr;
       }
       MOZ_FALLTHROUGH;  // to handle rx and center point
     case eCSSKeyword_circle: {
       // Add circles' |r| (or ellipses' |rx|) values:
-      if (!AddCSSValuePixelPercentCalc(CSS_PROPERTY_VALUE_NONNEGATIVE,
+      if (!AddCSSValuePixelPercentCalc(aRestriction == Restrictions::Enable
+                                         ? CSS_PROPERTY_VALUE_NONNEGATIVE
+                                         : 0,
                                        GetCommonUnit(aProperty,
                                                      func1->Item(1).GetUnit(),
                                                      func2->Item(1).GetUnit()),
                                        aCoeff1, func1->Item(1),
                                        aCoeff2, func2->Item(1),
                                        resultFuncArgs->Item(1))) {
         return nullptr;
       }
@@ -2232,17 +2242,19 @@ AddShapeFunction(nsCSSPropertyID aProper
       break;
     }
     case eCSSKeyword_inset: {
       MOZ_ASSERT(func1->Count() == 6 && func2->Count() == 6,
                  "Update for CSSParserImpl::ParseInsetFunction changes");
       // Items 1-4 are respectively the top, right, bottom and left offsets
       // from the reference box.
       for (size_t i = 1; i <= 4; ++i) {
-        if (!AddCSSValuePixelPercentCalc(CSS_PROPERTY_VALUE_NONNEGATIVE,
+        if (!AddCSSValuePixelPercentCalc(aRestriction == Restrictions::Enable
+                                           ? CSS_PROPERTY_VALUE_NONNEGATIVE
+                                           : 0,
                                          GetCommonUnit(aProperty,
                                                        func1->Item(i).GetUnit(),
                                                        func2->Item(i).GetUnit()),
                                          aCoeff1, func1->Item(i),
                                          aCoeff2, func2->Item(i),
                                          resultFuncArgs->Item(i))) {
           return nullptr;
         }
@@ -2255,17 +2267,19 @@ AddShapeFunction(nsCSSPropertyID aProper
       const nsCSSValue::Array* radii1 = func1->Item(5).GetArrayValue();
       const nsCSSValue::Array* radii2 = func2->Item(5).GetArrayValue();
       MOZ_ASSERT(radii1->Count() == 4 && radii2->Count() == 4);
       nsCSSValue::Array* resultRadii = nsCSSValue::Array::Create(4);
       resultFuncArgs->Item(5).SetArrayValue(resultRadii, eCSSUnit_Array);
       // We use an arbitrary border-radius property here to get the appropriate
       // restrictions for radii since this is a <border-radius> value.
       uint32_t restrictions =
-        nsCSSProps::ValueRestrictions(eCSSProperty_border_top_left_radius);
+        aRestriction == Restrictions::Enable
+          ? nsCSSProps::ValueRestrictions(eCSSProperty_border_top_left_radius)
+          : 0;
       for (size_t i = 0; i < 4; ++i) {
         const nsCSSValuePair& pair1 = radii1->Item(i).GetPairValue();
         const nsCSSValuePair& pair2 = radii2->Item(i).GetPairValue();
         const Maybe<nsCSSValuePair> pairResult =
           AddCSSValuePair(aProperty, restrictions,
                           aCoeff1, &pair1,
                           aCoeff2, &pair2);
         if (!pairResult) {