tinyjs-plugin-ninepatch
Version:
2,104 lines (1,823 loc) • 1.03 MB
JavaScript
/*!
* Name: tiny
* Description: The Tiny engine is an HTML5 game engine designed to be lightweight and concise JavaScript-friendly syntax, it will only for mobile.
* Author: yiqi
* Version: v1.0.1
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define([], factory);
else if(typeof exports === 'object')
exports["Tiny"] = factory();
else
root["Tiny"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "/dist";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 147);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
/**
* String of the current Tiny version.
*
* @static
* @constant
* @memberof Tiny
* @name VERSION
* @type {string}
*/
var VERSION = exports.VERSION = '1.0.1';
/**
* Math.PI * 2
*
* @static
* @constant
* @memberof Tiny
* @name PI_2
* @type {number}
*/
var PI_2 = exports.PI_2 = Math.PI * 2;
/**
* Constant conversion factor for converting radians to degrees
*
* @static
* @constant
* @memberof Tiny
* @name RAD_TO_DEG
* @type {number}
*/
var RAD_TO_DEG = exports.RAD_TO_DEG = 180 / Math.PI;
/**
* Constant conversion factor for converting degrees to radians
*
* @static
* @constant
* @memberof Tiny
* @name DEG_TO_RAD
* @type {number}
*/
var DEG_TO_RAD = exports.DEG_TO_RAD = Math.PI / 180;
/**
* Constant to identify the Renderer Type.
*
* @static
* @constant
* @memberof Tiny
* @name RENDERER_TYPE
* @type {object}
* @property {number} UNKNOWN - Unknown render type.
* @property {number} WEBGL - WebGL render type.
* @property {number} CANVAS - Canvas render type.
*/
var RENDERER_TYPE = exports.RENDERER_TYPE = {
UNKNOWN: 0,
WEBGL: 1,
CANVAS: 2
};
/**
* Various blend modes supported.
* <br>
* IMPORTANT - The WebGL renderer only supports the NORMAL, ADD, MULTIPLY and SCREEN blend modes.
* Anything else will silently act like NORMAL.
*
* @static
* @constant
* @memberof Tiny
* @name BLEND_MODES
* @type {object}
* @property {number} NORMAL
* @property {number} ADD
* @property {number} MULTIPLY
* @property {number} SCREEN
* @property {number} OVERLAY
* @property {number} DARKEN
* @property {number} LIGHTEN
* @property {number} COLOR_DODGE
* @property {number} COLOR_BURN
* @property {number} HARD_LIGHT
* @property {number} SOFT_LIGHT
* @property {number} DIFFERENCE
* @property {number} EXCLUSION
* @property {number} HUE
* @property {number} SATURATION
* @property {number} COLOR
* @property {number} LUMINOSITY
*/
var BLEND_MODES = exports.BLEND_MODES = {
NORMAL: 0,
ADD: 1,
MULTIPLY: 2,
SCREEN: 3,
OVERLAY: 4,
DARKEN: 5,
LIGHTEN: 6,
COLOR_DODGE: 7,
COLOR_BURN: 8,
HARD_LIGHT: 9,
SOFT_LIGHT: 10,
DIFFERENCE: 11,
EXCLUSION: 12,
HUE: 13,
SATURATION: 14,
COLOR: 15,
LUMINOSITY: 16
};
/**
* Various webgl draw modes. These can be used to specify which GL drawMode to use
* under certain situations and renderers.
*
* @static
* @constant
* @memberof Tiny
* @name DRAW_MODES
* @type {object}
* @property {number} POINTS
* @property {number} LINES
* @property {number} LINE_LOOP
* @property {number} LINE_STRIP
* @property {number} TRIANGLES
* @property {number} TRIANGLE_STRIP
* @property {number} TRIANGLE_FAN
*/
var DRAW_MODES = exports.DRAW_MODES = {
POINTS: 0,
LINES: 1,
LINE_LOOP: 2,
LINE_STRIP: 3,
TRIANGLES: 4,
TRIANGLE_STRIP: 5,
TRIANGLE_FAN: 6
};
/**
* The scale modes that are supported.
*
* The {@link Tiny.settings.SCALE_MODE} scale mode affects the default scaling mode of future operations.
* It can be re-assigned to either LINEAR or NEAREST, depending upon suitability.
*
* @static
* @constant
* @memberof Tiny
* @name SCALE_MODES
* @type {object}
* @property {number} LINEAR Smooth scaling
* @property {number} NEAREST Pixelating scaling
*/
var SCALE_MODES = exports.SCALE_MODES = {
LINEAR: 0,
NEAREST: 1
};
/**
* The wrap modes that are supported.
*
* The {@link Tiny.settings.WRAP_MODE} wrap mode affects the default wraping mode of future operations.
* It can be re-assigned to either CLAMP or REPEAT, depending upon suitability.
* If the texture is non power of two then clamp will be used regardless as webGL can
* only use REPEAT if the texture is po2.
*
* This property only affects WebGL.
*
* @static
* @constant
* @name WRAP_MODES
* @memberof Tiny
* @type {object}
* @property {number} CLAMP - The textures uvs are clamped
* @property {number} REPEAT - The texture uvs tile and repeat
* @property {number} MIRRORED_REPEAT - The texture uvs tile and repeat with mirroring
*/
var WRAP_MODES = exports.WRAP_MODES = {
CLAMP: 0,
REPEAT: 1,
MIRRORED_REPEAT: 2
};
/**
* The gc modes that are supported by Tiny.
*
* The {@link Tiny.settings.GC_MODE} Garbage Collection mode for Tiny textures is AUTO
* If set to GC_MODE, the renderer will occasianally check textures usage. If they are not
* used for a specified period of time they will be removed from the GPU. They will of course
* be uploaded again when they are required. This is a silent behind the scenes process that
* should ensure that the GPU does not get filled up.
*
* Handy for mobile devices!
* This property only affects WebGL.
*
* @static
* @constant
* @name GC_MODES
* @memberof Tiny
* @type {object}
* @property {number} AUTO - Garbage collection will happen periodically automatically
* @property {number} MANUAL - Garbage collection will need to be called manually
*/
var GC_MODES = exports.GC_MODES = {
AUTO: 0,
MANUAL: 1
};
/**
* Regexp for image type by extension.
*
* @static
* @constant
* @memberof Tiny
* @type {RegExp|string}
* @example `image.png`
*/
var URL_FILE_EXTENSION = exports.URL_FILE_EXTENSION = /\.(\w{3,4})(?:$|\?|#)/i;
/**
* Regexp for data URI.
* Based on: {@link https://github.com/ragingwind/data-uri-regex}
*
* @static
* @constant
* @name DATA_URI
* @memberof Tiny
* @type {RegExp|string}
* @example data:image/png;base64
*/
var DATA_URI = exports.DATA_URI = /^\s*data:(?:([\w-]+)\/([\w+.-]+))?(?:;(charset=[\w-]+|base64))?,(.*)/i;
/**
* Regexp for SVG size.
*
* @static
* @constant
* @name SVG_SIZE
* @memberof Tiny
* @type {RegExp|string}
* @example <svg width="100" height="100"></svg>
*/
var SVG_SIZE = exports.SVG_SIZE = /<svg[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i;
/**
* Constants that identify shapes, mainly to prevent `instanceof` calls.
*
* @static
* @constant
* @name SHAPES
* @memberof Tiny
* @type {object}
* @property {number} POLY Polygon
* @property {number} RECT Rectangle
* @property {number} CIRC Circle
* @property {number} ELIP Ellipse
* @property {number} RREC Rounded Rectangle
*/
var SHAPES = exports.SHAPES = {
POLY: 0,
RECT: 1,
CIRC: 2,
ELIP: 3,
RREC: 4
};
/**
* Constants that specify float precision in shaders.
*
* @static
* @constant
* @name PRECISION
* @memberof Tiny
* @type {object}
* @property {string} LOW='lowp'
* @property {string} MEDIUM='mediump'
* @property {string} HIGH='highp'
*/
var PRECISION = exports.PRECISION = {
LOW: 'lowp',
MEDIUM: 'mediump',
HIGH: 'highp'
};
/**
* Constants that specify the transform type.
*
* @static
* @constant
* @name TRANSFORM_MODE
* @memberof Tiny
* @type {object}
* @property {number} STATIC
* @property {number} DYNAMIC
*/
var TRANSFORM_MODE = exports.TRANSFORM_MODE = {
STATIC: 0,
DYNAMIC: 1
};
/**
* Constants that define the type of gradient on text.
*
* @static
* @constant
* @name TEXT_GRADIENT
* @memberof Tiny
* @type {object}
* @property {number} LINEAR_VERTICAL Vertical gradient
* @property {number} LINEAR_HORIZONTAL Linear gradient
*/
var TEXT_GRADIENT = exports.TEXT_GRADIENT = {
LINEAR_VERTICAL: 0,
LINEAR_HORIZONTAL: 1
};
/**
* Represents the update priorities used by internal Tiny classes when registered with
* the {@link Tiny.ticker.Ticker} object. Higher priority items are updated first and lower
* priority items, such as render, should go later.
*
* @static
* @constant
* @name UPDATE_PRIORITY
* @memberof Tiny
* @type {object}
* @property {number} INTERACTION=50 Highest priority, used for {@link Tiny.interaction.InteractionManager}
* @property {number} HIGH=25 High priority updating, {@link Tiny.VideoBaseTexture} and {@link Tiny.AnimatedSprite}
* @property {number} NORMAL=0 Default priority for ticker events, see {@link Tiny.ticker.Ticker#add}.
* @property {number} LOW=-25 Low priority used for {@link Tiny.Application} rendering.
* @property {number} UTILITY=-50 Lowest priority used for {@link Tiny.prepare.BasePrepare} utility.
*/
var UPDATE_PRIORITY = exports.UPDATE_PRIORITY = {
INTERACTION: 50,
HIGH: 25,
NORMAL: 0,
LOW: -25,
UTILITY: -50
};
/**
* 主界面尺寸
*
* @static
* @constant
* @name WIN_SIZE
* @memberof Tiny
* @type {object}
* @property {number} width 宽
* @property {number} height 高
*/
var WIN_SIZE = exports.WIN_SIZE = {
width: 0,
height: 0
};
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BaseTextureCache = exports.TextureCache = exports.isArray = exports.mixins = exports.pluginTarget = exports.EventEmitter = exports.removeItems = exports.isMobile = exports.TWEEN = undefined;
var _decide = __webpack_require__(126);
Object.keys(_decide).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function get() {
return _decide[key];
}
});
});
exports.uid = uid;
exports.isFunction = isFunction;
exports.isNumber = isNumber;
exports.isString = isString;
exports.isUndefined = isUndefined;
exports.isObject = isObject;
exports.getTime = getTime;
exports.random = random;
exports.randomInt = randomInt;
exports.randomFloat = randomFloat;
exports.randomBool = randomBool;
exports.randomPM = randomPM;
exports.randomFromArray = randomFromArray;
exports.hex2rgb = hex2rgb;
exports.hex2string = hex2string;
exports.rgb2hex = rgb2hex;
exports.deg2radian = deg2radian;
exports.radian2deg = radian2deg;
exports.getXMLHttpRequest = getXMLHttpRequest;
exports.getResolutionOfUrl = getResolutionOfUrl;
exports.decomposeDataUri = decomposeDataUri;
exports.getUrlFileExtension = getUrlFileExtension;
exports.getSvgSize = getSvgSize;
exports.isWebGLSupported = isWebGLSupported;
exports.sign = sign;
exports.arrayRemoveObject = arrayRemoveObject;
exports.detect = detect;
exports.point = point;
exports.scale = scale;
exports.color = color;
exports.destroyTextureCache = destroyTextureCache;
exports.clearTextureCache = clearTextureCache;
var _const = __webpack_require__(0);
var _settings = __webpack_require__(3);
var _settings2 = _interopRequireDefault(_settings);
var _eventemitter = __webpack_require__(6);
var _eventemitter2 = _interopRequireDefault(_eventemitter);
var _tween = __webpack_require__(20);
var _tween2 = _interopRequireDefault(_tween);
var _pluginTarget = __webpack_require__(130);
var _pluginTarget2 = _interopRequireDefault(_pluginTarget);
var _mixin = __webpack_require__(129);
var mixins = _interopRequireWildcard(_mixin);
var _ismobilejs = __webpack_require__(17);
var isMobile = _interopRequireWildcard(_ismobilejs);
var _removeArrayItems = __webpack_require__(76);
var _removeArrayItems2 = _interopRequireDefault(_removeArrayItems);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var nextUid = 0;
exports.TWEEN = _tween2.default;
exports.isMobile = isMobile;
exports.removeItems = _removeArrayItems2.default;
exports.EventEmitter = _eventemitter2.default;
exports.pluginTarget = _pluginTarget2.default;
exports.mixins = mixins;
/**
* Gets the next unique identifier
*
* @static
* @memberof Tiny
* @function uid
* @return {number} The next unique identifier to use.
*/
function uid() {
return ++nextUid;
}
/**
* 判断对象是否是`Array`类型
*
* @static
* @memberof Tiny
* @function isArray
* @param {Object} obj 要判断的对象
* @return {Boolean}
*/
var isArray = exports.isArray = Array.isArray || function (obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
};
/**
* 判断对象是否是函数类型
*
* @static
* @memberof Tiny
* @function isFunction
* @param {Object} obj 要判断的对象
* @return {Boolean}
*/
function isFunction(obj) {
return Object.prototype.toString.call(obj) === '[object Function]';
}
/**
* 判断对象是否是`Number`类型
*
* @static
* @memberof Tiny
* @function isNumber
* @param {Object} obj 要判断的对象
* @return {Boolean}
*/
function isNumber(obj) {
return Object.prototype.toString.call(obj) === '[object Number]';
}
/**
* 判断对象是否是`String`类型
*
* @static
* @memberof Tiny
* @function isString
* @param {Object} obj 要判断的对象
* @return {Boolean}
*/
function isString(obj) {
return typeof obj === 'string';
}
/**
* 判断对象是否是`Undefined`类型
*
* @static
* @memberof Tiny
* @function isUndefined
* @param obj
* @return {boolean}
*/
function isUndefined(obj) {
return obj === void 0;
}
/**
* 判断对象是否是`Object`类型
*
* @static
* @memberof Tiny
* @function isObject
* @param {Object} obj 要判断的对象
* @return {boolean}
*/
function isObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
}
/**
* 高精度获取当前时间,比 `Date.now()` 的精度高1000倍,为考虑不同性能场景下的时间获取,建议使用此方法来替代 `Date.now()`。
*
* @static
* @memberof Tiny
* @function getTime
* @return {number}
*/
function getTime() {
return window.performance.timing.navigationStart + window.performance.now();
}
/**
* 生成数字区间内的随机整型数据
*
* @example
*
* ``` js
* Tiny.random(10, 18);
* //=> 15
* ```
*
* @static
* @memberof Tiny
* @function random
* @param min
* @param max
* @return {number}
*/
function random(min, max) {
if (isArray(min)) {
max = min[1];
min = min[0];
}
return Math.floor(Math.random() * (max - min + 1)) + min;
}
/**
* `Tiny.random` 的别名
*
* @static
* @memberof Tiny
* @function randomInt
* @return {boolean}
*/
function randomInt() {
return random.call.apply(random, [this].concat(Array.prototype.slice.call(arguments)));
}
/**
* 返回区间内的随机浮点类型数字
*
* @static
* @memberof Tiny
* @function randomFloat
* @param min
* @param max
* @return {number}
*/
function randomFloat(min, max) {
return min + Math.random() * (max - min);
}
/**
* 生成随机的`Boolean`类型数据
*
* @static
* @memberof Tiny
* @function randomBool
* @param {number} chance 生成 true 的几率,默认值:0.5
* @return {boolean}
*/
function randomBool(chance) {
chance = chance ? chance : 0.5; // eslint-disable-line
return Math.random() < chance;
}
/**
* 随机生成 {-1, 1} 两个值
*
* @example
*
* ``` js
* Tiny.randomPM(0.8);
* //=> -1
* ```
*
* @static
* @memberof Tiny
* @function randomPM
* @param {number} chance 生成 -1 的几率,默认值:0.5
* @return {number}
*/
function randomPM(chance) {
chance = chance ? chance : 0.5; // eslint-disable-line
return Math.random() > chance ? -1 : 1;
}
/**
* 随机返回数组中的任意对象
*
* @memberof Tiny
* @function randomFromArray
* @param {array<object>} arr
* @return {object}
*/
function randomFromArray(arr) {
return arr[random(0, arr.length - 1)];
}
/**
* Converts a hex color number to an [R, G, B] array
*
* @memberof Tiny
* @function hex2rgb
* @param {number} hex - The number to convert
* @param {number[]} [out=[]] If supplied, this array will be used rather than returning a new one
* @return {number[]} An array representing the [R, G, B] of the color.
*/
function hex2rgb(hex, out) {
out = out || [];
out[0] = (hex >> 16 & 0xFF) / 255;
out[1] = (hex >> 8 & 0xFF) / 255;
out[2] = (hex & 0xFF) / 255;
return out;
}
/**
* Converts a hex color number to a string.
*
* @memberof Tiny
* @function hex2string
* @param {number} hex - Number in hex
* @return {string} The string color.
*/
function hex2string(hex) {
hex = hex.toString(16);
hex = '000000'.substr(0, 6 - hex.length) + hex;
return '#' + hex;
}
/**
* Converts a color as an [R, G, B] array to a hex number
*
* @memberof Tiny
* @function rgb2hex
* @param {number[]} rgb - rgb array
* @return {number} The color number
*/
function rgb2hex(rgb) {
return (rgb[0] * 255 << 16) + (rgb[1] * 255 << 8) + (rgb[2] * 255 | 0);
}
/**
* 角度值转弧度
*
* @memberof Tiny
* @function deg2radian
* @param deg
* @return {number}
*/
function deg2radian(deg) {
return _const.PI_2 * deg / 360;
}
/**
* 弧度值转角度
*
* @memberof Tiny
* @function radian2deg
* @param radian
* @return {number}
*/
function radian2deg(radian) {
return 360 * radian / _const.PI_2;
}
/**
* 获取 XMLHttpRequest 对象,如果 Tiny._XMLHttpRequest 存在,则取之,如果没有,则创建一个 XMLHttpRequest 对象,并存之。
* 如果 Tiny._XMLHttpRequest 正在使用中,则返回一个新建的 XMLHttpRequest
*
* @static
* @return {XMLHttpRequest}
*/
function getXMLHttpRequest() {
var xhr = this._XMLHttpRequest;
if (!xhr) {
xhr = new XMLHttpRequest();
this._XMLHttpRequest = xhr;
} else {
if (+xhr.readyState !== 4) {
return new XMLHttpRequest();
}
}
return xhr;
}
/**
* get the resolution / device pixel ratio of an asset by looking for the prefix
* used by spritesheets and image urls
*
* @memberof Tiny
* @function getResolutionOfUrl
* @param {string} url - the image path
* @param {number} [defaultValue=1] - the defaultValue if no filename prefix is set.
* @return {number} resolution / device pixel ratio of an asset
*/
function getResolutionOfUrl(url, defaultValue) {
var resolution = _settings2.default.RETINA_PREFIX.exec(url);
if (resolution) {
return parseFloat(resolution[1]);
}
return defaultValue !== undefined ? defaultValue : 1;
}
/**
* Typedef for decomposeDataUri return object.
*
* @typedef {object} DecomposedDataUri
* @property {mediaType} Media type, eg. `image`
* @property {subType} Sub type, eg. `png`
* @property {encoding} Data encoding, eg. `base64`
* @property {data} The actual data
*/
/**
* Split a data URI into components. Returns undefined if parameter `dataUri` is not a valid data URI.
*
* @memberof Tiny
* @function decomposeDataUri
* @param {string} dataUri - the data URI to check
* @return {DecomposedDataUri|undefined} The decomposed data uri or undefined
*/
function decomposeDataUri(dataUri) {
var dataUriMatch = _const.DATA_URI.exec(dataUri);
if (dataUriMatch) {
return {
mediaType: dataUriMatch[1] ? dataUriMatch[1].toLowerCase() : undefined,
subType: dataUriMatch[2] ? dataUriMatch[2].toLowerCase() : undefined,
encoding: dataUriMatch[3] ? dataUriMatch[3].toLowerCase() : undefined,
data: dataUriMatch[4]
};
}
return undefined;
}
/**
* Get type of the image by regexp for extension. Returns undefined for unknown extensions.
*
* @memberof Tiny
* @function getUrlFileExtension
* @param {string} url - the image path
* @return {string|undefined} image extension
*/
function getUrlFileExtension(url) {
var extension = _const.URL_FILE_EXTENSION.exec(url);
if (extension) {
return extension[1].toLowerCase();
}
return undefined;
}
/**
* Typedef for Size object.
*
* @typedef {object} Size
* @property {width} Width component
* @property {height} Height component
*/
/**
* Get size from an svg string using regexp.
*
* @memberof Tiny
* @function getSvgSize
* @param {string} svgString - a serialized svg element
* @return {Size|undefined} image extension
*/
function getSvgSize(svgString) {
var sizeMatch = _const.SVG_SIZE.exec(svgString);
var size = {};
if (sizeMatch) {
size[sizeMatch[1]] = Math.round(parseFloat(sizeMatch[3]));
size[sizeMatch[5]] = Math.round(parseFloat(sizeMatch[7]));
}
return size;
}
/**
* Helper for checking for webgl support
*
* @memberof Tiny
* @function isWebGLSupported
* @return {boolean} is webgl supported
*/
function isWebGLSupported() {
var contextOptions = { stencil: true, failIfMajorPerformanceCaveat: true };
try {
if (!window.WebGLRenderingContext) {
return false;
}
var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl', contextOptions) || canvas.getContext('experimental-webgl', contextOptions);
var success = !!(gl && gl.getContextAttributes().stencil);
if (gl) {
var loseContext = gl.getExtension('WEBGL_lose_context');
if (loseContext) {
loseContext.loseContext();
}
}
gl = null;
return success;
} catch (e) {
return false;
}
}
/**
* Returns sign of number
*
* @memberof Tiny
* @function sign
* @param {number} n - the number to check the sign of
* @return {number} 0 if `n` is 0, -1 if `n` is negative, 1 if `n` is positive
*/
function sign(n) {
if (n === 0) return 0;
return n < 0 ? -1 : 1;
}
/**
* 从数组中移除某个对象
*
* @memberof Tiny
* @function arrayRemoveObject
* @param {array<object>} arr
* @param {object} delObj
*/
function arrayRemoveObject(arr, delObj) {
for (var i = 0, l = arr.length; i < l; i++) {
if (arr[i] === delObj) {
arr.splice(i, 1);
break;
}
}
}
/**
* Looks through each value in the list, returning the first one that passes a truth test (**predicate**), or `undefined` if no value passes the test. The function returns as soon as it finds an acceptable element, and doesn't traverse the entire list.
*
* @example
*
* ``` js
* var even = Tiny.detect([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
* //=> 2
* ```
*
* @static
* @memberof Tiny
* @function detect
* @param {object} obj
* @param {function} iterator
* @param {object} context
* @param arg1
* @param arg2
* @return {boolean}
*/
function detect(obj, iterator, context, arg1, arg2) {
var result = void 0;
if (obj === null) {
return;
}
if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
result = iterator.call(context, obj[i], i, arg1, arg2);
if (result) {
return result;
}
}
return false;
} else {
for (var key in obj) {
result = iterator.call(context, obj[key], key, arg1, arg2);
if (result) {
return result;
}
}
return false;
}
}
/**
* 转化坐标值
*
* @example
*
* ``` js
* Tiny.point(100, 200);
* //=> {x: 100, y: 200}
* ```
*
* @static
* @memberof Tiny
* @function point
* @param {number} x
* @param {number} y - 如果不传,则等于 x
* @return {object}
*/
function point(x, y) {
return {
x: x, // eslint-disable-line
y: y === void 0 ? x : y
};
}
/**
* 转化缩放值
*
* @example
*
* ```js
* Tiny.scale(2, 1.5);
* //=> {scaleX: 2, scaleY: 1.5}
* ```
*
* @memberof Tiny
* @function scale
* @param {number} x
* @param {number} y - 如果不传,则等于 x
* @return {object}
*/
function scale(x, y) {
return {
scaleX: x,
scaleY: y === void 0 ? x : y
};
}
/**
* 转化RGB颜色值
*
* @example
*
* ``` js
* Tiny.color(0, 255, 255);
* //=> {r: 0, g: 255, b: 255}
* ```
*
* @param {number} red
* @param {number} green
* @param {number} blue
* @param {number} alpha
* @returns {object}
*/
function color(red, green, blue, alpha) {
return {
r: Tiny.isUndefined(red) ? 255 : red,
g: Tiny.isUndefined(green) ? 255 : green,
b: Tiny.isUndefined(blue) ? 255 : blue,
a: Tiny.isUndefined(alpha) ? 1 : alpha
};
}
/**
* texture 缓存,用于存储已加载的图片 texture
*
* @name TextureCache
* @memberof Tiny
* @type {object}
* @private
*/
var TextureCache = exports.TextureCache = Object.create(null);
/**
*
* @name BaseTextureCache
* @memberof Tiny
* @type {object}
* @private
*/
var BaseTextureCache = exports.BaseTextureCache = Object.create(null);
/**
* Destroys all texture in the cache
*
* @static
* @memberof Tiny
* @function destroyTextureCache
*/
function destroyTextureCache() {
var key = void 0;
for (key in TextureCache) {
TextureCache[key].destroy();
}
for (key in BaseTextureCache) {
BaseTextureCache[key].destroy();
}
}
/**
* Removes all textures from cache, but does not destroy them
*
* @static
* @memberof Tiny
* @function clearTextureCache
*/
function clearTextureCache() {
var key = void 0;
for (key in TextureCache) {
delete TextureCache[key];
}
for (key in BaseTextureCache) {
delete BaseTextureCache[key];
}
}
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _Point = __webpack_require__(24);
Object.defineProperty(exports, 'Point', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Point).default;
}
});
var _ObservablePoint = __webpack_require__(98);
Object.defineProperty(exports, 'ObservablePoint', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_ObservablePoint).default;
}
});
var _Matrix = __webpack_require__(50);
Object.defineProperty(exports, 'Matrix', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Matrix).default;
}
});
var _GroupD = __webpack_require__(49);
Object.defineProperty(exports, 'GroupD8', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_GroupD).default;
}
});
var _Circle = __webpack_require__(99);
Object.defineProperty(exports, 'Circle', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Circle).default;
}
});
var _Ellipse = __webpack_require__(100);
Object.defineProperty(exports, 'Ellipse', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Ellipse).default;
}
});
var _Polygon = __webpack_require__(101);
Object.defineProperty(exports, 'Polygon', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Polygon).default;
}
});
var _Rectangle = __webpack_require__(25);
Object.defineProperty(exports, 'Rectangle', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Rectangle).default;
}
});
var _RoundedRectangle = __webpack_require__(102);
Object.defineProperty(exports, 'RoundedRectangle', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_RoundedRectangle).default;
}
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.config = undefined;
var _maxRecommendedTextures = __webpack_require__(128);
var _maxRecommendedTextures2 = _interopRequireDefault(_maxRecommendedTextures);
var _canUploadSameBuffer = __webpack_require__(125);
var _canUploadSameBuffer2 = _interopRequireDefault(_canUploadSameBuffer);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* User's customizable globals for overriding the default Tiny settings, such
* as a renderer's default resolution, framerate, float percision, etc.
*
* @example
* // Disable interpolation when scaling, will make texture be pixelated
* Tiny.settings.SCALE_MODE = Tiny.SCALE_MODES.NEAREST;
* @namespace Tiny.settings
*/
exports.default = {
/**
* Target frames per millisecond.
*
* @static
* @memberof Tiny.settings
* @type {number}
* @default 0.06
*/
TARGET_FPMS: 0.06,
/**
* If set to true WebGL will attempt make textures mimpaped by default.
* Mipmapping will only succeed if the base texture uploaded has power of two dimensions.
*
* @static
* @memberof Tiny.settings
* @type {boolean}
* @default true
*/
MIPMAP_TEXTURES: true,
/**
* Default resolution / device pixel ratio of the renderer.
*
* @static
* @memberof Tiny.settings
* @type {number}
* @default 1
*/
RESOLUTION: 1,
/**
* The maximum textures that this device supports.
*
* @static
* @memberof Tiny.settings
* @type {number}
* @default 32
*/
SPRITE_MAX_TEXTURES: (0, _maxRecommendedTextures2.default)(32),
/**
* The default sprite batch size.
*
* The default aims to balance desktop and mobile devices.
*
* @static
* @memberof Tiny.settings
* @type {number}
* @default 4096
*/
SPRITE_BATCH_SIZE: 4096,
/**
* The prefix that denotes a URL is for a retina asset.
*
* @static
* @memberof Tiny.settings
* @type {RegExp|string}
* @type {RegExp}
* @example `@2x`
* @default /@([0-9\.]+)x/
*/
RETINA_PREFIX: /@([0-9\.]+)x/, // eslint-disable-line
/**
* 默认渲染参数
*
* @static
* @constant
* @memberof Tiny.settings
* @type {object}
* @property {boolean} antialias=false
* @property {boolean} transparent=false
* @property {number} backgroundColor=0x000000
* @property {boolean} clearBeforeRender=true
* @property {boolean} preserveDrawingBuffer=false
* @property {boolean} roundPixels=false
* @property {boolean} legacy=false
*/
RENDER_OPTIONS: {
view: null,
antialias: false,
autoResize: false,
transparent: false,
backgroundColor: 0x000000,
clearBeforeRender: true,
preserveDrawingBuffer: false,
roundPixels: false,
legacy: false
},
/**
* Default transform type.
*
* @static
* @memberof Tiny.settings
* @type {Tiny.TRANSFORM_MODE}
* @default Tiny.TRANSFORM_MODE.STATIC
*/
TRANSFORM_MODE: 0,
/**
* Default Garbage Collection mode.
*
* @static
* @memberof Tiny.settings
* @type {Tiny.GC_MODES}
* @default Tiny.GC_MODES.AUTO
*/
GC_MODE: 0,
/**
* Default Garbage Collection max idle.
*
* @static
* @memberof Tiny.settings
* @type {number}
* @default 3600
*/
GC_MAX_IDLE: 60 * 60,
/**
* Default Garbage Collection maximum check count.
*
* @static
* @memberof Tiny.settings
* @type {number}
* @default 600
*/
GC_MAX_CHECK_COUNT: 60 * 10,
/**
* Default wrap modes that are supported by Tiny.
*
* @static
* @memberof Tiny.settings
* @type {Tiny.WRAP_MODES}
* @default Tiny.WRAP_MODES.CLAMP
*/
WRAP_MODE: 0,
/**
* The scale modes that are supported by Tiny.
*
* @static
* @memberof Tiny.settings
* @type {Tiny.SCALE_MODES}
* @default Tiny.SCALE_MODES.LINEAR
*/
SCALE_MODE: 0,
/**
* Default specify float precision in vertex shader.
*
* @static
* @memberof Tiny.settings
* @type {Tiny.PRECISION}
* @default Tiny.PRECISION.HIGH
*/
PRECISION_VERTEX: 'highp',
/**
* Default specify float precision in shaders.
*
* @static
* @memberof Tiny.settings
* @type {Tiny.PRECISION}
* @default Tiny.PRECISION.MEDIUM
*/
PRECISION_FRAGMENT: 'mediump',
/**
* Can we upload the same buffer in a single frame?
*
* @static
* @constant
* @memberof Tiny.settings
* @type {boolean}
*/
CAN_UPLOAD_SAME_BUFFER: (0, _canUploadSameBuffer2.default)()
};
/**
* 默认配置参数
*
* @static
* @constant
* @name config
* @memberof Tiny
* @type {object}
* @property {number} width=320 宽度
* @property {number} height=568 高度 ['480', '568']
* @property {string} canvasId='TinyCanvas' canvas的DOM
* @property {boolean} fullScreen=true 是否全屏
* @property {number} dpi=1 分辨率
* @property {boolean} showFPS=false 是否显示帧频
* @property {number} renderType=0 渲染类型 [0: 自动识别, 1: WEBGL, 2: CANVAS]
* @property {object} renderOptions 渲染参数,见{@link Tiny.settings.RENDER_OPTIONS}
* @property {number} autoRender=1 是否自动渲染 [0: 手动, 1: 自动]
*/
var config = exports.config = {
width: 320,
height: 568,
canvasId: 'TinyCanvas',
fullScreen: true,
dpi: 1,
showFPS: false,
renderType: 0, //WEBGL: 1, CANVAS: 2
renderOptions: {},
autoRender: 1 //0: 手动, 1: 自动
};
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var gl = {
createContext: __webpack_require__(81),
setVertexAttribArrays: __webpack_require__(34),
GLBuffer: __webpack_require__(77),
GLFramebuffer: __webpack_require__(78),
GLShader: __webpack_require__(79),
GLTexture: __webpack_require__(33),
VertexArrayObject: __webpack_require__(80),
shader: __webpack_require__(82)
};
// Export for Node-compatible environments
if (typeof module !== 'undefined' && module.exports) {
// Export the module
module.exports = gl;
}
// Add to the browser window pixi.gl
if (typeof window !== 'undefined') {
// add the window object
window.PIXI = window.PIXI || {};
window.PIXI.glCore = gl;
}
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Application = exports.Filter = exports.SpriteMaskFilter = exports.Quad = exports.RenderTarget = exports.ObjectRenderer = exports.WebGLManager = exports.Shader = exports.CanvasRenderTarget = exports.TextureUvs = exports.VideoBaseTexture = exports.BaseRenderTexture = exports.RenderTexture = exports.BaseTexture = exports.Texture = exports.Spritesheet = exports.CanvasGraphicsRenderer = exports.GraphicsRenderer = exports.GraphicsData = exports.Graphics = exports.TextMetrics = exports.TextStyle = exports.Text = exports.SpriteRenderer = exports.CanvasTinter = exports.CanvasSpriteRenderer = exports.AnimatedSprite = exports.Sprite = exports.TransformBase = exports.TransformStatic = exports.Transform = exports.Container = exports.DisplayObject = exports.Bounds = exports.glCore = exports.WebGLRenderer = exports.CanvasRenderer = exports.ticker = exports.settings = exports.config = undefined;
var _const = __webpack_require__(0);
Object.keys(_const).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function get() {
return _const[key];
}
});
});
var _math = __webpack_require__(2);
Object.keys(_math).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function get() {
return _math[key];
}
});
});
var _utils = __webpack_require__(1);
Object.keys(_utils).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function get() {
return _utils[key];
}
});
});
var _settings = __webpack_require__(3);
Object.defineProperty(exports, 'config', {
enumerable: true,
get: function get() {
return _settings.config;
}
});
var _pixiGlCore = __webpack_require__(4);
Object.defineProperty(exports, 'glCore', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_pixiGlCore).default;
}
});
var _Bounds = __webpack_require__(22);
Object.defineProperty(exports, 'Bounds', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Bounds).default;
}
});
var _DisplayObject = __webpack_require__(45);
Object.defineProperty(exports, 'DisplayObject', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_DisplayObject).default;
}
});
var _Container = __webpack_require__(8);
Object.defineProperty(exports, 'Container', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Container).default;
}
});
var _Transform = __webpack_require__(46);
Object.defineProperty(exports, 'Transform', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Transform).default;
}
});
var _TransformStatic = __webpack_require__(47);
Object.defineProperty(exports, 'TransformStatic', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_TransformStatic).default;
}
});
var _TransformBase = __webpack_require__(23);
Object.defineProperty(exports, 'TransformBase', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_TransformBase).default;
}
});
var _Sprite = __webpack_require__(26);
Object.defineProperty(exports, 'Sprite', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Sprite).default;
}
});
var _AnimatedSprite = __webpack_require__(117);
Object.defineProperty(exports, 'AnimatedSprite', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_AnimatedSprite).default;
}
});
var _CanvasSpriteRenderer = __webpack_require__(118);
Object.defineProperty(exports, 'CanvasSpriteRenderer', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_CanvasSpriteRenderer).default;
}
});
var _CanvasTinter = __webpack_require__(57);
Object.defineProperty(exports, 'CanvasTinter', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_CanvasTinter).default;
}
});
var _SpriteRenderer = __webpack_require__(120);
Object.defineProperty(exports, 'SpriteRenderer', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_SpriteRenderer).default;
}
});
var _Text = __webpack_require__(58);
Object.defineProperty(exports, 'Text', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Text).default;
}
});
var _TextStyle = __webpack_require__(60);
Object.defineProperty(exports, 'TextStyle', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_TextStyle).default;
}
});
var _TextMetrics = __webpack_require__(59);
Object.defineProperty(exports, 'TextMetrics', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_TextMetrics).default;
}
});
var _Graphics = __webpack_require__(88);
Object.defineProperty(exports, 'Graphics', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Graphics).default;
}
});
var _GraphicsData = __webpack_require__(48);
Object.defineProperty(exports, 'GraphicsData', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_GraphicsData).default;
}
});
var _GraphicsRenderer = __webpack_require__(91);
Object.defineProperty(exports, 'GraphicsRenderer', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_GraphicsRenderer).default;
}
});
var _CanvasGraphicsRenderer = __webpack_require__(89);
Object.defineProperty(exports, 'CanvasGraphicsRenderer', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_CanvasGraphicsRenderer).default;
}
});
var _Spritesheet = __webpack_require__(122);
Object.defineProperty(exports, 'Spritesheet', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Spritesheet).default;
}
});
var _Texture = __webpack_require__(7);
Object.defineProperty(exports, 'Texture', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Texture).default;
}
});
var _BaseTexture = __webpack_require__(11);
Object.defineProperty(exports, 'BaseTexture', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_BaseTexture).default;
}
});
var _RenderTexture = __webpack_require__(27);
Object.defineProperty(exports, 'RenderTexture', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_RenderTexture).default;
}
});
var _BaseRenderTexture = __webpack_require__(61);
Object.defineProperty(exports, 'BaseRenderTexture', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_BaseRenderTexture).default;
}
});
var _VideoBaseTexture = __webpack_require__(63);
Object.defineProperty(exports, 'VideoBaseTexture', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_VideoBaseTexture).default;
}
});
var _TextureUvs = __webpack_require__(62);
Object.defineProperty(exports, 'TextureUvs', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_TextureUvs).default;
}
});
var _CanvasRenderTarget = __webpack_require__(52);
Object.defineProperty(exports, 'CanvasRenderTarget', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_CanvasRenderTarget).default;
}
});
var _Shader = __webpack_require__(12);
Object.defineProperty(exports, 'Shader', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Shader).default;
}
});
var _WebGLManager = __webpack_require__(10);
Object.defineProperty(exports, 'WebGLManager', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_WebGLManager).default;
}
});
var _ObjectRenderer = __webpack_require__(15);
Object.defineProperty(exports, 'ObjectRenderer', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_ObjectRenderer).default;
}
});
var _RenderTarget = __webpack_require__(16);
Object.defineProperty(exports, 'RenderTarget', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_RenderTarget).default;
}
});
var _Quad = __webpack_require__(56);
Object.defineProperty(exports, 'Quad', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Quad).default;
}
});
var _SpriteMaskFilter = __webpack_require__(55);
Object.defineProperty(exports, 'SpriteMaskFilter', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_SpriteMaskFilter).default;
}
});
var _Filter = __webpack_require__(54);
Object.defineProperty(exports, 'Filter', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Filter).default;
}
});
var _Application = __webpack_require__(87);
Object.defineProperty(exports, 'Application', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_Application).default;
}
});
var _ticker = __webpack_require__(28);
var ticker = _interopRequireWildcard(_ticker);
var _settings2 = _interopRequireDefault(_settings);
var _CanvasRenderer = __webpack_require__(9);
var _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer);
var _WebGLRenderer = __webpack_require__(14);
var _WebGLRenderer2 = _interopRequireDefault(_WebGLRenderer);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.settings = _settings2.default;
exports.ticker = ticker;
exports.CanvasRenderer = _CanvasRenderer2.default;
exports.WebGLRenderer = _WebGLRenderer2.default;
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var has = Object.prototype.hasOwnProperty,
prefix = '~';
/**
* Constructor to create a storage for our `EE` objects.
* An `Events` instance is a plain object whose properties are event names.
*
* @constructor
* @api private
*/
function Events() {}
//
// We try to not inherit from `Object.prototype`. In some engines creating an
// instance in this way is faster than calling `Object.create(null)` directly.
// If `Object.create(null)` is not supported we prefix the event names with a
// character to make sure that the built-in object properties are not
// overridden or used as an attack vector.
//
if (Object.create) {
Events.prototype = Object.create(null);
//
// This hack is needed because the `__proto__` property is still inherited in
// some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
//
if (!new Events().__proto__) prefix = false;
}
/**
* Representation of a single event listener.
*
* @param {Function} fn The listener function.
* @param {Mixed} context The context to invoke the listener with.
* @param {Boolean} [once=false] Specify if the listener is a one-time listener.
* @constructor
* @api private
*/
function EE(fn, context, once) {
this.fn = fn;
this.context = context;
this.once = once || false;
}
/**
* Minimal `EventEmitter` interface that is molded against the Node.js
* `EventEmitter` interface.
*
* @constructor
* @api public
*/
function EventEmitter() {
this._events = new Events();
this._eventsCount = 0;
}
/**
* Return an array listing the events for which the emitter has registered
* listeners.
*
* @returns {Array}
* @api public
*/
EventEmitter.prototype.eventNames = function eventNames() {
var names = [],
events,
name;
if (this._eventsCount === 0) return names;
for (name in events = this._events) {
if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
}
if (Object.getOwnPropertySymbols) {
return names.concat(Object.getOwnPropertySymbols(events));
}
return names;
};
/**
* Return the listeners registered for a given event.
*
* @param {String|Symbol} event The event name.
* @param {Boolean} exists Only check if there are listeners.
* @returns {Array|Boolean}
* @api public
*/
EventEmitter.prototype.listeners = function listeners(event, exists) {
var evt = prefix ? prefix + event : event,
available = this._events[evt];
if (exists) return !!available;
if (!available) return [];
if (available.fn) return [available.fn];
for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {
ee[i] = available[i].fn;
}
return ee;
};
/**
* Calls each of the listeners registered for a given event.
*
* @param {String|Symbol} event The event name.
* @returns {Boolean} `true` if the event had listeners, else `false`.
* @api public
*/
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
var evt = prefix ? prefix + event : event;
if (!this._events[evt]) return false;
var listeners = this._events[evt],
len = arguments.length,
args,
i;
if (listeners.fn) {
if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
switch (len) {
case 1:
return listeners.fn.call(listeners.context), true;
case 2:
return listeners.fn.call(listeners.context, a1), true;
case 3:
return listeners.fn.call(listeners.context, a1, a2), true;
case 4:
return listeners.fn.call(listeners.context, a1, a2, a3), true;
case 5:
return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
case 6:
return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
}
for (i = 1, args = new Array(len - 1); i < len; i++) {
args[i - 1] = arguments[i];
}
listeners.fn.apply(listeners.context, args);
} else {
var length = listeners.length,
j;
for (i = 0; i < length; i++) {
if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
switch (len) {
case 1:
listeners[i].fn.call(listene