DOMSVGAngle.cpp (4036B)
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 "DOMSVGAngle.h" 8 9 #include "SVGAnimatedOrient.h" 10 #include "mozilla/dom/SVGAngleBinding.h" 11 #include "mozilla/dom/SVGSVGElement.h" 12 13 namespace mozilla::dom { 14 15 NS_SVG_VAL_IMPL_CYCLE_COLLECTION_WRAPPERCACHED(DOMSVGAngle, mSVGElement) 16 17 DOMSVGAngle::DOMSVGAngle(SVGSVGElement* aSVGElement) 18 : mSVGElement(aSVGElement), mType(AngleType::CreatedValue) { 19 mVal = new SVGAnimatedOrient(); 20 mVal->Init(); 21 } 22 23 JSObject* DOMSVGAngle::WrapObject(JSContext* aCx, 24 JS::Handle<JSObject*> aGivenProto) { 25 return SVGAngle_Binding::Wrap(aCx, this, aGivenProto); 26 } 27 28 uint16_t DOMSVGAngle::UnitType() const { 29 uint16_t unitType; 30 if (mType == AngleType::AnimValue) { 31 mSVGElement->FlushAnimations(); 32 unitType = mVal->mAnimValUnit; 33 } else { 34 unitType = mVal->mBaseValUnit; 35 } 36 return SVGAnimatedOrient::IsValidUnitType(unitType) 37 ? unitType 38 : SVGAngle_Binding::SVG_ANGLETYPE_UNKNOWN; 39 } 40 41 float DOMSVGAngle::Value() const { 42 if (mType == AngleType::AnimValue) { 43 mSVGElement->FlushAnimations(); 44 return mVal->GetAnimValue(); 45 } 46 return mVal->GetBaseValue(); 47 } 48 49 void DOMSVGAngle::SetValue(float aValue, ErrorResult& aRv) { 50 if (mType == AngleType::AnimValue) { 51 aRv.ThrowNoModificationAllowedError("Animated values cannot be set"); 52 return; 53 } 54 bool isBaseVal = mType == AngleType::BaseValue; 55 mVal->SetBaseValue(aValue, mVal->mBaseValUnit, 56 isBaseVal ? mSVGElement.get() : nullptr, isBaseVal); 57 } 58 59 float DOMSVGAngle::ValueInSpecifiedUnits() const { 60 if (mType == AngleType::AnimValue) { 61 return mVal->mAnimVal; 62 } 63 return mVal->mBaseVal; 64 } 65 66 void DOMSVGAngle::SetValueInSpecifiedUnits(float aValue, ErrorResult& aRv) { 67 if (mType == AngleType::AnimValue) { 68 aRv.ThrowNoModificationAllowedError("Animated values cannot be set"); 69 return; 70 } 71 if (mType == AngleType::BaseValue) { 72 mVal->SetBaseValueInSpecifiedUnits(aValue, mSVGElement); 73 } else { 74 mVal->mBaseVal = aValue; 75 } 76 } 77 78 void DOMSVGAngle::NewValueSpecifiedUnits(uint16_t aUnitType, 79 float aValueInSpecifiedUnits, 80 ErrorResult& aRv) { 81 if (mType == AngleType::AnimValue) { 82 aRv.ThrowNoModificationAllowedError("Animated values cannot be set"); 83 return; 84 } 85 if (!SVGAnimatedOrient::IsValidUnitType(aUnitType)) { 86 aRv.ThrowNotSupportedError("Unknown unit type"); 87 return; 88 } 89 mVal->NewValueSpecifiedUnits( 90 aUnitType, aValueInSpecifiedUnits, 91 mType == AngleType::BaseValue ? mSVGElement.get() : nullptr); 92 } 93 94 void DOMSVGAngle::ConvertToSpecifiedUnits(uint16_t aUnitType, 95 ErrorResult& aRv) { 96 if (mType == AngleType::AnimValue) { 97 aRv.ThrowNoModificationAllowedError("Animated values cannot be set"); 98 return; 99 } 100 if (!SVGAnimatedOrient::IsValidUnitType(aUnitType)) { 101 aRv.ThrowNotSupportedError("Unknown unit type"); 102 return; 103 } 104 mVal->ConvertToSpecifiedUnits( 105 aUnitType, mType == AngleType::BaseValue ? mSVGElement.get() : nullptr); 106 } 107 108 void DOMSVGAngle::SetValueAsString(const nsAString& aValue, ErrorResult& aRv) { 109 if (mType == AngleType::AnimValue) { 110 aRv.ThrowNoModificationAllowedError("Animated values cannot be set"); 111 return; 112 } 113 bool isBaseVal = mType == AngleType::BaseValue; 114 aRv = mVal->SetBaseValueString( 115 aValue, isBaseVal ? mSVGElement.get() : nullptr, isBaseVal); 116 } 117 118 void DOMSVGAngle::GetValueAsString(nsAString& aValue) { 119 if (mType == AngleType::AnimValue) { 120 mSVGElement->FlushAnimations(); 121 mVal->GetAnimAngleValueString(aValue); 122 } else { 123 mVal->GetBaseAngleValueString(aValue); 124 } 125 } 126 127 } // namespace mozilla::dom