SVGFESpotLightElement.cpp (4729B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "mozilla/dom/SVGFESpotLightElement.h" 8 9 #include "mozilla/SVGFilterInstance.h" 10 #include "mozilla/dom/SVGFESpotLightElementBinding.h" 11 12 NS_IMPL_NS_NEW_SVG_ELEMENT(FESpotLight) 13 14 using namespace mozilla::gfx; 15 16 namespace mozilla::dom { 17 18 JSObject* SVGFESpotLightElement::WrapNode(JSContext* aCx, 19 JS::Handle<JSObject*> aGivenProto) { 20 return SVGFESpotLightElement_Binding::Wrap(aCx, this, aGivenProto); 21 } 22 23 SVGElement::NumberInfo SVGFESpotLightElement::sNumberInfo[8] = { 24 {nsGkAtoms::x, 0}, 25 {nsGkAtoms::y, 0}, 26 {nsGkAtoms::z, 0}, 27 {nsGkAtoms::pointsAtX, 0}, 28 {nsGkAtoms::pointsAtY, 0}, 29 {nsGkAtoms::pointsAtZ, 0}, 30 {nsGkAtoms::specularExponent, 1}, 31 {nsGkAtoms::limitingConeAngle, 0}}; 32 33 //---------------------------------------------------------------------- 34 // nsINode methods 35 36 NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFESpotLightElement) 37 38 //---------------------------------------------------------------------- 39 // SVGFilterPrimitiveChildElement methods 40 41 bool SVGFESpotLightElement::AttributeAffectsRendering( 42 int32_t aNameSpaceID, nsAtom* aAttribute) const { 43 return aNameSpaceID == kNameSpaceID_None && 44 (aAttribute == nsGkAtoms::x || aAttribute == nsGkAtoms::y || 45 aAttribute == nsGkAtoms::z || aAttribute == nsGkAtoms::pointsAtX || 46 aAttribute == nsGkAtoms::pointsAtY || 47 aAttribute == nsGkAtoms::pointsAtZ || 48 aAttribute == nsGkAtoms::specularExponent || 49 aAttribute == nsGkAtoms::limitingConeAngle); 50 } 51 52 //---------------------------------------------------------------------- 53 54 LightType SVGFESpotLightElement::ComputeLightAttributes( 55 SVGFilterInstance* aInstance, nsTArray<float>& aFloatAttributes) { 56 aFloatAttributes.SetLength(kSpotLightNumAttributes); 57 Point3D lightPos, lightPointsAt; 58 float limitingConeAngle; 59 60 GetAnimatedNumberValues(&lightPos.x, &lightPos.y, &lightPos.z, 61 &lightPointsAt.x, &lightPointsAt.y, &lightPointsAt.z, 62 &aFloatAttributes[kSpotLightFocusIndex], 63 &limitingConeAngle, nullptr); 64 65 lightPos = aInstance->ConvertLocation(lightPos); 66 lightPointsAt = aInstance->ConvertLocation(lightPointsAt); 67 aFloatAttributes[kSpotLightPositionXIndex] = lightPos.x; 68 aFloatAttributes[kSpotLightPositionYIndex] = lightPos.y; 69 aFloatAttributes[kSpotLightPositionZIndex] = lightPos.z; 70 aFloatAttributes[kSpotLightPointsAtXIndex] = lightPointsAt.x; 71 aFloatAttributes[kSpotLightPointsAtYIndex] = lightPointsAt.y; 72 aFloatAttributes[kSpotLightPointsAtZIndex] = lightPointsAt.z; 73 74 if (mNumberAttributes[SVGFESpotLightElement::LIMITING_CONE_ANGLE] 75 .IsExplicitlySet()) { 76 limitingConeAngle = std::clamp(limitingConeAngle, -90.0f, 90.0f); 77 } else { 78 limitingConeAngle = 90.0f; 79 } 80 81 aFloatAttributes[kSpotLightLimitingConeAngleIndex] = limitingConeAngle; 82 83 return LightType::Spot; 84 } 85 86 already_AddRefed<DOMSVGAnimatedNumber> SVGFESpotLightElement::X() { 87 return mNumberAttributes[ATTR_X].ToDOMAnimatedNumber(this); 88 } 89 90 already_AddRefed<DOMSVGAnimatedNumber> SVGFESpotLightElement::Y() { 91 return mNumberAttributes[ATTR_Y].ToDOMAnimatedNumber(this); 92 } 93 94 already_AddRefed<DOMSVGAnimatedNumber> SVGFESpotLightElement::Z() { 95 return mNumberAttributes[ATTR_Z].ToDOMAnimatedNumber(this); 96 } 97 98 already_AddRefed<DOMSVGAnimatedNumber> SVGFESpotLightElement::PointsAtX() { 99 return mNumberAttributes[POINTS_AT_X].ToDOMAnimatedNumber(this); 100 } 101 102 already_AddRefed<DOMSVGAnimatedNumber> SVGFESpotLightElement::PointsAtY() { 103 return mNumberAttributes[POINTS_AT_Y].ToDOMAnimatedNumber(this); 104 } 105 106 already_AddRefed<DOMSVGAnimatedNumber> SVGFESpotLightElement::PointsAtZ() { 107 return mNumberAttributes[POINTS_AT_Z].ToDOMAnimatedNumber(this); 108 } 109 110 already_AddRefed<DOMSVGAnimatedNumber> 111 SVGFESpotLightElement::SpecularExponent() { 112 return mNumberAttributes[SPECULAR_EXPONENT].ToDOMAnimatedNumber(this); 113 } 114 115 already_AddRefed<DOMSVGAnimatedNumber> 116 SVGFESpotLightElement::LimitingConeAngle() { 117 return mNumberAttributes[LIMITING_CONE_ANGLE].ToDOMAnimatedNumber(this); 118 } 119 120 //---------------------------------------------------------------------- 121 // SVGElement methods 122 123 SVGElement::NumberAttributesInfo SVGFESpotLightElement::GetNumberInfo() { 124 return NumberAttributesInfo(mNumberAttributes, sNumberInfo, 125 std::size(sNumberInfo)); 126 } 127 128 } // namespace mozilla::dom