var BOB_mod_gm = require('gm').subClass({ imageMagick: true }); var BOB_mod_async = require('async'); var BOB_mod_path = require('path'); var BOB_mod_fs = require('fs'); var BOB_mod_mkdirp = require('mkdirp'); var BOB_cfg_config = null; var BOB_module = {}; BOB_module.getBoothList = function(pFrom, pCallback) { BOB_mod_fs.readdir(BOB_cfg_config.paths.final, function(pErr, pBoothList) { var boothList = pBoothList ? pBoothList.sort() : []; boothList = boothList.splice(boothList.indexOf(pFrom) + 1); pCallback(pErr, boothList); }) } BOB_module.buildBooth = function(pBoothId, pCallback) { // Create output prebuild directory BOB_mod_mkdirp.sync(BOB_mod_path.join(BOB_cfg_config.paths.prebuilt, pBoothId)); // Resize pictures BOB_mod_async.mapSeries(BOB_cfg_config.pictNames, function(pPictName, pCb) { var srcPict = BOB_mod_path.join(BOB_cfg_config.paths.original, pBoothId, pPictName); var dstPict = BOB_mod_path.join(BOB_cfg_config.paths.prebuilt, pBoothId, pPictName); console.log("Resizing "+dstPict); BOB_mod_gm(srcPict) .autoOrient() .gravity('Center') .resize(BOB_cfg_config.cropSize.width, BOB_cfg_config.cropSize.height, "^") .crop(BOB_cfg_config.cropSize.width, BOB_cfg_config.cropSize.height) // .modulate(100, 0) // .contrast(+2) .write(dstPict, function(pErr) { if(pErr) console.log("Failed to resize picture", pErr) pCb() }) }, function(pErr) { console.log("Building booth") switch(BOB_cfg_config.style) { default : BOB_generateBooth(pBoothId, 'default', pCallback); } }) } function BOB_generateBooth(pBoothId, pType, pCallback) { var prebuiltPath = BOB_mod_path.join(BOB_cfg_config.paths.prebuilt, pBoothId); var finalPict = BOB_mod_path.join(BOB_cfg_config.paths.final, pBoothId+".jpg"); var finalLdPict = BOB_mod_path.join(BOB_cfg_config.paths.final_ld, pBoothId+".jpg"); var outPict = BOB_mod_gm(BOB_cfg_config.booths[pType].template); var printedDate = new Date(parseInt(pBoothId)); outPict.fill(BOB_cfg_config.background); outPict.drawRectangle(0, 0, BOB_cfg_config.booths[pType].resolution.width, BOB_cfg_config.booths[pType].resolution.height); outPict.draw('image Over 0,2080 1600,300 \''+BOB_cfg_config.footer+'\''); BOB_cfg_config.pictNames.forEach(function(pPictName, pIndex) { var cmdDraw = 'image Over'; cmdDraw += ' '+BOB_cfg_config.booths[pType].layout[pIndex].x; cmdDraw += ','+BOB_cfg_config.booths[pType].layout[pIndex].y; cmdDraw += ' '+BOB_cfg_config.booths[pType].layout[pIndex].width; cmdDraw += ','+BOB_cfg_config.booths[pType].layout[pIndex].height; cmdDraw += ' \''+BOB_mod_path.join(prebuiltPath, pPictName)+'\''; console.log(cmdDraw); outPict.draw(cmdDraw); }) outPict.fill("#666"); outPict.pointSize(20); outPict.draw('text 1250,2350 "'+printedDate.toUTCString()+'"'); outPict.write(finalPict, function (pErr) { if( pErr ) { console.log("Write outfile") console.log(pErr) pCallback(pErr); } else { BOB_mod_gm(finalPict) .resize(600, null) .write(finalLdPict, function(pErr) { pCallback(pErr); }) } }); } module.exports = function(pConfig) { BOB_cfg_config = pConfig; BOB_updateConfig(); return BOB_module; } function BOB_updateConfig() { BOB_mod_fs.readdir(BOB_cfg_config.paths.template, function(pErr, pFiles) { if( pErr ) { console.log("BOB_updateConfig", "Path:", BOB_cfg_config.paths.template, pErr); } else { BOB_mod_async.map(pFiles, function(pFile, pCb) { // Get name of template var boothName = pFile.split('.')[0]; // Init layouts object for the template BOB_cfg_config.booths[boothName] = { name : boothName, template : BOB_mod_path.join(BOB_cfg_config.paths.template, pFile), resolution : { width : 0, height : 0 }, layout : [] }; // Get reslution of current template BOB_mod_gm(BOB_cfg_config.booths[boothName].template).size(function(pErr, pValue){ if( pErr ) { console.log("[ERROR] Get template size", pErr); } else { BOB_cfg_config.booths[boothName].resolution = pValue; BOB_generatePictLayout(boothName); } pCb(); }) }, function(pErr) { }) } }) } function BOB_generatePictLayout(pBoothName) { var index = 0; var marginX = 20; var marginY = 20; var pictWidth = ( BOB_cfg_config.booths[pBoothName].resolution.width - 3 * marginX ) / 2; var pictHeight = parseInt(pictWidth * BOB_cfg_config.cropSize.height / BOB_cfg_config.cropSize.width); BOB_cfg_config.pictNames.forEach(function(pPictName, pIndex) { BOB_cfg_config.booths[pBoothName].layout.push({ x : marginX + (marginX + pictWidth) * ( pIndex % 2 ), y : marginY + (marginY + pictHeight) * parseInt( pIndex / 2 ), width : pictWidth, height : pictHeight }) }) console.log("INIT DONE"); }