tor-browser

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

SVGTextPathElement.cpp (4677B)


      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/SVGTextPathElement.h"
      8 
      9 #include "SVGElement.h"
     10 #include "mozilla/dom/SVGLengthBinding.h"
     11 #include "mozilla/dom/SVGTextContentElementBinding.h"
     12 #include "mozilla/dom/SVGTextPathElementBinding.h"
     13 #include "nsError.h"
     14 #include "nsGkAtoms.h"
     15 
     16 NS_IMPL_NS_NEW_SVG_ELEMENT(TextPath)
     17 
     18 namespace mozilla::dom {
     19 
     20 using namespace SVGTextContentElement_Binding;
     21 using namespace SVGTextPathElement_Binding;
     22 
     23 class DOMSVGAnimatedLength;
     24 
     25 JSObject* SVGTextPathElement::WrapNode(JSContext* aCx,
     26                                       JS::Handle<JSObject*> aGivenProto) {
     27  return SVGTextPathElement_Binding::Wrap(aCx, this, aGivenProto);
     28 }
     29 
     30 SVGElement::LengthInfo SVGTextPathElement::sLengthInfo[2] = {
     31    // from SVGTextContentElement:
     32    {nsGkAtoms::textLength, 0, SVGLength_Binding::SVG_LENGTHTYPE_NUMBER,
     33     SVGContentUtils::XY},
     34    // from SVGTextPathElement:
     35    {nsGkAtoms::startOffset, 0, SVGLength_Binding::SVG_LENGTHTYPE_NUMBER,
     36     SVGContentUtils::X}};
     37 
     38 SVGEnumMapping SVGTextPathElement::sMethodMap[] = {
     39    {nsGkAtoms::align, TEXTPATH_METHODTYPE_ALIGN},
     40    {nsGkAtoms::stretch, TEXTPATH_METHODTYPE_STRETCH},
     41    {nullptr, 0}};
     42 
     43 SVGEnumMapping SVGTextPathElement::sSpacingMap[] = {
     44    {nsGkAtoms::_auto, TEXTPATH_SPACINGTYPE_AUTO},
     45    {nsGkAtoms::exact, TEXTPATH_SPACINGTYPE_EXACT},
     46    {nullptr, 0}};
     47 
     48 SVGEnumMapping SVGTextPathElement::sSideMap[] = {
     49    {nsGkAtoms::left, TEXTPATH_SIDETYPE_LEFT},
     50    {nsGkAtoms::right, TEXTPATH_SIDETYPE_RIGHT},
     51    {nullptr, 0}};
     52 
     53 SVGElement::EnumInfo SVGTextPathElement::sEnumInfo[4] = {
     54    // from SVGTextContentElement:
     55    {nsGkAtoms::lengthAdjust, sLengthAdjustMap, LENGTHADJUST_SPACING},
     56    // from SVGTextPathElement:
     57    {nsGkAtoms::method, sMethodMap, TEXTPATH_METHODTYPE_ALIGN},
     58    {nsGkAtoms::spacing, sSpacingMap, TEXTPATH_SPACINGTYPE_EXACT},
     59    {nsGkAtoms::side, sSideMap, TEXTPATH_SIDETYPE_LEFT}};
     60 
     61 SVGElement::StringInfo SVGTextPathElement::sStringInfo[2] = {
     62    {nsGkAtoms::href, kNameSpaceID_None, true},
     63    {nsGkAtoms::href, kNameSpaceID_XLink, true}};
     64 
     65 //----------------------------------------------------------------------
     66 // Implementation
     67 
     68 SVGTextPathElement::SVGTextPathElement(
     69    already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo)
     70    : SVGTextPathElementBase(std::move(aNodeInfo)) {}
     71 
     72 void SVGTextPathElement::HrefAsString(nsAString& aHref) {
     73  if (mStringAttributes[SVGTextPathElement::HREF].IsExplicitlySet()) {
     74    mStringAttributes[SVGTextPathElement::HREF].GetAnimValue(aHref, this);
     75  } else {
     76    mStringAttributes[SVGTextPathElement::XLINK_HREF].GetAnimValue(aHref, this);
     77  }
     78 }
     79 
     80 //----------------------------------------------------------------------
     81 // nsINode methods
     82 
     83 NS_IMPL_ELEMENT_CLONE_WITH_INIT(SVGTextPathElement)
     84 
     85 already_AddRefed<DOMSVGAnimatedString> SVGTextPathElement::Href() {
     86  return mStringAttributes[HREF].IsExplicitlySet() ||
     87                 !mStringAttributes[XLINK_HREF].IsExplicitlySet()
     88             ? mStringAttributes[HREF].ToDOMAnimatedString(this)
     89             : mStringAttributes[XLINK_HREF].ToDOMAnimatedString(this);
     90 }
     91 
     92 //----------------------------------------------------------------------
     93 
     94 already_AddRefed<DOMSVGAnimatedLength> SVGTextPathElement::StartOffset() {
     95  return mLengthAttributes[STARTOFFSET].ToDOMAnimatedLength(this);
     96 }
     97 
     98 already_AddRefed<DOMSVGAnimatedEnumeration> SVGTextPathElement::Method() {
     99  return mEnumAttributes[METHOD].ToDOMAnimatedEnum(this);
    100 }
    101 
    102 already_AddRefed<DOMSVGAnimatedEnumeration> SVGTextPathElement::Spacing() {
    103  return mEnumAttributes[SPACING].ToDOMAnimatedEnum(this);
    104 }
    105 
    106 already_AddRefed<DOMSVGAnimatedEnumeration> SVGTextPathElement::Side() {
    107  return mEnumAttributes[SIDE].ToDOMAnimatedEnum(this);
    108 }
    109 
    110 //----------------------------------------------------------------------
    111 // SVGElement overrides
    112 
    113 SVGElement::LengthAttributesInfo SVGTextPathElement::GetLengthInfo() {
    114  return LengthAttributesInfo(mLengthAttributes, sLengthInfo,
    115                              std::size(sLengthInfo));
    116 }
    117 
    118 SVGElement::EnumAttributesInfo SVGTextPathElement::GetEnumInfo() {
    119  return EnumAttributesInfo(mEnumAttributes, sEnumInfo, std::size(sEnumInfo));
    120 }
    121 
    122 SVGElement::StringAttributesInfo SVGTextPathElement::GetStringInfo() {
    123  return StringAttributesInfo(mStringAttributes, sStringInfo,
    124                              std::size(sStringInfo));
    125 }
    126 
    127 }  // namespace mozilla::dom