8eedcd2dea
https://www.w3.org/TR/SVG11/filters.html#feSpecularLightingElement Because a fair amount of functionality will be shared between feSpecularLighting and feDiffuseLighting, this CL adds an intermediate SkSVGFeLighting base class for common code. The only light source type implemented in this CL is fePointLight, which exercised by the filters-light-03 W3C test. Bug: skia:10841 Change-Id: Icae26dedb1aae1cd25ba2db7c6468a243ebacbc5 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/359756 Reviewed-by: Florin Malita <fmalita@chromium.org> Commit-Queue: Tyler Denniston <tdenniston@google.com>
75 lines
2.8 KiB
C++
75 lines
2.8 KiB
C++
/*
|
|
* 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) {
|
|
return node->tag() == SkSVGTag::kFeTurbulence || node->tag() == SkSVGTag::kFeColorMatrix ||
|
|
node->tag() == SkSVGTag::kFeComposite || node->tag() == SkSVGTag::kFeFlood ||
|
|
node->tag() == SkSVGTag::kFeGaussianBlur || node->tag() == SkSVGTag::kFeOffset ||
|
|
node->tag() == SkSVGTag::kFeBlend || node->tag() == SkSVGTag::kFeMorphology ||
|
|
node->tag() == SkSVGTag::kFeDisplacementMap ||
|
|
node->tag() == SkSVGTag::kFeSpecularLighting;
|
|
}
|
|
|
|
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
|