assets9-im
Version:
Generate icons and splash screens for cordova / meteor apps. (with ImageMagick)
171 lines (121 loc) • 4.38 kB
JavaScript
let fs = require('fs')
let gm = require('gm').subClass({imageMagick: true})
//let sharp = require( 'sharp' )
let patch9 = require( './patch9' )
let loop = require( './loop' )
let folder = '.'
let icons = [
{name:"iphone_2x", size: "120x120"},
{name: "iphone_3x", size: "180x180"},
{name: "ipad", size: "76x76"},
{name: "ipad_2x", size: "152x152"},
{name: "ipad_pro", size: "167x167"},
{name: "ios_settings", size: "29x29"},
{name: "ios_settings_2x", size: "58x58"},
{name: "ios_settings_3x", size: "87x87"},
{name: "ios_spotlight", size: "40x40"},
{name: "ios_spotlight_2x", size: "80x80"},
{name: "android_mdpi", size: "48x48"},
{name: "android_hdpi", size: "72x72"},
{name: "android_xhdpi", size: "96x96"},
{name: "android_xxhdpi", size: "144x144"},
{name: "android_xxxhdpi", size: "192x192"}
]
let splashes = [
{"name":"iphone_2x","size":"640x960"},
{"name":"iphone5","size":"640x1136"},
{"name":"iphone6","size":"750x1334"},
{"name":"iphone6p_portrait","size":"1242x2208"},
{"name":"iphone6p_landscape","size":"2208x1242"},
{"name":"ipad_portrait","size":"768x1024"},
{"name":"ipad_portrait_2x","size":"1536x2048"},
{"name":"ipad_landscape","size":"1024x768"},
{"name":"ipad_landscape_2x","size":"2048x1536"},
{"name":"android_mdpi_portrait","size":"320x470"},
{"name":"android_mdpi_landscape","size":"470x320"},
{"name":"android_hdpi_portrait","size":"480x640"},
{"name":"android_hdpi_landscape","size":"640x480"},
{"name":"android_xhdpi_portrait","size":"720x960"},
{"name":"android_xhdpi_landscape","size":"960x720"},
{"name":"android_xxhdpi_portrait","size":"1080x1440"},
{"name":"android_xxhdpi_landscape","size":"1440x1080"}
]
function getSize( image ){
let sizes = image.size.split('x');
return {
width: parseInt(sizes[0]),
height: parseInt(sizes[1])
}
}
// source file, target directory, image profile
function resize( source , target , image , done ){
let size = getSize(image)
let name = image.name
let filename = target + name + '.png'
gm( source ).resize( size.width , size.height ).write( filename , function(error){
//sharp( source ).resize( size.width , size.height ).gamma(3).toFile( filename , function(error){
if( error ){
console.log( 'ERROR writing (resize)' , error )
} else {
done()
}
} )
}
function crop( source , target , image , done ){
let size = getSize(image)
let name = image.name
let filename = target + name + '.png'
// square up so that it cuts off as little as possible
let span = ( size.height > size.width ? size.height : size.width );
// calculate x and y offset
let xOffset = (span/2) - (size.width/2);
let yOffset = (span/2) - (size.height/2);
gm( source ).resize( span , span ).crop( size.width , size.height , xOffset , yOffset ).write( filename , function(error){
//sharp( source ).resize( span , span ).embed().resize( size.width , size.height ).crop().toFile( filename , function(error){
if( error ){
console.log( 'ERROR writing (crop)' , error )
} else {
// create 9 patch png for android
if( name.indexOf( 'android' ) >= 0 ){
patch9( filename , function(){
// delete non 9 patch png
fs.unlink( filename );
done()
} )
} else {
done()
}
}
})
}
function showMeteorConfig(){
console.log( 'App.icons({' );
icons.forEach(function(icon,index) {
console.log( "\t'" + icon.name + "': '" + folder + "/icons/" + icon.name + ".png'" + (index<icons.length-1?',':'') + " // " + icon.size );
});
console.log( '});' );
console.log( 'App.launchScreens({' );
splashes.forEach(function(splash,index) {
console.log( "\t'" + splash.name + "': '" + folder + "/splashes/" + splash.name + (splash.name.indexOf('android')>=0?'.9':'') + ".png'" + (index<splashes.length-1?',':'') + " // " + splash.size );
});
console.log( '});' );
}
if(!fs.existsSync( folder + '/icons')) {
fs.mkdirSync( folder + '/icons');
}
if(!fs.existsSync( folder + '/splashes')) {
fs.mkdirSync( folder + '/splashes');
}
// loop around icons
loop( icons , function(icon,index,list,done){
resize( folder + '/icon.png', folder + '/icons/', icon , done )
} , function(){
// loop around splash screens
loop( splashes , function(splash,index,list,done){
crop( folder + '/splash.png', folder + '/splashes/', splash , done )
} , function(){
showMeteorConfig()
})
} )