1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/* -*- 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/SVGFEColorMatrixElement.h"
#include "DOMSVGAnimatedNumberList.h"
#include "mozilla/dom/BindContext.h"
#include "mozilla/dom/Document.h"
#include "mozilla/dom/SVGFEColorMatrixElementBinding.h"
#define NUM_ENTRIES_IN_4x5_MATRIX 20
NS_IMPL_NS_NEW_SVG_ELEMENT(FEColorMatrix)
using namespace mozilla::gfx;
namespace mozilla::dom {
JSObject* SVGFEColorMatrixElement::WrapNode(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) {
return SVGFEColorMatrixElement_Binding::Wrap(aCx, this, aGivenProto);
}
SVGEnumMapping SVGFEColorMatrixElement::sTypeMap[] = {
{nsGkAtoms::matrix, SVG_FECOLORMATRIX_TYPE_MATRIX},
{nsGkAtoms::saturate, SVG_FECOLORMATRIX_TYPE_SATURATE},
{nsGkAtoms::hueRotate, SVG_FECOLORMATRIX_TYPE_HUE_ROTATE},
{nsGkAtoms::luminanceToAlpha, SVG_FECOLORMATRIX_TYPE_LUMINANCE_TO_ALPHA},
{nullptr, 0}};
SVGElement::EnumInfo SVGFEColorMatrixElement::sEnumInfo[1] = {
{nsGkAtoms::type, sTypeMap, SVG_FECOLORMATRIX_TYPE_MATRIX}};
SVGElement::StringInfo SVGFEColorMatrixElement::sStringInfo[2] = {
{nsGkAtoms::result, kNameSpaceID_None, true},
{nsGkAtoms::in, kNameSpaceID_None, true}};
SVGElement::NumberListInfo SVGFEColorMatrixElement::sNumberListInfo[1] = {
{nsGkAtoms::values}};
//----------------------------------------------------------------------
// nsINode methods
NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGFEColorMatrixElement)
//----------------------------------------------------------------------
already_AddRefed<DOMSVGAnimatedString> SVGFEColorMatrixElement::In1() {
return mStringAttributes[IN1].ToDOMAnimatedString(this);
}
already_AddRefed<DOMSVGAnimatedEnumeration> SVGFEColorMatrixElement::Type() {
return mEnumAttributes[TYPE].ToDOMAnimatedEnum(this);
}
already_AddRefed<DOMSVGAnimatedNumberList> SVGFEColorMatrixElement::Values() {
return DOMSVGAnimatedNumberList::GetDOMWrapper(&mNumberListAttributes[VALUES],
this, VALUES);
}
void SVGFEColorMatrixElement::GetSourceImageNames(
nsTArray<SVGStringInfo>& aSources) {
aSources.AppendElement(SVGStringInfo(&mStringAttributes[IN1], this));
}
FilterPrimitiveDescription SVGFEColorMatrixElement::GetPrimitiveDescription(
SVGFilterInstance* aInstance, const IntRect& aFilterSubregion,
const nsTArray<bool>& aInputsAreTainted,
nsTArray<RefPtr<SourceSurface>>& aInputImages) {
uint32_t type = mEnumAttributes[TYPE].GetAnimValue();
const SVGNumberList& values = mNumberListAttributes[VALUES].GetAnimValue();
ColorMatrixAttributes atts;
if (!mNumberListAttributes[VALUES].IsExplicitlySet() &&
(type == SVG_FECOLORMATRIX_TYPE_MATRIX ||
type == SVG_FECOLORMATRIX_TYPE_SATURATE ||
type == SVG_FECOLORMATRIX_TYPE_HUE_ROTATE)) {
atts.mType = (uint32_t)SVG_FECOLORMATRIX_TYPE_MATRIX;
static const auto identityMatrix = std::array{
// clang-format off
1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0
// clang-format on
};
atts.mValues.AppendElements(Span(identityMatrix));
} else {
atts.mType = type;
if (values.Length()) {
atts.mValues.AppendElements(&values[0], values.Length());
}
}
return FilterPrimitiveDescription(AsVariant(std::move(atts)));
}
bool SVGFEColorMatrixElement::AttributeAffectsRendering(
int32_t aNameSpaceID, nsAtom* aAttribute) const {
return SVGFEColorMatrixElementBase::AttributeAffectsRendering(aNameSpaceID,
aAttribute) ||
(aNameSpaceID == kNameSpaceID_None &&
(aAttribute == nsGkAtoms::in || aAttribute == nsGkAtoms::type ||
aAttribute == nsGkAtoms::values));
}
nsresult SVGFEColorMatrixElement::BindToTree(BindContext& aCtx,
nsINode& aParent) {
if (aCtx.InComposedDoc()) {
aCtx.OwnerDoc().SetUseCounter(eUseCounter_custom_feColorMatrix);
}
return SVGFEColorMatrixElementBase::BindToTree(aCtx, aParent);
}
//----------------------------------------------------------------------
// SVGElement methods
SVGElement::EnumAttributesInfo SVGFEColorMatrixElement::GetEnumInfo() {
return EnumAttributesInfo(mEnumAttributes, sEnumInfo, std::size(sEnumInfo));
}
SVGElement::StringAttributesInfo SVGFEColorMatrixElement::GetStringInfo() {
return StringAttributesInfo(mStringAttributes, sStringInfo,
std::size(sStringInfo));
}
SVGElement::NumberListAttributesInfo
SVGFEColorMatrixElement::GetNumberListInfo() {
return NumberListAttributesInfo(mNumberListAttributes, sNumberListInfo,
std::size(sNumberListInfo));
}
} // namespace mozilla::dom
|