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 SkSVGFeLighting_DEFINED 9 #define SkSVGFeLighting_DEFINED 10 11 #include "modules/svg/include/SkSVGFe.h" 12 #include "modules/svg/include/SkSVGTypes.h" 13 14 class SkSVGFeDistantLight; 15 class SkSVGFePointLight; 16 class SkSVGFeSpotLight; 17 18 class SkSVGFeLighting : public SkSVGFe { 19 public: 20 struct KernelUnitLength { 21 SkSVGNumberType fDx; 22 SkSVGNumberType fDy; 23 }; 24 25 SVG_ATTR(SurfaceScale, SkSVGNumberType, 1) SVG_OPTIONAL_ATTR(KernelUnitLength,KernelUnitLength)26 SVG_OPTIONAL_ATTR(KernelUnitLength, KernelUnitLength) 27 28 protected: 29 explicit SkSVGFeLighting(SkSVGTag t) : INHERITED(t) {} 30 getInputs()31 std::vector<SkSVGFeInputType> getInputs() const final { return {this->getIn()}; } 32 33 bool parseAndSetAttribute(const char*, const char*) override; 34 35 sk_sp<SkImageFilter> onMakeImageFilter(const SkSVGRenderContext&, 36 const SkSVGFilterContext&) const final; 37 38 virtual sk_sp<SkImageFilter> makeDistantLight(const SkSVGRenderContext&, 39 const SkSVGFilterContext&, 40 const SkSVGFeDistantLight*) const = 0; 41 42 virtual sk_sp<SkImageFilter> makePointLight(const SkSVGRenderContext&, 43 const SkSVGFilterContext&, 44 const SkSVGFePointLight*) const = 0; 45 46 virtual sk_sp<SkImageFilter> makeSpotLight(const SkSVGRenderContext&, 47 const SkSVGFilterContext&, 48 const SkSVGFeSpotLight*) const = 0; 49 50 SkColor resolveLightingColor(const SkSVGRenderContext&) const; 51 52 SkPoint3 resolveXYZ(const SkSVGRenderContext&, 53 const SkSVGFilterContext&, 54 SkSVGNumberType, 55 SkSVGNumberType, 56 SkSVGNumberType) const; 57 58 private: 59 using INHERITED = SkSVGFe; 60 }; 61 62 class SkSVGFeSpecularLighting final : public SkSVGFeLighting { 63 public: Make()64 static sk_sp<SkSVGFeSpecularLighting> Make() { 65 return sk_sp<SkSVGFeSpecularLighting>(new SkSVGFeSpecularLighting()); 66 } 67 68 SVG_ATTR(SpecularConstant, SkSVGNumberType, 1) 69 SVG_ATTR(SpecularExponent, SkSVGNumberType, 1) 70 71 protected: 72 bool parseAndSetAttribute(const char*, const char*) override; 73 74 sk_sp<SkImageFilter> makeDistantLight(const SkSVGRenderContext&, 75 const SkSVGFilterContext&, 76 const SkSVGFeDistantLight*) const final; 77 78 sk_sp<SkImageFilter> makePointLight(const SkSVGRenderContext&, 79 const SkSVGFilterContext&, 80 const SkSVGFePointLight*) const final; 81 82 sk_sp<SkImageFilter> makeSpotLight(const SkSVGRenderContext&, 83 const SkSVGFilterContext&, 84 const SkSVGFeSpotLight*) const final; 85 86 private: SkSVGFeSpecularLighting()87 SkSVGFeSpecularLighting() : INHERITED(SkSVGTag::kFeSpecularLighting) {} 88 89 using INHERITED = SkSVGFeLighting; 90 }; 91 92 class SkSVGFeDiffuseLighting final : public SkSVGFeLighting { 93 public: Make()94 static sk_sp<SkSVGFeDiffuseLighting> Make() { 95 return sk_sp<SkSVGFeDiffuseLighting>(new SkSVGFeDiffuseLighting()); 96 } 97 98 SVG_ATTR(DiffuseConstant, SkSVGNumberType, 1) 99 100 protected: 101 bool parseAndSetAttribute(const char*, const char*) override; 102 103 sk_sp<SkImageFilter> makeDistantLight(const SkSVGRenderContext&, 104 const SkSVGFilterContext&, 105 const SkSVGFeDistantLight*) const final; 106 107 sk_sp<SkImageFilter> makePointLight(const SkSVGRenderContext&, 108 const SkSVGFilterContext&, 109 const SkSVGFePointLight*) const final; 110 111 sk_sp<SkImageFilter> makeSpotLight(const SkSVGRenderContext&, 112 const SkSVGFilterContext&, 113 const SkSVGFeSpotLight*) const final; 114 115 private: SkSVGFeDiffuseLighting()116 SkSVGFeDiffuseLighting() : INHERITED(SkSVGTag::kFeDiffuseLighting) {} 117 118 using INHERITED = SkSVGFeLighting; 119 }; 120 121 #endif // SkSVGFeLighting_DEFINED 122