diff --git a/mozilla/content/svg/content/src/nsSVGFilters.cpp b/mozilla/content/svg/content/src/nsSVGFilters.cpp index 4815bf721fa..0aa2e396499 100644 --- a/mozilla/content/svg/content/src/nsSVGFilters.cpp +++ b/mozilla/content/svg/content/src/nsSVGFilters.cpp @@ -73,26 +73,18 @@ class nsSVGFilterResource { public: - enum DefaultSubregionType {UNION, ALL}; - - nsSVGFilterResource(nsSVGFilterInstance* aInstance, - const nsSVGFilterInstance::ColorModel &aColorModel); + nsSVGFilterResource(nsSVGFE *aFilter, nsSVGFilterInstance* aInstance); ~nsSVGFilterResource(); /* * Acquires a source image for reading * aIn: the name of the filter primitive to use as the source - * aFilter: the filter that is calling AcquireImage - * aDefaultSubregionType: whether the default subregion is the union - * of the referenced nodes or the entire area * aSourceData: out parameter - the image data of the filter primitive * specified by aIn * aSurface: optional out parameter - the surface of the filter * primitive image specified by aIn */ nsresult AcquireSourceImage(nsIDOMSVGAnimatedString* aIn, - nsSVGFE* aFilter, - DefaultSubregionType aDefaultSubregionType, PRUint8** aSourceData, gfxImageSurface** aSurface = 0); @@ -109,7 +101,6 @@ public: PRUint8** aTargetData, gfxImageSurface** aSurface = 0); - /* * The source region */ @@ -163,23 +154,23 @@ private: nsAutoString mInput, mResult; nsRect mSourceRegion, mFilterSubregion; nsRefPtr mTargetImage; + nsSVGFE *mFilter; nsSVGFilterInstance* mInstance; PRUint8 *mSourceData, *mTargetData; PRUint32 mWidth, mHeight; PRInt32 mStride; - nsSVGFilterInstance::ColorModel mColorModel; }; -nsSVGFilterResource::nsSVGFilterResource(nsSVGFilterInstance* aInstance, - const nsSVGFilterInstance::ColorModel &aColorModel) : +nsSVGFilterResource::nsSVGFilterResource(nsSVGFE *aFilter, + nsSVGFilterInstance* aInstance) : mTargetImage(nsnull), + mFilter(aFilter), mInstance(aInstance), mSourceData(nsnull), mTargetData(nsnull), mWidth(0), mHeight(0), - mStride(0), - mColorModel(aColorModel) + mStride(0) { } @@ -190,8 +181,6 @@ nsSVGFilterResource::~nsSVGFilterResource() nsresult nsSVGFilterResource::AcquireSourceImage(nsIDOMSVGAnimatedString* aIn, - nsSVGFE* aFilter, - DefaultSubregionType defaultSubregionType, PRUint8** aSourceData, gfxImageSurface** aSurface) { @@ -199,7 +188,8 @@ nsSVGFilterResource::AcquireSourceImage(nsIDOMSVGAnimatedString* aIn, nsRefPtr surface; mInstance->LookupImage(mInput, getter_AddRefs(surface), - &mSourceRegion, mColorModel); + &mSourceRegion, + mFilter->GetColorModel(aIn)); if (!surface) { return NS_ERROR_FAILURE; } @@ -210,9 +200,9 @@ nsSVGFilterResource::AcquireSourceImage(nsIDOMSVGAnimatedString* aIn, mHeight = size.height; mStride = surface->Stride(); - mInstance->GetFilterSubregion(aFilter, - (defaultSubregionType == ALL) ? - nsRect(0, 0, mWidth, mHeight) : mSourceRegion, + mInstance->GetFilterSubregion(mFilter, + mFilter->SubregionIsUnionOfRegions() ? + mSourceRegion : nsRect(0, 0, mWidth, mHeight), &mFilterSubregion); *aSourceData = mSourceData; @@ -250,7 +240,10 @@ nsSVGFilterResource::ReleaseTarget() if (!mTargetImage) { return; } - mInstance->DefineImage(mResult, mTargetImage, mFilterSubregion, mColorModel); + mInstance->DefineImage(mResult, + mTargetImage, + mFilterSubregion, + mFilter->GetColorModel(nsnull)); mTargetImage = nsnull; } @@ -290,10 +283,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEBase) //---------------------------------------------------------------------- // Implementation -nsSVGFE::nsSVGFE(nsINodeInfo* aNodeInfo) : nsSVGFEBase(aNodeInfo) -{ -} - nsresult nsSVGFE::Init() { @@ -353,25 +342,6 @@ nsSVGFE::ScanDualValueAttribute(const nsAString& aValue, nsIAtom* aAttribute, return PR_TRUE; } -nsSVGFilterInstance::ColorModel -nsSVGFE::GetColorModel(nsSVGFilterInstance::ColorModel::AlphaChannel aAlphaChannel) -{ - nsSVGFilterInstance::ColorModel - colorModel(nsSVGFilterInstance::ColorModel::LINEAR_RGB, - aAlphaChannel); - - nsIFrame* frame = GetPrimaryFrame(); - if (!frame) - return colorModel; - - nsStyleContext* style = frame->GetStyleContext(); - if (style->GetStyleSVG()->mColorInterpolationFilters == - NS_STYLE_COLOR_INTERPOLATION_SRGB) - colorModel.mColorSpace = nsSVGFilterInstance::ColorModel::SRGB; - - return colorModel; -} - nsresult nsSVGFE::SetupScalingFilter(nsSVGFilterInstance *aInstance, nsSVGFilterResource *aResource, @@ -384,9 +354,7 @@ nsSVGFE::SetupScalingFilter(nsSVGFilterInstance *aInstance, // the filter resource. nsresult rv; PRUint8 *sourceData, *targetData; - rv = aResource->AcquireSourceImage(aIn, this, - nsSVGFilterResource::UNION, - &sourceData, + rv = aResource->AcquireSourceImage(aIn, &sourceData, getter_AddRefs(aScaleInfo->mRealSource)); NS_ENSURE_SUCCESS(rv, rv); rv = aResource->AcquireTargetImage(mResult, &targetData, @@ -527,10 +495,11 @@ class nsSVGFEGaussianBlurElement : public nsSVGFEGaussianBlurElementBase, public nsIDOMSVGFEGaussianBlurElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEGaussianBlurElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEGaussianBlurElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEGaussianBlurElement(nsINodeInfo* aNodeInfo) + : nsSVGFEGaussianBlurElementBase(aNodeInfo) {} nsresult Init(); public: @@ -609,11 +578,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEGaussianBlurElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEGaussianBlurElement::nsSVGFEGaussianBlurElement(nsINodeInfo *aNodeInfo) - : nsSVGFEGaussianBlurElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEGaussianBlurElement::Init() { @@ -834,10 +798,9 @@ nsSVGFEGaussianBlurElement::Filter(nsSVGFilterInstance *instance) { nsresult rv; PRUint8 *sourceData, *targetData; - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData); NS_ENSURE_SUCCESS(rv, rv); @@ -901,10 +864,11 @@ class nsSVGFEBlendElement : public nsSVGFEBlendElementBase, public nsIDOMSVGFEBlendElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEBlendElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEBlendElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEBlendElement(nsINodeInfo* aNodeInfo) + : nsSVGFEBlendElementBase(aNodeInfo) {} nsresult Init(); public: @@ -979,11 +943,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEBlendElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEBlendElement::nsSVGFEBlendElement(nsINodeInfo *aNodeInfo) - : nsSVGFEBlendElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEBlendElement::Init() { @@ -1047,10 +1006,9 @@ nsSVGFEBlendElement::Filter(nsSVGFilterInstance *instance) { nsresult rv; PRUint8 *sourceData, *targetData; - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData); NS_ENSURE_SUCCESS(rv, rv); @@ -1065,7 +1023,7 @@ nsSVGFEBlendElement::Filter(nsSVGFilterInstance *instance) fr.CopySourceImage(); - rv = fr.AcquireSourceImage(mIn2, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn2, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rect = fr.GetFilterSubregion(); @@ -1135,10 +1093,11 @@ class nsSVGFEColorMatrixElement : public nsSVGFEColorMatrixElementBase, public nsIDOMSVGFEColorMatrixElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEColorMatrixElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEColorMatrixElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEColorMatrixElement(nsINodeInfo* aNodeInfo) + : nsSVGFEColorMatrixElementBase(aNodeInfo) {} nsresult Init(); public: @@ -1163,6 +1122,8 @@ public: virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; protected: + virtual PRBool OperatesOnPremultipledAlpha() { return PR_FALSE; } + virtual EnumAttributesInfo GetEnumInfo(); enum { TYPE }; @@ -1211,11 +1172,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEColorMatrixElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEColorMatrixElement::nsSVGFEColorMatrixElement(nsINodeInfo *aNodeInfo) - : nsSVGFEColorMatrixElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEColorMatrixElement::Init() { @@ -1300,10 +1256,9 @@ nsSVGFEColorMatrixElement::Filter(nsSVGFilterInstance *instance) { nsresult rv; PRUint8 *sourceData, *targetData; - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::UNPREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData); NS_ENSURE_SUCCESS(rv, rv); @@ -1462,10 +1417,11 @@ class nsSVGFECompositeElement : public nsSVGFECompositeElementBase, public nsIDOMSVGFECompositeElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFECompositeElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFECompositeElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFECompositeElement(nsINodeInfo* aNodeInfo) + : nsSVGFECompositeElementBase(aNodeInfo) {} nsresult Init(); public: @@ -1553,11 +1509,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFECompositeElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFECompositeElement::nsSVGFECompositeElement(nsINodeInfo *aNodeInfo) - : nsSVGFECompositeElementBase(aNodeInfo) -{ -} - nsresult nsSVGFECompositeElement::Init() { @@ -1656,11 +1607,9 @@ nsSVGFECompositeElement::Filter(nsSVGFilterInstance *instance) nsresult rv; PRUint8 *sourceData, *targetData; nsRefPtr sourceSurface, targetSurface; + nsSVGFilterResource fr(this, instance); - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); - rv = fr.AcquireSourceImage(mIn2, this, nsSVGFilterResource::UNION, &sourceData, - getter_AddRefs(sourceSurface)); + rv = fr.AcquireSourceImage(mIn2, &sourceData, getter_AddRefs(sourceSurface)); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData, getter_AddRefs(targetSurface)); @@ -1694,7 +1643,7 @@ nsSVGFECompositeElement::Filter(nsSVGFilterInstance *instance) fr.CopySourceImage(); // Blend in the second source image - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); float k1Scaled = k1 / 255.0f; float k4Scaled = k4 / 255.0f; @@ -1730,7 +1679,7 @@ nsSVGFECompositeElement::Filter(nsSVGFilterInstance *instance) gfxContext::OPERATOR_XOR }; ctx.SetOperator(opMap[op]); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData, + rv = fr.AcquireSourceImage(mIn1, &sourceData, getter_AddRefs(sourceSurface)); NS_ENSURE_SUCCESS(rv, rv); ctx.SetSource(sourceSurface); @@ -1770,10 +1719,11 @@ class nsSVGFEComponentTransferElement : public nsSVGFEComponentTransferElementBa public nsIDOMSVGFEComponentTransferElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEComponentTransferElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEComponentTransferElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEComponentTransferElement(nsINodeInfo* aNodeInfo) + : nsSVGFEComponentTransferElementBase(aNodeInfo) {} nsresult Init(); public: @@ -1799,6 +1749,7 @@ public: virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; protected: + virtual PRBool OperatesOnPremultipledAlpha() { return PR_FALSE; } nsCOMPtr mIn1; }; @@ -1824,11 +1775,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEComponentTransferElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEComponentTransferElement::nsSVGFEComponentTransferElement(nsINodeInfo *aNodeInfo) - : nsSVGFEComponentTransferElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEComponentTransferElement::Init() { @@ -1868,10 +1814,9 @@ nsSVGFEComponentTransferElement::Filter(nsSVGFilterInstance *instance) { nsresult rv; PRUint8 *sourceData, *targetData; - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::UNPREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData); NS_ENSURE_SUCCESS(rv, rv); @@ -1931,10 +1876,11 @@ typedef nsSVGElement nsSVGComponentTransferFunctionElementBase; class nsSVGComponentTransferFunctionElement : public nsSVGComponentTransferFunctionElementBase { -protected: friend nsresult NS_NewSVGComponentTransferFunctionElement(nsIContent **aResult, - nsINodeInfo *aNodeInfo); - nsSVGComponentTransferFunctionElement(nsINodeInfo* aNodeInfo); + nsINodeInfo *aNodeInfo); +protected: + nsSVGComponentTransferFunctionElement(nsINodeInfo* aNodeInfo) + : nsSVGComponentTransferFunctionElementBase(aNodeInfo) {} nsresult Init(); public: @@ -2003,11 +1949,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGComponentTransferFunctionElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGComponentTransferFunctionElement::nsSVGComponentTransferFunctionElement(nsINodeInfo* aNodeInfo) - : nsSVGComponentTransferFunctionElementBase(aNodeInfo) -{ -} - nsresult nsSVGComponentTransferFunctionElement::Init() { @@ -2191,9 +2132,9 @@ nsSVGComponentTransferFunctionElement::GetNumberInfo() class nsSVGFEFuncRElement : public nsSVGComponentTransferFunctionElement, public nsIDOMSVGFEFuncRElement { -protected: friend nsresult NS_NewSVGFEFuncRElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); +protected: nsSVGFEFuncRElement(nsINodeInfo* aNodeInfo) : nsSVGComponentTransferFunctionElement(aNodeInfo) {} @@ -2231,9 +2172,9 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(nsSVGFEFuncRElement) class nsSVGFEFuncGElement : public nsSVGComponentTransferFunctionElement, public nsIDOMSVGFEFuncGElement { -protected: friend nsresult NS_NewSVGFEFuncGElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); +protected: nsSVGFEFuncGElement(nsINodeInfo* aNodeInfo) : nsSVGComponentTransferFunctionElement(aNodeInfo) {} @@ -2271,9 +2212,9 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(nsSVGFEFuncGElement) class nsSVGFEFuncBElement : public nsSVGComponentTransferFunctionElement, public nsIDOMSVGFEFuncBElement { -protected: friend nsresult NS_NewSVGFEFuncBElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); +protected: nsSVGFEFuncBElement(nsINodeInfo* aNodeInfo) : nsSVGComponentTransferFunctionElement(aNodeInfo) {} @@ -2311,9 +2252,9 @@ NS_IMPL_ELEMENT_CLONE_WITH_INIT(nsSVGFEFuncBElement) class nsSVGFEFuncAElement : public nsSVGComponentTransferFunctionElement, public nsIDOMSVGFEFuncAElement { -protected: friend nsresult NS_NewSVGFEFuncAElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); +protected: nsSVGFEFuncAElement(nsINodeInfo* aNodeInfo) : nsSVGComponentTransferFunctionElement(aNodeInfo) {} @@ -2355,10 +2296,11 @@ class nsSVGFEMergeElement : public nsSVGFEMergeElementBase, public nsIDOMSVGFEMergeElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEMergeElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEMergeElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEMergeElement(nsINodeInfo* aNodeInfo) + : nsSVGFEMergeElementBase(aNodeInfo) {} public: // interfaces: @@ -2402,14 +2344,6 @@ NS_INTERFACE_MAP_BEGIN(nsSVGFEMergeElement) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(SVGFEMergeElement) NS_INTERFACE_MAP_END_INHERITING(nsSVGFEMergeElementBase) -//---------------------------------------------------------------------- -// Implementation - -nsSVGFEMergeElement::nsSVGFEMergeElement(nsINodeInfo *aNodeInfo) - : nsSVGFEMergeElementBase(aNodeInfo) -{ -} - //---------------------------------------------------------------------- // nsIDOMNode methods @@ -2421,9 +2355,8 @@ nsSVGFEMergeElement::Filter(nsSVGFilterInstance *instance) nsresult rv; PRUint8 *sourceData, *targetData; nsRefPtr sourceSurface, targetSurface; + nsSVGFilterResource fr(this, instance); - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); rv = fr.AcquireTargetImage(mResult, &targetData, getter_AddRefs(targetSurface)); NS_ENSURE_SUCCESS(rv, rv); @@ -2439,8 +2372,7 @@ nsSVGFEMergeElement::Filter(nsSVGFilterInstance *instance) nsCOMPtr str; node->GetIn1(getter_AddRefs(str)); - rv = fr.AcquireSourceImage(str, this, nsSVGFilterResource::UNION, - &sourceData, getter_AddRefs(sourceSurface)); + rv = fr.AcquireSourceImage(str, &sourceData, getter_AddRefs(sourceSurface)); NS_ENSURE_SUCCESS(rv, rv); ctx.SetSource(sourceSurface); @@ -2476,10 +2408,11 @@ typedef nsSVGStylableElement nsSVGFEMergeNodeElementBase; class nsSVGFEMergeNodeElement : public nsSVGFEMergeNodeElementBase, public nsIDOMSVGFEMergeNodeElement { -protected: friend nsresult NS_NewSVGFEMergeNodeElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEMergeNodeElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEMergeNodeElement(nsINodeInfo* aNodeInfo) + : nsSVGFEMergeNodeElementBase(aNodeInfo) {} nsresult Init(); public: @@ -2518,11 +2451,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEMergeNodeElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEMergeNodeElement::nsSVGFEMergeNodeElement(nsINodeInfo *aNodeInfo) - : nsSVGFEMergeNodeElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEMergeNodeElement::Init() { @@ -2565,10 +2493,11 @@ class nsSVGFEOffsetElement : public nsSVGFEOffsetElementBase, public nsIDOMSVGFEOffsetElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEOffsetElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEOffsetElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEOffsetElement(nsINodeInfo* aNodeInfo) + : nsSVGFEOffsetElementBase(aNodeInfo) {} nsresult Init(); public: @@ -2628,11 +2557,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEOffsetElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEOffsetElement::nsSVGFEOffsetElement(nsINodeInfo *aNodeInfo) - : nsSVGFEOffsetElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEOffsetElement::Init() { @@ -2685,10 +2609,9 @@ nsSVGFEOffsetElement::Filter(nsSVGFilterInstance *instance) { nsresult rv; PRUint8 *sourceData, *targetData; - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData); NS_ENSURE_SUCCESS(rv, rv); @@ -2757,10 +2680,11 @@ class nsSVGFEFloodElement : public nsSVGFEFloodElementBase, public nsIDOMSVGFEFloodElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEFloodElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEFloodElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEFloodElement(nsINodeInfo* aNodeInfo) + : nsSVGFEFloodElementBase(aNodeInfo) {} nsresult Init(); public: @@ -2788,6 +2712,8 @@ public: virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; protected: + virtual PRBool OperatesOnSRGB(nsIDOMSVGAnimatedString*) { return PR_TRUE; } + nsCOMPtr mIn1; }; @@ -2812,11 +2738,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEFloodElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEFloodElement::nsSVGFEFloodElement(nsINodeInfo *aNodeInfo) - : nsSVGFEFloodElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEFloodElement::Init() { @@ -2857,13 +2778,9 @@ nsSVGFEFloodElement::Filter(nsSVGFilterInstance *instance) nsresult rv; PRUint8 *sourceData, *targetData; nsRefPtr targetSurface; - // flood colour is sRGB - nsSVGFilterInstance::ColorModel - colorModel(nsSVGFilterInstance::ColorModel::SRGB, - nsSVGFilterInstance::ColorModel::PREMULTIPLIED); - nsSVGFilterResource fr(instance, colorModel); + nsSVGFilterResource fr(this, instance); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData, getter_AddRefs(targetSurface)); @@ -2917,13 +2834,16 @@ class nsSVGFETileElement : public nsSVGFETileElementBase, public nsIDOMSVGFETileElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFETileElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFETileElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFETileElement(nsINodeInfo* aNodeInfo) + : nsSVGFETileElementBase(aNodeInfo) {} nsresult Init(); public: + virtual PRBool SubregionIsUnionOfRegions() { return PR_FALSE; } + // interfaces: NS_DECL_ISUPPORTS_INHERITED @@ -2971,11 +2891,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFETileElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFETileElement::nsSVGFETileElement(nsINodeInfo *aNodeInfo) - : nsSVGFETileElementBase(aNodeInfo) -{ -} - nsresult nsSVGFETileElement::Init() { @@ -3026,10 +2941,9 @@ nsSVGFETileElement::Filter(nsSVGFilterInstance *instance) { nsresult rv; PRUint8 *sourceData, *targetData; - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::ALL, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData); NS_ENSURE_SUCCESS(rv, rv); @@ -3064,13 +2978,16 @@ class nsSVGFETurbulenceElement : public nsSVGFETurbulenceElementBase, public nsIDOMSVGFETurbulenceElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFETurbulenceElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFETurbulenceElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFETurbulenceElement(nsINodeInfo* aNodeInfo) + : nsSVGFETurbulenceElementBase(aNodeInfo) {} nsresult Init(); public: + virtual PRBool SubregionIsUnionOfRegions() { return PR_FALSE; } + // interfaces: NS_DECL_ISUPPORTS_INHERITED @@ -3228,11 +3145,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFETurbulenceElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFETurbulenceElement::nsSVGFETurbulenceElement(nsINodeInfo *aNodeInfo) - : nsSVGFETurbulenceElementBase(aNodeInfo) -{ -} - nsresult nsSVGFETurbulenceElement::Init() { @@ -3327,14 +3239,13 @@ nsSVGFETurbulenceElement::Filter(nsSVGFilterInstance *instance) { nsresult rv; PRUint8 *sourceData, *targetData; - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); nsIDOMSVGAnimatedString* sourceGraphic = nsnull; rv = NS_NewSVGAnimatedString(&sourceGraphic); NS_ENSURE_SUCCESS(rv, rv); - rv = fr.AcquireSourceImage(sourceGraphic, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(sourceGraphic, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData); NS_ENSURE_SUCCESS(rv, rv); @@ -3597,10 +3508,11 @@ class nsSVGFEMorphologyElement : public nsSVGFEMorphologyElementBase, public nsIDOMSVGFEMorphologyElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEMorphologyElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEMorphologyElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEMorphologyElement(nsINodeInfo* aNodeInfo) + : nsSVGFEMorphologyElementBase(aNodeInfo) {} nsresult Init(); public: @@ -3684,11 +3596,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEMorphologyElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEMorphologyElement::nsSVGFEMorphologyElement(nsINodeInfo *aNodeInfo) - : nsSVGFEMorphologyElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEMorphologyElement::Init() { @@ -3798,10 +3705,9 @@ nsSVGFEMorphologyElement::Filter(nsSVGFilterInstance *instance) { nsresult rv; PRUint8 *sourceData, *targetData; - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); - rv = fr.AcquireSourceImage(mIn1, this, nsSVGFilterResource::UNION, &sourceData); + rv = fr.AcquireSourceImage(mIn1, &sourceData); NS_ENSURE_SUCCESS(rv, rv); rv = fr.AcquireTargetImage(mResult, &targetData); NS_ENSURE_SUCCESS(rv, rv); @@ -3899,10 +3805,11 @@ class nsSVGFEConvolveMatrixElement : public nsSVGFEConvolveMatrixElementBase, public nsIDOMSVGFEConvolveMatrixElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEConvolveMatrixElement(nsIContent **aResult, - nsINodeInfo *aNodeInfo); - nsSVGFEConvolveMatrixElement(nsINodeInfo* aNodeInfo); + nsINodeInfo *aNodeInfo); +protected: + nsSVGFEConvolveMatrixElement(nsINodeInfo* aNodeInfo) + : nsSVGFEConvolveMatrixElementBase(aNodeInfo) {} nsresult Init(); public: @@ -3930,6 +3837,12 @@ public: virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const; protected: + virtual PRBool OperatesOnPremultipledAlpha() { + PRBool preserveAlpha; + mPreserveAlpha->GetAnimVal(&preserveAlpha); + return !preserveAlpha; + } + virtual NumberAttributesInfo GetNumberInfo(); virtual EnumAttributesInfo GetEnumInfo(); @@ -3996,11 +3909,6 @@ NS_INTERFACE_MAP_END_INHERITING(nsSVGFEConvolveMatrixElementBase) //---------------------------------------------------------------------- // Implementation -nsSVGFEConvolveMatrixElement::nsSVGFEConvolveMatrixElement(nsINodeInfo *aNodeInfo) - : nsSVGFEConvolveMatrixElementBase(aNodeInfo) -{ -} - nsresult nsSVGFEConvolveMatrixElement::Init() { @@ -4343,11 +4251,7 @@ nsSVGFEConvolveMatrixElement::Filter(nsSVGFilterInstance *instance) divisor = 1; } - nsSVGFilterResource - fr(instance, GetColorModel(preserveAlpha - ? nsSVGFilterInstance::ColorModel::UNPREMULTIPLIED - : nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); - + nsSVGFilterResource fr(this, instance); ScaleInfo info; nsresult rv = SetupScalingFilter(instance, &fr, mIn1, @@ -4420,10 +4324,11 @@ typedef nsSVGElement nsSVGFEDistantLightElementBase; class nsSVGFEDistantLightElement : public nsSVGFEDistantLightElementBase, public nsIDOMSVGFEDistantLightElement { -protected: friend nsresult NS_NewSVGFEDistantLightElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEDistantLightElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEDistantLightElement(nsINodeInfo* aNodeInfo) + : nsSVGFEDistantLightElementBase(aNodeInfo) {} public: // interfaces: @@ -4466,14 +4371,6 @@ NS_INTERFACE_MAP_BEGIN(nsSVGFEDistantLightElement) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(SVGFEDistantLightElement) NS_INTERFACE_MAP_END_INHERITING(nsSVGFEDistantLightElementBase) -//---------------------------------------------------------------------- -// Implementation - -nsSVGFEDistantLightElement::nsSVGFEDistantLightElement(nsINodeInfo* aNodeInfo) - : nsSVGFEDistantLightElementBase(aNodeInfo) -{ -} - //---------------------------------------------------------------------- // nsIDOMNode methods @@ -4513,10 +4410,11 @@ typedef nsSVGElement nsSVGFEPointLightElementBase; class nsSVGFEPointLightElement : public nsSVGFEPointLightElementBase, public nsIDOMSVGFEPointLightElement { -protected: friend nsresult NS_NewSVGFEPointLightElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFEPointLightElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFEPointLightElement(nsINodeInfo* aNodeInfo) + : nsSVGFEPointLightElementBase(aNodeInfo) {} public: // interfaces: @@ -4560,14 +4458,6 @@ NS_INTERFACE_MAP_BEGIN(nsSVGFEPointLightElement) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(SVGFEPointLightElement) NS_INTERFACE_MAP_END_INHERITING(nsSVGFEPointLightElementBase) -//---------------------------------------------------------------------- -// Implementation - -nsSVGFEPointLightElement::nsSVGFEPointLightElement(nsINodeInfo* aNodeInfo) - : nsSVGFEPointLightElementBase(aNodeInfo) -{ -} - //---------------------------------------------------------------------- // nsIDOMNode methods @@ -4611,10 +4501,11 @@ typedef nsSVGElement nsSVGFESpotLightElementBase; class nsSVGFESpotLightElement : public nsSVGFESpotLightElementBase, public nsIDOMSVGFESpotLightElement { -protected: friend nsresult NS_NewSVGFESpotLightElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFESpotLightElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFESpotLightElement(nsINodeInfo* aNodeInfo) + : nsSVGFESpotLightElementBase(aNodeInfo) {} public: // interfaces: @@ -4664,14 +4555,6 @@ NS_INTERFACE_MAP_BEGIN(nsSVGFESpotLightElement) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(SVGFESpotLightElement) NS_INTERFACE_MAP_END_INHERITING(nsSVGFESpotLightElementBase) -//---------------------------------------------------------------------- -// Implementation - -nsSVGFESpotLightElement::nsSVGFESpotLightElement(nsINodeInfo* aNodeInfo) - : nsSVGFESpotLightElementBase(aNodeInfo) -{ -} - //---------------------------------------------------------------------- // nsIDOMNode methods @@ -4748,7 +4631,8 @@ class nsSVGFELightingElement : public nsSVGFELightingElementBase, public nsISVGFilter { protected: - nsSVGFELightingElement(nsINodeInfo* aNodeInfo); + nsSVGFELightingElement(nsINodeInfo* aNodeInfo) + : nsSVGFELightingElementBase(aNodeInfo) {} nsresult Init(); public: @@ -4786,16 +4670,6 @@ protected: nsCOMPtr mIn1; }; -//---------------------------------------------------------------------- -// nsISupports methods - -NS_IMPL_ADDREF_INHERITED(nsSVGFELightingElement,nsSVGFELightingElementBase) -NS_IMPL_RELEASE_INHERITED(nsSVGFELightingElement,nsSVGFELightingElementBase) - -NS_INTERFACE_MAP_BEGIN(nsSVGFELightingElement) - NS_INTERFACE_MAP_ENTRY(nsISVGFilter) -NS_INTERFACE_MAP_END_INHERITING(nsSVGFELightingElementBase) - nsSVGElement::NumberInfo nsSVGFELightingElement::sNumberInfo[6] = { { &nsGkAtoms::surfaceScale, 1 }, @@ -4806,10 +4680,18 @@ nsSVGElement::NumberInfo nsSVGFELightingElement::sNumberInfo[6] = { &nsGkAtoms::kernelUnitLength, 0 } }; -nsSVGFELightingElement::nsSVGFELightingElement(nsINodeInfo *aNodeInfo) - : nsSVGFELightingElementBase(aNodeInfo) -{ -} +//---------------------------------------------------------------------- +// nsISupports methods + +NS_IMPL_ADDREF_INHERITED(nsSVGFELightingElement,nsSVGFELightingElementBase) +NS_IMPL_RELEASE_INHERITED(nsSVGFELightingElement,nsSVGFELightingElementBase) + +NS_INTERFACE_MAP_BEGIN(nsSVGFELightingElement) + NS_INTERFACE_MAP_ENTRY(nsISVGFilter) +NS_INTERFACE_MAP_END_INHERITING(nsSVGFELightingElementBase) + +//---------------------------------------------------------------------- +// Implementation nsresult nsSVGFELightingElement::Init() @@ -4958,8 +4840,7 @@ GenerateNormal(float *N, const PRUint8 *data, PRInt32 stride, nsRect rect, NS_IMETHODIMP nsSVGFELightingElement::Filter(nsSVGFilterInstance *instance) { - nsSVGFilterResource fr(instance, - GetColorModel(nsSVGFilterInstance::ColorModel::PREMULTIPLIED)); + nsSVGFilterResource fr(this, instance); ScaleInfo info; nsresult rv = SetupScalingFilter(instance, &fr, mIn1, @@ -5103,10 +4984,11 @@ typedef nsSVGFELightingElement nsSVGFEDiffuseLightingElementBase; class nsSVGFEDiffuseLightingElement : public nsSVGFEDiffuseLightingElementBase, public nsIDOMSVGFEDiffuseLightingElement { -protected: friend nsresult NS_NewSVGFEDiffuseLightingElement(nsIContent **aResult, - nsINodeInfo *aNodeInfo); - nsSVGFEDiffuseLightingElement(nsINodeInfo* aNodeInfo); + nsINodeInfo *aNodeInfo); +protected: + nsSVGFEDiffuseLightingElement(nsINodeInfo* aNodeInfo) + : nsSVGFEDiffuseLightingElementBase(aNodeInfo) {} public: // interfaces: @@ -5146,14 +5028,6 @@ NS_INTERFACE_MAP_BEGIN(nsSVGFEDiffuseLightingElement) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(SVGFEDiffuseLightingElement) NS_INTERFACE_MAP_END_INHERITING(nsSVGFEDiffuseLightingElementBase) -//---------------------------------------------------------------------- -// Implementation - -nsSVGFEDiffuseLightingElement::nsSVGFEDiffuseLightingElement(nsINodeInfo *aNodeInfo) - : nsSVGFEDiffuseLightingElementBase(aNodeInfo) -{ -} - //---------------------------------------------------------------------- // nsIDOMNode methods @@ -5231,10 +5105,11 @@ typedef nsSVGFELightingElement nsSVGFESpecularLightingElementBase; class nsSVGFESpecularLightingElement : public nsSVGFESpecularLightingElementBase, public nsIDOMSVGFESpecularLightingElement { -protected: friend nsresult NS_NewSVGFESpecularLightingElement(nsIContent **aResult, nsINodeInfo *aNodeInfo); - nsSVGFESpecularLightingElement(nsINodeInfo* aNodeInfo); +protected: + nsSVGFESpecularLightingElement(nsINodeInfo* aNodeInfo) + : nsSVGFESpecularLightingElementBase(aNodeInfo) {} public: // interfaces: @@ -5277,14 +5152,6 @@ NS_INTERFACE_MAP_BEGIN(nsSVGFESpecularLightingElement) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(SVGFESpecularLightingElement) NS_INTERFACE_MAP_END_INHERITING(nsSVGFESpecularLightingElementBase) -//---------------------------------------------------------------------- -// Implementation - -nsSVGFESpecularLightingElement::nsSVGFESpecularLightingElement(nsINodeInfo *aNodeInfo) - : nsSVGFESpecularLightingElementBase(aNodeInfo) -{ -} - //---------------------------------------------------------------------- // nsIDOMNode methods @@ -5396,10 +5263,11 @@ class nsSVGFEUnimplementedMOZElement : public nsSVGFEUnimplementedMOZElementBase public nsIDOMSVGFEUnimplementedMOZElement, public nsISVGFilter { -protected: friend nsresult NS_NewSVGFEUnimplementedMOZElement(nsIContent **aResult, - nsINodeInfo *aNodeInfo); - nsSVGFEUnimplementedMOZElement(nsINodeInfo* aNodeInfo); + nsINodeInfo *aNodeInfo); +protected: + nsSVGFEUnimplementedMOZElement(nsINodeInfo* aNodeInfo) + : nsSVGFEUnimplementedMOZElementBase(aNodeInfo) {} public: // interfaces: @@ -5441,14 +5309,6 @@ NS_INTERFACE_MAP_BEGIN(nsSVGFEUnimplementedMOZElement) NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(SVGFEUnimplementedMOZElement) NS_INTERFACE_MAP_END_INHERITING(nsSVGFEUnimplementedMOZElementBase) -//---------------------------------------------------------------------- -// Implementation - -nsSVGFEUnimplementedMOZElement::nsSVGFEUnimplementedMOZElement(nsINodeInfo *aNodeInfo) - : nsSVGFEUnimplementedMOZElementBase(aNodeInfo) -{ -} - //---------------------------------------------------------------------- // nsIDOMNode methods diff --git a/mozilla/content/svg/content/src/nsSVGFilters.h b/mozilla/content/svg/content/src/nsSVGFilters.h index 5210b48b23a..cb08d6404da 100644 --- a/mozilla/content/svg/content/src/nsSVGFilters.h +++ b/mozilla/content/svg/content/src/nsSVGFilters.h @@ -39,6 +39,7 @@ #include "nsSVGStylableElement.h" #include "nsSVGLength2.h" +#include "nsIFrame.h" class nsSVGFilterResource; class nsIDOMSVGAnimatedString; @@ -51,7 +52,7 @@ class nsSVGFE : public nsSVGFEBase friend class nsSVGFilterInstance; protected: - nsSVGFE(nsINodeInfo *aNodeInfo); + nsSVGFE(nsINodeInfo *aNodeInfo) : nsSVGFEBase(aNodeInfo) {} nsresult Init(); PRBool ScanDualValueAttribute(const nsAString& aValue, nsIAtom* aAttribute, @@ -59,9 +60,6 @@ protected: NumberInfo* aInfo1, NumberInfo* aInfo2, nsAttrValue& aResult); - nsSVGFilterInstance::ColorModel - GetColorModel(nsSVGFilterInstance::ColorModel::AlphaChannel aAlphaChannel); - struct ScaleInfo { nsRefPtr mRealSource; nsRefPtr mRealTarget; @@ -82,11 +80,35 @@ protected: public: + nsSVGFilterInstance::ColorModel + GetColorModel(nsIDOMSVGAnimatedString* aIn) { + return nsSVGFilterInstance::ColorModel ( + (OperatesOnSRGB(aIn) ? + nsSVGFilterInstance::ColorModel::SRGB : + nsSVGFilterInstance::ColorModel::LINEAR_RGB), + (OperatesOnPremultipledAlpha() ? + nsSVGFilterInstance::ColorModel::PREMULTIPLIED : + nsSVGFilterInstance::ColorModel::UNPREMULTIPLIED)); + } + + // See http://www.w3.org/TR/SVG/filters.html#FilterPrimitiveSubRegion + virtual PRBool SubregionIsUnionOfRegions() { return PR_TRUE; } + // interfaces: NS_DECL_ISUPPORTS_INHERITED NS_DECL_NSIDOMSVGFILTERPRIMITIVESTANDARDATTRIBUTES protected: + virtual PRBool OperatesOnPremultipledAlpha() { return PR_TRUE; } + + virtual PRBool OperatesOnSRGB(nsIDOMSVGAnimatedString*) { + nsIFrame* frame = GetPrimaryFrame(); + if (!frame) return PR_FALSE; + + nsStyleContext* style = frame->GetStyleContext(); + return style->GetStyleSVG()->mColorInterpolationFilters == + NS_STYLE_COLOR_INTERPOLATION_SRGB; + } // nsSVGElement specializations: virtual LengthAttributesInfo GetLengthInfo();