From 011cb3e886a87148727288e338e2839c2122fc40 Mon Sep 17 00:00:00 2001 From: Robert Longson Date: Sat, 14 Aug 2010 20:42:18 -0400 Subject: [PATCH] Bug 584322 - feDisplacementMap seems to be adding an offset. r=roc, a=dbaron --- content/svg/content/src/nsSVGFilters.cpp | 17 ++++++++++------- content/svg/content/src/nsSVGFilters.h | 16 ++++++++-------- layout/reftests/svg/filters/reftest.list | 2 ++ 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/content/svg/content/src/nsSVGFilters.cpp b/content/svg/content/src/nsSVGFilters.cpp index 4ace69078da..075dae66354 100644 --- a/content/svg/content/src/nsSVGFilters.cpp +++ b/content/svg/content/src/nsSVGFilters.cpp @@ -1068,7 +1068,7 @@ public: virtual nsXPCClassInfo* GetClassInfo(); protected: - virtual PRBool OperatesOnPremultipledAlpha() { return PR_FALSE; } + virtual PRBool OperatesOnPremultipledAlpha(PRInt32) { return PR_FALSE; } virtual EnumAttributesInfo GetEnumInfo(); virtual StringAttributesInfo GetStringInfo(); @@ -1695,7 +1695,7 @@ public: virtual nsXPCClassInfo* GetClassInfo(); protected: - virtual PRBool OperatesOnPremultipledAlpha() { return PR_FALSE; } + virtual PRBool OperatesOnPremultipledAlpha(PRInt32) { return PR_FALSE; } virtual StringAttributesInfo GetStringInfo(); @@ -2715,7 +2715,7 @@ public: virtual nsXPCClassInfo* GetClassInfo(); protected: virtual PRBool OperatesOnSRGB(nsSVGFilterInstance*, - PRUint32, Image*) { return PR_TRUE; } + PRInt32, Image*) { return PR_TRUE; } virtual StringAttributesInfo GetStringInfo(); @@ -3898,7 +3898,7 @@ public: virtual nsXPCClassInfo* GetClassInfo(); protected: - virtual PRBool OperatesOnPremultipledAlpha() { + virtual PRBool OperatesOnPremultipledAlpha(PRInt32) { return !mBooleanAttributes[PRESERVEALPHA].GetAnimValue(); } @@ -5354,7 +5354,7 @@ private: protected: virtual PRBool OperatesOnSRGB(nsSVGFilterInstance*, - PRUint32, Image*) { return PR_TRUE; } + PRInt32, Image*) { return PR_TRUE; } virtual nsSVGPreserveAspectRatio *GetPreserveAspectRatio(); virtual StringAttributesInfo GetStringInfo(); @@ -5689,13 +5689,16 @@ public: virtual nsXPCClassInfo* GetClassInfo(); protected: virtual PRBool OperatesOnSRGB(nsSVGFilterInstance* aInstance, - PRUint32 aInput, Image* aImage) { - if (aInput == 0 && aImage) + PRInt32 aInput, Image* aImage) { + if (aInput == 0) return aImage->mColorModel.mColorSpace == ColorModel::SRGB; return nsSVGFEDisplacementMapElementBase::OperatesOnSRGB(aInstance, aInput, aImage); } + virtual PRBool OperatesOnPremultipledAlpha(PRInt32 aInput) { + return !(aInput == 1); + } virtual NumberAttributesInfo GetNumberInfo(); virtual EnumAttributesInfo GetEnumInfo(); diff --git a/content/svg/content/src/nsSVGFilters.h b/content/svg/content/src/nsSVGFilters.h index 01460fa82a8..0697d5a2c71 100644 --- a/content/svg/content/src/nsSVGFilters.h +++ b/content/svg/content/src/nsSVGFilters.h @@ -119,21 +119,21 @@ protected: public: ColorModel - GetInputColorModel(nsSVGFilterInstance* aInstance, PRUint32 aInputIndex, + GetInputColorModel(nsSVGFilterInstance* aInstance, PRInt32 aInputIndex, Image* aImage) { return ColorModel( (OperatesOnSRGB(aInstance, aInputIndex, aImage) ? ColorModel::SRGB : ColorModel::LINEAR_RGB), - (OperatesOnPremultipledAlpha() ? + (OperatesOnPremultipledAlpha(aInputIndex) ? ColorModel::PREMULTIPLIED : ColorModel::UNPREMULTIPLIED)); } ColorModel GetOutputColorModel(nsSVGFilterInstance* aInstance) { return ColorModel( - (OperatesOnSRGB(aInstance, 0, nsnull) ? + (OperatesOnSRGB(aInstance, -1, nsnull) ? ColorModel::SRGB : ColorModel::LINEAR_RGB), - (OperatesOnPremultipledAlpha() ? + (OperatesOnPremultipledAlpha(-1) ? ColorModel::PREMULTIPLIED : ColorModel::UNPREMULTIPLIED)); } @@ -199,13 +199,13 @@ public: operator nsISupports*() { return static_cast(this); } protected: - virtual PRBool OperatesOnPremultipledAlpha() { return PR_TRUE; } + virtual PRBool OperatesOnPremultipledAlpha(PRInt32) { return PR_TRUE; } - // Called either with aImage non-null, in which case this is + // Called either with aInputIndex >=0 in which case this is // testing whether the input 'aInputIndex' should be SRGB, or - // if aImage is null returns true if the output will be SRGB + // if aInputIndex is -1 returns true if the output will be SRGB virtual PRBool OperatesOnSRGB(nsSVGFilterInstance* aInstance, - PRUint32 aInputIndex, Image* aImage) { + PRInt32 aInputIndex, Image* aImage) { nsIFrame* frame = GetPrimaryFrame(); if (!frame) return PR_FALSE; diff --git a/layout/reftests/svg/filters/reftest.list b/layout/reftests/svg/filters/reftest.list index d20cc534530..369628b465f 100644 --- a/layout/reftests/svg/filters/reftest.list +++ b/layout/reftests/svg/filters/reftest.list @@ -72,6 +72,8 @@ fails == filter-marked-line-01.svg pass.svg # bug 477704 == feConvolveMatrix-bias-01.svg feConvolveMatrix-bias-01-ref.svg == feConvolveMatrix-order-01.svg feConvolveMatrix-order-01-ref.svg +== feDisplacementMap-alpha-01.svg pass.svg + == feMorphology-radius-negative-01.svg pass.svg == feMorphology-radius-negative-02.svg pass.svg == feMorphology-radius-zero-01.svg pass.svg