2021-01-03 20:16:48 -08:00
|
|
|
const { createCanvas, loadImage } = require("canvas");
|
|
|
|
|
|
2021-01-03 21:58:19 -08:00
|
|
|
async function renderOutfitImage(layerRefs, size) {
|
|
|
|
|
const canvas = createCanvas(size, size);
|
2021-01-03 20:16:48 -08:00
|
|
|
const ctx = canvas.getContext("2d");
|
|
|
|
|
|
2021-01-03 21:58:19 -08:00
|
|
|
const images = await Promise.all(layerRefs.map(loadImageAndSkipOnFailure));
|
|
|
|
|
const loadedImages = images.filter((image) => image);
|
|
|
|
|
for (const image of loadedImages) {
|
|
|
|
|
ctx.drawImage(image, 0, 0, size, size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
image: canvas.toBuffer(),
|
|
|
|
|
status:
|
|
|
|
|
loadedImages.length === layerRefs.length ? "success" : "partial-failure",
|
|
|
|
|
};
|
|
|
|
|
}
|
2021-01-03 20:16:48 -08:00
|
|
|
|
2021-01-03 21:58:19 -08:00
|
|
|
async function loadImageAndSkipOnFailure(url) {
|
|
|
|
|
try {
|
|
|
|
|
const image = await loadImage(url);
|
|
|
|
|
return image;
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.warn(`Error loading layer, skipping: ${e.message}. (${url})`);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2021-01-03 19:57:02 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = { renderOutfitImage };
|