From e185d6219ee3e0623ad16c84e659ead6dbe5d669 Mon Sep 17 00:00:00 2001 From: hsjoihs | sozysozbot Date: Mon, 4 Dec 2023 00:34:13 +0900 Subject: [PATCH] =?UTF-8?q?=E5=85=A5=E5=8A=9B=E5=86=85=E5=AE=B9=E9=87=8F?= =?UTF-8?q?=E3=81=AB=E5=BF=9C=E3=81=98=E3=81=A6=E6=A8=AA=E5=B9=85=E3=81=8C?= =?UTF-8?q?=E5=A4=89=E3=82=8F=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 60 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/index.html b/index.html index 1275fd6..8696e76 100644 --- a/index.html +++ b/index.html @@ -21,7 +21,8 @@

燐字領収書

]
- +

@@ -42,6 +43,17 @@

燐字領収書

{ name: "斥銭", price: -500 }, ]; + async function loadFont() { + const LinzklarRounded = new FontFace( + 'LinzklarRounded', + 'url(https://yasusho.github.io/linmarn_font_project/fonts/rounded/linzklar_rounded.woff)' + ); + await LinzklarRounded.load(); + document.fonts.add(LinzklarRounded); + console.log('Font loaded'); + document.body.classList.add("fonts-loaded"); + } + /* * 「サイズ」を基準とした方眼の上に字を書いていく。 * 縦書きしたとき、一番右の行が行番号 0 となる。 @@ -52,42 +64,42 @@

燐字領収書

* そうでなくて、「終了位置」が指定されているならば、 * 「行番号と終了位置が交差する位置」が、文字列全体を囲う枠の右下の角となるように文字を置いていく。 */ - function generate_image(content) { + async function generate_image(content) { const canvas = document.getElementById("main_canvas"); const ctx = canvas.getContext("2d"); const MARGIN_RIGHT = 31; const MARGIN_TOP = 20; const SIZE_FACTOR = 91 / 2; - const LinzklarRounded = new FontFace('LinzklarRounded', 'url(https://yasusho.github.io/linmarn_font_project/fonts/rounded/linzklar_rounded.woff)'); + const MARGIN_LEFT = 140; + + canvas.width = MARGIN_LEFT + MARGIN_RIGHT + Math.max(...content.map(o => o.サイズ + o.行番号)) * SIZE_FACTOR; - LinzklarRounded.load().then(function (font) { - document.fonts.add(font); - console.log('Font loaded'); - ctx.font = "91px LinzklarRounded"; - ctx.textAlign = "right"; - ctx.textBaseline = "top"; + await loadFont(); - content.forEach(o => { - const font_size = o.サイズ * SIZE_FACTOR; - ctx.font = `${font_size}px LinzklarRounded`; + ctx.textAlign = "right"; + ctx.textBaseline = "top"; - if (o.開始位置 != null && o.終了位置 != null) { - alert("開始位置と終了位置を両方指定することはできません"); - throw new Error("開始位置と終了位置を両方指定することはできません"); - } + content.forEach(o => { + const font_size = o.サイズ * SIZE_FACTOR; + ctx.font = `${font_size}px LinzklarRounded`; - const 開始位置 = o.開始位置 ?? o.終了位置 - o.サイズ * o.内容.length; + if (o.開始位置 != null && o.終了位置 != null) { + alert("開始位置と終了位置を両方指定することはできません"); + throw new Error("開始位置と終了位置を両方指定することはできません"); + } - [...o.内容].map((char, ind) => { - ctx.fillText( - char, - 1181 - MARGIN_RIGHT - SIZE_FACTOR * o.行番号, - MARGIN_TOP + font_size * ind + SIZE_FACTOR * 開始位置 - ); - }); + const 開始位置 = o.開始位置 ?? o.終了位置 - o.サイズ * o.内容.length; + + [...o.内容].map((char, ind) => { + ctx.fillText( + char, + canvas.width - MARGIN_RIGHT - SIZE_FACTOR * o.行番号, + MARGIN_TOP + font_size * ind + SIZE_FACTOR * 開始位置 + ); }); }); + } function download_image() {