- From: Brian Birtles <bbirtles@mozilla.com>
- Date: Fri, 15 Feb 2013 15:59:43 +1100
- To: "public-fx@w3.org" <public-fx@w3.org>
Web Animations minutes, 15 February 2013
Etherpad: https://etherpad.mozilla.org/ep/pad/view/ro.g4AmirOCYzH/latest
Present: Doug, Dmitry, Shane, Silvia, Steve, Brian
Agenda:
1. Review of media integration
2. Should it be getComputedTiming() or just computedTiming?
3. More complex timing functions
1. TOP-LEVEL OBJECT REVIEW
==========================
Presented summary of discussion regarding Players etc.
Whiteboard reference: http://cl.ly/image/1O0o2g0b2W20
Code sample:
var anim = new Anim(...);
var p = document.timeline.createPlayer(anim);
p.startTime = 5;
p.pause();
A few questions to nail down:
a) Is the parameter to Document.timeline.createPlayer optional?
Yes, since this allows you to set up the players (with their start
times) and set (schedule) the timed items later.
i.e. Timeline.createPlayer(optional TimedItem item)
b) Is Player.play(TimedItem item) needed?
No, not if Player.timedItem is writeable. Making Player.timedItem
writeable allows you to substitute in another animation whilst
maintaining current time / playback rate etc.
If you want to reset then just set Player.startTime to
Timeline.currentTime (or just cancel and createPlayer with the timedItem).
c) What does cancel() do?
Cancel sets timedItem to null.
Discussed whether unpause() should be called play() but agreed it should
stay unpause() because the semantics are different to HTMLMediaElement’s
play() (e.g. if the start time is in the future, calling this method
should NOT make the thing start, it simply unpauses if you’ve paused).
Also: unpause() has no effect without calling pause() first, so it's an
appropriate name.
Also discussed whether Player can control multiple TimedItems but agreed
that this is not necessary since you can just use a ParGroup for that.
Also discussed how audio/video is part of this and decided for a
“MediaRef” object that is also a TimedItem. MediaController could also
be referenced from a “MediaRef” object — Shane is going to have a go at
sorting through the details.
2. SHOULD IT BE getComputedTiming() OR JUST computedTiming?
===========================================================
getComputedTiming() — parallel to getComputedStyle(); can’t change
getComputedTiming() suggests a snapshot (i.e. not live)
Should it live on document.timeline? To better parallel
window.getComputedStyle()?
getComputedTiming() suggests it is a property on the Window with a
parameter of TimedItem.
computedTiming is more like a property on TimedItem.
We need a property on the TimedItem element and it’s supposed to be
read-only.
TimedItem.getComputedTiming()
• parallels getComputedStyle() better
• better suggests it is read-only? but we have read-only attributes
elsewhere
• provides a snapshot. Is this really more useful though?
TimedItem.computedTiming
• seems more natural since we don’t normally use getters to get local values
Decided to revisit yesterday's decision about splitting off computed
timing and consider a number of alternatives:
// Option 0
interface TimedItem {
// Timing layout parameters
double startDelay;
double iterationStart;
unrestricted double iterationCount;
(unrestricted double or DOMString) iterationDuration;
double playbackRate;
// Timing style parameters
FillMode fillMode;
PlaybackDirection direction;
TimingFunction? timingFunction;
// Calculated timing params
readonly double computedIterationDuration;
readonly double startTime;
readonly double endTime;
readonly double activeDuration;
// Playback state
readonly double currentTime;
readonly double outputTime;
readonly double currentIteration;
// Event callbacks
EventHandler onstart;
EventHandler oniteration;
EventHandler onend;
// Player
Player getPlayer();
};
// Option 1:
interface TimedItem {
readonly TimingDictionary specified;
// Calculated timing params
readonly double iterationDuration;
readonly double startTime;
readonly double endTime;
readonly double activeDuration;
// May need the *actual* TimingFunction here? (For when
specified.timingFunction is a string)
// Playback state
readonly double currentTime;
readonly double outputTime;
readonly double currentIteration;
// Event callbacks
EventHandler onstart;
EventHandler oniteration;
EventHandler onend;
// Player
Player getPlayer();
};
dictionary TimingDictionary {
double startDelay = 0;
FillMode fillMode = "forwards";
double iterationStart = 0.0;
unrestricted double iterationCount = 1.0;
unrestricted double? iterationDuration = null;
double defaultPlaybackRate = 1.0;
PlaybackDirection direction = "normal";
(DOMString or TimingFunction)? timingFunction = null;
};
// Option 2:
interface TimedItem {
// Timing layout parameters
double startDelay;
double iterationStart;
unrestricted double iterationCount;
(unrestricted double or DOMString) iterationDuration;
double playbackRate;
// Timing style parameters
FillMode fillMode;
PlaybackDirection direction;
TimingFunction? timingFunction;
readonly ComputedTiming computedTiming;
// may be getComputedTiming() ?
// Event callbacks
EventHandler onstart;
EventHandler oniteration;
EventHandler onend;
// Player
Player getPlayer();
};
interface ComputedTiming {
// Calculated timing params
readonly double iterationDuration;
readonly double startTime;
readonly double endTime;
readonly double activeDuration;
// Playback state
readonly double currentTime;
readonly double outputTime;
readonly double currentIteration;
}
// Option 3:
interface TimedItem {
readonly TimingDictionary specified;
ComputedTiming getComputedTiming();
// Maybe readonly ComputedTiming computedTiming; ?
// Playback state
readonly double currentTime;
readonly double outputTime;
readonly double currentIteration;
// Event callbacks
EventHandler onstart;
EventHandler oniteration;
EventHandler onend;
// Player
Player getPlayer();
};
After some fairly intense deliberations we’ve decided to go with option
1 for now. We will clearly mark in the spec as an issue some of these
alternatives and see what feedback we get.
There was also the suggestion of gathering metrics from the polyfill to
see which functions are used most often so we can optimise the API
accordingly.
3. MORE COMPLEX TimingFunctions
===============================
Some other APIs have many many timing functions. We don't want to define
all of these in Web Animations, and certainly not in the first version.
However, many authoring tools will want to export different effects
(e.g. bounce effects etc.).
It would be useful if the baseline version of Web Animations had a means
of representing such timing functions.
There is a proposal to extend SplineTimingFunction so that it can take
more than one segment. This would allow most timing functions to be
approximated. Also, all implementations will be required to implement
the maths for SplineTimingFunction anyway so it should be minimal
implementation overhead to support multiple segments.
However, we need to consider what constraints are necessary on the
control points in order to ensure that the resulting curve produces a
function (i.e. there is one and only one output value for each input time).
One strawman proposal was to take multiples of four numbers where the
sequence is something like this:
<first point is 0,0>
[0,1]: first control point
[2,3]: second control point
[4,5]: end of first segment
<first control point of second segment is the reflection of [2,3]>
[6,7]: second control point of second segment
<end point is 1,1>
But this makes it hard to represent curves with sharp points (such as
bouncing). We need to look into what limitations are needed on the input
values.
Dmitry proposed an approach that takes 3 points for all segments except
for the last, which takes 2. (0, 0) forms the first point for the first
bezier, (1, 1) forms the last point for the last bezier. The final point
of each bezier forms the first point of the next bezier.
The final points (i.e. the 3rd, 6th, 9th, etc.) (or maybe all the
points?) must be monotonic increasing in x.
This approach allows for sharp corners at the cost of more difficulty in
producing smooth curves; as the interface is primarily for tool
designers this increase in difficulty doesn’t matter.
➙ Shane will look into other curves too.
Discussed meeting times. Good-looking options are:
a) Fri 10am AEDST / 8am JST
b) Wed 10am AEDST / 8am JST
We'll try Fri for now and if it's difficult (due to closeness with SVG
telcon) then we will try Wed.
Next meeting: 22 Feb 2013 10am AEDST / 8am JST / 3pm PST
Past meetings: http://www.w3.org/Graphics/fx/wiki/Web_Animations/Meetings
Received on Friday, 15 February 2013 05:00:19 UTC