var app = require('app'); var BrowserWindow = require('browser-window'); var argv = require('yargs').argv; var fs = require('fs'); var cp = require('child_process'); var mainWindow = null; var allWindowClosed = false; var pendingTasks = 0; var zoom = 2 function checkQuit(){ if(allWindowClosed && pendingTasks == 0) app.quit(); } app.on('window-all-closed', function() { allWindowClosed = true; checkQuit() }); function combineImages(images, outfile, width, height, background, padding){ var command = 'convert ' + images.join(' ') + ' -append -crop ' + width + 'x' + height + '+0+0 +repage -bordercolor rgb(52,52,53) -trim ' + outfile; console.log(command); cp.exec(command, function(err, stdout, stderr){ images.forEach(function(file){ fs.unlinkSync(file); }); pendingTasks -= 1; checkQuit(); }) }; var ipc = require('electron').ipcMain; function GOTO(phase){ currentPhase = phase }; var phases = { prepare : function(event, arg){ console.log(arg); GOTO(phases['receive-rect']); }, 'receive-rect' : function(event, rect){ pendingTasks += 1 rect = JSON.parse(JSON.stringify(rect)); var file = argv.dir + '/' + rect.name + '.png'; var j = 0; var totalFiles = Math.ceil(rect.height / rect.windowHeight); var pendingFiles = totalFiles; function doneFileWrite(){ pendingFiles -= 1; if(pendingFiles <= 0) { var images = []; for(var k = 0; k < j; k++){ images.push(argv.dir + '/' + rect.name + '.' + k + '.png') } combineImages(images, file, rect.windowWidth * rect.dpi, rect.height * rect.dpi, rect.background, rect.padding); } } function step(){ event.sender.send('scroll', rect.y + j * rect.windowHeight); GOTO(function(event){ mainWindow.capturePage(function(image){ fs.writeFile(argv.dir + '/' + rect.name + '.' + j + '.png', image.toPng(), doneFileWrite); j += 1; if(j >= totalFiles) { // Move to next image event.sender.send('complete', file); GOTO(phases['receive-rect']); } else { step() } }) }) }; step() } }; var currentPhase = phases['prepare']; ipc.on('snapshot', function(){ currentPhase.apply(this, arguments) }); ipc.on('log', function(event, arg){ console.log(arg); }) app.on('ready', function() { mainWindow = new BrowserWindow({width: 64 * 16 * zoom, height: 1024 * zoom, x: 5000, y: 5000, zoomFactor: zoom}); mainWindow.loadURL('file://' + __dirname + '/index.html'); //mainWindow.hide(); });