diff --git a/layout/reftests/svg/filters/css-filters/contrast-extreme-ref.html b/layout/reftests/svg/filters/css-filters/contrast-extreme-ref.html new file mode 100644 index 00000000000..c276e8bca7f --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-extreme-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Increase the Contrast of an HTML Element Using a Large Factor + + + + +

You should see a bright green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-extreme.html b/layout/reftests/svg/filters/css-filters/contrast-extreme.html new file mode 100644 index 00000000000..e5b80f8ed6a --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-extreme.html @@ -0,0 +1,29 @@ + + + + + CSS Filters: Increase the Contrast of an HTML Element Using a Large Factor + + + + + + + +

You should see a bright green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-one-ref.html b/layout/reftests/svg/filters/css-filters/contrast-one-ref.html new file mode 100644 index 00000000000..90df359cc11 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-one-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Set the Contrast of HTML Element Using a Factor of One + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-one.html b/layout/reftests/svg/filters/css-filters/contrast-one.html new file mode 100644 index 00000000000..c7c4cca19a1 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-one.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Set the Contrast of HTML Element Using a Factor of One + + + + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-percent-ref.html b/layout/reftests/svg/filters/css-filters/contrast-percent-ref.html new file mode 100644 index 00000000000..84f5eb0410d --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-percent-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Increase the Contrast of an HTML Element + + + + +

You should see a bright green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-percent.html b/layout/reftests/svg/filters/css-filters/contrast-percent.html new file mode 100644 index 00000000000..7d0337f642a --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-percent.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Increase the Contrast of an HTML Element + + + + + + + +

You should see a bright green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-reduce-ref.html b/layout/reftests/svg/filters/css-filters/contrast-reduce-ref.html new file mode 100644 index 00000000000..ef169da13bb --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-reduce-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Reduce the Contrast of an HTML Element + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-reduce.html b/layout/reftests/svg/filters/css-filters/contrast-reduce.html new file mode 100644 index 00000000000..f4482d49371 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-reduce.html @@ -0,0 +1,29 @@ + + + + + CSS Filters: Reduce the Contrast of an HTML Element + + + + + + + +

You should see a green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-ref.html b/layout/reftests/svg/filters/css-filters/contrast-ref.html new file mode 100644 index 00000000000..84f5eb0410d --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-ref.html @@ -0,0 +1,22 @@ + + + + + CSS Filters: Increase the Contrast of an HTML Element + + + + +

You should see a bright green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-zero-ref.html b/layout/reftests/svg/filters/css-filters/contrast-zero-ref.html new file mode 100644 index 00000000000..5f1a1f6ea63 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-zero-ref.html @@ -0,0 +1,23 @@ + + + + + CSS Filters: Reduce the Contrast of an HTML Element Using a Factor of Zero + + + + +

You should see a gray square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast-zero.html b/layout/reftests/svg/filters/css-filters/contrast-zero.html new file mode 100644 index 00000000000..59db11b60cb --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast-zero.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Reduce the Contrast of an HTML Element Using a Factor of Zero + + + + + + + +

You should see a gray square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/contrast.html b/layout/reftests/svg/filters/css-filters/contrast.html new file mode 100644 index 00000000000..e12b6ebbc97 --- /dev/null +++ b/layout/reftests/svg/filters/css-filters/contrast.html @@ -0,0 +1,28 @@ + + + + + CSS Filters: Increase the Contrast of an HTML Element + + + + + + + +

You should see a bright green square.

+
+ + diff --git a/layout/reftests/svg/filters/css-filters/reftest.list b/layout/reftests/svg/filters/css-filters/reftest.list index 16f77e197cf..3303a76a729 100644 --- a/layout/reftests/svg/filters/css-filters/reftest.list +++ b/layout/reftests/svg/filters/css-filters/reftest.list @@ -13,6 +13,12 @@ default-preferences pref(layout.css.filters.enabled,true) == brightness-one.html brightness-one-ref.html == brightness-percent.html brightness-percent-ref.html == brightness-zero.html brightness-zero-ref.html +== contrast.html contrast-ref.html +== contrast-extreme.html contrast-extreme-ref.html +== contrast-one.html contrast-one-ref.html +== contrast-percent.html contrast-percent-ref.html +== contrast-reduce.html contrast-reduce-ref.html +== contrast-zero.html contrast-zero-ref.html == drop-shadow.html drop-shadow-ref.html == drop-shadow-default-color.html drop-shadow-default-color-ref.html == drop-shadow-negative-offset.html drop-shadow-negative-offset-ref.html diff --git a/layout/svg/nsCSSFilterInstance.cpp b/layout/svg/nsCSSFilterInstance.cpp index 3b602129218..6366b40e497 100644 --- a/layout/svg/nsCSSFilterInstance.cpp +++ b/layout/svg/nsCSSFilterInstance.cpp @@ -55,7 +55,9 @@ nsCSSFilterInstance::BuildPrimitives(nsTArray& aPrim result = SetAttributesForBrightness(descr); break; case NS_STYLE_FILTER_CONTRAST: - return NS_ERROR_NOT_IMPLEMENTED; + descr = CreatePrimitiveDescription(PrimitiveType::ComponentTransfer, aPrimitiveDescrs); + result = SetAttributesForContrast(descr); + break; case NS_STYLE_FILTER_DROP_SHADOW: descr = CreatePrimitiveDescription(PrimitiveType::DropShadow, aPrimitiveDescrs); result = SetAttributesForDropShadow(descr); @@ -151,6 +153,32 @@ nsCSSFilterInstance::SetAttributesForBrightness(FilterPrimitiveDescription& aDes return NS_OK; } +nsresult +nsCSSFilterInstance::SetAttributesForContrast(FilterPrimitiveDescription& aDescr) +{ + const nsStyleCoord& styleValue = mFilter.GetFilterParameter(); + float value = styleValue.GetFactorOrPercentValue(); + float intercept = -(0.5 * value) + 0.5; + + // Set transfer functions for RGB. + AttributeMap contrastAttrs; + contrastAttrs.Set(eComponentTransferFunctionType, + (uint32_t)SVG_FECOMPONENTTRANSFER_TYPE_LINEAR); + contrastAttrs.Set(eComponentTransferFunctionSlope, value); + contrastAttrs.Set(eComponentTransferFunctionIntercept, intercept); + aDescr.Attributes().Set(eComponentTransferFunctionR, contrastAttrs); + aDescr.Attributes().Set(eComponentTransferFunctionG, contrastAttrs); + aDescr.Attributes().Set(eComponentTransferFunctionB, contrastAttrs); + + // 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::SetAttributesForDropShadow(FilterPrimitiveDescription& aDescr) { diff --git a/layout/svg/nsCSSFilterInstance.h b/layout/svg/nsCSSFilterInstance.h index bfbb9b6bfcd..75931702944 100644 --- a/layout/svg/nsCSSFilterInstance.h +++ b/layout/svg/nsCSSFilterInstance.h @@ -64,6 +64,7 @@ private: */ nsresult SetAttributesForBlur(FilterPrimitiveDescription& aDescr); nsresult SetAttributesForBrightness(FilterPrimitiveDescription& aDescr); + nsresult SetAttributesForContrast(FilterPrimitiveDescription& aDescr); nsresult SetAttributesForDropShadow(FilterPrimitiveDescription& aDescr); nsresult SetAttributesForGrayscale(FilterPrimitiveDescription& aDescr); nsresult SetAttributesForHueRotate(FilterPrimitiveDescription& aDescr);