summaryrefslogtreecommitdiffstats
path: root/dom/svg/SVGFilters.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/svg/SVGFilters.h
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/svg/SVGFilters.h')
-rw-r--r--dom/svg/SVGFilters.h243
1 files changed, 243 insertions, 0 deletions
diff --git a/dom/svg/SVGFilters.h b/dom/svg/SVGFilters.h
new file mode 100644
index 0000000000..5ecec2a445
--- /dev/null
+++ b/dom/svg/SVGFilters.h
@@ -0,0 +1,243 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef DOM_SVG_SVGFILTERS_H_
+#define DOM_SVG_SVGFILTERS_H_
+
+#include "mozilla/Attributes.h"
+#include "mozilla/dom/SVGElement.h"
+#include "FilterDescription.h"
+#include "nsImageLoadingContent.h"
+#include "SVGAnimatedLength.h"
+#include "SVGAnimatedNumber.h"
+#include "SVGAnimatedNumberPair.h"
+#include "SVGAnimatedString.h"
+
+namespace mozilla {
+class SVGFilterInstance;
+
+namespace dom {
+
+struct SVGStringInfo {
+ SVGStringInfo(const SVGAnimatedString* aString, SVGElement* aElement)
+ : mString(aString), mElement(aElement) {}
+
+ const SVGAnimatedString* mString;
+ SVGElement* mElement;
+};
+
+using SVGFEBase = SVGElement;
+
+#define NS_SVG_FE_CID \
+ { \
+ 0x60483958, 0xd229, 0x4a77, { \
+ 0x96, 0xb2, 0x62, 0x3e, 0x69, 0x95, 0x1e, 0x0e \
+ } \
+ }
+
+/**
+ * Base class for filter primitive elements
+ * Children of those elements e.g. feMergeNode
+ * derive from SVGFEUnstyledElement instead
+ */
+class SVGFE : public SVGFEBase {
+ friend class mozilla::SVGFilterInstance;
+
+ protected:
+ using SourceSurface = mozilla::gfx::SourceSurface;
+ using Size = mozilla::gfx::Size;
+ using IntRect = mozilla::gfx::IntRect;
+ using ColorSpace = mozilla::gfx::ColorSpace;
+ using FilterPrimitiveDescription = mozilla::gfx::FilterPrimitiveDescription;
+
+ explicit SVGFE(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo)
+ : SVGFEBase(std::move(aNodeInfo)) {}
+ virtual ~SVGFE() = default;
+
+ public:
+ using PrimitiveAttributes = mozilla::gfx::PrimitiveAttributes;
+
+ ColorSpace GetInputColorSpace(int32_t aInputIndex,
+ ColorSpace aUnchangedInputColorSpace) {
+ return OperatesOnSRGB(aInputIndex,
+ aUnchangedInputColorSpace == ColorSpace::SRGB)
+ ? ColorSpace::SRGB
+ : ColorSpace::LinearRGB;
+ }
+
+ // This is only called for filter primitives without inputs. For primitives
+ // with inputs, the output color model is the same as of the first input.
+ ColorSpace GetOutputColorSpace() {
+ return ProducesSRGB() ? ColorSpace::SRGB : ColorSpace::LinearRGB;
+ }
+
+ // See http://www.w3.org/TR/SVG/filters.html#FilterPrimitiveSubRegion
+ virtual bool SubregionIsUnionOfRegions() { return true; }
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_SVG_FE_CID)
+
+ // interfaces:
+ NS_DECL_ISUPPORTS_INHERITED
+
+ // SVGElement interface
+ nsresult Clone(mozilla::dom::NodeInfo*, nsINode** aResult) const override = 0;
+
+ bool HasValidDimensions() const override;
+
+ virtual SVGAnimatedString& GetResultImageName() = 0;
+ // Return a list of all image names used as sources. Default is to
+ // return no sources.
+ virtual void GetSourceImageNames(nsTArray<SVGStringInfo>& aSources);
+
+ virtual FilterPrimitiveDescription GetPrimitiveDescription(
+ SVGFilterInstance* aInstance, const IntRect& aFilterSubregion,
+ const nsTArray<bool>& aInputsAreTainted,
+ nsTArray<RefPtr<SourceSurface>>& aInputImages) = 0;
+
+ // returns true if changes to the attribute should cause us to
+ // repaint the filter
+ virtual bool AttributeAffectsRendering(int32_t aNameSpaceID,
+ nsAtom* aAttribute) const;
+
+ // Return whether this filter primitive has tainted output. A filter's
+ // output is tainted if it depends on things that the web page is not
+ // allowed to read from, e.g. the source graphic or cross-origin images.
+ // aReferencePrincipal is the node principal of the filtered frame's element.
+ virtual bool OutputIsTainted(const nsTArray<bool>& aInputsAreTainted,
+ nsIPrincipal* aReferencePrincipal);
+
+ static nsIntRect GetMaxRect() {
+ // Try to avoid overflow errors dealing with this rect. It will
+ // be intersected with some other reasonable-sized rect eventually.
+ return nsIntRect(INT32_MIN / 2, INT32_MIN / 2, INT32_MAX, INT32_MAX);
+ }
+
+ operator nsISupports*() { return static_cast<nsIContent*>(this); }
+
+ // WebIDL
+ already_AddRefed<DOMSVGAnimatedLength> X();
+ already_AddRefed<DOMSVGAnimatedLength> Y();
+ already_AddRefed<DOMSVGAnimatedLength> Width();
+ already_AddRefed<DOMSVGAnimatedLength> Height();
+ already_AddRefed<DOMSVGAnimatedString> Result();
+
+ protected:
+ virtual bool OperatesOnSRGB(int32_t aInputIndex, bool aInputIsAlreadySRGB) {
+ return StyleIsSetToSRGB();
+ }
+
+ // Only called for filter primitives without inputs.
+ virtual bool ProducesSRGB() { return StyleIsSetToSRGB(); }
+
+ bool StyleIsSetToSRGB();
+
+ // SVGElement specializations:
+ LengthAttributesInfo GetLengthInfo() override;
+
+ Size GetKernelUnitLength(SVGFilterInstance* aInstance,
+ SVGAnimatedNumberPair* aKernelUnitLength);
+
+ enum { ATTR_X, ATTR_Y, ATTR_WIDTH, ATTR_HEIGHT };
+ SVGAnimatedLength mLengthAttributes[4];
+ static LengthInfo sLengthInfo[4];
+};
+
+NS_DEFINE_STATIC_IID_ACCESSOR(SVGFE, NS_SVG_FE_CID)
+
+using SVGFEUnstyledElementBase = SVGElement;
+
+class SVGFEUnstyledElement : public SVGFEUnstyledElementBase {
+ protected:
+ explicit SVGFEUnstyledElement(
+ already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo)
+ : SVGFEUnstyledElementBase(std::move(aNodeInfo)) {}
+
+ public:
+ nsresult Clone(mozilla::dom::NodeInfo*, nsINode** aResult) const override = 0;
+
+ // returns true if changes to the attribute should cause us to
+ // repaint the filter
+ virtual bool AttributeAffectsRendering(int32_t aNameSpaceID,
+ nsAtom* aAttribute) const = 0;
+};
+
+//------------------------------------------------------------
+
+using SVGFELightingElementBase = SVGFE;
+
+class SVGFELightingElement : public SVGFELightingElementBase {
+ protected:
+ explicit SVGFELightingElement(
+ already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo)
+ : SVGFELightingElementBase(std::move(aNodeInfo)) {}
+
+ virtual ~SVGFELightingElement() = default;
+
+ public:
+ // interfaces:
+ NS_INLINE_DECL_REFCOUNTING_INHERITED(SVGFELightingElement,
+ SVGFELightingElementBase)
+
+ bool AttributeAffectsRendering(int32_t aNameSpaceID,
+ nsAtom* aAttribute) const override;
+ SVGAnimatedString& GetResultImageName() override {
+ return mStringAttributes[RESULT];
+ }
+ void GetSourceImageNames(nsTArray<SVGStringInfo>& aSources) override;
+
+ protected:
+ bool OperatesOnSRGB(int32_t aInputIndex, bool aInputIsAlreadySRGB) override {
+ return true;
+ }
+
+ NumberAttributesInfo GetNumberInfo() override;
+ NumberPairAttributesInfo GetNumberPairInfo() override;
+ StringAttributesInfo GetStringInfo() override;
+
+ mozilla::gfx::LightType ComputeLightAttributes(
+ SVGFilterInstance* aInstance, nsTArray<float>& aFloatAttributes);
+
+ bool AddLightingAttributes(
+ mozilla::gfx::DiffuseLightingAttributes* aAttributes,
+ SVGFilterInstance* aInstance);
+
+ enum {
+ SURFACE_SCALE,
+ DIFFUSE_CONSTANT,
+ SPECULAR_CONSTANT,
+ SPECULAR_EXPONENT
+ };
+ SVGAnimatedNumber mNumberAttributes[4];
+ static NumberInfo sNumberInfo[4];
+
+ enum { KERNEL_UNIT_LENGTH };
+ SVGAnimatedNumberPair mNumberPairAttributes[1];
+ static NumberPairInfo sNumberPairInfo[1];
+
+ enum { RESULT, IN1 };
+ SVGAnimatedString mStringAttributes[2];
+ static StringInfo sStringInfo[2];
+};
+
+using SVGFELightElementBase = SVGFEUnstyledElement;
+
+class SVGFELightElement : public SVGFELightElementBase {
+ protected:
+ explicit SVGFELightElement(
+ already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo)
+ : SVGFELightElementBase(std::move(aNodeInfo)) {}
+
+ public:
+ using PrimitiveAttributes = gfx::PrimitiveAttributes;
+
+ virtual mozilla::gfx::LightType ComputeLightAttributes(
+ SVGFilterInstance* aInstance, nsTArray<float>& aFloatAttributes) = 0;
+};
+
+} // namespace dom
+} // namespace mozilla
+
+#endif // DOM_SVG_SVGFILTERS_H_