From bf2584ca8c102ea142181d8a8013f63af4cc89ac Mon Sep 17 00:00:00 2001 From: CBenni Date: Mon, 11 Dec 2017 16:43:28 +0100 Subject: [PATCH] Added santa hat, refactored drawing --- SantaHat.png | Bin 0 -> 30324 bytes index.js | 108 +++++++++++++++++++++++++++++---------------------- 2 files changed, 61 insertions(+), 47 deletions(-) create mode 100644 SantaHat.png diff --git a/SantaHat.png b/SantaHat.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ef780c2719071e15e061510f483868a39a7a7c GIT binary patch literal 30324 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 literal 0 HcmV?d00001 diff --git a/index.js b/index.js index 1e2c448..f58b2fc 100644 --- a/index.js +++ b/index.js @@ -12,20 +12,7 @@ var config = require("./config"); var cache = {}; -templates = { - bee: { - template: "./BeeTemplate.png", - leftOffset: 475, - widthTarget: 600, - bottomTarget: 530 - }, - turtle: { - template: "./TurtleTemplate.png", - leftOffset: 210, - widthTarget: 150, - bottomTarget: 150 - } -} +templates = config.templates; for(templateName in templates) { const data = templates[templateName]; @@ -33,6 +20,14 @@ for(templateName in templates) { data.image.src = data.template; } +// drawing: we keep the image fixed in its default position and draw the template on top/below it + +// calculates the x or y position of the template to be drawn +// size = width or height of the template/image +// anchor = the corresponding anchor config +function calculatePosition(scale, anchor, imageSize) { + return imageSize * anchor.position / 100 - anchor.offset * scale; +} function render(template, img, size) { var width = img.width; @@ -46,45 +41,65 @@ function render(template, img, size) { if (!size.height) height = height * size.width / img.width; } - const templateScale = width / template.widthTarget; // scale the template to fit the image + const xScale = width / template.anchor.x.size; + const yScale = width / template.anchor.y.size; + const templateScale = Math.min(xScale || 1, yScale || 1); + let templateOffsetX = calculatePosition(templateScale, template.anchor.x, width); + let templateOffsetY = calculatePosition(templateScale, template.anchor.y, height); - let resultingWidth = template.image.width * templateScale; - let resultingHeight = template.image.height * templateScale; + let imageOffsetX = 0; + let imageOffsetY = 0; + let resultingWidth = width; // start with the image boundaries as defined by the image + let resultingHeight = height; - let imgTop = template.bottomTarget * templateScale - height; // naive top center position - - if (imgTop < 0) { - resultingHeight -= imgTop; - imgTop = 0; + if(templateOffsetX < 0) { + resultingWidth -= templateOffsetX; + imageOffsetX = -templateOffsetX; + templateOffsetX = 0; + } + if(templateOffsetY < 0) { + resultingHeight -= templateOffsetY; + imageOffsetY = -templateOffsetY; + templateOffsetY = 0; + } + if(template.image.width * templateScale > resultingWidth) { + resultingWidth = template.image.width * templateScale; + } + if(template.image.height * templateScale > resultingHeight) { + resultingHeight = template.image.height * templateScale; } - const resultingImgTop = imgTop; - const resultingImgLeft = template.leftOffset * templateScale - width / 2.0; - - if(resultingImgLeft + width > resultingWidth) { - resultingWidth = resultingImgLeft + width; - } - - const resultingTemplateTop = resultingHeight - template.image.height * templateScale; - const resultingTemplateLeft = 0.0; + const toDraw = [{ + z: 1, + image: img, + x: imageOffsetX, + y: imageOffsetY, + h: height, + w: width, + name: "image" + }, { + z: template.z || 0, + image: template.image, + x: templateOffsetX, + y: templateOffsetY, + h: template.image.height * templateScale, + w: template.image.width * templateScale, + name: "template "+template.template + }].sort((u,v) => u.z > v.z); var canvas = new Canvas(resultingWidth, resultingHeight); var ctx = canvas.getContext("2d"); - console.log("Drawing template "+template.template) - try { - ctx.drawImage(template.image, resultingTemplateLeft, resultingTemplateTop, template.image.width * templateScale, template.image.height * templateScale); - console.log("Drawing done.") - } catch (err) { - throw new Error(JSON.stringify({ status: 400, error: "Invalid template" })) - } - console.log("Drawing image") - try { - ctx.drawImage(img, resultingImgLeft, resultingImgTop, width, height); - console.log("Drawing done.") - } catch (err) { - console.error(err); - throw new Error(JSON.stringify({ status: 400, error: "Invalid image" })) + + for(let i=0;i/g.exec(str) if (discordEmote) {