tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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