diff --git a/layout/reftests/svg/filters/css-filters/invert-half-ref.html b/layout/reftests/svg/filters/css-filters/invert-half-ref.html new file mode 100644 index 000000000000..bd0d67d66b26 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-half-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Invert an HTML Element Using a Factor of One Half + + + + +

You should see a gray square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-half.html b/layout/reftests/svg/filters/css-filters/invert-half.html new file mode 100644 index 000000000000..818d75116929 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-half.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Invert an HTML Element Using a Factor of One Half + + + + + + + +

You should see a gray square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-one-ref.html b/layout/reftests/svg/filters/css-filters/invert-one-ref.html new file mode 100644 index 000000000000..6882b501c9a7 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-one-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Invert an HTML Element Using a Factor of One + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-one.html b/layout/reftests/svg/filters/css-filters/invert-one.html new file mode 100644 index 000000000000..f9e8eaa98abd --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-one.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Invert an HTML Element Using a Factor of One + + + + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-over-one-ref.html b/layout/reftests/svg/filters/css-filters/invert-over-one-ref.html new file mode 100644 index 000000000000..4452898e3b49 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-over-one-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Invert an HTML Element Using a Factor Over One + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-over-one.html b/layout/reftests/svg/filters/css-filters/invert-over-one.html new file mode 100644 index 000000000000..374fe6dfdea1 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-over-one.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Invert an HTML Element Using a Factor Over One + + + + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-percent-ref.html b/layout/reftests/svg/filters/css-filters/invert-percent-ref.html new file mode 100644 index 000000000000..fd197f038c03 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-percent-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Invert an HTML Element Using a Percentage + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-percent.html b/layout/reftests/svg/filters/css-filters/invert-percent.html new file mode 100644 index 000000000000..d56dc1741801 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-percent.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Invert an HTML Element Using a Percentage + + + + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-ref.html b/layout/reftests/svg/filters/css-filters/invert-ref.html new file mode 100644 index 000000000000..c5af4b6116fc --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Invert an HTML Element + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-zero-ref.html b/layout/reftests/svg/filters/css-filters/invert-zero-ref.html new file mode 100644 index 000000000000..3f000a71dd9d --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-zero-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Invert an HTML Element Using a Factor of Zero + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert-zero.html b/layout/reftests/svg/filters/css-filters/invert-zero.html new file mode 100644 index 000000000000..9adb505dd4d3 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert-zero.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Invert an HTML Element Using a Factor of Zero + + + + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/invert.html b/layout/reftests/svg/filters/css-filters/invert.html new file mode 100644 index 000000000000..8ba201e227cc --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/invert.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Invert an HTML Element + + + + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/reftest.list b/layout/reftests/svg/filters/css-filters/reftest.list index 61746415ac41..58dcfebbda17 100644 --- a/layout/reftests/svg/filters/css-filters/reftest.list +++ b/layout/reftests/svg/filters/css-filters/reftest.list @@ -23,6 +23,12 @@ fuzzy-if(d2d,1,10000) == grayscale-percent.html grayscale-percent-ref.html == hue-rotate-rad.html hue-rotate-rad-ref.html == hue-rotate-turn.html hue-rotate-turn-ref.html == hue-rotate-zero.html hue-rotate-zero-ref.html +fuzzy-if(d2d,1,10000) == invert.html invert-ref.html +== invert-half.html invert-half-ref.html +== invert-one.html invert-one-ref.html +== invert-over-one.html invert-over-one-ref.html +fuzzy-if(d2d,1,10000) == invert-percent.html invert-percent-ref.html +== invert-zero.html invert-zero-ref.html == saturate.html saturate-ref.html fuzzy-if(d2d,1,10000) == saturate-desaturate.html saturate-desaturate-ref.html == saturate-extreme.html saturate-extreme-ref.html diff --git a/layout/svg/nsCSSFilterInstance.cpp b/layout/svg/nsCSSFilterInstance.cpp index 8763e2e2b6fa..a524d7f3de8c 100644 --- a/layout/svg/nsCSSFilterInstance.cpp +++ b/layout/svg/nsCSSFilterInstance.cpp @@ -67,7 +67,9 @@ nsCSSFilterInstance::BuildPrimitives(nsTArray& aPrim result = SetAttributesForHueRotate(descr); break; case NS_STYLE_FILTER_INVERT: - return NS_ERROR_NOT_IMPLEMENTED; + descr = CreatePrimitiveDescription(PrimitiveType::ComponentTransfer, aPrimitiveDescrs); + result = SetAttributesForInvert(descr); + break; case NS_STYLE_FILTER_OPACITY: return NS_ERROR_NOT_IMPLEMENTED; case NS_STYLE_FILTER_SATURATE: @@ -177,6 +179,33 @@ nsCSSFilterInstance::SetAttributesForHueRotate(FilterPrimitiveDescription& aDesc return NS_OK; } +nsresult +nsCSSFilterInstance::SetAttributesForInvert(FilterPrimitiveDescription& aDescr) +{ + const nsStyleCoord& styleValue = mFilter.GetFilterParameter(); + float value = ClampFactor(styleValue.GetFactorOrPercentValue()); + + // Set transfer functions for RGB. + AttributeMap invertAttrs; + float invertTableValues[2]; + invertTableValues[0] = value; + invertTableValues[1] = 1 - value; + invertAttrs.Set(eComponentTransferFunctionType, + (uint32_t)SVG_FECOMPONENTTRANSFER_TYPE_TABLE); + invertAttrs.Set(eComponentTransferFunctionTableValues, invertTableValues, 2); + aDescr.Attributes().Set(eComponentTransferFunctionR, invertAttrs); + aDescr.Attributes().Set(eComponentTransferFunctionG, invertAttrs); + aDescr.Attributes().Set(eComponentTransferFunctionB, invertAttrs); + + // Set identity transfer function for A. + AttributeMap identityAttrs; + identityAttrs.Set(eComponentTransferFunctionType, + (uint32_t)SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY); + aDescr.Attributes().Set(eComponentTransferFunctionA, identityAttrs); + + return NS_OK; +} + nsresult nsCSSFilterInstance::SetAttributesForSaturate(FilterPrimitiveDescription& aDescr) { diff --git a/layout/svg/nsCSSFilterInstance.h b/layout/svg/nsCSSFilterInstance.h index 1005caa7c8e8..bed79bcd01fa 100644 --- a/layout/svg/nsCSSFilterInstance.h +++ b/layout/svg/nsCSSFilterInstance.h @@ -66,6 +66,7 @@ private: nsresult SetAttributesForDropShadow(FilterPrimitiveDescription& aDescr); nsresult SetAttributesForGrayscale(FilterPrimitiveDescription& aDescr); nsresult SetAttributesForHueRotate(FilterPrimitiveDescription& aDescr); + nsresult SetAttributesForInvert(FilterPrimitiveDescription& aDescr); nsresult SetAttributesForSaturate(FilterPrimitiveDescription& aDescr); nsresult SetAttributesForSepia(FilterPrimitiveDescription& aDescr);