tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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