window.onload = function(){ var seed = { x: (2147483648 * Math.random()) | 0, y: (2147483648 * Math.random()) | 0, z: (2147483648 * Math.random()) | 0, w: (2147483648 * Math.random()) | 0 }; function randomInt(xors) { var t = xors.x ^ (xors.x << 11); xors.x = xors.y; xors.y = xors.z; xors.z = xors.w; return xors.w = (xors.w^(xors.w>>>19))^(t^(t>>>8)); } function random(xors) { return randomInt(xors) / 2147483648; } function shuffle(xs){ var v = Object.assign({}, seed); var xs = xs.slice(); var ys = []; while(0 < xs.length){ var i = Math.abs(randomInt(v)) % xs.length; ys.push(xs[i]); xs.splice(i, 1); } return ys; } var colorTuples = shuffle([ ["#16ae67", "#90c31f"], ["#ea5421", "#f39800"], ["#00ac8e", "#e4007f"], ["#227fc4", "#00a1e9"], ["#9fa0a0", "#c9caca"], ["#e60013", "#f39800"], ["#c3d600", "#a42e8c"] ]); var topColors = shuffle(["#04ad8f", "#a6ce48", "#f3a118", "#ea6435", "#17b297", "#e30983", "#2782c4", "#1aa6e7", "#b5b5b5", "#f29905", "#e50011", "#ccdc26", "#a5328d", "#0aaa60", "#91c423", "#f29300", "#ec5f69", "#22b69e", "#e63e9b", "#917220"]); var topInput = document.querySelector("#top"); var middleInput = document.querySelector("#middle"); var bottomInput = document.querySelector("#bottom"); var top = document.querySelector(".top"); var middle = document.querySelector(".middle"); var bottom = document.querySelector(".bottom"); var foreground = document.getElementById("foreground"); var image = document.getElementById("result"); var container = document.querySelector(".container"); var download = document.getElementById("download"); var canvas = document.createElement("canvas"); var g = canvas.getContext("2d"); function update(){ setTimeout(function(){ setText(topInput.value, middleInput.value, bottomInput.value); }); } middleInput.addEventListener("change", update); middleInput.addEventListener("keydown", update); topInput.addEventListener("change", update); topInput.addEventListener("keydown", update); bottomInput.addEventListener("change", update); bottomInput.addEventListener("keydown", update); function setText(topText, middleText, bottomText){ var topTextSize = 30; var topMiddlePadding = 30; var middleTextSize = 120; var middleBottomPadding = 20; var bottomTextSize = 30; var margin = 60; var bottomTextLetterSpacing = 20; var topTextFont = `normal bold ${topTextSize}px/2 "Yu Mincho"`; var middleTextFont = `normal 400 ${middleTextSize}px/2 japarifont`; var bottomTextFont = `normal 400 ${bottomTextSize}px/2 PlayBold`; // resize canvas g.font = topTextFont; var topMetrics = g.measureText(topText); g.font = middleTextFont; var middleMetrics = g.measureText(middleText); g.font = bottomTextFont; var bottomMetrics = g.measureText(bottomText); canvas.width = margin + Math.max( topMetrics.width, middleMetrics.width, bottomMetrics.width + bottomTextLetterSpacing * (bottomText.length - 1) ) + margin; canvas.height = margin + topTextSize + topMiddlePadding + middleTextSize + middleBottomPadding + bottomTextSize + margin; // prepare canvas g.save(); g.clearRect(0, 0, canvas.width, canvas.height); g.textBaseline = "top"; // stroke top text function iterate(callback){ var xors = Object.assign({}, seed); g.save(); g.font = topTextFont; g.fillStyle = "white"; g.strokeStyle = "white"; g.lineJoin = "round"; g.lineWidth = 10.0; var metrics = g.measureText(topText); g.translate(margin + (canvas.width - metrics.width - margin * 2) * 0.5, margin); var x = 0; for(var i = 0; i < topText.length; i++){ var c = topText.slice(i, i + 1); var rot = random(xors) * 0.2; var metrics = g.measureText(c); g.save(); g.translate(metrics.width * 0.5, topTextSize * 0.5); g.rotate(rot); g.translate(-metrics.width * 0.5, -topTextSize * 0.5); callback(i, c); g.restore(); g.translate(metrics.width, 0); } g.restore(); } g.save(); var xors = Object.assign({}, seed); var topColors = ["#04ad8f", "#a6ce48", "#f3a118", "#ea6435", "#17b297", "#e30983", "#2782c4", "#1aa6e7", "#b5b5b5", "#f29905", "#e50011", "#ccdc26", "#a5328d", "#0aaa60", "#91c423", "#f29300", "#ec5f69", "#22b69e", "#e63e9b", "#917220"]; iterate(function(i, c){ g.shadowColor = "transparent"; g.strokeText(c, 0, 0); }); iterate(function(i, c){ g.shadowColor = "rgba(0, 0, 0, 0.3)"; g.shadowBlur = 10; g.fillStyle = topColors[i % topColors.length]; g.fillText(c, 0, 0); }); // centerize var metrics = g.measureText(middleText); g.translate((canvas.width - middleMetrics.width) * 0.5, margin + topTextSize + topMiddlePadding); // stroke outline g.font = middleTextFont; g.strokeStyle = "white"; g.lineWidth = 20.0; g.shadowColor = "rgba(0, 0, 0, 0.3)"; g.shadowBlur = 10; g.lineCap = "round"; g.lineJoin = "round"; g.strokeText(middleText, 0, 0); // fill charactors var x = 0; var xors = Object.assign({}, seed); for(var i = 0; i < middleText.length; i++){ var c = middleText.slice(i, i + 1); // base color g.shadowColor = "rgba(0, 0, 0, 0.6)"; g.shadowBlur = 10; g.fillStyle = colorTuples[i % colorTuples.length][0]; g.fillText(c, 0, 0); g.save(); // clip var rot = random(xors); g.beginPath(); g.save(); g.translate(middleTextSize * 0.5, middleTextSize * 0.5); g.rotate(rot); g.translate(-middleTextSize * 0.5, -middleTextSize * 0.5); g.moveTo(-middleTextSize * 2, middleTextSize * 0.5); g.lineTo(middleTextSize * 2, middleTextSize * 0.5); g.lineTo(middleTextSize * 2, middleTextSize * 2); g.lineTo(-middleTextSize * 2, middleTextSize * 2); g.closePath(); g.restore(); g.clip(); // upper color g.shadowColor = "none"; g.shadowBlur = 0; g.fillStyle = colorTuples[i % colorTuples.length][1]; g.fillText(c, 0, 0); g.restore(); // go to next var metrics = g.measureText(c); g.translate(metrics.width, 0); } g.restore(); // bottom text g.save(); g.strokeStyle = "white"; g.fillStyle = "#977a2d"; g.lineWidth = 13.0; g.lineCap = "round"; g.lineJoin = "round"; g.textBaseline = "top"; g.font = bottomTextFont; var metrics = g.measureText(bottomText); g.translate( (canvas.width - metrics.width - (bottomText.length - 1) * bottomTextLetterSpacing) * 0.5, margin + topTextSize + topMiddlePadding + middleTextSize + middleBottomPadding ); for(var i = 0; i < bottomText.length; i++){ var c = bottomText.slice(i, i + 1); g.shadowColor = "rgba(0, 0, 0, 0.3)"; g.shadowBlur = 10; g.strokeText(c, 0, 0); g.shadowColor = "transparent"; g.fillText(c, 0, 0); var metrics = g.measureText(c); g.translate(metrics.width + bottomTextLetterSpacing, 0); } g.restore(); var url = canvas.toDataURL(); image.src = url; download.href = url; } topInput.value = "女の子の姿になった動物たちが繰り広げる大冒険!"; middleInput.value = "けものフレンズ"; bottomInput.value = "KEMONO FRIENDS"; update(); download.addEventListener("click", function(){ canvas.toBlob(function(blob) { saveAs(blob, middleInput.value + ".png"); }); }); };