diff options
Diffstat (limited to 'dom/smil/SMILCSSValueType.h')
-rw-r--r-- | dom/smil/SMILCSSValueType.h | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/dom/smil/SMILCSSValueType.h b/dom/smil/SMILCSSValueType.h new file mode 100644 index 0000000000..72c66bdc43 --- /dev/null +++ b/dom/smil/SMILCSSValueType.h @@ -0,0 +1,133 @@ +/* -*- 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/. */ + +/* representation of a value for a SMIL-animated CSS property */ + +#ifndef DOM_SMIL_SMILCSSVALUETYPE_H_ +#define DOM_SMIL_SMILCSSVALUETYPE_H_ + +#include "mozilla/Attributes.h" +#include "mozilla/SMILType.h" +#include "nsCSSPropertyID.h" +#include "nsStringFwd.h" + +namespace mozilla { +struct AnimationValue; +class DeclarationBlock; +namespace dom { +class Element; +} // namespace dom + +/* + * SMILCSSValueType: Represents a SMIL-animated CSS value. + */ +class SMILCSSValueType : public SMILType { + public: + // Singleton for SMILValue objects to hold onto. + static SMILCSSValueType sSingleton; + + protected: + // SMILType Methods + // ------------------- + void Init(SMILValue& aValue) const override; + void Destroy(SMILValue&) const override; + nsresult Assign(SMILValue& aDest, const SMILValue& aSrc) const override; + bool IsEqual(const SMILValue& aLeft, const SMILValue& aRight) const override; + nsresult Add(SMILValue& aDest, const SMILValue& aValueToAdd, + uint32_t aCount) const override; + nsresult SandwichAdd(SMILValue& aDest, + const SMILValue& aValueToAdd) const override; + nsresult ComputeDistance(const SMILValue& aFrom, const SMILValue& aTo, + double& aDistance) const override; + nsresult Interpolate(const SMILValue& aStartVal, const SMILValue& aEndVal, + double aUnitDistance, SMILValue& aResult) const override; + + public: + // Helper Methods + // -------------- + /** + * Sets up the given SMILValue to represent the given string value. The + * string is interpreted as a value for the given property on the given + * element. + * + * On failure, this method leaves aValue.mType == SMILNullType::sSingleton. + * Otherwise, this method leaves aValue.mType == this class's singleton. + * + * @param aPropID The property for which we're parsing a value. + * @param aTargetElement The target element to whom the property/value + * setting applies. + * @param aString The string to be parsed as a CSS value. + * @param [out] aValue The SMILValue to be populated. Should + * initially be null-typed. + * @param [out] aIsContextSensitive Set to true if |aString| may produce + * a different |aValue| depending on other + * CSS properties on |aTargetElement| + * or its ancestors (e.g. 'inherit). + * false otherwise. May be nullptr. + * Not set if the method fails. + * @pre aValue.IsNull() + * @post aValue.IsNull() || aValue.mType == SMILCSSValueType::sSingleton + */ + static void ValueFromString(nsCSSPropertyID aPropID, + dom::Element* aTargetElement, + const nsAString& aString, SMILValue& aValue, + bool* aIsContextSensitive); + + /** + * Creates a SMILValue to wrap the given animation value. + * + * @param aPropID The property that |aValue| corresponds to. + * @param aTargetElement The target element to which the animation value + * applies. + * @param aValue The animation value to use. + * @return A new SMILValue. On failure, returns a + * SMILValue with the null type (i.e. rv.IsNull() + * returns true). + */ + static SMILValue ValueFromAnimationValue(nsCSSPropertyID aPropID, + dom::Element* aTargetElement, + const AnimationValue& aValue); + + /** + * Sets the relevant property values in the declaration block. + * + * Returns whether the declaration changed. + */ + static bool SetPropertyValues(const SMILValue&, mozilla::DeclarationBlock&); + + /** + * Return the CSS property animated by the specified value. + * + * @param aValue The SMILValue to examine. + * @return The nsCSSPropertyID enum value of the property animated + * by |aValue|, or eCSSProperty_UNKNOWN if the type of + * |aValue| is not SMILCSSValueType. + */ + static nsCSSPropertyID PropertyFromValue(const SMILValue& aValue); + + /** + * If |aValue| is an empty value, converts it to a suitable zero value by + * matching the type of value stored in |aValueToMatch|. + * + * There is no indication if this method fails. If a suitable zero value could + * not be created, |aValue| is simply unmodified. + * + * @param aValue The SMILValue (of type SMILCSSValueType) to + * possibly update. + * @param aValueToMatch A SMILValue (of type SMILCSSValueType) for which + * a corresponding zero value will be created if |aValue| + * is empty. + */ + static void FinalizeValue(SMILValue& aValue, const SMILValue& aValueToMatch); + + private: + // Private constructor: prevent instances beyond my singleton. + constexpr SMILCSSValueType() = default; +}; + +} // namespace mozilla + +#endif // DOM_SMIL_SMILCSSVALUETYPE_H_ |