aboutsummaryrefslogtreecommitdiff
path: root/catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js')
-rw-r--r--catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js123
1 files changed, 123 insertions, 0 deletions
diff --git a/catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js b/catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js
new file mode 100644
index 00000000..cab801ed
--- /dev/null
+++ b/catapult/third_party/polymer/components/web-animations-js/src/keyframe-interpolations.js
@@ -0,0 +1,123 @@
+// Copyright 2014 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(shared, scope, testing) {
+
+ scope.convertEffectInput = function(effectInput) {
+ var keyframes = shared.normalizeKeyframes(effectInput);
+ var propertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups(keyframes);
+ var interpolations = makeInterpolations(propertySpecificKeyframeGroups);
+ return function(target, fraction) {
+ if (fraction != null) {
+ interpolations.filter(function(interpolation) {
+ return fraction >= interpolation.applyFrom && fraction < interpolation.applyTo;
+ }).forEach(function(interpolation) {
+ var offsetFraction = fraction - interpolation.startOffset;
+ var localDuration = interpolation.endOffset - interpolation.startOffset;
+ var scaledLocalTime = localDuration == 0 ? 0 : interpolation.easingFunction(offsetFraction / localDuration);
+ scope.apply(target, interpolation.property, interpolation.interpolation(scaledLocalTime));
+ });
+ } else {
+ for (var property in propertySpecificKeyframeGroups)
+ if (property != 'offset' && property != 'easing' && property != 'composite')
+ scope.clear(target, property);
+ }
+ };
+ };
+
+
+ function makePropertySpecificKeyframeGroups(keyframes) {
+ var propertySpecificKeyframeGroups = {};
+
+ for (var i = 0; i < keyframes.length; i++) {
+ for (var member in keyframes[i]) {
+ if (member != 'offset' && member != 'easing' && member != 'composite') {
+ var propertySpecificKeyframe = {
+ offset: keyframes[i].offset,
+ easing: keyframes[i].easing,
+ value: keyframes[i][member]
+ };
+ propertySpecificKeyframeGroups[member] = propertySpecificKeyframeGroups[member] || [];
+ propertySpecificKeyframeGroups[member].push(propertySpecificKeyframe);
+ }
+ }
+ }
+
+ for (var groupName in propertySpecificKeyframeGroups) {
+ var group = propertySpecificKeyframeGroups[groupName];
+ if (group[0].offset != 0 || group[group.length - 1].offset != 1) {
+ throw {
+ type: DOMException.NOT_SUPPORTED_ERR,
+ name: 'NotSupportedError',
+ message: 'Partial keyframes are not supported'
+ };
+ }
+ }
+ return propertySpecificKeyframeGroups;
+ }
+
+
+ function makeInterpolations(propertySpecificKeyframeGroups) {
+ var interpolations = [];
+ for (var groupName in propertySpecificKeyframeGroups) {
+ var keyframes = propertySpecificKeyframeGroups[groupName];
+ for (var i = 0; i < keyframes.length - 1; i++) {
+ var startIndex = i;
+ var endIndex = i + 1;
+ var startOffset = keyframes[startIndex].offset;
+ var endOffset = keyframes[endIndex].offset;
+ var applyFrom = startOffset;
+ var applyTo = endOffset;
+
+ if (i == 0) {
+ applyFrom = -Infinity;
+ WEB_ANIMATIONS_TESTING && console.assert(startOffset == 0);
+ if (endOffset == 0) {
+ endIndex = startIndex;
+ }
+ }
+ if (i == keyframes.length - 2) {
+ applyTo = Infinity;
+ WEB_ANIMATIONS_TESTING && console.assert(endOffset == 1);
+ if (startOffset == 1) {
+ startIndex = endIndex;
+ }
+ }
+
+ interpolations.push({
+ applyFrom: applyFrom,
+ applyTo: applyTo,
+ startOffset: keyframes[startIndex].offset,
+ endOffset: keyframes[endIndex].offset,
+ easingFunction: shared.parseEasingFunction(keyframes[startIndex].easing),
+ property: groupName,
+ interpolation: scope.propertyInterpolation(groupName,
+ keyframes[startIndex].value,
+ keyframes[endIndex].value)
+ });
+ }
+ }
+ interpolations.sort(function(leftInterpolation, rightInterpolation) {
+ return leftInterpolation.startOffset - rightInterpolation.startOffset;
+ });
+ return interpolations;
+ }
+
+
+ if (WEB_ANIMATIONS_TESTING) {
+ testing.makePropertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups;
+ testing.makeInterpolations = makeInterpolations;
+ }
+
+})(webAnimationsShared, webAnimations1, webAnimationsTesting);