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