Source: apc-static/task/worker/generate_theme_startup_image_files.js

/**
 * Generate theme startup image files.
 * @function task.worker.generateThemeFaviconFiles
 * @param {object} config - Task configuration
 * @param {string} config.destDir - Destination directory.
 * @param {number} [config.count=12] - Number of favicons to generate.
 * @param {function} callback - Callback when done.
 * @author Taka Okunishi
 */

var path = require('path'),
    util = require('util'),
    format = util.format,
    lib = require('../../lib'),
    image = lib.image,
    array = lib.array,
    file = lib.file,
    mkdirP = file.mkdirP,
    debug = require('./_debug'),
    shuffled = array.shuffled,
    _themeNameForIndex = require('./_theme_name_for_index'),
    text2image = image.text2image,
    apeman = require('apeman'),
    _randomColor = require('./_random_color'),
    _randomFont = require('./_random_font');

exports = module.exports = function (config, callback) {
    var destDir = path.resolve(config.destDir),
        current = apeman.current,
        appName = current.meta().name,
        count = config.count || 12,
        fontSize = 48,
        sizesFile = current.lookup('task/data/startup-images-sizes-data.js'),
        sizes = require(sizesFile);
    mkdirP(destDir, function (err) {
        if (err) {
            callback(err);
            return;
        }
        require('async').series(
            exports._startupImageData(sizes, fontSize, count)
                .map(function (imageData, i) {
                    return imageData.map(function (imageData) {
                        return {
                            imageData: imageData,
                            themeName: _themeNameForIndex(i)
                        }
                    });
                })
                .reduce(function (a, b) {
                    return [].concat(a).concat(b);
                }, [])
                .map(function (data) {
                    var imageData = data.imageData,
                        width = imageData.width,
                        height = imageData.height,
                        themeName = data.themeName;
                    return function (callback) {
                        var dest = path.resolve(destDir, exports._nameStartupImageFile(themeName, width, height));
                        text2image(
                            appName,
                            dest,
                            imageData,
                            function (err) {
                                if (!err) {
                                    debug.didCreateFile(dest);
                                }
                                setTimeout(function () {
                                    callback(err);
                                }, 1);
                            }
                        )
                    }
                }),
            function (err) {
                callback(err);
            }
        );
    });
};

exports._nameStartupImageFile = function (themeName, width, height) {
    return format('apple-touch-startup-image-theme-%s-%sx%s.png', themeName, width, height);
};

exports._startupImageData = function (sizes, fontSize, count) {
    var result = [];
    for (var i = 0; i < count; i++) {
        (function () {
            var fontFile = _randomFont().filename,
                themeColor = _randomColor();
                var colors = [ themeColor, '#FFF'].sort(function () {
                    return Math.random() - Math.random();
                });
            result.push(
                sizes.map(function (size) {
                    return {
                        backgroundColor: colors[0],
                        width: size.width,
                        height: size.height,
                        fontSize: fontSize,
                        color: colors[1],
                        fontFile: fontFile
                    };
                })
            );
        })();
    }
    return result;
};