summaryrefslogtreecommitdiffstats
path: root/dom/smil/nsSMILValue.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/smil/nsSMILValue.h')
-rw-r--r--dom/smil/nsSMILValue.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/dom/smil/nsSMILValue.h b/dom/smil/nsSMILValue.h
new file mode 100644
index 000000000..c0998d61d
--- /dev/null
+++ b/dom/smil/nsSMILValue.h
@@ -0,0 +1,81 @@
+/* -*- 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 NS_SMILVALUE_H_
+#define NS_SMILVALUE_H_
+
+#include "nsISMILType.h"
+#include "nsSMILNullType.h"
+
+/**
+ * Although objects of this type are generally only created on the stack and
+ * only exist during the taking of a new time sample, that's not always the
+ * case. The nsSMILValue objects obtained from attributes' base values are
+ * cached so that the SMIL engine can make certain optimizations during a
+ * sample if the base value has not changed since the last sample (potentially
+ * avoiding recomposing). These nsSMILValue objects typically live much longer
+ * than a single sample.
+ */
+class nsSMILValue
+{
+public:
+ nsSMILValue() : mU(), mType(nsSMILNullType::Singleton()) { }
+ explicit nsSMILValue(const nsISMILType* aType);
+ nsSMILValue(const nsSMILValue& aVal);
+
+ ~nsSMILValue()
+ {
+ mType->Destroy(*this);
+ }
+
+ const nsSMILValue& operator=(const nsSMILValue& aVal);
+
+ // Move constructor / reassignment operator:
+ nsSMILValue(nsSMILValue&& aVal);
+ nsSMILValue& operator=(nsSMILValue&& aVal);
+
+ // Equality operators. These are allowed to be conservative (return false
+ // more than you'd expect) - see comment above nsISMILType::IsEqual.
+ bool operator==(const nsSMILValue& aVal) const;
+ bool operator!=(const nsSMILValue& aVal) const {
+ return !(*this == aVal);
+ }
+
+ bool IsNull() const
+ {
+ return (mType == nsSMILNullType::Singleton());
+ }
+
+ nsresult Add(const nsSMILValue& aValueToAdd, uint32_t aCount = 1);
+ nsresult SandwichAdd(const nsSMILValue& aValueToAdd);
+ nsresult ComputeDistance(const nsSMILValue& aTo, double& aDistance) const;
+ nsresult Interpolate(const nsSMILValue& aEndVal,
+ double aUnitDistance,
+ nsSMILValue& aResult) const;
+
+ union {
+ bool mBool;
+ uint64_t mUint;
+ int64_t mInt;
+ double mDouble;
+ struct {
+ float mAngle;
+ uint16_t mUnit;
+ uint16_t mOrientType;
+ } mOrient;
+ int32_t mIntPair[2];
+ float mNumberPair[2];
+ void* mPtr;
+ } mU;
+ const nsISMILType* mType;
+
+protected:
+ void InitAndCheckPostcondition(const nsISMILType* aNewType);
+ void DestroyAndCheckPostcondition();
+ void DestroyAndReinit(const nsISMILType* aNewType);
+};
+
+#endif // NS_SMILVALUE_H_