• 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 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::kFeComposite:
25             case SkSVGTag::kFeDiffuseLighting:
26             case SkSVGTag::kFeDisplacementMap:
27             case SkSVGTag::kFeFlood:
28             case SkSVGTag::kFeGaussianBlur:
29             case SkSVGTag::kFeImage:
30             case SkSVGTag::kFeMorphology:
31             case SkSVGTag::kFeOffset:
32             case SkSVGTag::kFeSpecularLighting:
33             case SkSVGTag::kFeTurbulence:
34                 return true;
35             default:
36                 return false;
37         }
38     }
39 
40     sk_sp<SkImageFilter> makeImageFilter(const SkSVGRenderContext& ctx,
41                                          const SkSVGFilterContext& fctx) const;
42 
43     // https://www.w3.org/TR/SVG11/filters.html#FilterPrimitiveSubRegion
44     SkRect resolveFilterSubregion(const SkSVGRenderContext&, const SkSVGFilterContext&) const;
45 
46     /**
47      * Resolves the colorspace within which this filter effect should be applied.
48      * Spec: https://www.w3.org/TR/SVG11/painting.html#ColorInterpolationProperties
49      * 'color-interpolation-filters' property.
50      */
51     virtual SkSVGColorspace resolveColorspace(const SkSVGRenderContext&,
52                                               const SkSVGFilterContext&) const;
53 
54     /** Propagates any inherited presentation attributes in the given context. */
55     void applyProperties(SkSVGRenderContext*) const;
56 
SVG_ATTR(In,SkSVGFeInputType,SkSVGFeInputType ())57     SVG_ATTR(In, SkSVGFeInputType, SkSVGFeInputType())
58     SVG_ATTR(Result, SkSVGStringType, SkSVGStringType())
59     SVG_OPTIONAL_ATTR(X, SkSVGLength)
60     SVG_OPTIONAL_ATTR(Y, SkSVGLength)
61     SVG_OPTIONAL_ATTR(Width, SkSVGLength)
62     SVG_OPTIONAL_ATTR(Height, SkSVGLength)
63 
64 protected:
65     explicit SkSVGFe(SkSVGTag t) : INHERITED(t) {}
66 
67     virtual sk_sp<SkImageFilter> onMakeImageFilter(const SkSVGRenderContext&,
68                                                    const SkSVGFilterContext&) const = 0;
69 
70     virtual std::vector<SkSVGFeInputType> getInputs() const = 0;
71 
72     bool parseAndSetAttribute(const char*, const char*) override;
73 
74 private:
75     /**
76      * Resolves the rect specified by the x, y, width and height attributes (if specified) on this
77      * filter effect. These attributes are resolved according to the given length context and
78      * the value of 'primitiveUnits' on the parent <filter> element.
79      */
80     SkRect resolveBoundaries(const SkSVGRenderContext&, const SkSVGFilterContext&) const;
81 
82     using INHERITED = SkSVGHiddenContainer;
83 };
84 
85 #endif  // SkSVGFe_DEFINED
86