/src/mozilla-central/dom/svg/SVGMotionSMILAnimationFunction.h
Line | Count | Source (jump to first uncovered line) |
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 MOZILLA_SVGMOTIONSMILANIMATIONFUNCTION_H_ |
8 | | #define MOZILLA_SVGMOTIONSMILANIMATIONFUNCTION_H_ |
9 | | |
10 | | #include "mozilla/gfx/2D.h" |
11 | | #include "mozilla/RefPtr.h" |
12 | | #include "nsSMILAnimationFunction.h" |
13 | | #include "nsTArray.h" |
14 | | #include "SVGMotionSMILType.h" // for RotateType |
15 | | |
16 | | class nsAttrValue; |
17 | | class nsAtom; |
18 | | class nsIContent; |
19 | | class nsISMILAttr; |
20 | | class nsSMILValue; |
21 | | |
22 | | namespace mozilla { |
23 | | |
24 | | namespace dom { |
25 | | class SVGMPathElement; |
26 | | } // namespace dom |
27 | | |
28 | | //---------------------------------------------------------------------- |
29 | | // SVGMotionSMILAnimationFunction |
30 | | // |
31 | | // Subclass of nsSMILAnimationFunction to support a few extra features offered |
32 | | // by the <animateMotion> element. |
33 | | // |
34 | | class SVGMotionSMILAnimationFunction final : public nsSMILAnimationFunction |
35 | | { |
36 | | typedef mozilla::gfx::Path Path; |
37 | | |
38 | | public: |
39 | | SVGMotionSMILAnimationFunction(); |
40 | | virtual bool SetAttr(nsAtom* aAttribute, |
41 | | const nsAString& aValue, |
42 | | nsAttrValue& aResult, |
43 | | nsresult* aParseResult = nullptr) override; |
44 | | virtual bool UnsetAttr(nsAtom* aAttribute) override; |
45 | | |
46 | | // Method to allow our owner-element to signal us when our <mpath> |
47 | | // has changed or been added/removed. When that happens, we need to |
48 | | // mark ourselves as changed so we'll get recomposed, and mark our path data |
49 | | // as stale so it'll get regenerated (regardless of mPathSourceType, since |
50 | | // <mpath> trumps all the other sources of path data) |
51 | 0 | void MpathChanged() { mIsPathStale = mHasChanged = true; } |
52 | | |
53 | | protected: |
54 | | enum PathSourceType { |
55 | | // NOTE: Ordering matters here. Higher-priority path-descriptors should |
56 | | // have higher enumerated values |
57 | | ePathSourceType_None, // uninitialized or not applicable |
58 | | ePathSourceType_ByAttr, // by or from-by animation |
59 | | ePathSourceType_ToAttr, // to or from-to animation |
60 | | ePathSourceType_ValuesAttr, |
61 | | ePathSourceType_PathAttr, |
62 | | ePathSourceType_Mpath |
63 | | }; |
64 | | |
65 | | virtual nsSMILCalcMode GetCalcMode() const override; |
66 | | virtual nsresult GetValues(const nsISMILAttr& aSMILAttr, |
67 | | nsSMILValueArray& aResult) override; |
68 | | virtual void CheckValueListDependentAttrs(uint32_t aNumValues) override; |
69 | | |
70 | | virtual bool IsToAnimation() const override; |
71 | | |
72 | | void CheckKeyPoints(); |
73 | | nsresult SetKeyPoints(const nsAString& aKeyPoints, nsAttrValue& aResult); |
74 | | void UnsetKeyPoints(); |
75 | | nsresult SetRotate(const nsAString& aRotate, nsAttrValue& aResult); |
76 | | void UnsetRotate(); |
77 | | |
78 | | // Helpers for GetValues |
79 | | void MarkStaleIfAttributeAffectsPath(nsAtom* aAttribute); |
80 | | void RebuildPathAndVertices(const nsIContent* aContextElem); |
81 | | void RebuildPathAndVerticesFromMpathElem(dom::SVGMPathElement* aMpathElem); |
82 | | void RebuildPathAndVerticesFromPathAttr(); |
83 | | void RebuildPathAndVerticesFromBasicAttrs(const nsIContent* aContextElem); |
84 | | bool GenerateValuesForPathAndPoints(Path* aPath, |
85 | | bool aIsKeyPoints, |
86 | | FallibleTArray<double>& aPointDistances, |
87 | | nsSMILValueArray& aResult); |
88 | | |
89 | | // Members |
90 | | // ------- |
91 | | FallibleTArray<double> mKeyPoints; // parsed from "keyPoints" attribute. |
92 | | |
93 | | RotateType mRotateType; // auto, auto-reverse, or explicit. |
94 | | float mRotateAngle; // the angle value, if explicit. |
95 | | |
96 | | PathSourceType mPathSourceType; // source of our Path. |
97 | | RefPtr<Path> mPath; // representation of motion path. |
98 | | FallibleTArray<double> mPathVertices; // distances of vertices along path. |
99 | | |
100 | | bool mIsPathStale; |
101 | | }; |
102 | | |
103 | | } // namespace mozilla |
104 | | |
105 | | #endif // MOZILLA_SVGMOTIONSMILANIMATIONFUNCTION_H_ |