diff options
Diffstat (limited to 'dom/svg/SVGMotionSMILAnimationFunction.h')
-rw-r--r-- | dom/svg/SVGMotionSMILAnimationFunction.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/dom/svg/SVGMotionSMILAnimationFunction.h b/dom/svg/SVGMotionSMILAnimationFunction.h new file mode 100644 index 000000000..a9855b372 --- /dev/null +++ b/dom/svg/SVGMotionSMILAnimationFunction.h @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_SVGMOTIONSMILANIMATIONFUNCTION_H_ +#define MOZILLA_SVGMOTIONSMILANIMATIONFUNCTION_H_ + +#include "mozilla/gfx/2D.h" +#include "mozilla/RefPtr.h" +#include "nsSMILAnimationFunction.h" +#include "nsTArray.h" +#include "SVGMotionSMILType.h" // for RotateType + +class nsAttrValue; +class nsIAtom; +class nsIContent; +class nsISMILAttr; +class nsSMILValue; + +namespace mozilla { + +namespace dom { +class SVGMPathElement; +} // namespace dom + +//---------------------------------------------------------------------- +// SVGMotionSMILAnimationFunction +// +// Subclass of nsSMILAnimationFunction to support a few extra features offered +// by the <animateMotion> element. +// +class SVGMotionSMILAnimationFunction final : public nsSMILAnimationFunction +{ + typedef mozilla::gfx::Path Path; + +public: + SVGMotionSMILAnimationFunction(); + virtual bool SetAttr(nsIAtom* aAttribute, + const nsAString& aValue, + nsAttrValue& aResult, + nsresult* aParseResult = nullptr) override; + virtual bool UnsetAttr(nsIAtom* aAttribute) override; + + // Method to allow our owner-element to signal us when our <mpath> + // has changed or been added/removed. When that happens, we need to + // mark ourselves as changed so we'll get recomposed, and mark our path data + // as stale so it'll get regenerated (regardless of mPathSourceType, since + // <mpath> trumps all the other sources of path data) + void MpathChanged() { mIsPathStale = mHasChanged = true; } + +protected: + enum PathSourceType { + // NOTE: Ordering matters here. Higher-priority path-descriptors should + // have higher enumerated values + ePathSourceType_None, // uninitialized or not applicable + ePathSourceType_ByAttr, // by or from-by animation + ePathSourceType_ToAttr, // to or from-to animation + ePathSourceType_ValuesAttr, + ePathSourceType_PathAttr, + ePathSourceType_Mpath + }; + + virtual nsSMILCalcMode GetCalcMode() const override; + virtual nsresult GetValues(const nsISMILAttr& aSMILAttr, + nsSMILValueArray& aResult) override; + virtual void CheckValueListDependentAttrs(uint32_t aNumValues) override; + + virtual bool IsToAnimation() const override; + + void CheckKeyPoints(); + nsresult SetKeyPoints(const nsAString& aKeyPoints, nsAttrValue& aResult); + void UnsetKeyPoints(); + nsresult SetRotate(const nsAString& aRotate, nsAttrValue& aResult); + void UnsetRotate(); + + // Helpers for GetValues + void MarkStaleIfAttributeAffectsPath(nsIAtom* aAttribute); + void RebuildPathAndVertices(const nsIContent* aContextElem); + void RebuildPathAndVerticesFromMpathElem(dom::SVGMPathElement* aMpathElem); + void RebuildPathAndVerticesFromPathAttr(); + void RebuildPathAndVerticesFromBasicAttrs(const nsIContent* aContextElem); + bool GenerateValuesForPathAndPoints(Path* aPath, + bool aIsKeyPoints, + FallibleTArray<double>& aPointDistances, + nsSMILValueArray& aResult); + + // Members + // ------- + FallibleTArray<double> mKeyPoints; // parsed from "keyPoints" attribute. + + RotateType mRotateType; // auto, auto-reverse, or explicit. + float mRotateAngle; // the angle value, if explicit. + + PathSourceType mPathSourceType; // source of our Path. + RefPtr<Path> mPath; // representation of motion path. + FallibleTArray<double> mPathVertices; // distances of vertices along path. + + bool mIsPathStale; +}; + +} // namespace mozilla + +#endif // MOZILLA_SVGMOTIONSMILANIMATIONFUNCTION_H_ |