| /* |
| * Copyright 2020 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SkSVGFe_DEFINED |
| #define SkSVGFe_DEFINED |
| |
| #include <vector> |
| |
| #include "modules/svg/include/SkSVGHiddenContainer.h" |
| |
| class SkImageFilter; |
| class SkSVGFilterContext; |
| |
| class SkSVGFe : public SkSVGHiddenContainer { |
| public: |
| static bool IsFilterEffect(const sk_sp<SkSVGNode>& node) { |
| switch (node->tag()) { |
| case SkSVGTag::kFeBlend: |
| case SkSVGTag::kFeColorMatrix: |
| case SkSVGTag::kFeComposite: |
| case SkSVGTag::kFeDiffuseLighting: |
| case SkSVGTag::kFeDisplacementMap: |
| case SkSVGTag::kFeFlood: |
| case SkSVGTag::kFeGaussianBlur: |
| case SkSVGTag::kFeImage: |
| case SkSVGTag::kFeMorphology: |
| case SkSVGTag::kFeOffset: |
| case SkSVGTag::kFeSpecularLighting: |
| case SkSVGTag::kFeTurbulence: |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| sk_sp<SkImageFilter> makeImageFilter(const SkSVGRenderContext& ctx, |
| const SkSVGFilterContext& fctx) const; |
| |
| // https://www.w3.org/TR/SVG11/filters.html#FilterPrimitiveSubRegion |
| SkRect resolveFilterSubregion(const SkSVGRenderContext&, const SkSVGFilterContext&) const; |
| |
| /** |
| * Resolves the colorspace within which this filter effect should be applied. |
| * Spec: https://www.w3.org/TR/SVG11/painting.html#ColorInterpolationProperties |
| * 'color-interpolation-filters' property. |
| */ |
| virtual SkSVGColorspace resolveColorspace(const SkSVGRenderContext&, |
| const SkSVGFilterContext&) const; |
| |
| /** Propagates any inherited presentation attributes in the given context. */ |
| void applyProperties(SkSVGRenderContext*) const; |
| |
| SVG_ATTR(In, SkSVGFeInputType, SkSVGFeInputType()) |
| SVG_ATTR(Result, SkSVGStringType, SkSVGStringType()) |
| SVG_OPTIONAL_ATTR(X, SkSVGLength) |
| SVG_OPTIONAL_ATTR(Y, SkSVGLength) |
| SVG_OPTIONAL_ATTR(Width, SkSVGLength) |
| SVG_OPTIONAL_ATTR(Height, SkSVGLength) |
| |
| protected: |
| explicit SkSVGFe(SkSVGTag t) : INHERITED(t) {} |
| |
| virtual sk_sp<SkImageFilter> onMakeImageFilter(const SkSVGRenderContext&, |
| const SkSVGFilterContext&) const = 0; |
| |
| virtual std::vector<SkSVGFeInputType> getInputs() const = 0; |
| |
| bool parseAndSetAttribute(const char*, const char*) override; |
| |
| private: |
| /** |
| * Resolves the rect specified by the x, y, width and height attributes (if specified) on this |
| * filter effect. These attributes are resolved according to the given length context and |
| * the value of 'primitiveUnits' on the parent <filter> element. |
| */ |
| SkRect resolveBoundaries(const SkSVGRenderContext&, const SkSVGFilterContext&) const; |
| |
| using INHERITED = SkSVGHiddenContainer; |
| }; |
| |
| #endif // SkSVGFe_DEFINED |