325 lines
10 KiB
JavaScript
Executable File
325 lines
10 KiB
JavaScript
Executable File
/*!
|
|
* VERSION: 0.2.2
|
|
* DATE: 2018-02-15
|
|
* UPDATES AND DOCS AT: http://greensock.com
|
|
*
|
|
* @license Copyright (c) 2008-2019, GreenSock. All rights reserved.
|
|
* This work is subject to the terms at http://greensock.com/standard-license or for
|
|
* Club GreenSock members, the software agreement that was issued with your membership.
|
|
*
|
|
* @author: Jack Doyle, jack@greensock.com
|
|
**/
|
|
/* eslint-disable */
|
|
var _gsScope = (typeof(module) !== "undefined" && module.exports && typeof(global) !== "undefined") ? global : this || window; //helps ensure compatibility with AMD/RequireJS and CommonJS/Node
|
|
(_gsScope._gsQueue || (_gsScope._gsQueue = [])).push( function() {
|
|
|
|
"use strict";
|
|
|
|
var _numExp = /(\d|\.)+/g,
|
|
_ColorFilter, _ColorMatrixFilter,
|
|
_colorProps = ["redMultiplier","greenMultiplier","blueMultiplier","alphaMultiplier","redOffset","greenOffset","blueOffset","alphaOffset"],
|
|
_colorLookup = {aqua:[0,255,255],
|
|
lime:[0,255,0],
|
|
silver:[192,192,192],
|
|
black:[0,0,0],
|
|
maroon:[128,0,0],
|
|
teal:[0,128,128],
|
|
blue:[0,0,255],
|
|
navy:[0,0,128],
|
|
white:[255,255,255],
|
|
fuchsia:[255,0,255],
|
|
olive:[128,128,0],
|
|
yellow:[255,255,0],
|
|
orange:[255,165,0],
|
|
gray:[128,128,128],
|
|
purple:[128,0,128],
|
|
green:[0,128,0],
|
|
red:[255,0,0],
|
|
pink:[255,192,203],
|
|
cyan:[0,255,255],
|
|
transparent:[255,255,255,0]},
|
|
_parseColor = function(color) {
|
|
if (color === "" || color == null || color === "none") {
|
|
return _colorLookup.transparent;
|
|
} else if (_colorLookup[color]) {
|
|
return _colorLookup[color];
|
|
} else if (typeof(color) === "number") {
|
|
return [color >> 16, (color >> 8) & 255, color & 255];
|
|
} else if (color.charAt(0) === "#") {
|
|
if (color.length === 4) { //for shorthand like #9F0
|
|
color = "#" + color.charAt(1) + color.charAt(1) + color.charAt(2) + color.charAt(2) + color.charAt(3) + color.charAt(3);
|
|
}
|
|
color = parseInt(color.substr(1), 16);
|
|
return [color >> 16, (color >> 8) & 255, color & 255];
|
|
}
|
|
return color.match(_numExp) || _colorLookup.transparent;
|
|
},
|
|
_parseColorFilter = function(t, v, pg) {
|
|
if (!_ColorFilter) {
|
|
_ColorFilter = (_gsScope.ColorFilter || _gsScope.createjs.ColorFilter);
|
|
if (!_ColorFilter) {
|
|
throw("EaselPlugin error: The EaselJS ColorFilter JavaScript file wasn't loaded.");
|
|
}
|
|
}
|
|
var filters = t.filters || [],
|
|
i = filters.length,
|
|
c, s, e, a, p;
|
|
while (--i > -1) {
|
|
if (filters[i] instanceof _ColorFilter) {
|
|
s = filters[i];
|
|
break;
|
|
}
|
|
}
|
|
if (!s) {
|
|
s = new _ColorFilter();
|
|
filters.push(s);
|
|
t.filters = filters;
|
|
}
|
|
e = s.clone();
|
|
if (v.tint != null) {
|
|
c = _parseColor(v.tint);
|
|
a = (v.tintAmount != null) ? Number(v.tintAmount) : 1;
|
|
e.redOffset = Number(c[0]) * a;
|
|
e.greenOffset = Number(c[1]) * a;
|
|
e.blueOffset = Number(c[2]) * a;
|
|
e.redMultiplier = e.greenMultiplier = e.blueMultiplier = 1 - a;
|
|
} else {
|
|
for (p in v) {
|
|
if (p !== "exposure") if (p !== "brightness") {
|
|
e[p] = Number(v[p]);
|
|
}
|
|
}
|
|
}
|
|
if (v.exposure != null) {
|
|
e.redOffset = e.greenOffset = e.blueOffset = 255 * (Number(v.exposure) - 1);
|
|
e.redMultiplier = e.greenMultiplier = e.blueMultiplier = 1;
|
|
} else if (v.brightness != null) {
|
|
a = Number(v.brightness) - 1;
|
|
e.redOffset = e.greenOffset = e.blueOffset = (a > 0) ? a * 255 : 0;
|
|
e.redMultiplier = e.greenMultiplier = e.blueMultiplier = 1 - Math.abs(a);
|
|
}
|
|
i = 8;
|
|
while (--i > -1) {
|
|
p = _colorProps[i];
|
|
if (s[p] !== e[p]) {
|
|
pg._addTween(s, p, s[p], e[p], "easel_colorFilter");
|
|
}
|
|
}
|
|
pg._overwriteProps.push("easel_colorFilter");
|
|
if (!t.cacheID) {
|
|
throw("EaselPlugin warning: for filters to display in EaselJS, you must call the object's cache() method first. " + t);
|
|
}
|
|
},
|
|
|
|
_idMatrix = [1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],
|
|
_lumR = 0.212671,
|
|
_lumG = 0.715160,
|
|
_lumB = 0.072169,
|
|
|
|
_applyMatrix = function(m, m2) {
|
|
if (!(m instanceof Array) || !(m2 instanceof Array)) {
|
|
return m2;
|
|
}
|
|
var temp = [],
|
|
i = 0,
|
|
z = 0,
|
|
y, x;
|
|
for (y = 0; y < 4; y++) {
|
|
for (x = 0; x < 5; x++) {
|
|
z = (x === 4) ? m[i + 4] : 0;
|
|
temp[i + x] = m[i] * m2[x] + m[i+1] * m2[x + 5] + m[i+2] * m2[x + 10] + m[i+3] * m2[x + 15] + z;
|
|
}
|
|
i += 5;
|
|
}
|
|
return temp;
|
|
},
|
|
|
|
_setSaturation = function(m, n) {
|
|
if (isNaN(n)) {
|
|
return m;
|
|
}
|
|
var inv = 1 - n,
|
|
r = inv * _lumR,
|
|
g = inv * _lumG,
|
|
b = inv * _lumB;
|
|
return _applyMatrix([r + n, g, b, 0, 0, r, g + n, b, 0, 0, r, g, b + n, 0, 0, 0, 0, 0, 1, 0], m);
|
|
},
|
|
|
|
_colorize = function(m, color, amount) {
|
|
if (isNaN(amount)) {
|
|
amount = 1;
|
|
}
|
|
var c = _parseColor(color),
|
|
r = c[0] / 255,
|
|
g = c[1] / 255,
|
|
b = c[2] / 255,
|
|
inv = 1 - amount;
|
|
return _applyMatrix([inv + amount * r * _lumR, amount * r * _lumG, amount * r * _lumB, 0, 0, amount * g * _lumR, inv + amount * g * _lumG, amount * g * _lumB, 0, 0, amount * b * _lumR, amount * b * _lumG, inv + amount * b * _lumB, 0, 0, 0, 0, 0, 1, 0], m);
|
|
},
|
|
|
|
_setHue = function(m, n) {
|
|
if (isNaN(n)) {
|
|
return m;
|
|
}
|
|
n *= Math.PI / 180;
|
|
var c = Math.cos(n),
|
|
s = Math.sin(n);
|
|
return _applyMatrix([(_lumR + (c * (1 - _lumR))) + (s * (-_lumR)), (_lumG + (c * (-_lumG))) + (s * (-_lumG)), (_lumB + (c * (-_lumB))) + (s * (1 - _lumB)), 0, 0, (_lumR + (c * (-_lumR))) + (s * 0.143), (_lumG + (c * (1 - _lumG))) + (s * 0.14), (_lumB + (c * (-_lumB))) + (s * -0.283), 0, 0, (_lumR + (c * (-_lumR))) + (s * (-(1 - _lumR))), (_lumG + (c * (-_lumG))) + (s * _lumG), (_lumB + (c * (1 - _lumB))) + (s * _lumB), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1], m);
|
|
},
|
|
|
|
_setContrast = function(m, n) {
|
|
if (isNaN(n)) {
|
|
return m;
|
|
}
|
|
n += 0.01;
|
|
return _applyMatrix([n,0,0,0,128 * (1 - n), 0,n,0,0,128 * (1 - n), 0,0,n,0,128 * (1 - n), 0,0,0,1,0], m);
|
|
},
|
|
|
|
_parseColorMatrixFilter = function(t, v, pg) {
|
|
if (!_ColorMatrixFilter) {
|
|
_ColorMatrixFilter = (_gsScope.ColorMatrixFilter || _gsScope.createjs.ColorMatrixFilter);
|
|
if (!_ColorMatrixFilter) {
|
|
throw("EaselPlugin error: The EaselJS ColorMatrixFilter JavaScript file wasn't loaded.");
|
|
}
|
|
}
|
|
var filters = t.filters || [],
|
|
i = filters.length,
|
|
matrix, startMatrix, s;
|
|
while (--i > -1) {
|
|
if (filters[i] instanceof _ColorMatrixFilter) {
|
|
s = filters[i];
|
|
break;
|
|
}
|
|
}
|
|
if (!s) {
|
|
s = new _ColorMatrixFilter(_idMatrix.slice());
|
|
filters.push(s);
|
|
t.filters = filters;
|
|
}
|
|
startMatrix = s.matrix;
|
|
matrix = _idMatrix.slice();
|
|
if (v.colorize != null) {
|
|
matrix = _colorize(matrix, v.colorize, Number(v.colorizeAmount));
|
|
}
|
|
if (v.contrast != null) {
|
|
matrix = _setContrast(matrix, Number(v.contrast));
|
|
}
|
|
if (v.hue != null) {
|
|
matrix = _setHue(matrix, Number(v.hue));
|
|
}
|
|
if (v.saturation != null) {
|
|
matrix = _setSaturation(matrix, Number(v.saturation));
|
|
}
|
|
|
|
i = matrix.length;
|
|
while (--i > -1) {
|
|
if (matrix[i] !== startMatrix[i]) {
|
|
pg._addTween(startMatrix, i, startMatrix[i], matrix[i], "easel_colorMatrixFilter");
|
|
}
|
|
}
|
|
|
|
pg._overwriteProps.push("easel_colorMatrixFilter");
|
|
if (!t.cacheID) {
|
|
throw("EaselPlugin warning: for filters to display in EaselJS, you must call the object's cache() method first. " + t);
|
|
}
|
|
|
|
pg._matrix = startMatrix;
|
|
};
|
|
|
|
|
|
var EaselPlugin = _gsScope._gsDefine.plugin({
|
|
propName: "easel",
|
|
priority: -1,
|
|
version: "0.2.2",
|
|
API: 2,
|
|
|
|
//called when the tween renders for the first time. This is where initial values should be recorded and any setup routines should run.
|
|
init: function(target, value, tween, index) {
|
|
this._target = target;
|
|
var p, pt, tint, colorMatrix, end, labels, i;
|
|
for (p in value) {
|
|
|
|
end = value[p];
|
|
if (typeof(end) === "function") {
|
|
end = end(index, target);
|
|
}
|
|
if (p === "colorFilter" || p === "tint" || p === "tintAmount" || p === "exposure" || p === "brightness") {
|
|
if (!tint) {
|
|
_parseColorFilter(target, value.colorFilter || value, this);
|
|
tint = true;
|
|
}
|
|
|
|
} else if (p === "saturation" || p === "contrast" || p === "hue" || p === "colorize" || p === "colorizeAmount") {
|
|
if (!colorMatrix) {
|
|
_parseColorMatrixFilter(target, value.colorMatrixFilter || value, this);
|
|
colorMatrix = true;
|
|
}
|
|
|
|
} else if (p === "frame") {
|
|
this._firstPT = pt = {_next:this._firstPT, t:target, p:"gotoAndStop", s:target.currentFrame, f:true, n:"frame", pr:0, type:0, m:Math.round};
|
|
if (typeof(end) === "string" && end.charAt(1) !== "=" && (labels = target.labels)) {
|
|
for (i = 0; i < labels.length; i++) {
|
|
if (labels[i].label === end) {
|
|
end = labels[i].position;
|
|
}
|
|
}
|
|
}
|
|
pt.c = (typeof(end) === "number") ? end - pt.s : parseFloat((end+"").split("=").join(""));
|
|
if (pt._next) {
|
|
pt._next._prev = pt;
|
|
}
|
|
|
|
} else if (target[p] != null) {
|
|
this._firstPT = pt = {_next:this._firstPT, t:target, p:p, f:(typeof(target[p]) === "function"), n:p, pr:0, type:0};
|
|
pt.s = (!pt.f) ? parseFloat(target[p]) : target[ ((p.indexOf("set") || typeof(target["get" + p.substr(3)]) !== "function") ? p : "get" + p.substr(3)) ]();
|
|
pt.c = (typeof(end) === "number") ? end - pt.s : (typeof(end) === "string") ? parseFloat(end.split("=").join("")) : 0;
|
|
|
|
if (pt._next) {
|
|
pt._next._prev = pt;
|
|
}
|
|
}
|
|
|
|
}
|
|
return true;
|
|
},
|
|
|
|
//called each time the values should be updated, and the ratio gets passed as the only parameter (typically it's a value between 0 and 1, but it can exceed those when using an ease like Elastic.easeOut or Back.easeOut, etc.)
|
|
set: function(v) {
|
|
var pt = this._firstPT,
|
|
min = 0.000001,
|
|
val;
|
|
while (pt) {
|
|
val = pt.c * v + pt.s;
|
|
if (pt.m) {
|
|
val = pt.m(val, pt.t);
|
|
} else if (val < min && val > -min) {
|
|
val = 0;
|
|
}
|
|
if (pt.f) {
|
|
pt.t[pt.p](val);
|
|
} else {
|
|
pt.t[pt.p] = val;
|
|
}
|
|
pt = pt._next;
|
|
}
|
|
if (this._target.cacheID) {
|
|
this._target.updateCache();
|
|
}
|
|
}
|
|
|
|
});
|
|
|
|
}); if (_gsScope._gsDefine) { _gsScope._gsQueue.pop()(); }
|
|
//export to AMD/RequireJS and CommonJS/Node (precursor to full modular build system coming at a later date)
|
|
(function(name) {
|
|
"use strict";
|
|
var getGlobal = function() {
|
|
return (_gsScope.GreenSockGlobals || _gsScope)[name];
|
|
};
|
|
if (typeof(module) !== "undefined" && module.exports) { //node
|
|
require("../TweenLite.js");
|
|
module.exports = getGlobal();
|
|
} else if (typeof(define) === "function" && define.amd) { //AMD
|
|
define(["TweenLite"], getGlobal);
|
|
}
|
|
}("EaselPlugin")); |