Source: gfx/utils/index.js

const Texture = require('../core/textures/Texture');
const { Rectangle } = require('../core/math');
const loader = require('engine/loader');

/**
 * Get texture instance from data.
 * @memberof module:engine/gfx/utils
 * @param {String|Array|Texture} data   Key of the texture.
 * @return {Texture|undefined} Texture instance of `undefined`
 */
function textureFromData(data) {
  if (!data) {
    return undefined;
  }
  else if (typeof(data) === 'string') {
    return loader.resources[data].texture;
  }
  else if (Array.isArray(data)) {
    return loader.resources[data[0]].textures[data[1]];
  }
  else if (data.hasOwnProperty('baseTexture')) {
    return data;
  }
}

/**
 * Create textures for tiles in a tileset. Can also be used to extract
 * grid based sprite-sheets.
 * @memberof module:engine/gfx/utils
 * @param  {Texture} tilesetp   Tileset texture.
 * @param  {number} tileWidth   Width of a single tile.
 * @param  {number} tileHeight  Height of a single tile.
 * @return {array<Texture>}     List of textures.
 */
function filmstrip(tilesetp, tileWidth, tileHeight) {
  var tileset = textureFromData(tilesetp);
  var strip = [];

  var w = tileset.width;
  var h = tileset.height;
  var crop = tileset.crop;

  var sheet = tileset.baseTexture;

  var cols = Math.floor(w / tileWidth);
  var rows = Math.floor(h / tileHeight);

  var q = 0, r = 0;
  for (r = 0; r < rows; r++) {
    for (q = 0; q < cols; q++) {
      strip.push(new Texture(sheet, new Rectangle(q * tileWidth + crop.x, r * tileHeight + crop.y, tileWidth, tileHeight)));
    }
  }

  return strip;
}

/**
 * Gfx utils.
 *
 * @exports engine/gfx/utils
 *
 * @requires module:engine/gfx/core/textures/Texture
 * @requires module:engine/gfx/core/math
 * @requires module:engine/loader
 */
module.exports.textureFromData = textureFromData;
module.exports.filmstrip = filmstrip;