Line data Source code
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/SVGFEDropShadowElement.h"
8 : #include "mozilla/dom/SVGFEDropShadowElementBinding.h"
9 : #include "nsIFrame.h"
10 : #include "nsSVGFilterInstance.h"
11 :
12 0 : NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(FEDropShadow)
13 :
14 : using namespace mozilla::gfx;
15 :
16 : namespace mozilla {
17 : namespace dom {
18 :
19 : JSObject*
20 0 : SVGFEDropShadowElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
21 : {
22 0 : return SVGFEDropShadowElementBinding::Wrap(aCx, this, aGivenProto);
23 : }
24 :
25 : nsSVGElement::NumberInfo SVGFEDropShadowElement::sNumberInfo[2] =
26 : {
27 : { &nsGkAtoms::dx, 2, false },
28 : { &nsGkAtoms::dy, 2, false }
29 : };
30 :
31 : nsSVGElement::NumberPairInfo SVGFEDropShadowElement::sNumberPairInfo[1] =
32 : {
33 : { &nsGkAtoms::stdDeviation, 2, 2 }
34 : };
35 :
36 : nsSVGElement::StringInfo SVGFEDropShadowElement::sStringInfo[2] =
37 : {
38 : { &nsGkAtoms::result, kNameSpaceID_None, true },
39 : { &nsGkAtoms::in, kNameSpaceID_None, true }
40 : };
41 :
42 : //----------------------------------------------------------------------
43 : // nsIDOMNode methods
44 :
45 0 : NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEDropShadowElement)
46 :
47 : //----------------------------------------------------------------------
48 :
49 : already_AddRefed<SVGAnimatedString>
50 0 : SVGFEDropShadowElement::In1()
51 : {
52 0 : return mStringAttributes[IN1].ToDOMAnimatedString(this);
53 : }
54 :
55 : already_AddRefed<SVGAnimatedNumber>
56 0 : SVGFEDropShadowElement::Dx()
57 : {
58 0 : return mNumberAttributes[DX].ToDOMAnimatedNumber(this);
59 : }
60 :
61 : already_AddRefed<SVGAnimatedNumber>
62 0 : SVGFEDropShadowElement::Dy()
63 : {
64 0 : return mNumberAttributes[DY].ToDOMAnimatedNumber(this);
65 : }
66 :
67 : already_AddRefed<SVGAnimatedNumber>
68 0 : SVGFEDropShadowElement::StdDeviationX()
69 : {
70 0 : return mNumberPairAttributes[STD_DEV].ToDOMAnimatedNumber(nsSVGNumberPair::eFirst, this);
71 : }
72 :
73 : already_AddRefed<SVGAnimatedNumber>
74 0 : SVGFEDropShadowElement::StdDeviationY()
75 : {
76 0 : return mNumberPairAttributes[STD_DEV].ToDOMAnimatedNumber(nsSVGNumberPair::eSecond, this);
77 : }
78 :
79 : void
80 0 : SVGFEDropShadowElement::SetStdDeviation(float stdDeviationX, float stdDeviationY)
81 : {
82 0 : mNumberPairAttributes[STD_DEV].SetBaseValues(stdDeviationX, stdDeviationY, this);
83 0 : }
84 :
85 : FilterPrimitiveDescription
86 0 : SVGFEDropShadowElement::GetPrimitiveDescription(nsSVGFilterInstance* aInstance,
87 : const IntRect& aFilterSubregion,
88 : const nsTArray<bool>& aInputsAreTainted,
89 : nsTArray<RefPtr<SourceSurface>>& aInputImages)
90 : {
91 : float stdX = aInstance->GetPrimitiveNumber(SVGContentUtils::X,
92 0 : &mNumberPairAttributes[STD_DEV],
93 0 : nsSVGNumberPair::eFirst);
94 : float stdY = aInstance->GetPrimitiveNumber(SVGContentUtils::Y,
95 0 : &mNumberPairAttributes[STD_DEV],
96 0 : nsSVGNumberPair::eSecond);
97 0 : if (stdX < 0 || stdY < 0) {
98 0 : return FilterPrimitiveDescription(PrimitiveType::Empty);
99 : }
100 :
101 0 : IntPoint offset(int32_t(aInstance->GetPrimitiveNumber(
102 0 : SVGContentUtils::X, &mNumberAttributes[DX])),
103 0 : int32_t(aInstance->GetPrimitiveNumber(
104 0 : SVGContentUtils::Y, &mNumberAttributes[DY])));
105 :
106 0 : FilterPrimitiveDescription descr(PrimitiveType::DropShadow);
107 0 : descr.Attributes().Set(eDropShadowStdDeviation, Size(stdX, stdY));
108 0 : descr.Attributes().Set(eDropShadowOffset, offset);
109 :
110 0 : nsIFrame* frame = GetPrimaryFrame();
111 0 : if (frame) {
112 0 : nsStyleContext* style = frame->StyleContext();
113 0 : Color color(Color::FromABGR(style->StyleSVGReset()->mFloodColor));
114 0 : color.a *= style->StyleSVGReset()->mFloodOpacity;
115 0 : descr.Attributes().Set(eDropShadowColor, color);
116 : } else {
117 0 : descr.Attributes().Set(eDropShadowColor, Color());
118 : }
119 0 : return descr;
120 : }
121 :
122 : bool
123 0 : SVGFEDropShadowElement::AttributeAffectsRendering(int32_t aNameSpaceID,
124 : nsIAtom* aAttribute) const
125 : {
126 0 : return SVGFEDropShadowElementBase::AttributeAffectsRendering(aNameSpaceID, aAttribute) ||
127 0 : (aNameSpaceID == kNameSpaceID_None &&
128 0 : (aAttribute == nsGkAtoms::in ||
129 0 : aAttribute == nsGkAtoms::stdDeviation ||
130 0 : aAttribute == nsGkAtoms::dx ||
131 0 : aAttribute == nsGkAtoms::dy));
132 : }
133 :
134 : void
135 0 : SVGFEDropShadowElement::GetSourceImageNames(nsTArray<nsSVGStringInfo>& aSources)
136 : {
137 0 : aSources.AppendElement(nsSVGStringInfo(&mStringAttributes[IN1], this));
138 0 : }
139 :
140 : //----------------------------------------------------------------------
141 : // nsIContent methods
142 :
143 : NS_IMETHODIMP_(bool)
144 0 : SVGFEDropShadowElement::IsAttributeMapped(const nsIAtom* name) const
145 : {
146 : static const MappedAttributeEntry* const map[] = {
147 : sFEFloodMap
148 : };
149 :
150 0 : return FindAttributeDependence(name, map) ||
151 0 : SVGFEDropShadowElementBase::IsAttributeMapped(name);
152 : }
153 :
154 : //----------------------------------------------------------------------
155 : // nsSVGElement methods
156 :
157 : nsSVGElement::NumberAttributesInfo
158 0 : SVGFEDropShadowElement::GetNumberInfo()
159 : {
160 : return NumberAttributesInfo(mNumberAttributes, sNumberInfo,
161 0 : ArrayLength(sNumberInfo));
162 : }
163 :
164 : nsSVGElement::NumberPairAttributesInfo
165 0 : SVGFEDropShadowElement::GetNumberPairInfo()
166 : {
167 : return NumberPairAttributesInfo(mNumberPairAttributes, sNumberPairInfo,
168 0 : ArrayLength(sNumberPairInfo));
169 : }
170 :
171 : nsSVGElement::StringAttributesInfo
172 0 : SVGFEDropShadowElement::GetStringInfo()
173 : {
174 : return StringAttributesInfo(mStringAttributes, sStringInfo,
175 0 : ArrayLength(sStringInfo));
176 : }
177 :
178 : } // namespace dom
179 : } // namespace mozilla
|