SVGFEBlendElement.cpp (4500B)
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/SVGFEBlendElement.h" 8 9 #include "mozilla/dom/BindContext.h" 10 #include "mozilla/dom/Document.h" 11 #include "mozilla/dom/SVGFEBlendElementBinding.h" 12 13 NS_IMPL_NS_NEW_SVG_ELEMENT(FEBlend) 14 15 using namespace mozilla::gfx; 16 17 namespace mozilla::dom { 18 19 JSObject* SVGFEBlendElement::WrapNode(JSContext* aCx, 20 JS::Handle<JSObject*> aGivenProto) { 21 return SVGFEBlendElement_Binding::Wrap(aCx, this, aGivenProto); 22 } 23 24 SVGEnumMapping SVGFEBlendElement::sModeMap[] = { 25 {nsGkAtoms::normal, SVG_FEBLEND_MODE_NORMAL}, 26 {nsGkAtoms::multiply, SVG_FEBLEND_MODE_MULTIPLY}, 27 {nsGkAtoms::screen, SVG_FEBLEND_MODE_SCREEN}, 28 {nsGkAtoms::darken, SVG_FEBLEND_MODE_DARKEN}, 29 {nsGkAtoms::lighten, SVG_FEBLEND_MODE_LIGHTEN}, 30 {nsGkAtoms::overlay, SVG_FEBLEND_MODE_OVERLAY}, 31 {nsGkAtoms::color_dodge, SVG_FEBLEND_MODE_COLOR_DODGE}, 32 {nsGkAtoms::color_burn, SVG_FEBLEND_MODE_COLOR_BURN}, 33 {nsGkAtoms::hardLight, SVG_FEBLEND_MODE_HARD_LIGHT}, 34 {nsGkAtoms::softLight, SVG_FEBLEND_MODE_SOFT_LIGHT}, 35 {nsGkAtoms::difference, SVG_FEBLEND_MODE_DIFFERENCE}, 36 {nsGkAtoms::exclusion, SVG_FEBLEND_MODE_EXCLUSION}, 37 {nsGkAtoms::hue, SVG_FEBLEND_MODE_HUE}, 38 {nsGkAtoms::saturation, SVG_FEBLEND_MODE_SATURATION}, 39 {nsGkAtoms::color, SVG_FEBLEND_MODE_COLOR}, 40 {nsGkAtoms::luminosity, SVG_FEBLEND_MODE_LUMINOSITY}, 41 {nullptr, 0}}; 42 43 SVGElement::EnumInfo SVGFEBlendElement::sEnumInfo[1] = { 44 {nsGkAtoms::mode, sModeMap, SVG_FEBLEND_MODE_NORMAL}}; 45 46 SVGElement::StringInfo SVGFEBlendElement::sStringInfo[3] = { 47 {nsGkAtoms::result, kNameSpaceID_None, true}, 48 {nsGkAtoms::in, kNameSpaceID_None, true}, 49 {nsGkAtoms::in2, kNameSpaceID_None, true}}; 50 51 //---------------------------------------------------------------------- 52 // nsINode methods 53 54 NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEBlendElement) 55 56 //---------------------------------------------------------------------- 57 // nsIDOMSVGFEBlendElement methods 58 59 already_AddRefed<DOMSVGAnimatedString> SVGFEBlendElement::In1() { 60 return mStringAttributes[IN1].ToDOMAnimatedString(this); 61 } 62 63 already_AddRefed<DOMSVGAnimatedString> SVGFEBlendElement::In2() { 64 return mStringAttributes[IN2].ToDOMAnimatedString(this); 65 } 66 67 already_AddRefed<DOMSVGAnimatedEnumeration> SVGFEBlendElement::Mode() { 68 return mEnumAttributes[MODE].ToDOMAnimatedEnum(this); 69 } 70 71 FilterPrimitiveDescription SVGFEBlendElement::GetPrimitiveDescription( 72 SVGFilterInstance* aInstance, const IntRect& aFilterSubregion, 73 const nsTArray<bool>& aInputsAreTainted, 74 nsTArray<RefPtr<SourceSurface>>& aInputImages) { 75 uint32_t mode = mEnumAttributes[MODE].GetAnimValue(); 76 BlendAttributes attributes; 77 attributes.mBlendMode = mode; 78 return FilterPrimitiveDescription(AsVariant(std::move(attributes))); 79 } 80 81 bool SVGFEBlendElement::AttributeAffectsRendering(int32_t aNameSpaceID, 82 nsAtom* aAttribute) const { 83 return SVGFEBlendElementBase::AttributeAffectsRendering(aNameSpaceID, 84 aAttribute) || 85 (aNameSpaceID == kNameSpaceID_None && 86 (aAttribute == nsGkAtoms::in || aAttribute == nsGkAtoms::in2 || 87 aAttribute == nsGkAtoms::mode)); 88 } 89 90 void SVGFEBlendElement::GetSourceImageNames(nsTArray<SVGStringInfo>& aSources) { 91 aSources.AppendElement(SVGStringInfo(&mStringAttributes[IN1], this)); 92 aSources.AppendElement(SVGStringInfo(&mStringAttributes[IN2], this)); 93 } 94 95 nsresult SVGFEBlendElement::BindToTree(BindContext& aCtx, nsINode& aParent) { 96 if (aCtx.InComposedDoc()) { 97 aCtx.OwnerDoc().SetUseCounter(eUseCounter_custom_feBlend); 98 } 99 100 return SVGFEBlendElementBase::BindToTree(aCtx, aParent); 101 } 102 103 //---------------------------------------------------------------------- 104 // SVGElement methods 105 106 SVGElement::EnumAttributesInfo SVGFEBlendElement::GetEnumInfo() { 107 return EnumAttributesInfo(mEnumAttributes, sEnumInfo, std::size(sEnumInfo)); 108 } 109 110 SVGElement::StringAttributesInfo SVGFEBlendElement::GetStringInfo() { 111 return StringAttributesInfo(mStringAttributes, sStringInfo, 112 std::size(sStringInfo)); 113 } 114 115 } // namespace mozilla::dom