// 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 <= 0 && interpolation.startTime == 0) || (fraction >= 1 && interpolation.endTime == 1) || (fraction >= interpolation.startTime && fraction <= interpolation.endTime); }).forEach(function(interpolation) { var offsetFraction = fraction - interpolation.startTime; var localDuration = interpolation.endTime - interpolation.startTime; var scaledLocalTime = localDuration == 0 ? 0 : interpolation.easing(offsetFraction / localDuration); scope.apply(target, interpolation.property, interpolation.interpolation(scaledLocalTime)); }); } else { // IONIC HACK! // DO NOT CLEAR OUT THE INLINE STYLE HERE // IONIC ANIMATE SETS INLINE STYLES ITSELF AND THE WEB ANIMATIONS API WILL // OVERWRITE IONIC DUE TO THE ASYNC PROMISES THAT FIRE OFF AFTER ONFINISH // 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 group = propertySpecificKeyframeGroups[groupName]; for (var i = 0; i < group.length - 1; i++) { var startTime = group[i].offset; var endTime = group[i + 1].offset; var startValue = group[i].value; var endValue = group[i + 1].value; if (startTime == endTime) { if (endTime == 1) { startValue = endValue; } else { endValue = startValue; } } interpolations.push({ startTime: startTime, endTime: endTime, easing: group[i].easing, property: groupName, interpolation: scope.propertyInterpolation(groupName, startValue, endValue) }); } } interpolations.sort(function(leftInterpolation, rightInterpolation) { return leftInterpolation.startTime - rightInterpolation.startTime; }); return interpolations; } if (WEB_ANIMATIONS_TESTING) { testing.makePropertySpecificKeyframeGroups = makePropertySpecificKeyframeGroups; testing.makeInterpolations = makeInterpolations; } })(webAnimationsShared, webAnimations1, webAnimationsTesting);