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 "DOMSVGAnimatedNumberList.h"
8 : #include "mozilla/dom/SVGFEColorMatrixElement.h"
9 : #include "mozilla/dom/SVGFEColorMatrixElementBinding.h"
10 : #include "nsSVGUtils.h"
11 :
12 : #define NUM_ENTRIES_IN_4x5_MATRIX 20
13 :
14 0 : NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(FEColorMatrix)
15 :
16 : using namespace mozilla::gfx;
17 :
18 : namespace mozilla {
19 : namespace dom {
20 :
21 : JSObject*
22 0 : SVGFEColorMatrixElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
23 : {
24 0 : return SVGFEColorMatrixElementBinding::Wrap(aCx, this, aGivenProto);
25 : }
26 :
27 : nsSVGEnumMapping SVGFEColorMatrixElement::sTypeMap[] = {
28 : {&nsGkAtoms::matrix, SVG_FECOLORMATRIX_TYPE_MATRIX},
29 : {&nsGkAtoms::saturate, SVG_FECOLORMATRIX_TYPE_SATURATE},
30 : {&nsGkAtoms::hueRotate, SVG_FECOLORMATRIX_TYPE_HUE_ROTATE},
31 : {&nsGkAtoms::luminanceToAlpha, SVG_FECOLORMATRIX_TYPE_LUMINANCE_TO_ALPHA},
32 : {nullptr, 0}
33 : };
34 :
35 : nsSVGElement::EnumInfo SVGFEColorMatrixElement::sEnumInfo[1] =
36 : {
37 : { &nsGkAtoms::type,
38 : sTypeMap,
39 : SVG_FECOLORMATRIX_TYPE_MATRIX
40 : }
41 : };
42 :
43 : nsSVGElement::StringInfo SVGFEColorMatrixElement::sStringInfo[2] =
44 : {
45 : { &nsGkAtoms::result, kNameSpaceID_None, true },
46 : { &nsGkAtoms::in, kNameSpaceID_None, true }
47 : };
48 :
49 : nsSVGElement::NumberListInfo SVGFEColorMatrixElement::sNumberListInfo[1] =
50 : {
51 : { &nsGkAtoms::values }
52 : };
53 :
54 : //----------------------------------------------------------------------
55 : // nsIDOMNode methods
56 :
57 :
58 0 : NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEColorMatrixElement)
59 :
60 :
61 : //----------------------------------------------------------------------
62 :
63 : already_AddRefed<SVGAnimatedString>
64 0 : SVGFEColorMatrixElement::In1()
65 : {
66 0 : return mStringAttributes[IN1].ToDOMAnimatedString(this);
67 : }
68 :
69 : already_AddRefed<SVGAnimatedEnumeration>
70 0 : SVGFEColorMatrixElement::Type()
71 : {
72 0 : return mEnumAttributes[TYPE].ToDOMAnimatedEnum(this);
73 : }
74 :
75 : already_AddRefed<DOMSVGAnimatedNumberList>
76 0 : SVGFEColorMatrixElement::Values()
77 : {
78 : return DOMSVGAnimatedNumberList::GetDOMWrapper(&mNumberListAttributes[VALUES],
79 0 : this, VALUES);
80 : }
81 :
82 : void
83 0 : SVGFEColorMatrixElement::GetSourceImageNames(nsTArray<nsSVGStringInfo>& aSources)
84 : {
85 0 : aSources.AppendElement(nsSVGStringInfo(&mStringAttributes[IN1], this));
86 0 : }
87 :
88 : FilterPrimitiveDescription
89 0 : SVGFEColorMatrixElement::GetPrimitiveDescription(nsSVGFilterInstance* aInstance,
90 : const IntRect& aFilterSubregion,
91 : const nsTArray<bool>& aInputsAreTainted,
92 : nsTArray<RefPtr<SourceSurface>>& aInputImages)
93 : {
94 0 : uint32_t type = mEnumAttributes[TYPE].GetAnimValue();
95 0 : const SVGNumberList &values = mNumberListAttributes[VALUES].GetAnimValue();
96 :
97 0 : FilterPrimitiveDescription descr(PrimitiveType::ColorMatrix);
98 0 : if (!mNumberListAttributes[VALUES].IsExplicitlySet() &&
99 0 : (type == SVG_FECOLORMATRIX_TYPE_MATRIX ||
100 0 : type == SVG_FECOLORMATRIX_TYPE_SATURATE ||
101 : type == SVG_FECOLORMATRIX_TYPE_HUE_ROTATE)) {
102 0 : descr.Attributes().Set(eColorMatrixType, (uint32_t)SVG_FECOLORMATRIX_TYPE_MATRIX);
103 : static const float identityMatrix[] =
104 : { 1, 0, 0, 0, 0,
105 : 0, 1, 0, 0, 0,
106 : 0, 0, 1, 0, 0,
107 : 0, 0, 0, 1, 0 };
108 0 : descr.Attributes().Set(eColorMatrixValues, identityMatrix, 20);
109 : } else {
110 0 : descr.Attributes().Set(eColorMatrixType, type);
111 0 : if (values.Length()) {
112 0 : descr.Attributes().Set(eColorMatrixValues, &values[0], values.Length());
113 : } else {
114 0 : descr.Attributes().Set(eColorMatrixValues, nullptr, 0);
115 : }
116 : }
117 0 : return descr;
118 : }
119 :
120 : bool
121 0 : SVGFEColorMatrixElement::AttributeAffectsRendering(int32_t aNameSpaceID,
122 : nsIAtom* aAttribute) const
123 : {
124 0 : return SVGFEColorMatrixElementBase::AttributeAffectsRendering(aNameSpaceID, aAttribute) ||
125 0 : (aNameSpaceID == kNameSpaceID_None &&
126 0 : (aAttribute == nsGkAtoms::in ||
127 0 : aAttribute == nsGkAtoms::type ||
128 0 : aAttribute == nsGkAtoms::values));
129 : }
130 :
131 : //----------------------------------------------------------------------
132 : // nsSVGElement methods
133 :
134 : nsSVGElement::EnumAttributesInfo
135 0 : SVGFEColorMatrixElement::GetEnumInfo()
136 : {
137 : return EnumAttributesInfo(mEnumAttributes, sEnumInfo,
138 0 : ArrayLength(sEnumInfo));
139 : }
140 :
141 : nsSVGElement::StringAttributesInfo
142 0 : SVGFEColorMatrixElement::GetStringInfo()
143 : {
144 : return StringAttributesInfo(mStringAttributes, sStringInfo,
145 0 : ArrayLength(sStringInfo));
146 : }
147 :
148 : nsSVGElement::NumberListAttributesInfo
149 0 : SVGFEColorMatrixElement::GetNumberListInfo()
150 : {
151 : return NumberListAttributesInfo(mNumberListAttributes, sNumberListInfo,
152 0 : ArrayLength(sNumberListInfo));
153 : }
154 :
155 : } // namespace dom
156 : } // namespace mozilla
|