43 lines
1.8 KiB
JavaScript
43 lines
1.8 KiB
JavaScript
const { spawn } = require('child_process');
|
|
const crypto = require('crypto');
|
|
const fs = require('fs');
|
|
const { Card } = require('../models');
|
|
|
|
//TODO: Handle missing images
|
|
module.exports = {
|
|
name: "Compositing",
|
|
renderProfile: async function(profile, svgTemplate, renderedCards) {
|
|
let hash = crypto.createHash('md5').update(JSON.stringify(profile)).digest('hex');
|
|
|
|
let outFile = `/app/assets/image_cache/profiles/${hash}.gif`;
|
|
console.log('Rendering profile to ' + outFile);
|
|
|
|
//composite {overlay} {background} [{mask}] [-compose {method}] {result}
|
|
let args = ['svg:-', 'null:',
|
|
'\(', `${renderedCards[0]}`, '-coalesce', '\)',
|
|
'-geometry', '+25+85', '-compose', 'over', '-layers', 'composite',
|
|
'null:', '\(', `${renderedCards[1]}`, '-coalesce', '-resize', '170x283', '\)',
|
|
'-geometry', '+350+300', '-compose', 'over', '-layers', 'composite',
|
|
'null:', '\(', `${renderedCards[2]}`, '-coalesce', '-resize', '170x283', '\)',
|
|
'-geometry', '+535+300', '-compose', 'over', '-layers', 'composite',
|
|
'null:', '\(', `${renderedCards[3]}`, '-coalesce', '-resize', '170x283', '\)',
|
|
'-geometry', '+720+300', '-compose', 'over', '-layers', 'composite',
|
|
'-layers', 'optimize', outFile];
|
|
|
|
console.log('GM Args: ' + args);
|
|
|
|
const composite = spawn('convert', args);
|
|
composite.stdin.write(svgTemplate);
|
|
composite.stdin.end();
|
|
|
|
composite.stderr.on('data', (data) => {
|
|
console.log(`stdout: ${data}`);
|
|
});
|
|
const exitCode = await new Promise( (resolve, reject) => {
|
|
composite.on('close', resolve);
|
|
})
|
|
|
|
return outFile;
|
|
}
|
|
}
|