UNPKG

node-sprite-generator

Version:

Generates image sprites and their spritesheets (css, stylus, sass, scss or less) from sets of images. Supports retina sprites. Provides express middleware and grunt task.

82 lines (67 loc) 2.09 kB
'use strict'; var _ = require('underscore'), async = require('async'), Jimp = require('jimp'), filterMap = { none: Jimp.PNG_FILTER_NONE, sub: Jimp.PNG_FILTER_SUB, up: Jimp.PNG_FILTER_UP, average: Jimp.PNG_FILTER_AVERAGE, paeth: Jimp.PNG_FILTER_PAETH, all: Jimp.PNG_FILTER_AUTO }; function readImage(path, callback) { new Jimp(path, function (err) { if (err) { return callback(err); } callback(err, { path: path, width: this.bitmap.width, height: this.bitmap.height, data: this }); }); } function readImages(filePaths, callback) { async.mapLimit(filePaths, 80, readImage, function (err, result) { if (err) { return callback(err); } // NOTE: async.mapLimit() apparently does not guarantee output order will match input order. // Restore the expected order before executing callback. callback(null, _(filePaths).map(function(filePath) { return _(result).findWhere({ path: filePath }); })); }); } function filterToParam(filter) { return filterMap[filter]; } function renderSprite(layout, filePath, options, callback) { var defaults = { compressionLevel: 6, filter: 'all' }; options = _.extend({}, defaults, options); new Jimp(layout.width, layout.height, function (err) { var composed = this; if (err) { return callback(err); } _(layout.images).each(function (image) { var imageToDraw = image.data.resize(image.width, image.height); composed.composite(imageToDraw, image.x, image.y); }); composed.deflateLevel(options.compressionLevel); composed.filterType(filterToParam(options.filter)); composed.write(filePath, function (writeError) { callback(writeError); }); }); } module.exports = { readImages: readImages, render: renderSprite, filterToParam: filterToParam };