Line data Source code
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 NS_SMILINSTANCETIME_H_
8 : #define NS_SMILINSTANCETIME_H_
9 :
10 : #include "nsSMILTimeValue.h"
11 :
12 : class nsSMILInterval;
13 : class nsSMILTimeContainer;
14 : class nsSMILTimeValueSpec;
15 :
16 : //----------------------------------------------------------------------
17 : // nsSMILInstanceTime
18 : //
19 : // An instant in document simple time that may be used in creating a new
20 : // interval.
21 : //
22 : // For an overview of how this class is related to other SMIL time classes see
23 : // the documentation in nsSMILTimeValue.h
24 : //
25 : // These objects are owned by an nsSMILTimedElement but MAY also be referenced
26 : // by:
27 : //
28 : // a) nsSMILIntervals that belong to the same nsSMILTimedElement and which refer
29 : // to the nsSMILInstanceTimes which form the interval endpoints; and/or
30 : // b) nsSMILIntervals that belong to other nsSMILTimedElements but which need to
31 : // update dependent instance times when they change or are deleted.
32 : // E.g. for begin='a.begin', 'a' needs to inform dependent
33 : // nsSMILInstanceTimes if its begin time changes. This notification is
34 : // performed by the nsSMILInterval.
35 :
36 : class nsSMILInstanceTime final
37 : {
38 : public:
39 : // Instance time source. Times generated by events, syncbase relationships,
40 : // and DOM calls behave differently in some circumstances such as when a timed
41 : // element is reset.
42 : enum nsSMILInstanceTimeSource {
43 : // No particularly significant source, e.g. offset time, 'indefinite'
44 : SOURCE_NONE,
45 : // Generated by a DOM call such as beginElement
46 : SOURCE_DOM,
47 : // Generated by a syncbase relationship
48 : SOURCE_SYNCBASE,
49 : // Generated by an event
50 : SOURCE_EVENT
51 : };
52 :
53 : explicit nsSMILInstanceTime(const nsSMILTimeValue& aTime,
54 : nsSMILInstanceTimeSource aSource = SOURCE_NONE,
55 : nsSMILTimeValueSpec* aCreator = nullptr,
56 : nsSMILInterval* aBaseInterval = nullptr);
57 :
58 : void Unlink();
59 : void HandleChangedInterval(const nsSMILTimeContainer* aSrcContainer,
60 : bool aBeginObjectChanged,
61 : bool aEndObjectChanged);
62 : void HandleDeletedInterval();
63 : void HandleFilteredInterval();
64 :
65 0 : const nsSMILTimeValue& Time() const { return mTime; }
66 0 : const nsSMILTimeValueSpec* GetCreator() const { return mCreator; }
67 :
68 0 : bool IsDynamic() const { return !!(mFlags & kDynamic); }
69 0 : bool IsFixedTime() const { return !(mFlags & kMayUpdate); }
70 0 : bool FromDOM() const { return !!(mFlags & kFromDOM); }
71 :
72 : bool ShouldPreserve() const;
73 : void UnmarkShouldPreserve();
74 :
75 : void AddRefFixedEndpoint();
76 : void ReleaseFixedEndpoint();
77 :
78 0 : void DependentUpdate(const nsSMILTimeValue& aNewTime)
79 : {
80 0 : MOZ_ASSERT(!IsFixedTime(),
81 : "Updating an instance time that is not expected to be updated");
82 0 : mTime = aNewTime;
83 0 : }
84 :
85 0 : bool IsDependent() const { return !!mBaseInterval; }
86 : bool IsDependentOn(const nsSMILInstanceTime& aOther) const;
87 0 : const nsSMILInterval* GetBaseInterval() const { return mBaseInterval; }
88 : const nsSMILInstanceTime* GetBaseTime() const;
89 :
90 0 : bool SameTimeAndBase(const nsSMILInstanceTime& aOther) const
91 : {
92 0 : return mTime == aOther.mTime && GetBaseTime() == aOther.GetBaseTime();
93 : }
94 :
95 : // Get and set a serial number which may be used by a containing class to
96 : // control the sort order of otherwise similar instance times.
97 0 : uint32_t Serial() const { return mSerial; }
98 0 : void SetSerial(uint32_t aIndex) { mSerial = aIndex; }
99 :
100 0 : NS_INLINE_DECL_REFCOUNTING(nsSMILInstanceTime)
101 :
102 : private:
103 : // Private destructor, to discourage deletion outside of Release():
104 : ~nsSMILInstanceTime();
105 :
106 : void SetBaseInterval(nsSMILInterval* aBaseInterval);
107 :
108 : nsSMILTimeValue mTime;
109 :
110 : // Internal flags used to represent the behaviour of different instance times
111 : enum {
112 : // Indicates that this instance time was generated by an event or a DOM
113 : // call. Such instance times require special handling when (i) the owning
114 : // element is reset, (ii) when they are to be added as a new end instance
115 : // times (as per SMIL's event sensitivity contraints), and (iii) when
116 : // a backwards seek is performed and the timing model is reconstructed.
117 : kDynamic = 1,
118 :
119 : // Indicates that this instance time is referred to by an
120 : // nsSMILTimeValueSpec and as such may be updated. Such instance time should
121 : // not be filtered out by the nsSMILTimedElement even if they appear to be
122 : // in the past as they may be updated to a future time.
123 : kMayUpdate = 2,
124 :
125 : // Indicates that this instance time was generated from the DOM as opposed
126 : // to an nsSMILTimeValueSpec. When a 'begin' or 'end' attribute is set or
127 : // reset we should clear all the instance times that have been generated by
128 : // that attribute (and hence an nsSMILTimeValueSpec), but not those from the
129 : // DOM.
130 : kFromDOM = 4,
131 :
132 : // Indicates that this instance time was used as the endpoint of an interval
133 : // that has been filtered or removed. However, since it is a dynamic time it
134 : // should be preserved and not filtered.
135 : kWasDynamicEndpoint = 8
136 : };
137 : uint8_t mFlags; // Combination of kDynamic, kMayUpdate, etc.
138 : mutable bool mVisited; // Cycle tracking
139 :
140 : // Additional reference count to determine if this instance time is currently
141 : // used as a fixed endpoint in any intervals. Instance times that are used in
142 : // this way should not be removed when the owning nsSMILTimedElement removes
143 : // instance times in response to a restart or in an attempt to free up memory
144 : // by filtering out old instance times.
145 : //
146 : // Instance times are only shared in a few cases, namely:
147 : // a) early ends,
148 : // b) zero-duration intervals,
149 : // c) momentarily whilst establishing new intervals and updating the current
150 : // interval, and
151 : // d) trimmed intervals
152 : // Hence the limited range of a uint16_t should be more than adequate.
153 : uint16_t mFixedEndpointRefCnt;
154 :
155 : uint32_t mSerial; // A serial number used by the containing class to
156 : // specify the sort order for instance times with the
157 : // same mTime.
158 :
159 : nsSMILTimeValueSpec* mCreator; // The nsSMILTimeValueSpec object that created
160 : // us. (currently only needed for syncbase
161 : // instance times.)
162 : nsSMILInterval* mBaseInterval; // Interval from which this time is derived
163 : // (only used for syncbase instance times)
164 : };
165 :
166 : #endif // NS_SMILINSTANCETIME_H_
|