xref: /aosp_15_r20/external/skia/modules/svg/include/SkSVGFe.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2020 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkSVGFe_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkSVGFe_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAPI.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGHiddenContainer.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGNode.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGTypes.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkTLazy.h"
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker class SkImageFilter;
22*c8dee2aaSAndroid Build Coastguard Worker class SkSVGFilterContext;
23*c8dee2aaSAndroid Build Coastguard Worker class SkSVGRenderContext;
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker class SK_API SkSVGFe : public SkSVGHiddenContainer {
26*c8dee2aaSAndroid Build Coastguard Worker public:
IsFilterEffect(const sk_sp<SkSVGNode> & node)27*c8dee2aaSAndroid Build Coastguard Worker     static bool IsFilterEffect(const sk_sp<SkSVGNode>& node) {
28*c8dee2aaSAndroid Build Coastguard Worker         switch (node->tag()) {
29*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeBlend:
30*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeColorMatrix:
31*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeComponentTransfer:
32*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeComposite:
33*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeDiffuseLighting:
34*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeDisplacementMap:
35*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeFlood:
36*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeGaussianBlur:
37*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeImage:
38*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeMerge:
39*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeMorphology:
40*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeOffset:
41*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeSpecularLighting:
42*c8dee2aaSAndroid Build Coastguard Worker             case SkSVGTag::kFeTurbulence:
43*c8dee2aaSAndroid Build Coastguard Worker                 return true;
44*c8dee2aaSAndroid Build Coastguard Worker             default:
45*c8dee2aaSAndroid Build Coastguard Worker                 return false;
46*c8dee2aaSAndroid Build Coastguard Worker         }
47*c8dee2aaSAndroid Build Coastguard Worker     }
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImageFilter> makeImageFilter(const SkSVGRenderContext& ctx,
50*c8dee2aaSAndroid Build Coastguard Worker                                          const SkSVGFilterContext& fctx) const;
51*c8dee2aaSAndroid Build Coastguard Worker 
52*c8dee2aaSAndroid Build Coastguard Worker     // https://www.w3.org/TR/SVG11/filters.html#FilterPrimitiveSubRegion
53*c8dee2aaSAndroid Build Coastguard Worker     SkRect resolveFilterSubregion(const SkSVGRenderContext&, const SkSVGFilterContext&) const;
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     /**
56*c8dee2aaSAndroid Build Coastguard Worker      * Resolves the colorspace within which this filter effect should be applied.
57*c8dee2aaSAndroid Build Coastguard Worker      * Spec: https://www.w3.org/TR/SVG11/painting.html#ColorInterpolationProperties
58*c8dee2aaSAndroid Build Coastguard Worker      * 'color-interpolation-filters' property.
59*c8dee2aaSAndroid Build Coastguard Worker      */
60*c8dee2aaSAndroid Build Coastguard Worker     virtual SkSVGColorspace resolveColorspace(const SkSVGRenderContext&,
61*c8dee2aaSAndroid Build Coastguard Worker                                               const SkSVGFilterContext&) const;
62*c8dee2aaSAndroid Build Coastguard Worker 
63*c8dee2aaSAndroid Build Coastguard Worker     /** Propagates any inherited presentation attributes in the given context. */
64*c8dee2aaSAndroid Build Coastguard Worker     void applyProperties(SkSVGRenderContext*) const;
65*c8dee2aaSAndroid Build Coastguard Worker 
SVG_ATTR(In,SkSVGFeInputType,SkSVGFeInputType ())66*c8dee2aaSAndroid Build Coastguard Worker     SVG_ATTR(In, SkSVGFeInputType, SkSVGFeInputType())
67*c8dee2aaSAndroid Build Coastguard Worker     SVG_ATTR(Result, SkSVGStringType, SkSVGStringType())
68*c8dee2aaSAndroid Build Coastguard Worker     SVG_OPTIONAL_ATTR(X, SkSVGLength)
69*c8dee2aaSAndroid Build Coastguard Worker     SVG_OPTIONAL_ATTR(Y, SkSVGLength)
70*c8dee2aaSAndroid Build Coastguard Worker     SVG_OPTIONAL_ATTR(Width, SkSVGLength)
71*c8dee2aaSAndroid Build Coastguard Worker     SVG_OPTIONAL_ATTR(Height, SkSVGLength)
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker protected:
74*c8dee2aaSAndroid Build Coastguard Worker     explicit SkSVGFe(SkSVGTag t) : INHERITED(t) {}
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkImageFilter> onMakeImageFilter(const SkSVGRenderContext&,
77*c8dee2aaSAndroid Build Coastguard Worker                                                    const SkSVGFilterContext&) const = 0;
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker     virtual std::vector<SkSVGFeInputType> getInputs() const = 0;
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker     bool parseAndSetAttribute(const char*, const char*) override;
82*c8dee2aaSAndroid Build Coastguard Worker 
83*c8dee2aaSAndroid Build Coastguard Worker private:
84*c8dee2aaSAndroid Build Coastguard Worker     /**
85*c8dee2aaSAndroid Build Coastguard Worker      * Resolves the rect specified by the x, y, width and height attributes (if specified) on this
86*c8dee2aaSAndroid Build Coastguard Worker      * filter effect. These attributes are resolved according to the given length context and
87*c8dee2aaSAndroid Build Coastguard Worker      * the value of 'primitiveUnits' on the parent <filter> element.
88*c8dee2aaSAndroid Build Coastguard Worker      */
89*c8dee2aaSAndroid Build Coastguard Worker     SkRect resolveBoundaries(const SkSVGRenderContext&, const SkSVGFilterContext&) const;
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkSVGHiddenContainer;
92*c8dee2aaSAndroid Build Coastguard Worker };
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker #endif  // SkSVGFe_DEFINED
95