summaryrefslogtreecommitdiffstats
path: root/dom/smil/SMILValue.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/smil/SMILValue.h')
-rw-r--r--dom/smil/SMILValue.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/dom/smil/SMILValue.h b/dom/smil/SMILValue.h
new file mode 100644
index 0000000000..d57daa5eb3
--- /dev/null
+++ b/dom/smil/SMILValue.h
@@ -0,0 +1,75 @@
+/* -*- 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 DOM_SMIL_SMILVALUE_H_
+#define DOM_SMIL_SMILVALUE_H_
+
+#include "mozilla/SMILNullType.h"
+#include "mozilla/SMILType.h"
+
+namespace mozilla {
+
+/**
+ * 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 SMILValue 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 SMILValue objects typically live much longer
+ * than a single sample.
+ */
+class SMILValue {
+ public:
+ SMILValue() : mU(), mType(SMILNullType::Singleton()) {}
+ explicit SMILValue(const SMILType* aType);
+ SMILValue(const SMILValue& aVal);
+
+ ~SMILValue() { mType->Destroy(*this); }
+
+ const SMILValue& operator=(const SMILValue& aVal);
+
+ // Move constructor / reassignment operator:
+ SMILValue(SMILValue&& aVal) noexcept;
+ SMILValue& operator=(SMILValue&& aVal) noexcept;
+
+ // Equality operators. These are allowed to be conservative (return false
+ // more than you'd expect) - see comment above SMILType::IsEqual.
+ bool operator==(const SMILValue& aVal) const;
+ bool operator!=(const SMILValue& aVal) const { return !(*this == aVal); }
+
+ bool IsNull() const { return (mType == SMILNullType::Singleton()); }
+
+ nsresult Add(const SMILValue& aValueToAdd, uint32_t aCount = 1);
+ nsresult SandwichAdd(const SMILValue& aValueToAdd);
+ nsresult ComputeDistance(const SMILValue& aTo, double& aDistance) const;
+ nsresult Interpolate(const SMILValue& aEndVal, double aUnitDistance,
+ SMILValue& 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 SMILType* mType;
+
+ protected:
+ void InitAndCheckPostcondition(const SMILType* aNewType);
+ void DestroyAndCheckPostcondition();
+ void DestroyAndReinit(const SMILType* aNewType);
+};
+
+} // namespace mozilla
+
+#endif // DOM_SMIL_SMILVALUE_H_