gecko-dev/dom/svg/SVGFEPointLightElement.cpp
Doug Thayer e79792a58a Bug 1417699 - Replace hash map with tagged union r=mstange
This replaces the hash map of attributes with a tagged union. In
this case, all filter attributes will be stored in line, with the
exception of some more complex attributes which have an internal
nsTArray of floats. This should help avoid all the hashing and
extra heap allocations.

Depends on D4899

Differential Revision: https://phabricator.services.mozilla.com/D4900

--HG--
extra : moz-landing-system : lando
2018-09-19 17:18:16 +00:00

95 lines
2.8 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/SVGFEPointLightElement.h"
#include "mozilla/dom/SVGFEPointLightElementBinding.h"
#include "nsSVGFilterInstance.h"
NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(FEPointLight)
using namespace mozilla::gfx;
namespace mozilla {
namespace dom {
JSObject*
SVGFEPointLightElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
{
return SVGFEPointLightElement_Binding::Wrap(aCx, this, aGivenProto);
}
nsSVGElement::NumberInfo SVGFEPointLightElement::sNumberInfo[3] =
{
{ &nsGkAtoms::x, 0, false },
{ &nsGkAtoms::y, 0, false },
{ &nsGkAtoms::z, 0, false }
};
//----------------------------------------------------------------------
// nsINode methods
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEPointLightElement)
//----------------------------------------------------------------------
// nsFEUnstyledElement methods
bool
SVGFEPointLightElement::AttributeAffectsRendering(int32_t aNameSpaceID,
nsAtom* aAttribute) const
{
return aNameSpaceID == kNameSpaceID_None &&
(aAttribute == nsGkAtoms::x ||
aAttribute == nsGkAtoms::y ||
aAttribute == nsGkAtoms::z);
}
//----------------------------------------------------------------------
LightType
SVGFEPointLightElement::ComputeLightAttributes(nsSVGFilterInstance* aInstance,
nsTArray<float>& aFloatAttributes)
{
Point3D lightPos;
GetAnimatedNumberValues(&lightPos.x, &lightPos.y, &lightPos.z, nullptr);
lightPos = aInstance->ConvertLocation(lightPos);
aFloatAttributes.SetLength(kPointLightNumAttributes);
aFloatAttributes[kPointLightPositionXIndex] = lightPos.x;
aFloatAttributes[kPointLightPositionYIndex] = lightPos.y;
aFloatAttributes[kPointLightPositionZIndex] = lightPos.z;
return LightType::Point;
}
already_AddRefed<SVGAnimatedNumber>
SVGFEPointLightElement::X()
{
return mNumberAttributes[ATTR_X].ToDOMAnimatedNumber(this);
}
already_AddRefed<SVGAnimatedNumber>
SVGFEPointLightElement::Y()
{
return mNumberAttributes[ATTR_Y].ToDOMAnimatedNumber(this);
}
already_AddRefed<SVGAnimatedNumber>
SVGFEPointLightElement::Z()
{
return mNumberAttributes[ATTR_Z].ToDOMAnimatedNumber(this);
}
//----------------------------------------------------------------------
// nsSVGElement methods
nsSVGElement::NumberAttributesInfo
SVGFEPointLightElement::GetNumberInfo()
{
return NumberAttributesInfo(mNumberAttributes, sNumberInfo,
ArrayLength(sNumberInfo));
}
} // namespace dom
} // namespace mozilla