SVGAnimatedOrient.h (5465B)
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 #ifndef DOM_SVG_SVGANIMATEDORIENT_H_ 8 #define DOM_SVG_SVGANIMATEDORIENT_H_ 9 10 #include "DOMSVGAnimatedEnumeration.h" 11 #include "SVGAnimatedEnumeration.h" 12 #include "mozilla/AlreadyAddRefed.h" 13 #include "mozilla/SMILAttr.h" 14 #include "mozilla/UniquePtr.h" 15 #include "mozilla/dom/SVGAngleBinding.h" 16 #include "mozilla/dom/SVGMarkerElementBinding.h" 17 #include "nsError.h" 18 19 class nsISupports; 20 21 namespace mozilla { 22 23 class SMILValue; 24 25 namespace dom { 26 class DOMSVGAngle; 27 class DOMSVGAnimatedAngle; 28 class SVGAnimationElement; 29 class SVGElement; 30 } // namespace dom 31 32 class SVGAnimatedOrient { 33 friend class AutoChangeOrientNotifier; 34 friend class dom::DOMSVGAngle; 35 friend class dom::DOMSVGAnimatedAngle; 36 using SVGElement = dom::SVGElement; 37 38 public: 39 void Init() { 40 mAnimVal = mBaseVal = .0f; 41 mAnimType = mBaseType = 42 dom::SVGMarkerElement_Binding::SVG_MARKER_ORIENT_ANGLE; 43 mAnimValUnit = mBaseValUnit = 44 dom::SVGAngle_Binding::SVG_ANGLETYPE_UNSPECIFIED; 45 mIsAnimated = false; 46 } 47 48 nsresult SetBaseValueString(const nsAString& aValue, SVGElement* aSVGElement, 49 bool aDoSetAttr); 50 void GetBaseValueString(nsAString& aValue) const; 51 void GetBaseAngleValueString(nsAString& aValue) const; 52 void GetAnimAngleValueString(nsAString& aValue) const; 53 54 float GetBaseValue() const { 55 return mBaseVal * GetDegreesPerUnit(mBaseValUnit); 56 } 57 float GetAnimValue() const { 58 return mAnimVal * GetDegreesPerUnit(mAnimValUnit); 59 } 60 SVGEnumValue GetAnimType() const { return mAnimType; } 61 62 void SetBaseValue(float aValue, uint8_t aUnit, SVGElement* aSVGElement, 63 bool aDoSetAttr); 64 void SetBaseType(SVGEnumValue aValue, SVGElement* aSVGElement, 65 ErrorResult& aRv); 66 void SetAnimValue(float aValue, uint8_t aUnit, SVGElement* aSVGElement); 67 void SetAnimType(SVGEnumValue aValue, SVGElement* aSVGElement); 68 69 uint8_t GetBaseValueUnit() const { return mBaseValUnit; } 70 uint8_t GetAnimValueUnit() const { return mAnimValUnit; } 71 float GetBaseValInSpecifiedUnits() const { return mBaseVal; } 72 float GetAnimValInSpecifiedUnits() const { return mAnimVal; } 73 74 static nsresult ToDOMSVGAngle(nsISupports** aResult); 75 already_AddRefed<dom::DOMSVGAnimatedAngle> ToDOMAnimatedAngle( 76 SVGElement* aSVGElement); 77 already_AddRefed<dom::DOMSVGAnimatedEnumeration> ToDOMAnimatedEnum( 78 SVGElement* aSVGElement); 79 UniquePtr<SMILAttr> ToSMILAttr(SVGElement* aSVGElement); 80 81 static bool IsValidUnitType(uint16_t aUnitType); 82 83 static bool GetValueFromString(const nsAString& aString, float& aValue, 84 uint16_t* aUnitType); 85 static float GetDegreesPerUnit(uint8_t aUnit); 86 87 private: 88 float mAnimVal; 89 float mBaseVal; 90 uint8_t mAnimType; 91 uint8_t mBaseType; 92 uint8_t mAnimValUnit; 93 uint8_t mBaseValUnit; 94 bool mIsAnimated; 95 96 void SetBaseValueInSpecifiedUnits(float aValue, SVGElement* aSVGElement); 97 void NewValueSpecifiedUnits(uint16_t aUnitType, float aValueInSpecifiedUnits, 98 SVGElement* aSVGElement); 99 void ConvertToSpecifiedUnits(uint16_t aUnitType, SVGElement* aSVGElement); 100 already_AddRefed<dom::DOMSVGAngle> ToDOMBaseVal(SVGElement* aSVGElement); 101 already_AddRefed<dom::DOMSVGAngle> ToDOMAnimVal(SVGElement* aSVGElement); 102 103 public: 104 // DOM wrapper class for the (DOM)SVGAnimatedEnumeration interface where the 105 // wrapped class is SVGAnimatedOrient. 106 struct DOMAnimatedEnum final : public dom::DOMSVGAnimatedEnumeration { 107 DOMAnimatedEnum(SVGAnimatedOrient* aVal, SVGElement* aSVGElement) 108 : DOMSVGAnimatedEnumeration(aSVGElement), mVal(aVal) {} 109 ~DOMAnimatedEnum(); 110 111 SVGAnimatedOrient* mVal; // kept alive because it belongs to content 112 113 using dom::DOMSVGAnimatedEnumeration::SetBaseVal; 114 uint16_t BaseVal() override { return mVal->mBaseType; } 115 void SetBaseVal(uint16_t aBaseVal, ErrorResult& aRv) override { 116 mVal->SetBaseType(aBaseVal, mSVGElement, aRv); 117 } 118 uint16_t AnimVal() override { 119 // Script may have modified animation parameters or timeline -- DOM 120 // getters need to flush any resample requests to reflect these 121 // modifications. 122 mSVGElement->FlushAnimations(); 123 return mVal->mAnimType; 124 } 125 }; 126 127 struct SMILOrient final : public SMILAttr { 128 public: 129 SMILOrient(SVGAnimatedOrient* aOrient, SVGElement* aSVGElement) 130 : mOrient(aOrient), mSVGElement(aSVGElement) {} 131 132 // These will stay alive because a SMILAttr only lives as long 133 // as the Compositing step, and DOM elements don't get a chance to 134 // die during that. 135 SVGAnimatedOrient* mOrient; 136 SVGElement* mSVGElement; 137 138 // SMILAttr methods 139 nsresult ValueFromString(const nsAString& aStr, 140 const dom::SVGAnimationElement* aSrcElement, 141 SMILValue& aValue, 142 bool& aPreventCachingOfSandwich) const override; 143 SMILValue GetBaseValue() const override; 144 void ClearAnimValue() override; 145 nsresult SetAnimValue(const SMILValue& aValue) override; 146 }; 147 }; 148 149 } // namespace mozilla 150 151 #endif // DOM_SVG_SVGANIMATEDORIENT_H_