From 5a5c23495f09e493c6f8b2de6124c9510b54f295 Mon Sep 17 00:00:00 2001 From: PMinn <40393799+PMinn@users.noreply.github.com> Date: Sat, 9 Aug 2025 23:51:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=94=B9=E5=96=84=E4=B8=AD=E6=96=87=20UI/U?= =?UTF-8?q?X?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/cglyphlist.js | 2 +- pages/fontdrawer_new.js | 1272 +++++++++++++++++++++++++++++++++++++++ pages/index.html | 501 ++++++++++----- pages/menu.css | 32 + pages/menu.js | 10 + pages/style_new.css | 252 ++++++++ 6 files changed, 1919 insertions(+), 150 deletions(-) create mode 100644 pages/fontdrawer_new.js create mode 100644 pages/menu.css create mode 100644 pages/menu.js create mode 100644 pages/style_new.css diff --git a/pages/cglyphlist.js b/pages/cglyphlist.js index a0615b9..531e2d6 100644 --- a/pages/cglyphlist.js +++ b/pages/cglyphlist.js @@ -10,7 +10,7 @@ const glyphMap = { "parenright": {"c":")","w":"P","n":"半形括號"}, "asterisk": {"c":"*","w":"P","n":"半形星號"}, "plus": {"c":"+","w":"P","n":"半形加號"}, - "comma": {"c":",","w":"P","n":"半形逗號"}, + "comma": {"c":",","w":"P","n":"半形逗號"}, "hyphen": {"c":"-","w":"P","n":"半形減號/連字號"}, "period": {"c":".","w":"P","n":"半形句點"}, "slash": {"c":"/","w":"P","n":"半形正斜線"}, diff --git a/pages/fontdrawer_new.js b/pages/fontdrawer_new.js new file mode 100644 index 0000000..1ca50ef --- /dev/null +++ b/pages/fontdrawer_new.js @@ -0,0 +1,1272 @@ +const version = '0.592'; // 版本號 +const upm = 1000; +const userAgent = navigator.userAgent.toLowerCase(); +const pressureDelta = 1.3; // 筆壓模式跟一般模式的筆寬差異倍數 (舊筆壓模式用) +const dbName = fdrawer.dbName || 'FontDrawerDB'; // 使用 fdrawer.dbName,如果未定義則使用預設值 +const storeName = 'FontData'; +const events = []; + +let db; +let settings = null; + +const brushes = []; +function addBrush(imgSrc) { + var brush = new Image(); + brush.src = 'data:image/png;base64,' + imgSrc; + brushes.push(brush); +} +addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFu2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTE6NDc6MTIrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTE6NDc6MTIrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgyMTU3OTVjLTUwZDQtNzA0NC05NDczLTliY2FiOGEyNzdlNSIgeG1wTU06RG9jdW1lbnRJRD0i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'); +addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTE6Mjg6MTYrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTE6Mjg6MTYrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCIgeG1wTU06RG9jdW1lbnRJRD0i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'); +addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTE6NTU6MDErMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTE6NTU6MDErMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU0YmZiNzZmLThmNGYtNGE0YS04OGEwLTc4MDA2NWI2ZjMwNCIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmY5ODYzOWYzLTU3YjMtZWU0Yy04OTUxLWM4MzAyYzAyNTk3YSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTRlMGFmMDYtNzIxNS0xZjQ2LWE4NmQtZTc3NTgzM2Y2YzBkIiBzdEV2dDp3aGVuPSIyMDI1LTA3LTE5VDExOjI1OjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjkyNGNkYWJlLWUxMmEtY2E0MS04YmE1LTEwODI2NmM4MzQzMiIgc3RFdnQ6d2hlbj0iMjAyNS0wNy0xOVQxMTo1NTowMSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NGJmYjc2Zi04ZjRmLTRhNGEtODhhMC03ODAwNjViNmYzMDQiIHN0RXZ0OndoZW49IjIwMjUtMDctMTlUMTE6NTU6MDErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6Ijiu+AAAKxklEQVR42u2d6U9cyRXFf73Q3ewMi8HLGLBhzGQyiRQpkUZRIuVz/uxkkoyU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'); +addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTU6MjA6NTYrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTU6MjA6NTYrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg0ODE1NjE1LTNlOTktZTU0MC05MTJkLTIzOTIyNzU2NDdmYiIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjMyNmMxZmViLWZhNTItZGI0ZC1iNmE1LWY3YTdkZmUxNTM3MiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTRlMGFmMDYtNzIxNS0xZjQ2LWE4NmQtZTc3NTgzM2Y2YzBkIiBzdEV2dDp3aGVuPSIyMDI1LTA3LTE5VDExOjI1OjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc2YWQxMWJjLTU3YzYtOWE0YS1hOTQ5LWZmMTAzMWNmNDhmNCIgc3RFdnQ6d2hlbj0iMjAyNS0wNy0xOVQxNToyMDo1NiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4NDgxNTYxNS0zZTk5LWU1NDAtOTEyZC0yMzkyMjc1NjQ3ZmIiIHN0RXZ0OndoZW49IjIwMjUtMDctMTlUMTU6MjA6NTYrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7P7eCvAAAGsklEQVR42u2dbYiUVRTHf2d2XHPzZU1N0wKtzPd8Qcoy01Cx+mJl4IcyUJI+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'); +addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTI6Mjk6MzIrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTI6Mjk6MzIrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI3ZDI3MjBiLTUzYjgtMTM0NC04MGZjLTFkY2EwMzQxMzFlNiIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmU5ZWFjMDdmLTNmMDQtYzc0NS1iYTcxLTJlNjJkY2U5NmM5YSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTRlMGFmMDYtNzIxNS0xZjQ2LWE4NmQtZTc3NTgzM2Y2YzBkIiBzdEV2dDp3aGVuPSIyMDI1LTA3LTE5VDExOjI1OjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmFiZmViNmY4LTUwNzEtNWM0Ni04YjJkLTQxODYxYzE3NGIxYSIgc3RFdnQ6d2hlbj0iMjAyNS0wNy0xOVQxMjoyOTozMiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyN2QyNzIwYi01M2I4LTEzNDQtODBmYy0xZGNhMDM0MTMxZTYiIHN0RXZ0OndoZW49IjIwMjUtMDctMTlUMTI6Mjk6MzIrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4oCt+pAAAQ7UlEQVR42u2dCXgURRbHKyQhAeQGRRBEoyI3inhwrCwKwnqh4okiAp6AriiH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'); +addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMjFUMjI6MDc6MTErMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMjFUMjI6MDc6MTErMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg3MzBkNGY3LTY4ZmEtYjE0YS1iOGU3LTI2NjhhOTA2ZjU4MSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmE2NzljNjU1LTU3NmItYmE0NS04NzhlLWQ5MGE4NTNhZjIwZSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTRlMGFmMDYtNzIxNS0xZjQ2LWE4NmQtZTc3NTgzM2Y2YzBkIiBzdEV2dDp3aGVuPSIyMDI1LTA3LTE5VDExOjI1OjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgyMTU3OTVjLTUwZDQtNzA0NC05NDczLTliY2FiOGEyNzdlNSIgc3RFdnQ6d2hlbj0iMjAyNS0wNy0xOVQxMTo0NzoxMiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4NzMwZDRmNy02OGZhLWIxNGEtYjhlNy0yNjY4YTkwNmY1ODEiIHN0RXZ0OndoZW49IjIwMjUtMDctMjFUMjI6MDc6MTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6uWwLnAAAD8UlEQVR42u3cX8ieYxwH8M/DNtMWYzP1yghZkpPNn5lJW5KccCT/QkQSIUorESf+RJGwE8RqlDAndkBJsjkgm/yZhq0l2cZsjL0z2+3gvt71WM+7533+Tdu+37p66u05uj7PfV339bt/99uoqkry/+WwTEEAApAEIABJAAKQBCAASQACkAQgAEkAApAEIABJAAKQBCAASQACkAQgAEkAApD0L+P2/kOj0ZiDadiFYXyDbeW7WzJlvae5H7exd3Nuo9FYgVMwBT9gAn7GJ1iDb/EhdheUfzKl3QOoquo/A/djB6oWYyvW4Su8iqtwFoYyrZ0B7JnvFgCTsXAUgFbjO7xW4C7FpExxbwAjuRaryhIzFojtWFuWqscxK1PdG8DhOB/LOrgaRsau8rkGD2I2jsPETP/YAZpzb9l8qy7HTryLezD3UN8zugEYV5aUF7Gh3AF1i7EGr+MOnFfusgLQBmAkR+MafN4DwMjYhpVYjBsxIwCdvbB3H9b3AaLCxoLxNBYEYOw5AQ+V03I/ILbjN3yEO8uJPABtMrlsrC+U29CdfYAYuYvajJcwJwDtc2Q5iL2xj5N0L2MlbkUjAO2zoMvzw1jGDjyH0wPQPnPx1oAgKnyMywPQPvPKGeKXAUH8igdwVABap6Eub1+ERfh+gFfFklL6CMAomYaL8TxWd1Ds63Qsx9UBGD2Tymb9TIH4c0AQa9Xl9eMDMHrOxROlTrR9QBCb8CzODsDoObX8WleXgt/uPiPsLBCLcRnGB2D0Q91NWDGgq+Fv/IQ3ceX+Xp4OBIDmzMfbA7xr+hFL1U8ATwrA6JmBJ/HXgCA24p0CceIgl6cDFaA5t/SxAtuq1LGsQEwZRO3pYABoLnUsHeDytBw3BKB9jsXDpSQxCIh16qd2jQC0zxX4YEAQX+I2dYdHANpkJp5St1U2P+TpdWzF+7hOl90dhwrASMbherxXJm+4TxAbSuFvPo7oZHk61ACaMxuPqZ+ubepTIfB3dal9ZgDGnqnqxuKXC8bmPl0Vj+LkAHSWWbi9LCdf672Z4LNSRpkegM4yHRfiLvVj1C09QGxWt++fGYDuNu0hdYl8IT7tseh3t7qjMABdZEKpCZ1TNu9VpWa0rcPSxhKcEYD+5BI8Ukogqzs8xM0PQP8yhAtwM15Rd3wM4499IKzHgub5bvWSXqa2s4xXv8wyXt1uP0/9ZO80dUvlcLk7mlTOHV9UVbWnayMAgztnTMUx6jdOZ5SC4S6sr6pqUcsdOUtQ39P8ax5pGpu4zyUo2b/JvyoIQACSAAQgCUAAkgAEIAlAAJIABCAJQACSAAQgCUAAkgAEIAlAAJIABCAJwMGVfwFk+B+8bph6jgAAAABJRU5ErkJggg=='); + +// 初始化 IndexedDB +function initDB() { + return new Promise((resolve, reject) => { + const request = indexedDB.open(dbName, 1); + + request.onupgradeneeded = function (event) { + db = event.target.result; + if (!db.objectStoreNames.contains(storeName)) { + db.createObjectStore(storeName, { keyPath: 'key' }); + } + }; + + request.onsuccess = function (event) { + db = event.target.result; + resolve(db); + }; + + request.onerror = function (event) { + reject(event.target.error); + }; + }); +} + +// 儲存資料到 IndexedDB +function saveToDB(key, value) { + return new Promise((resolve, reject) => { + const transaction = db.transaction([storeName], 'readwrite'); + const store = transaction.objectStore(storeName); + const request = store.put({ key, value }); + + request.onsuccess = function () { + resolve(); + }; + + request.onerror = function (event) { + reject(event.target.error); + }; + }); +} + +// 從 IndexedDB 讀取資料 +function loadFromDB(key, defaultValue = null) { + return new Promise((resolve, reject) => { + const transaction = db.transaction([storeName], 'readonly'); + const store = transaction.objectStore(storeName); + const request = store.get(key); + + request.onsuccess = function (event) { + resolve(event.target.result ? event.target.result.value : defaultValue); + }; + + request.onerror = function (event) { + reject(event.target.error); + }; + }); +} + +function countGlyphFromDB() { + return new Promise((resolve, reject) => { + const transaction = db.transaction([storeName], 'readonly'); + const store = transaction.objectStore(storeName); + const cursorRequest = store.openCursor(); + + let count = 0; + cursorRequest.onsuccess = function (event) { + const cursor = event.target.result; + if (cursor) { + if (cursor.key.startsWith('g_')) count++; + cursor.continue(); + } else { + resolve(count); // 當游標完成時,返回計數 + } + }; + + cursorRequest.onerror = function (event) { + reject(event.target.error); + }; + }); +} + +// 刪除 IndexedDB 中的資料 +function deleteFromDB(key) { + return new Promise((resolve, reject) => { + const transaction = db.transaction([storeName], 'readwrite'); + const store = transaction.objectStore(storeName); + const request = store.delete(key); + + request.onsuccess = function () { + resolve(); + }; + + request.onerror = function (event) { + reject(event.target.error); + }; + }); +} + +// 清除 IndexedDB +function clearDB() { + return new Promise((resolve, reject) => { + const transaction = db.transaction([storeName], 'readwrite'); + const store = transaction.objectStore(storeName); + const request = store.clear(); + + request.onsuccess = function () { + resolve(); + }; + + request.onerror = function (event) { + reject(event.target.error); + }; + }); +} + +// 讀取設定 +async function loadSettings() { + const settings = { + notNewFlag: await loadFromDB('notNewFlag', 'N') == 'Y', // 是否為舊檔案,預設為 N + scaleRate: await loadFromDB('scaleRate', 100) * 1, // 縮放比例,預設為 100% + smallMode: await loadFromDB('smallMode', 'N') == 'Y', // 是否小字模式,預設為 N + lineWidth: await loadFromDB('lineWidth', 12) * 1, // 筆寬,預設為 12 + brushType: await loadFromDB('brushType', 0) * 1, // 筆刷類型,預設為 0 + pressureMode: await loadFromDB('pressureMode', 'N') == 'Y', // 筆壓模式,預設為 N + pressureEffect: await loadFromDB('pressureEffect', 'none'), // 筆壓公式,預設為 none + gridType: await loadFromDB('gridType', '3x3grid'), // 格線類型,預設為 3x3grid + oldPressureMode: await loadFromDB('oldPressureMode', 'N') == 'Y', // 啟用舊版筆壓模式,預設為 N + fontNameEng: await loadFromDB('fontNameEng') || 'MyFreehandFont', + fontNameCJK: await loadFromDB('fontNameCJK') || fdrawer.fontNameCJK, + noFixedWidthFlag: await loadFromDB('noFixedWidthFlag', 'N') == 'Y', // 比例寬輸出,預設為 N + saveAsTester: await loadFromDB('saveAsTester', 'Y') == 'Y', // 是否為測試輸出,預設為 Y + testSerialNo: await loadFromDB('testSerialNo', 1) * 1, // 測試輸出序號,預設為 1 + customGlyphs: await loadFromDB('customGlyphs') // 自定義文字 + }; + + if (settings.customGlyphs && settings.customGlyphs != '') { // 如果有自定義文字,則添加到列表中 + var cglist = settings.customGlyphs.split(/,/); + glyphList[fdrawer.customList] = []; + for (var i = 0; i < cglist.length; i++) { + glyphList[fdrawer.customList].push(cglist[i]); + var uni = parseInt(cglist[i].replace(/^u(ni)?/g, ''), 16); + glyphMap[cglist[i]] = { c: String.fromCodePoint(uni), w: 'F' }; // 將自定義文字添加到映射中 + } + } + + console.log('Settings loaded:', settings); + + return settings; +} + +async function updateSetting(key, value) { + if (settings == null) settings = await loadSettings(); + if (typeof (value) != 'undefined') settings[key] = value; + if (typeof (settings[key]) == 'boolean') { + //console.log(`Updating setting ${key} to ${settings[key] ? 'Y' : 'N'}`); + await saveToDB(key, settings[key] ? 'Y' : 'N'); // 將布林值轉換為 'Y' 或 'N' + } else { + //console.log(`Updating setting ${key} to ${settings[key]}`); + await saveToDB(key, settings[key]); + } +} + +// 初始化 +async function initCanvas(canvas) { + canvas.addEventListener('touchstart', (e) => e.preventDefault(), { passive: false }); + canvas.addEventListener('touchmove', (e) => e.preventDefault(), { passive: false }); + + var scale = parseInt(settings.scaleRate, 10) / 100; // 轉換為小數 + + // 繪製底圖 + const gridCanvas = document.getElementById('gridCanvas'); + const gridCtx = gridCanvas.getContext('2d'); + gridCtx.clearRect(0, 0, gridCanvas.width, gridCanvas.height); + + const emWidth = gridCanvas.width / scale; // 字身框寬度 + const emHeight = gridCanvas.height / scale; // 字身框高度 + const gridXOff = (gridCanvas.width - emWidth) / 2; // X 軸偏移量 + const gridYOff = (gridCanvas.height - emHeight) / 2; // X 軸偏移量 + + //const gridWidth = Math.round(gridCanvas.width / scale / 3); // 每格寬度 + //const gridHeight = Math.round(gridCanvas.height / scale / 3); // 每格高度 + + gridCtx.strokeStyle = '#cccccc'; + gridCtx.lineWidth = 1; + + // 繪製格線 + let lines = 1; + + // 字身框 + gridCtx.beginPath(); + gridCtx.rect(gridXOff, gridYOff, emWidth, emHeight); + gridCtx.stroke(); + + if (settings.gridType == '3x3grid') lines = 3; + else if (settings.gridType == '3x3grid-new') lines = 4; + else if (settings.gridType == '2x2grid') lines = 2; + else if (settings.gridType == 'stargrid') lines = 2; + + for (let i = 1; i < lines; i++) { + if (settings.gridType == '3x3grid-new' && i == 2) continue; // 跳過新 3x3 格線的中間線 + + gridCtx.beginPath(); + gridCtx.moveTo(gridXOff + emWidth * i / lines, gridYOff); + gridCtx.lineTo(gridXOff + emWidth * i / lines, gridYOff + emHeight); + gridCtx.stroke(); + + gridCtx.beginPath(); + gridCtx.moveTo(gridXOff, gridYOff + emHeight * i / lines); + gridCtx.lineTo(gridXOff + emWidth, gridYOff + emHeight * i / lines); + gridCtx.stroke(); + } + + if (settings.gridType == 'stargrid') { + gridCtx.beginPath(); + gridCtx.moveTo(gridXOff, gridYOff); + gridCtx.lineTo(gridXOff + emWidth, gridYOff + emHeight); + gridCtx.stroke(); + gridCtx.beginPath(); + gridCtx.moveTo(gridXOff + emWidth, gridYOff); + gridCtx.lineTo(gridXOff, gridYOff + emHeight); + gridCtx.stroke(); + } else if (settings.gridType == 'boxgrid') { + gridCtx.beginPath(); + gridCtx.rect(gridXOff + emWidth * 0.15, gridYOff + emHeight * 0.15, emWidth * 0.7, emHeight * 0.7); + gridCtx.stroke(); + } + + if (settings.gridType == 'boxgrid' || settings.gridType == 'nogrid') { + let boxLen = 15; + gridCtx.beginPath(); + gridCtx.moveTo(gridXOff - boxLen, gridYOff + emHeight * 0.5); + gridCtx.lineTo(gridXOff + boxLen, gridYOff + emHeight * 0.5); + gridCtx.stroke(); + gridCtx.beginPath(); + gridCtx.moveTo(gridXOff + emWidth - boxLen, gridYOff + emHeight * 0.5); + gridCtx.lineTo(gridXOff + emWidth + boxLen, gridYOff + emHeight * 0.5); + gridCtx.stroke(); + gridCtx.beginPath(); + gridCtx.moveTo(gridXOff + emWidth * 0.5, gridYOff - boxLen); + gridCtx.lineTo(gridXOff + emWidth * 0.5, gridYOff + boxLen); + gridCtx.stroke(); + gridCtx.beginPath(); + gridCtx.moveTo(gridXOff + emWidth * 0.5, gridYOff + emHeight - boxLen); + gridCtx.lineTo(gridXOff + emWidth * 0.5, gridYOff + emHeight + boxLen); + gridCtx.stroke(); + } + + // 繪製基線 + gridCtx.strokeStyle = '#ee9999'; // 基線顏色 + gridCtx.beginPath(); + gridCtx.moveTo(0, gridYOff + emHeight * 0.75); + gridCtx.lineTo(gridCanvas.width, gridYOff + emHeight * 0.75); + gridCtx.stroke(); + + // 依照設定值顯示筆寬、筆刷、筆壓UI + $('#lineWidthSelect').val(settings.lineWidth); + $('#brushSelector').empty().append($(brushes[settings.brushType])); + if (settings.pressureMode) { + $('#pressureSwitch').prop('checked', true); + } else { + $('#pressureSwitch').prop('checked', false); + } +} + +function initListSelect($listSelect) { + $listSelect.empty(); // 清空選單 + for (var list in glyphList) { + $listSelect.append( + $('').val(list).text(list) + ); + } +} + +async function createFont(glyphs, gidMap, verts, ccmps) { + if (settings.saveAsTester) { + settings.fontNameEng += settings.testSerialNo; + settings.fontNameCJK += settings.testSerialNo; + updateSetting('testSerialNo', settings.testSerialNo + 1); // 更新測試序號 + } + + const font = new opentype.Font({ + familyName: settings.fontNameEng, + fullName: settings.fontNameEng, + postScriptName: settings.fontNameEng.replace(/[^a-zA-Z0-9]/g, ''), // 去除特殊字符 + styleName: 'Regular', + designer: 'zi-hi.com', + designerURL: 'https://zi-hi.com', + manufacturer: 'zi-hi.com', + manufacturerURL: 'https://zi-hi.com', + + unitsPerEm: upm, + ascender: 880, + descender: -120, + glyphs: glyphs + }); + + for (var group in font.names) { + font.names[group].fontFamily[fdrawer.fontLang] = settings.fontNameCJK; + font.names[group].fullName[fdrawer.fontLang] = settings.fontNameCJK; + } + + font.tables.os2.achVendID = 'ZIHI'; + font.tables.os2.ulCodePageRange1 = fdrawer.codePage; // CodePage + font.tables.os2.usWinAscent = 920; // Windows ascent + font.tables.os2.usWinDescent = 200; // Windows ascent + font.tables.os2.xAvgCharWidth = upm; + + // ccmps + for (let i in ccmps) { + var gname_to = ccmps[i]; + var allpass = true; + var subfrom = []; + for (let i in glyphMap[gname_to].s) { + var gname_from = glyphMap[gname_to].s[i]; + if (!gidMap[gname_from]) allpass = false; + subfrom.push(gidMap[gname_from]); + } + if (!allpass) continue; + font.substitution.addLigature('ccmp', { sub: subfrom, by: gidMap[gname_to] }); + } + + // verts + for (let i in verts) { + var gname_v = verts[i]; + var gname_h = glyphMap[gname_v].v; + if (!gidMap[gname_v]) continue; // 如果沒有對應的 cid,則跳過 + if (!gidMap[gname_h]) continue; // 如果沒有對應的 cid,則跳過 + font.substitution.addSingle('vert', { sub: gidMap[gname_h], by: gidMap[gname_v] }); + } + + return font; +} + +$(document).ready(async function () { + const $listSelect = $('#listSelect'); + + const $canvas = $('#drawingCanvas'); + const canvas = $canvas[0]; + const ctx = canvas.getContext('2d'); + let ratio = canvas.height / $canvas.height(); + let isDrawing = false; + const undoStack = []; // 儲存畫布狀態的堆疊 + const $naviContainer = $('#navi-container'); + const $progressContainer = $('#progress-container'); + const $progressBar = $('#progress-bar'); + const $progressText = $('#progress-text'); + const download_container = document.getElementById('download_container'); + const settings_container = document.getElementById('settings_container'); + const settings_containerr_modal = new bootstrap.Modal(settings_container); + const hint_container = document.getElementById('hint_container'); + const listup_container = document.getElementById('listup_container'); + const listup_container_modal = new bootstrap.Modal(listup_container); + + // 初始化 IndexedDB + initDB().then(async () => { + console.log('IndexedDB 起動完成'); + settings = await loadSettings(); + initListSelect($listSelect); + initCanvas(canvas); // 初始化九宮格底圖 + $('#canvas-container').toggleClass('smallmode', settings.smallMode); + + $listSelect.change(); // 觸發一次 change 事件以載入第一個列表 + + // 初始化筆壓繪圖狀態 + await updatePressureDrawingStatus(); + + if (!settings.notNewFlag) { + settings_containerr_modal.show(); + } else { + if ($('#ads-container')) $('#ads-container').show(); + } + $('#spanDoneCount').text(await countGlyphFromDB()); + + $('#smallModeCheck').prop('checked', settings.smallMode); + var scale = settings.scaleRate; // 預設縮放比例為 100% + $('#scaleRateSlider').val(scale); + $('#scaleRateValue').text(scale + '%'); + $('#pressureEffectSelect').val(settings.pressureEffect); + $('#pressureDrawingEnabled').prop('checked', settings.oldPressureMode); + $('#gridTypeSelect').val(settings.gridType); + + }).catch((error) => { + console.error('IndexedDB 起動失敗', error); + }); + + // (舊筆壓模式) 初始化 PressureDrawing 實例 + const pressureDrawing = new PressureDrawing(); + //let pressureDrawingEnabled = false; + let pressureDrawingSettings = { + thinning: 0.5, + smoothing: 0.4, + streamline: 0.4 + }; + + // (舊筆壓模式) 更新筆壓繪圖狀態 + async function updatePressureDrawingStatus() { + const moduleInitialized = await pressureDrawing.initialize(); + + // 預設關閉筆壓繪圖 + settings.oldPressureMode = settings.oldPressureMode && moduleInitialized; + $('#brushSelector').toggle(!settings.oldPressureMode); // 如果舊筆壓繪圖啟用,則隱藏筆刷選擇器 + $('#pressureSwitchContainer').toggle(!settings.oldPressureMode); // 如果舊筆壓繪圖啟用,則隱藏筆壓開關 + } + + let nowList = null; + let nowGlyphIndex = null; + let nowGlyph = null; + + // 切換列表 + $listSelect.on('change', function () { + const selectedValue = $(this).val(); + if (selectedValue) { + nowList = glyphList[selectedValue]; + nowGlyphIndex = 0; // 重置當前字形索引 + setGlyph(0); + } + }); //.change(); // 觸發一次 change 事件以載入第一個列表 + + // 設定編輯中的字符 + function setGlyph(index) { + if (!nowList) return; + if (index < 0) index = nowList.length - 1; // 如果索引小於0,則設為最後一個字符 + if (index >= nowList.length) index = 0; // 如果索引大於字符數量,則設為第一個字符 + nowGlyphIndex = index; + nowGlyph = nowList[index]; // 取得當前字符的名稱 + + $('#glyphName').text(nowGlyph); // 更新顯示的字符 + $('#charSeq').text(glyphMap[nowGlyph].c).removeClass('vert'); + if (glyphMap[nowGlyph].v && nowGlyph.indexOf('.vert') > 0) $('#charSeq').addClass('vert'); + + $('#glyphNote').text(glyphMap[nowGlyph].n || ''); + + // 載入之前的畫布內容 + undoStack.length = 0; // 清空復原堆疊 + ctx.clearRect(0, 0, canvas.width, canvas.height); + loadCanvasData(nowGlyph); + + // 重置筆壓檢測狀態 + if (settings.oldPressureMode) { + pressureDrawing.resetPressureDetection(); + } + } + + var svgTimers = {}; // 用於控制 SVG 儲存的定時器 + + async function saveSVG(glyph, pngData) { + const svgData = await toSVG(glyph, pngData); + + if (svgData && svgData != '') { + await saveToDB('s_' + glyph, svgData); + } else { // 轉外框後才發現是空白的話,連同png一起清掉 + await deleteFromDB('g_' + glyph); + await deleteFromDB('s_' + glyph); + } + + $('#spanDoneCount').text(await countGlyphFromDB()); + } + + // 儲存畫布的功能 + async function saveToLocalDB(runNow = false) { + let saveGlyph = nowGlyph; // 嘗試解決非同步操作導致的 Race Condition + const pngData = canvas.toDataURL(); + await saveToDB('g_' + saveGlyph, pngData); + + if (svgTimers[saveGlyph]) clearTimeout(svgTimers[saveGlyph]); // 清除之前的定時器 + + if (runNow) { // 如果立即儲存 + await saveSVG(saveGlyph, pngData); // 儲存 SVG + } else { // 延遲儲存 + svgTimers[saveGlyph] = setTimeout(async function () { // 延遲轉外框 + saveSVG(saveGlyph, pngData); // 儲存 SVG + }, 1200); + } + } + + // 修改讀取畫布的功能 + async function loadCanvasData(glyph) { + const savedCanvas = await loadFromDB('g_' + glyph); + if (savedCanvas) { + const img = new Image(); + img.src = savedCanvas; + img.onload = function () { + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(img, 0, 0); + }; + } + } + + $('#prevButton').on('click', function () { setGlyph(nowGlyphIndex - 1); }); // 切換到上一個字符 + $('#nextButton').on('click', function () { setGlyph(nowGlyphIndex + 1); }); // 切換到下一個字符 + + $('#findButton').on('click', function () { + var char = prompt(fdrawer.findMsg); + if (!char) return; // 如果沒有輸入字符,則不進行任何操作 + char = char.trim(); // 去除前後空白 + if (char.length === 0) return; + + var breakFlag = false; + for (let i in glyphList) { + for (let j in glyphList[i]) { + if (glyphMap[glyphList[i][j]].c == char) { + nowList = glyphList[i]; + $listSelect.val(i); // 更新下拉選單的值 + setGlyph(j * 1); + breakFlag = true; + break; + } + } + if (breakFlag) break; + } + + // 找不到的話詢問要不要新增這個字 + if (!breakFlag) { + if (char.length == (char.codePointAt(0) < 65536 ? 1 : 2)) { + if (confirm(fdrawer.notFound + '\n' + fdrawer.confirmAdd)) { + var uni = char.codePointAt(0).toString(16).toUpperCase(); + var gn = uni.length <= 4 ? 'uni' + uni.padStart(4, '0') : 'u' + uni; // 生成 Unicode 名稱 + var chr = String.fromCodePoint(char.codePointAt(0)); + + if (!glyphList[fdrawer.customList]) { + glyphList[fdrawer.customList] = []; + initListSelect($listSelect); // 重新初始化下拉選單 + } + glyphList[fdrawer.customList].push(gn); // 將新字符添加到自定義列表 + glyphMap[gn] = { c: chr, w: 'F' }; // 將自定義文字添加到映射中 + updateSetting('customGlyphs', glyphList[fdrawer.customList].join(',')); // 儲存自定義字符 + + nowList = glyphList[fdrawer.customList]; + $listSelect.val(fdrawer.customList); // 更新下拉選單的值 + setGlyph(glyphList[fdrawer.customList].length - 1); + } + } else { + alert(fdrawer.notFound); + } + } + }); + + // 更新筆寬 + $('#lineWidthSelect').change(function () { + settings.lineWidth = parseInt($(this).val(), 10); + updateSetting('lineWidth'); // 儲存筆寬到 Local Storage + }); + + // 切換筆刷 + $('#brushSelector').on('click', function () { + settings.brushType++; + if (settings.brushType >= brushes.length) settings.brushType = 0; + + updateSetting('brushType'); // 儲存筆刷類型 + $('#brushSelector').empty().append($(brushes[settings.brushType])); + }); + + // 切換筆壓 + $('#pressureSwitch').on('click', function () { + settings.pressureMode = !settings.pressureMode; + updateSetting('pressureMode'); + }); + + // 切換畫筆與橡皮擦模式 + $('#penButton').on('click', function () { + $('#penButton').addClass('btn-primary'); + $('#penButton').removeClass('btn-light'); + $('#eraserButton').addClass('btn-light'); + $('#eraserButton').removeClass('btn-primary'); + eraseMode = false; + }); + $('#eraserButton').on('click', function () { + $('#eraserButton').addClass('btn-primary'); + $('#eraserButton').removeClass('btn-light'); + $('#penButton').addClass('btn-light'); + $('#penButton').removeClass('btn-primary'); + eraseMode = true; // 切換到橡皮擦模式 + }); + + let hasPointerEvent = false; // 這個筆畫是否有pointer事件 + let hasRealPressure = false; // 這個筆畫是否曾經有疑似真實的筆壓值 + let simulatePressure = false; // 模擬筆壓開關 + let lastPressure = 0.5; // 上一次的筆壓值 + + function getPressureValue(mode, event, x, y) { + if (!settings.pressureMode) return 0.5; + + let eventType = event.type; + if (mode == 'move' && hasPointerEvent && !eventType.includes('pointer')) return null; // 如果曾經有pointer事件,則只接受pointer事件 + + let toolType = event.originalEvent.pointerType; + let pressure = event.originalEvent.pressure; + let touchForce = event.originalEvent.touches && event.originalEvent.touches.length > 0 ? event.originalEvent.touches[0].force : null; + let webkitForce = event.originalEvent.webkitForce !== undefined ? event.originalEvent.webkitForce : null; + + if (mode == 'start') { + if (events.length > 1000) events.splice(0, events.length - 200); + if (eventType.includes('pointer')) hasPointerEvent = true; // 這個筆畫有pointer事件 + } else if (mode == 'end') { + simulatePressure = false; + hasTouchEvent = false; + hasRealPressure = false; + hasPointerEvent = false; + } + + events.push(`${mode} - ${eventType} / ${toolType} / P:${pressure} / T:${touchForce} / W:${webkitForce}`); // 儲存事件資訊 + //console.log(`${eventType} / ${toolType} / P:${pressure} / T:${touchForce} / W:${webkitForce}`); // 儲存事件資訊 + + let isRealPressure = typeof (pressure) != 'undefined'; + if (isRealPressure && toolType != 'pen' && pressure == 0) isRealPressure = false; + if (isRealPressure && toolType != 'pen' && !hasRealPressure && (pressure == 1 || pressure == 0.5)) isRealPressure = false; + if (toolType == 'pen' && pressure < 0.01) return null; + if (mode != 'start' && !simulatePressure && !isRealPressure) return null; + + if (isRealPressure) { + simulatePressure = false; // 如果移動中發現有真實筆壓值,則關閉模擬筆壓 + if (pressure > 0 && pressure < 1 && pressure != 0.5) hasRealPressure = true; // 出現過看似真實的筆壓值 + + // 真實筆壓值套用敏感度運算 + if (settings.pressureEffect == 'contrast') pressure = 0.5 + Math.sin((pressure * 0.9 - 0.45) * Math.PI) / 2; + if (settings.pressureEffect == 'enhance') pressure = Math.sin(pressure * Math.PI / 2); + if (settings.pressureEffect == 'enhancex') pressure = Math.sin(Math.sin(pressure * Math.PI / 2) * Math.PI / 2); + + if (mode != 'start') pressure = (lastPressure + pressure) / 2; + return lastPressure = pressure; + + } else if (mode == 'start') { + simulatePressure = true; // 如果開始繪製時沒有真實筆壓值,則開啟模擬筆壓 + return 0.5; + + } else { //if (simulatePressure && lastX && lastY) { + let distance = Math.sqrt(Math.pow(x - lastX, 2) + Math.pow(y - lastY, 2)); + let speedFactor = Math.min(1, 5 / Math.max(distance, 1)); + pressure = (lastPressure * 3 + speedFactor * 0.65 + 0.05) / 4; + return lastPressure = pressure; + } + } + + // 儲存背景用於筆壓繪圖的即時預覽 + let backgroundImageData = null; + let lastX, lastY, lastLW, isMoved = false; + var eraseMode = false; + + function drawBrush(ctx, brush, x, y, lw) { + if (userAgent.includes('macintosh') && userAgent.includes('safari') && !userAgent.includes('chrome')) { + // 在 Mac Safari 上使用臨時 canvas 繪製,避免直接繪圖造成污垢 + // 不知道為什麼我的Mac-Safari直接繪圖會很髒,只好建立一個臨時的畫筆 canvas + // 但這會造成Android上很慢,所以只在Mac-Safari上使用 + const brushCanvas = document.createElement('canvas'); + brushCanvas.width = lw; + brushCanvas.height = lw; + const brushCtx = brushCanvas.getContext('2d'); + brushCtx.drawImage(brush, 0, 0, lw, lw); + + ctx.drawImage(brushCanvas, x - lw / 2, y - lw / 2); + } else { + // 其他瀏覽器直接繪製 + ctx.drawImage(brush, x - lw / 2, y - lw / 2, lw + 1, lw + 1); + } + } + + // 開始繪製 + $canvas.on('mousedown touchstart pointerdown', function (event) { + if (event.touches && event.touches.length === 2) { + if (isDrawing) $('#undoButton').trigger('click'); // 先撤銷掉目前的筆劃 + isDrawing = false; + return; + } + + if (isDrawing && !event.type.includes('pointer')) return; + + const { x, y } = getCanvasCoordinates(event); + var pressureVal = getPressureValue('start', event, x, y); + ratio = canvas.height / $canvas.height(); // 筆畫開始時重新確認一次螢幕縮放比(因為有可能調過視窗大小等) + + var png = canvas.toDataURL(); + if (!isDrawing && png != undoStack[undoStack.length - 1]) undoStack.push(png); // 儲存當前畫布狀態到 undoStack + isDrawing = true; // 儲存畫布後正式宣告筆畫開始 + if (svgTimers[nowGlyph]) clearTimeout(svgTimers[nowGlyph]); // 停止SVG轉外框 (提高效能) + + if (settings.oldPressureMode) { // 舊筆壓模式 + const pressure = pressureDrawing.simulatePressure(event.originalEvent, 'start'); + pressureDrawing.startStroke(x * ratio, y * ratio, pressure); + backgroundImageData = ctx.getImageData(0, 0, canvas.width, canvas.height); // 儲存背景圖像用於即時預覽 + + // 防止預設的觸控行為(如滾動) + event.preventDefault(); + + } else { // 筆刷模式 + var lw = settings.lineWidth * pressureVal * 2; // 計算線寬 + ctx.globalCompositeOperation = eraseMode ? "destination-out" : "source-over"; // 如果是橡皮擦模式,則使用 destination-out,否則使用 source-over + //if (event.type.includes('pointer')) + //drawBrush(ctx, brushes[settings.brushType], x*ratio, y*ratio, lw); + + lastX = x; // 儲存最後的 X 座標 + lastY = y; // 儲存最後的 Y 座標 + lastLW = lw; + isMoved = false; + } + }); + + // 繪製中 + $canvas.on('mousemove touchmove pointermove', function (event) { + if (!isDrawing) return; + const { x, y } = getCanvasCoordinates(event); + var pressureVal = getPressureValue('move', event, x, y); + if (settings.pressureMode && pressureVal == null) return; // 筆壓模式必須要有筆壓值 + + if (settings.oldPressureMode) { // 舊筆壓模式 + // 使用筆壓繪圖系統:收集點並提供即時預覽 + const pressure = pressureDrawing.simulatePressure(event.originalEvent, 'move'); + pressureDrawing.addPoint(x * ratio, y * ratio, pressure); + + // 生成即時預覽筆跡 + pressureDrawingSettings.size = settings.lineWidth * pressureDelta; + const previewStroke = pressureDrawing.createPreviewStroke(pressureDrawingSettings); + if (previewStroke && backgroundImageData) { + ctx.putImageData(backgroundImageData, 0, 0); // 恢復背景圖像 + pressureDrawing.drawStrokeOnCanvas(ctx, previewStroke, eraseMode); // 繪製預覽筆跡 + } + + // 防止預設的觸控行為 + event.preventDefault(); + + } else { + ctx.globalCompositeOperation = eraseMode ? "destination-out" : "source-over"; // 如果是橡皮擦模式,則使用 destination-out,否則使用 source-over + + var lw = settings.lineWidth * pressureVal * 2; + + var d = Math.max(Math.abs(lastX - x), Math.abs(lastY - y)) * 1.5; + if (d > 40) events.push(`Long-DrawImage / ${pressureVal} / ${event.originalEvent.pointerType} / ${x}, ${y}, ${lw} (${lastX}, ${lastY}, ${lastLW}) ${d}`); // 儲存事件資訊 + if (d > 0) { + for (var t = d; t > 0; t--) { + var tx = (lastX + (x - lastX) * t / d) * ratio; + var ty = (lastY + (y - lastY) * t / d) * ratio; + var tlw = lastLW + (lw - lastLW) * t / d; // 線寬漸變 + + drawBrush(ctx, brushes[settings.brushType], tx, ty, tlw); + } + events.push(`Move-DrawImage / ${pressureVal} / ${event.originalEvent.pointerType} / ${x}, ${y}, ${lw} (${lastX}, ${lastY}, ${lastLW}) ${d}`); // 儲存事件資訊 + } + + lastX = x; // 更新最後的 X 座標 + lastY = y; // 更新最後的 Y 座標 + lastLW = lw; // 更新最後的筆寬 + isMoved = true; + } + }); + + // 停止繪製 + $canvas.on('mouseup mouseleave touchend pointerup pointerleave', function (event) { + if (!isDrawing) return; + isDrawing = false; + const { x, y } = getCanvasCoordinates(event); + getPressureValue('end', event, x, y); + + if (settings.oldPressureMode) { // 舊筆壓模式 + // 使用筆壓繪圖系統:生成最終筆跡並繪製 + pressureDrawingSettings.size = settings.lineWidth * pressureDelta; + const finalStroke = pressureDrawing.finishStroke(pressureDrawingSettings); + if (finalStroke && finalStroke.length > 0) { + if (backgroundImageData) ctx.putImageData(backgroundImageData, 0, 0); // 恢復背景圖像(如果有的話) + pressureDrawing.drawStrokeOnCanvas(ctx, finalStroke, eraseMode); // 繪製最終筆跡 + } + + // 清除背景圖像數據 + backgroundImageData = null; + } else { + if (!isMoved) { + ctx.globalCompositeOperation = eraseMode ? "destination-out" : "source-over"; // 如果是橡皮擦模式,則使用 destination-out,否則使用 source-over + drawBrush(ctx, brushes[settings.brushType], lastX * ratio, lastY * ratio, lastLW); + } + + lastX = null; + lastY = null; + lastLW = null; + isMoved = false; // 重置移動狀態 + } + + ctx.globalCompositeOperation = "source-over"; // 恢復正常繪圖模式(重要) + + saveToLocalDB(); // 停止繪製時儲存畫布內容到 Local Storage + }); + + // 復原功能 + $('#undoButton').on('click', function () { + if (undoStack.length > 0) { + const lastState = undoStack.pop(); + const img = new Image(); + img.src = lastState; + img.onload = function () { + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(img, 0, 0); + saveToLocalDB(); // 復原後更新 Local Storage + }; + } + }); + + // 雙指復原 + let undoTouchTime = null; + $(document).on('touchstart', function (event) { + if (event.touches.length === 2) { + undoTouchTime = new Date().getTime(); // 記錄雙指觸控的時間 + } + }).on('touchend', function (event) { + if (undoTouchTime && new Date().getTime() - undoTouchTime < 250) { // 如果雙指觸控時間夠短 + $('#undoButton').trigger('click'); + undoTouchTime = null; + } + }); + + // 清除畫布的功能 + $('#clearButton').on('click', async function () { + const savedCanvas = await loadFromDB('g_' + nowGlyph); + if (!savedCanvas) return; // 如果沒有儲存的畫布,則不進行任何操作 + undoStack.push(canvas.toDataURL()); // 儲存當前畫布狀態到 undoStack + ctx.clearRect(0, 0, canvas.width, canvas.height); + + //undoStack.length = 0; // 清空復原堆疊 + await deleteFromDB('g_' + nowGlyph); // 清除 IndexedDB 中的資料 + await deleteFromDB('s_' + nowGlyph); // 清除 IndexedDB 中的資料 + }); + + async function moveGlyph(xoff, yoff) { + const savedCanvas = await loadFromDB('g_' + nowGlyph); + if (!savedCanvas) return; // 如果沒有儲存的畫布,則不進行任何操作 + undoStack.push(canvas.toDataURL()); // 儲存當前畫布狀態到 undoStack + + const img = new Image(); + img.src = savedCanvas; + img.onload = function () { + ctx.clearRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(img, xoff, yoff); + saveToLocalDB(); // 更新 Local Storage + }; + } + + $('#moveLeftButton').on('click', function () { moveGlyph(-10, 0); }); // 向左移動 10px + $('#moveRightButton').on('click', function () { moveGlyph(10, 0); }); // 向右移動 10px + $('#moveUpButton').on('click', function () { moveGlyph(0, -10); }); // 向上移動 10px + $('#moveDownButton').on('click', function () { moveGlyph(0, 10); }); // 向下移動 10px + + // 支援鍵盤方向鍵操作 + $(document).on('keydown', function (event) { + switch (event.key) { + case 'ArrowLeft': // 左方向鍵 + moveGlyph(-10, 0); + break; + case 'ArrowRight': // 右方向鍵 + moveGlyph(10, 0); + break; + case 'ArrowUp': // 上方向鍵 + moveGlyph(0, -10); + break; + case 'ArrowDown': // 下方向鍵 + moveGlyph(0, 10); + break; + case 'z': // Z 鍵 - 復原 + $('#undoButton').trigger('click'); + break; + case 'v': // V 鍵 - 畫筆 + $('#penButton').trigger('click'); + break; + case 'c': // V 鍵 - 橡皮擦 + $('#eraserButton').trigger('click'); + break; + case 'x': // X 鍵 - 清除 + $('#clearButton').trigger('click'); + break; + case 'b': // B 鍵 - 切換筆刷 + $('#brushSelector').trigger('click'); + break; + case 'n': // N 鍵 - 切換筆壓 + $('#pressureSwitch').trigger('click'); + break; + case 'PageDown': // PageDown 鍵 - 下一步 + case ']': // "]" 鍵 - 下一步 + $('#nextButton').trigger('click'); + break; + case 'PageUp': // PageUp 鍵 - 上一步 + case '[': // "]" 鍵 - 下一步 + $('#prevButton').trigger('click'); + break; + case 'Enter': // Enter 鍵 - 下一步 / 同時按shift - 上一步 + case ' ': // Space 鍵 - 下一步 / 同時按shift - 上一步 + $(event.shiftKey ? '#prevButton' : '#nextButton').trigger('click'); + break; + } + }); + + // 更新進度條 + function updateProgress(current, total) { + const percentage = Math.round((current / total) * 100); + $progressBar.val(percentage); + $progressText.text(`${percentage}%`); + } + + async function toSVG(gname, savedCanvas) { + // 建立一個臨時的 canvas + const tempCanvas = document.createElement('canvas'); + const tempCtx = tempCanvas.getContext('2d'); + tempCanvas.width = 500; + tempCanvas.height = 500; + + tempCtx.fillStyle = 'white'; + tempCtx.fillRect(0, 0, tempCanvas.width, tempCanvas.height); + const img = new Image(); + img.src = savedCanvas; + return new Promise((resolve) => { + img.onload = function () { + tempCtx.drawImage(img, 0, 0); + + // 使用 potrace.js 將臨時 canvas 轉換為 SVG + Potrace.loadImageFromUrl(tempCanvas.toDataURL('image/png')); + Potrace.setParameter({ + turdSize: 100, // 減少雜訊 + opttolerance: 0.5, // 調整優化容差 + }); + Potrace.process(function () { + var svgData = Potrace.getSVG(2); // 取得 SVG 資料 + svgData = svgData.replace(/^.+path d="/, '').replace(/".+$/, ''); + resolve(svgData); + }); + }; + }); + } + + async function loadSVG(gname) { + var savedSvg = await loadFromDB('s_' + gname); + if (savedSvg) return savedSvg; // 如果已經存在 SVG,則直接返回 + + var savedCanvas = await loadFromDB('g_' + gname); + if (!savedCanvas) return null; + var svgData = toSVG(gname, savedCanvas); // 如果不存在 SVG,則儲存並返回新的 SVG + await saveToDB('s_' + gname, svgData); + return svgData; + } + + function createGlyph(unicode, gname, adw, path) { + var glyphObj = { + name: gname, + advanceWidth: adw, + path: path || new opentype.Path() + }; + if (unicode) glyphObj.unicode = unicode; + return new opentype.Glyph(glyphObj); + } + + function padPath(path, pad) { + var boundingBox = path.getBoundingBox(); + var width = Math.round(boundingBox.x2 - boundingBox.x1); + var xoff = pad - Math.round(boundingBox.x1); // 單純指定邊界寬度 + + path.commands.forEach(c => { + c.x = c.x + xoff; + if (c.x1) c.x1 = c.x1 + xoff; + if (c.x2) c.x2 = c.x2 + xoff; + }); + return width + pad * 2; // 返回調整後的寬度 + } + + $('#saveAsTester').on('click', async function () { + updateSetting('saveAsTester', this.checked); // 儲存是否為測試儲存 + }); + + // 儲存字型檔 + $('#downloadFontButton').on('click', async function () { + // 顯示進度條 + $naviContainer.hide(); + $progressContainer.show(); + $progressBar.val(0); + $progressText.text('0%'); + + const glyphs = [ // 建立字符陣列,並加入一些空格字符(因程式機制上無法畫出空白字符,只能自動產生) + createGlyph(null, '.notdef', 600), // notdef + createGlyph(0x20, 'space', 300), // 空格 + createGlyph(0xA0, 'uni00A0', 300), // No-break Space + createGlyph(0x2c9, 'macron', 600), // 一聲 + createGlyph(0x3000, 'uni3000', upm), // Ideographic Space + createGlyph(0x2002, 'uni2002', upm / 2), // En Space + createGlyph(0x2003, 'uni2003', upm), // Em Space + ]; + + const gidMap = {}; + const fulls = []; + const verts = []; + const ccmps = []; + + const totalGlyphs = Object.keys(glyphMap).length; // 總字符數量 + let processedGlyphs = 0; + var scale = parseInt(settings.scaleRate, 10) / 100; + var scaleoff = (upm - scale * upm) / 2; // 縮放偏移量 + + for (let gname in glyphMap) { + // 更新進度條 + updateProgress(processedGlyphs, totalGlyphs); + processedGlyphs++; + + try { + let svgData = await loadSVG(gname); + if (!svgData) continue; + let path = await opentype.Path.fromSVG(svgData, { flipYBase: 0, scale: scale, y: 880 - scaleoff, x: scaleoff }); + + let adw = upm; + if (glyphMap[gname].w == 'P' || glyphMap[gname].w == 'H') { // 比例寬自動調整 + adw = padPath(path, 50); + } else if (settings.noFixedWidthFlag) { + adw = padPath(path, 100); + } + + let unicode = null; + if (gname.match(/^uni([0-9A-F]{4})$/i)) { + unicode = parseInt(RegExp.$1, 16); // 轉換為 Unicode 編碼 + } else if (gname.match(/^u([0-9A-F]{5})$/i)) { + unicode = parseInt(RegExp.$1, 16); // 轉換為 Unicode 編碼 + } else if (gname.indexOf('.vert') < 0 && glyphMap[gname].c.length == 1) { + unicode = glyphMap[gname].c.charCodeAt(0); // 使用字符的 Unicode 編碼 + } + let glyph = createGlyph(unicode, gname, adw, path); + glyphs.push(glyph); + gidMap[gname] = glyphs.length - 1; + + // 自動製作全形字符 + if (glyphMap[gname].f) { + let gnameF = glyphMap[gname].f; + let pathF = await opentype.Path.fromSVG(svgData, { flipYBase: 0, scale: scale, y: 880 - scaleoff, x: scaleoff }); + let adwF = upm; + if (settings.noFixedWidthFlag) adwF = padPath(pathF, 100); // 如果沒有固定寬度 + let unicodeF = null; + if (gnameF.match(/^uni([0-9A-F]{4})$/i)) unicodeF = parseInt(RegExp.$1, 16); // 轉換為 Unicode 編碼 + let glyphF = createGlyph(unicodeF, gnameF, adwF, pathF); + fulls.push(glyphF); + } + + if (glyphMap[gname].v) verts.push(gname); + if (glyphMap[gname].s) ccmps.push(gname); + } catch (err) { + console.error(`Error processing glyph ${gname}:`, err); + } + } + + // 加入全形字符在後面 + for (let i in fulls) { + var glyphF = fulls[i]; + glyphs.push(glyphF); + gidMap[glyphF.name] = glyphs.length - 1; + } + const font = await createFont(glyphs, gidMap, verts, ccmps); + + // 建立下載連結 + const link = document.createElement('a'); + link.download = font.names.windows.postScriptName.en + '.otf'; //'drawing.otf'; + link.href = window.URL.createObjectURL(new Blob([font.toArrayBuffer()]), { type: "font/opentype" }); + link.click(); + + // 隱藏進度條 + $naviContainer.show(); + $progressContainer.hide(); + }); + + // 顯示設定畫面 + function updateSettingsContainer() { + $('#settings-title').text(settings.notNewFlag ? fdrawer.settingsTitle : fdrawer.welcomeTitle); + $('#span-welcome').toggle(!settings.notNewFlag); + + $('#fontNameEng').val(settings.fontNameEng); + $('#fontNameCJK').val(settings.fontNameCJK); + $('#noFixedWidthFlag').prop('checked', settings.noFixedWidthFlag); + + if (!settings.notNewFlag) updateSetting('notNewFlag', true); // 如果是第一次使用,則設定 notNewFlag 為 true + } + settings_container.addEventListener('shown.bs.modal', updateSettingsContainer); + + $('#fontNameEng').on('change', function () { updateSetting('fontNameEng', $(this).val().replace(/[^a-zA-Z0-9 ]/g, '')); }); + $('#fontNameCJK').on('change', function () { updateSetting('fontNameCJK', $(this).val()); }); + $('#smallModeCheck').on('click', async function () { + await updateSetting('smallMode', $(this).prop('checked')); + $('#canvas-container').toggleClass('smallmode', settings.smallMode); + }); + $('#noFixedWidthFlag').on('click', function () { updateSetting('noFixedWidthFlag', $(this).prop('checked')); }); + $('#scaleRateSlider').on('input', function () { + var rate = parseInt($(this).val(), 10); + $('#scaleRateValue').text(rate + '%'); + updateSetting('scaleRate', rate); + initCanvas(canvas); + }); + $('#pressureEffectSelect').change(function () { updateSetting('pressureEffect', $(this).val()); }); + $('#gridTypeSelect').change(function () { + updateSetting('gridType', $(this).val()); + initCanvas(canvas); + }); + + // 筆壓繪圖設定事件監聽器 + $('#pressureDrawingEnabled').on('change', async function () { + updateSetting('oldPressureMode', $(this).prop('checked')); + // 立即更新筆壓繪圖狀態 + await updatePressureDrawingStatus(); + + $('#brushSelector').toggle(!settings.oldPressureMode); // 如果舊筆壓繪圖啟用,則隱藏筆刷選擇器 + $('#pressureSwitchContainer').toggle(!settings.oldPressureMode); // 如果舊筆壓繪圖啟用,則隱藏筆壓開關 + }); + + // 顯示字表畫面 + listup_container.addEventListener('shown.bs.modal', async function () { + saveToLocalDB(true); // 儲存當前畫布內容到 Local Storage + + $('#listup-body').empty(); // 清空 + + // 計算 viewBox + var scale = parseInt(settings.scaleRate, 10) / 100; + var emSize = Math.round(upm / scale); + var emOff = Math.round((upm - emSize) / 2); + var viewBox = `${emOff} ${emOff} ${emSize} ${emSize}`; + + for (let i in nowList) { + var gname = nowList[i]; + var svgData = await loadFromDB('s_' + gname); + if (svgData) { // 已寫過 + $('#listup-body').append( + $('').html('').data('index', i).on('click', function () { + setGlyph($(this).data('index') * 1); + listup_container_modal.hide(); + }) + ); + } else { + var cell = $('').text(glyphMap[gname].c).data('index', i).on('click', function () { + setGlyph($(this).data('index') * 1); + listup_container_modal.hide(); + }); + if (glyphMap[gname].v && gname.indexOf('.vert') > 0) cell.addClass('vert'); + $('#listup-body').append(cell); + } + } + + $('

').appendTo($('#listup-body')); + }); + + // 顯示提示畫面 + hint_container.addEventListener('shown.bs.modal', function () { + $('#version').text(version); + }); + + // 顯示下載畫面 + download_container.addEventListener('shown.bs.modal', async function () { + $('#saveAsTester').prop('checked', settings.saveAsTester); // 設定是否為測試儲存 + }); + + // 關閉廣告畫面 + $('#closeAdsButton').on('click', function () { + $('#ads-container').hide(); + }); + + + // 取得滑鼠或觸控座標 + function getCanvasCoordinates(event) { + const rect = canvas.getBoundingClientRect(); + const touch = event.type.includes('touch') ? event.originalEvent.touches[0] : event; + return { + x: touch.clientX - rect.left, + y: touch.clientY - rect.top + }; + } + + // 匯出事件 - Debugger + $('#exportEventsButton').on('click', async function () { + const data = events.join('\n'); + if (data.length > 0) { + const blob = new Blob([data], { type: 'text/plain' }); + const link = document.createElement('a'); + link.download = settings.fontNameEng + '-EventLog' + (new Date()).toISOString() + '.txt'; + link.href = window.URL.createObjectURL(blob); + link.click(); + } else { + alert(fdrawer.noDataToExport); + } + }); + + // 匯出資料 + $('#exportDataButton').on('click', async function () { + const transaction = db.transaction([storeName], 'readonly'); + const store = transaction.objectStore(storeName); + const request = store.getAll(); + + request.onsuccess = async function (event) { + const data = event.target.result.map(item => `${item.key}\t${item.value}`).join('\n'); + if (data.length > 0) { + const blob = new Blob([data], { type: 'text/plain' }); + const link = document.createElement('a'); + link.download = settings.fontNameEng + '-' + (new Date()).toISOString() + '.txt'; + link.href = window.URL.createObjectURL(blob); + link.click(); + } else { + alert(fdrawer.noDataToExport); + } + }; + }); + + // 匯入資料 + $('#importDataFile').on('change', async function () { + if (confirm(fdrawer.importConfirm)) { + const fileInput = $(this); + const file = fileInput[0].files[0]; + if (file) { + const reader = new FileReader(); + reader.onload = async function (e) { + await clearDB(); // 清除現有的 IndexedDB 資料 + const data = e.target.result; + const lines = data.split('\n'); + for (const line of lines) { + if (line.trim() === '') continue; // 跳過空行 + const parts = line.split('\t'); + if (parts.length < 2) continue; // 如果格式不正確,跳過 + const key = parts[0].trim(); + const value = parts[1].trim(); + await saveToDB(key, value); + } + alert(fdrawer.importDone); + location.reload(); // 重新載入頁面 + }; + reader.readAsText(file); + } + } else { + $(this).val(''); // 清除選擇的檔案 + } + }); + + // 修改清除所有資料的功能 + $('#clearAllButton').on('click', async function () { + if (confirm(fdrawer.clearConfirm)) { + await clearDB(); + alert(fdrawer.clearDone); + location.reload(); // 重新載入頁面 + } + }); +}); + +document.addEventListener('DOMContentLoaded', function () { + // 判斷是否在 in-app browser 中 + const userAgent = navigator.userAgent || navigator.vendor || window.opera; + + if (/FBAN|FBAV|Instagram|Line|Threads/i.test(userAgent)) { + // 如果是 Facebook、Instagram 或 Line 的 in-app browser + alert(fdrawer.inAppNotice); + } + + // 解決 iOS Safari 按鈕點兩下容易不小心放大視窗的問題 + if (/iphone|ipad|ipod/.test(userAgent.toLowerCase()) && /safari/.test(userAgent.toLowerCase())) { + document.querySelectorAll('body').forEach(function (btn) { + btn.addEventListener('dblclick', function (e) { + e.preventDefault(); + }, { passive: false }); + }); + } +}); diff --git a/pages/index.html b/pages/index.html index 21aee78..0444827 100644 --- a/pages/index.html +++ b/pages/index.html @@ -1,173 +1,372 @@ - - - 手寫字型產生器 by 字嗨 - + + + 手寫字型產生器 by 字嗨 + + + -

- - - 👓 - 🔍 -
- -
+ + +
- 👈 - 👉 -
+ + + + + + +
- - -
- -
-
- 🖌️🚿 - - + +
- -
- 🚮 - ⬅️ - ➡️ - ⬆️ - ⬇️ - ↩️ -
- + 個字 +
0%
-
-
- × -

字符列表

-
+ -
-
- × -

提示 Ver

-
    -
  • 本工具由「字嗨!」提供。
  • -
  • 書寫的字表來自「jf7000當務字集」。
  • -
  • 由於所有資料儲存在您瀏覽器本地端,若擔心被瀏覽器清除,建議定期用匯出功能備份資料。
  • -
  • 建議每個字寫好後,就立刻調整位置(漢字原則上置中),這樣可避免事後調整困難。
  • -
  • 半形文字一律輸出成比例寬,故水平方向位置會被忽略。背景的紅線是基線的參考位置。
  • -
  • 全形的英數字會使用半形英數字自動產生。
  • -
  • 當所需的字符齊全時,系統會自動處理直排、組合文字的設定。
  • -
  • 請注意因為技術的限制,目前本系統所產生的OTF檔案,雖可勉強安裝運作,但並非正確的CID格式,可能在Adobe軟體無法正確識別為CJK字型。
  • -
  • 本服務所生成的字型檔,若使用上造成任何影響,本服務與作者不負任何責任。
  • -
  • 本系統並未蒐集任何使用者筆跡或其他用戶資訊。但若要公開您的字型檔時,請自行評估筆跡公開的風險。
  • -
  • 本工具不定期更新,雖然力求盡可能支援先前的版本,但要維護多種舊機制相各種環境有所困難,難以盡善盡美。由於所有版本程式碼都是開源的,可自行從GitHub上使用。若有技術支援需求,可與作者聯絡(可能須付費)。
  • -
  • 本專案GitHub頁面在這裡,在此可查閱更多資訊。

  • -
+ -
-
- × -

設定

- 在開始書寫之前,先來設定一些基本資訊吧!這些設定值之後都能再更改。
提醒您,若您是在App內的瀏覽器開啟本頁,建議用系統瀏覽器開啟,避免資料遺失!
- -

字型英文名稱

- - -

字型中文名稱

- - -

縮放率

- - 100% - 手寫時為了避免超框,容易不經意把字寫得偏小。這裡可以調整文字框的尺寸。 - -

我的字就是小

- - 適合寫字真的很小的人。 - -

背景格線樣式

- - -

中文字不等寬

- - 設定為不等寬會更像手寫字型,但可能不適合用於直排。 - -

筆壓敏感度(實驗中)

- - 本選項僅對有筆壓的設備有效。目前尚在調整中,未來修改可能無法維持舊版相容性。 - -

啟用舊筆壓模式(不建議)

- - 舊筆壓模式無法支援筆刷功能。 - -
-
-
-
-
-

完全清除字型資料

- -
-

匯出系統事件(開發用)

- -
+ -
-
- × -

下載

- -

下載字型

- - - 勾選測試輸出,字型名稱會加上流水號。避免系統快取造成在電腦上無法正常安裝使用的問題。 -
-

斗內作者

- 字型檔的權利均屬於您個人,不過如果您喜歡這個工具,請考慮斗內支持作者的開發工作。您的支持將有助於未來的更新和改進! -
-
-
-

匯入先前備份的資料

- -
-

匯出編輯中資料

- -
-

+ @@ -182,9 +381,12 @@

活動訊息

--> - + + - + - - - + + + + \ No newline at end of file diff --git a/pages/menu.css b/pages/menu.css new file mode 100644 index 0000000..e0ccfbe --- /dev/null +++ b/pages/menu.css @@ -0,0 +1,32 @@ +#menu { + background-color: #fff; + overflow-x: auto; + width: calc(100vw - 1rem); + margin: .5rem; +} + +#menu>div { + display: none; + width: max-content; +} + +#menu>div.active { + display: inline-flex; +} + +#menu .block { + display: inline-flex; + flex-direction: column; + align-items: center; + border-right: #cacaca solid 1px; +} + +#menu .block>span { + display: inline-block; + width: 100%; + text-align: center; + margin-top: 0.1rem; + opacity: 0.8; + font-size: 0.8em; + margin-top: auto; +} \ No newline at end of file diff --git a/pages/menu.js b/pages/menu.js new file mode 100644 index 0000000..0f72db5 --- /dev/null +++ b/pages/menu.js @@ -0,0 +1,10 @@ +const menuPages = document.querySelectorAll('#menu>div'); + +document.querySelectorAll('.nav-link').forEach((link, index) => { + link.addEventListener('click', () => { + document.querySelectorAll('.nav-link').forEach(l => l.classList.remove('active')); + link.classList.add('active'); + menuPages.forEach(l => l.classList.remove('active')); + menuPages[index].classList.add('active'); + }); +}); \ No newline at end of file diff --git a/pages/style_new.css b/pages/style_new.css new file mode 100644 index 0000000..446146f --- /dev/null +++ b/pages/style_new.css @@ -0,0 +1,252 @@ +body { + margin: 0; + display: flex; + flex-direction: column; + justify-content: center; + /*height: 80vh;*/ + background-color: #f0f0f0; + font-family: sans-serif; + overflow: hidden; + user-select: none; + /* 禁用文字選擇 */ + -webkit-touch-callout: none; + /* 禁用長按彈出選單 */ + -webkit-user-select: none; + /* 禁用文字選擇 */ + -webkit-tap-highlight-color: transparent; + /* 移除點擊高亮效果 */ +} + +@font-face { + font-family: LessonOne; + src: url('LessonOne-Regular.woff'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: GenYoExt; + src: url('GenYoExt3-R.woff'); + font-weight: normal; + font-style: normal; +} + +#demo-container { + margin-bottom: 5px; + width: 360px; + position: relative; + color: #1123c4; + text-align: center; + font-family: sans-serif; + height: 5.6em; + margin: 10px auto +} + +#demo-container span { + display: block; + line-height: 1.2; +} + +#glyphName { + font-family: Consolas, monospace; + color: #aaa +} + +#demo-container #charSeq { + font-size: 2.6em; + line-height: 1; + margin: 0 auto 10px auto; + width: 1em; + font-family: GenYoExt, LessonOne, sans-serif; + border: 1px solid #aaa; +} + +#demo-container #charSeq.vert { + writing-mode: vertical-rl; + text-orientation: mixed; + font-feature-settings: "vert" +} + +#prevButton { + font-size: 3.2em; + position: absolute; + left: 0; + top: 0; + border: 0; + background: transparent; + box-shadow: none; +} + +#nextButton { + font-size: 3.2em; + position: absolute; + right: 0; + top: 0; + border: 0; + background: transparent; + box-shadow: none +} + +#canvas-container { + position: relative; + width: 360px; + height: 360px; + border: 1px solid #888; + background-color: #fff; + align-self: center; +} + +canvas { + position: absolute; + top: 0; + left: 0; + width: 360px; + height: 360px; + touch-action: none; +} + +@media screen and (max-height: 750px), +screen and (max-width: 380px) { + #canvas-container { + width: 300px; + height: 300px + } + + canvas { + width: 300px; + height: 300px; + touch-action: none; + } +} + +.smallmode { + width: 200px !important; + height: 200px !important +} + +.smallmode canvas { + width: 200px; + height: 200px; + touch-action: none; +} + +#gridCanvas { + z-index: 0 +} + +/* 九宮格底圖在下方 */ +#drawingCanvas { + position: absolute; + top: 0; + left: 0; + z-index: 1 +} + +/* 繪圖畫布在上方 */ +#lineWidthSlider { + width: 120px; + display: inline-block; + vertical-align: middle; +} + +#lineWidthValue { + display: inline-block; + width: 1.5em; + text-align: right; +} + +#brushSelector img { + width: 28px; + height: 28px; + line-height: 32px; + margin-top: 2px; +} + +#navi-container { + display: flex; + position: fixed; + bottom: 0; + left: 0; + width: 100%; + padding: 0 .2rem; + font-size: .8rem; +} + +#navi-container #spanDoneCount { + margin-right: .2rem; +} + +#progress-container { + display: none; + position: fixed; + bottom: 0; + left: 0; + width: 100%; + background-color: #fff; + padding: 10px; + text-align: center; + box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1); + z-index: 1056; +} + +#progress-bar { + width: 80%; + height: 20px; + display: block; + margin: 0 auto; +} + +.note { + display: block; + color: #323232; + font-size: .9em; +} + +#listup-body svg { + display: block; + background-color: #fff; + width: 50px; + height: 50px; + float: left; + border: 1px solid #ccc; + margin: 5px +} + +#listup-body span { + display: block; + background-color: #666; + color: #ddd; + width: 50px; + height: 50px; + float: left; + border: 1px solid #ccc; + line-height: 50px; + text-align: center; + font-size: 2em; + margin: 5px; + font-family: GenYoExt, LessonOne, sans-serif; + overflow: hidden; +} + +#listup-body span.vert { + writing-mode: vertical-rl; + text-orientation: mixed; + font-feature-settings: "vert" +} + +#hintContent { + padding: 0 1.2em +} + +#hintContent li { + margin: 10px 0; + line-height: 1.6; +} + +.nav-link { + color: #000; +} + +#importDataFile { + display: none; +} \ No newline at end of file From fe116fd084e37763f2fa25cf9304d5e6d7c50846 Mon Sep 17 00:00:00 2001 From: PMinn <40393799+PMinn@users.noreply.github.com> Date: Sun, 17 Aug 2025 20:30:35 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=94=B9=E5=96=84=E4=B8=AD=E6=96=87=20UI/U?= =?UTF-8?q?X?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/{ => css}/menu.css | 17 +- pages/{style_new.css => css/style.css} | 37 +- pages/fontdrawer_new.js | 1272 ---- pages/fonts/GenYoExt3-R.woff | Bin 0 -> 71456 bytes pages/fonts/LessonOne-Regular.woff | Bin 0 -> 35372 bytes pages/index.html | 189 +- pages/js/Canvas.js | 401 + pages/js/brushes.js | 16 + pages/js/cglyphlist.js | 9486 ++++++++++++++++++++++++ pages/js/controller.js | 550 ++ pages/js/db.js | 145 + pages/js/font.js | 63 + pages/js/index.js | 153 + pages/js/jglyphlist.js | 7315 ++++++++++++++++++ pages/js/menu.js | 12 + pages/js/potrace.js | 1304 ++++ pages/js/pressure-drawing.js | 573 ++ pages/js/settings.js | 50 + 18 files changed, 20227 insertions(+), 1356 deletions(-) rename pages/{ => css}/menu.css (63%) rename pages/{style_new.css => css/style.css} (90%) delete mode 100644 pages/fontdrawer_new.js create mode 100644 pages/fonts/GenYoExt3-R.woff create mode 100644 pages/fonts/LessonOne-Regular.woff create mode 100644 pages/js/Canvas.js create mode 100644 pages/js/brushes.js create mode 100644 pages/js/cglyphlist.js create mode 100644 pages/js/controller.js create mode 100644 pages/js/db.js create mode 100644 pages/js/font.js create mode 100644 pages/js/index.js create mode 100644 pages/js/jglyphlist.js create mode 100644 pages/js/menu.js create mode 100644 pages/js/potrace.js create mode 100644 pages/js/pressure-drawing.js create mode 100644 pages/js/settings.js diff --git a/pages/menu.css b/pages/css/menu.css similarity index 63% rename from pages/menu.css rename to pages/css/menu.css index e0ccfbe..286c87f 100644 --- a/pages/menu.css +++ b/pages/css/menu.css @@ -1,5 +1,4 @@ #menu { - background-color: #fff; overflow-x: auto; width: calc(100vw - 1rem); margin: .5rem; @@ -29,4 +28,20 @@ opacity: 0.8; font-size: 0.8em; margin-top: auto; +} + +/* 寬度大於1025的裝置 選單限縮在500 */ +@media only screen and (min-width: 1025px) { + + /* 平板橫向 */ + #menu_nav { + margin: 0 auto; + max-width: 500px; + width: 100vw; + } + + #menu { + margin: .5rem auto; + max-width: 500px; + } } \ No newline at end of file diff --git a/pages/style_new.css b/pages/css/style.css similarity index 90% rename from pages/style_new.css rename to pages/css/style.css index 446146f..14b9361 100644 --- a/pages/style_new.css +++ b/pages/css/style.css @@ -19,14 +19,14 @@ body { @font-face { font-family: LessonOne; - src: url('LessonOne-Regular.woff'); + src: url('../fonts/LessonOne-Regular.woff'); font-weight: normal; font-style: normal; } @font-face { font-family: GenYoExt; - src: url('GenYoExt3-R.woff'); + src: url('../fonts/GenYoExt3-R.woff'); font-weight: normal; font-style: normal; } @@ -144,17 +144,11 @@ screen and (max-width: 380px) { /* 繪圖畫布在上方 */ #lineWidthSlider { - width: 120px; + width: 100px; display: inline-block; vertical-align: middle; } -#lineWidthValue { - display: inline-block; - width: 1.5em; - text-align: right; -} - #brushSelector img { width: 28px; height: 28px; @@ -162,6 +156,17 @@ screen and (max-width: 380px) { margin-top: 2px; } +#button-container { + position: relative; + align-self: center; + display: flex; +} + +#button-container .split { + width: 1px; + background-color: #ccc; +} + #navi-container { display: flex; position: fixed; @@ -249,4 +254,18 @@ screen and (max-width: 380px) { #importDataFile { display: none; +} + +.btn:has(>svg) { + font-size: .8em; +} + +#scaleRateValue { + display: inline-block; + width: 3em; + text-align: center; +} + +.nav-item { + cursor: pointer; } \ No newline at end of file diff --git a/pages/fontdrawer_new.js b/pages/fontdrawer_new.js deleted file mode 100644 index 1ca50ef..0000000 --- a/pages/fontdrawer_new.js +++ /dev/null @@ -1,1272 +0,0 @@ -const version = '0.592'; // 版本號 -const upm = 1000; -const userAgent = navigator.userAgent.toLowerCase(); -const pressureDelta = 1.3; // 筆壓模式跟一般模式的筆寬差異倍數 (舊筆壓模式用) -const dbName = fdrawer.dbName || 'FontDrawerDB'; // 使用 fdrawer.dbName,如果未定義則使用預設值 -const storeName = 'FontData'; -const events = []; - -let db; -let settings = null; - -const brushes = []; -function addBrush(imgSrc) { - var brush = new Image(); - brush.src = 'data:image/png;base64,' + imgSrc; - brushes.push(brush); -} -addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFu2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTE6NDc6MTIrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTE6NDc6MTIrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgyMTU3OTVjLTUwZDQtNzA0NC05NDczLTliY2FiOGEyNzdlNSIgeG1wTU06RG9jdW1lbnRJRD0i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'); -addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAE7mlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTE6Mjg6MTYrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTE6Mjg6MTYrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCIgeG1wTU06RG9jdW1lbnRJRD0i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'); -addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTE6NTU6MDErMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTE6NTU6MDErMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU0YmZiNzZmLThmNGYtNGE0YS04OGEwLTc4MDA2NWI2ZjMwNCIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmY5ODYzOWYzLTU3YjMtZWU0Yy04OTUxLWM4MzAyYzAyNTk3YSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTRlMGFmMDYtNzIxNS0xZjQ2LWE4NmQtZTc3NTgzM2Y2YzBkIiBzdEV2dDp3aGVuPSIyMDI1LTA3LTE5VDExOjI1OjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjkyNGNkYWJlLWUxMmEtY2E0MS04YmE1LTEwODI2NmM4MzQzMiIgc3RFdnQ6d2hlbj0iMjAyNS0wNy0xOVQxMTo1NTowMSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NGJmYjc2Zi04ZjRmLTRhNGEtODhhMC03ODAwNjViNmYzMDQiIHN0RXZ0OndoZW49IjIwMjUtMDctMTlUMTE6NTU6MDErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6Ijiu+AAAKxklEQVR42u2d6U9cyRXFf73Q3ewMi8HLGLBhzGQyiRQpkUZRIuVz/uxkkoyU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'); -addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTU6MjA6NTYrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTU6MjA6NTYrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg0ODE1NjE1LTNlOTktZTU0MC05MTJkLTIzOTIyNzU2NDdmYiIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjMyNmMxZmViLWZhNTItZGI0ZC1iNmE1LWY3YTdkZmUxNTM3MiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTRlMGFmMDYtNzIxNS0xZjQ2LWE4NmQtZTc3NTgzM2Y2YzBkIiBzdEV2dDp3aGVuPSIyMDI1LTA3LTE5VDExOjI1OjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc2YWQxMWJjLTU3YzYtOWE0YS1hOTQ5LWZmMTAzMWNmNDhmNCIgc3RFdnQ6d2hlbj0iMjAyNS0wNy0xOVQxNToyMDo1NiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4NDgxNTYxNS0zZTk5LWU1NDAtOTEyZC0yMzkyMjc1NjQ3ZmIiIHN0RXZ0OndoZW49IjIwMjUtMDctMTlUMTU6MjA6NTYrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7P7eCvAAAGsklEQVR42u2dbYiUVRTHf2d2XHPzZU1N0wKtzPd8Qcoy01Cx+mJl4IcyUJI+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'); -addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMTlUMTI6Mjk6MzIrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMTlUMTI6Mjk6MzIrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI3ZDI3MjBiLTUzYjgtMTM0NC04MGZjLTFkY2EwMzQxMzFlNiIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmU5ZWFjMDdmLTNmMDQtYzc0NS1iYTcxLTJlNjJkY2U5NmM5YSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTRlMGFmMDYtNzIxNS0xZjQ2LWE4NmQtZTc3NTgzM2Y2YzBkIiBzdEV2dDp3aGVuPSIyMDI1LTA3LTE5VDExOjI1OjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmFiZmViNmY4LTUwNzEtNWM0Ni04YjJkLTQxODYxYzE3NGIxYSIgc3RFdnQ6d2hlbj0iMjAyNS0wNy0xOVQxMjoyOTozMiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyN2QyNzIwYi01M2I4LTEzNDQtODBmYy0xZGNhMDM0MTMxZTYiIHN0RXZ0OndoZW49IjIwMjUtMDctMTlUMTI6Mjk6MzIrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4oCt+pAAAQ7UlEQVR42u2dCXgURRbHKyQhAeQGRRBEoyI3inhwrCwKwnqh4okiAp6AriiH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'); -addBrush('iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNS0wNy0xOVQxMToyNToxMSswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjUtMDctMjFUMjI6MDc6MTErMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjUtMDctMjFUMjI6MDc6MTErMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg3MzBkNGY3LTY4ZmEtYjE0YS1iOGU3LTI2NjhhOTA2ZjU4MSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmE2NzljNjU1LTU3NmItYmE0NS04NzhlLWQ5MGE4NTNhZjIwZSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmE0ZTBhZjA2LTcyMTUtMWY0Ni1hODZkLWU3NzU4MzNmNmMwZCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTRlMGFmMDYtNzIxNS0xZjQ2LWE4NmQtZTc3NTgzM2Y2YzBkIiBzdEV2dDp3aGVuPSIyMDI1LTA3LTE5VDExOjI1OjExKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgyMTU3OTVjLTUwZDQtNzA0NC05NDczLTliY2FiOGEyNzdlNSIgc3RFdnQ6d2hlbj0iMjAyNS0wNy0xOVQxMTo0NzoxMiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4NzMwZDRmNy02OGZhLWIxNGEtYjhlNy0yNjY4YTkwNmY1ODEiIHN0RXZ0OndoZW49IjIwMjUtMDctMjFUMjI6MDc6MTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6uWwLnAAAD8UlEQVR42u3cX8ieYxwH8M/DNtMWYzP1yghZkpPNn5lJW5KccCT/QkQSIUorESf+RJGwE8RqlDAndkBJsjkgm/yZhq0l2cZsjL0z2+3gvt71WM+7533+Tdu+37p66u05uj7PfV339bt/99uoqkry/+WwTEEAApAEIABJAAKQBCAASQACkAQgAEkAApAEIABJAAKQBCAASQACkAQgAEkAApD0L+P2/kOj0ZiDadiFYXyDbeW7WzJlvae5H7exd3Nuo9FYgVMwBT9gAn7GJ1iDb/EhdheUfzKl3QOoquo/A/djB6oWYyvW4Su8iqtwFoYyrZ0B7JnvFgCTsXAUgFbjO7xW4C7FpExxbwAjuRaryhIzFojtWFuWqscxK1PdG8DhOB/LOrgaRsau8rkGD2I2jsPETP/YAZpzb9l8qy7HTryLezD3UN8zugEYV5aUF7Gh3AF1i7EGr+MOnFfusgLQBmAkR+MafN4DwMjYhpVYjBsxIwCdvbB3H9b3AaLCxoLxNBYEYOw5AQ+V03I/ILbjN3yEO8uJPABtMrlsrC+U29CdfYAYuYvajJcwJwDtc2Q5iL2xj5N0L2MlbkUjAO2zoMvzw1jGDjyH0wPQPnPx1oAgKnyMywPQPvPKGeKXAUH8igdwVABap6Eub1+ERfh+gFfFklL6CMAomYaL8TxWd1Ds63Qsx9UBGD2Tymb9TIH4c0AQa9Xl9eMDMHrOxROlTrR9QBCb8CzODsDoObX8WleXgt/uPiPsLBCLcRnGB2D0Q91NWDGgq+Fv/IQ3ceX+Xp4OBIDmzMfbA7xr+hFL1U8ATwrA6JmBJ/HXgCA24p0CceIgl6cDFaA5t/SxAtuq1LGsQEwZRO3pYABoLnUsHeDytBw3BKB9jsXDpSQxCIh16qd2jQC0zxX4YEAQX+I2dYdHANpkJp5St1U2P+TpdWzF+7hOl90dhwrASMbherxXJm+4TxAbSuFvPo7oZHk61ACaMxuPqZ+ubepTIfB3dal9ZgDGnqnqxuKXC8bmPl0Vj+LkAHSWWbi9LCdf672Z4LNSRpkegM4yHRfiLvVj1C09QGxWt++fGYDuNu0hdYl8IT7tseh3t7qjMABdZEKpCZ1TNu9VpWa0rcPSxhKcEYD+5BI8Ukogqzs8xM0PQP8yhAtwM15Rd3wM4499IKzHgub5bvWSXqa2s4xXv8wyXt1uP0/9ZO80dUvlcLk7mlTOHV9UVbWnayMAgztnTMUx6jdOZ5SC4S6sr6pqUcsdOUtQ39P8ax5pGpu4zyUo2b/JvyoIQACSAAQgCUAAkgAEIAlAAJIABCAJQACSAAQgCUAAkgAEIAlAAJIABCAJwMGVfwFk+B+8bph6jgAAAABJRU5ErkJggg=='); - -// 初始化 IndexedDB -function initDB() { - return new Promise((resolve, reject) => { - const request = indexedDB.open(dbName, 1); - - request.onupgradeneeded = function (event) { - db = event.target.result; - if (!db.objectStoreNames.contains(storeName)) { - db.createObjectStore(storeName, { keyPath: 'key' }); - } - }; - - request.onsuccess = function (event) { - db = event.target.result; - resolve(db); - }; - - request.onerror = function (event) { - reject(event.target.error); - }; - }); -} - -// 儲存資料到 IndexedDB -function saveToDB(key, value) { - return new Promise((resolve, reject) => { - const transaction = db.transaction([storeName], 'readwrite'); - const store = transaction.objectStore(storeName); - const request = store.put({ key, value }); - - request.onsuccess = function () { - resolve(); - }; - - request.onerror = function (event) { - reject(event.target.error); - }; - }); -} - -// 從 IndexedDB 讀取資料 -function loadFromDB(key, defaultValue = null) { - return new Promise((resolve, reject) => { - const transaction = db.transaction([storeName], 'readonly'); - const store = transaction.objectStore(storeName); - const request = store.get(key); - - request.onsuccess = function (event) { - resolve(event.target.result ? event.target.result.value : defaultValue); - }; - - request.onerror = function (event) { - reject(event.target.error); - }; - }); -} - -function countGlyphFromDB() { - return new Promise((resolve, reject) => { - const transaction = db.transaction([storeName], 'readonly'); - const store = transaction.objectStore(storeName); - const cursorRequest = store.openCursor(); - - let count = 0; - cursorRequest.onsuccess = function (event) { - const cursor = event.target.result; - if (cursor) { - if (cursor.key.startsWith('g_')) count++; - cursor.continue(); - } else { - resolve(count); // 當游標完成時,返回計數 - } - }; - - cursorRequest.onerror = function (event) { - reject(event.target.error); - }; - }); -} - -// 刪除 IndexedDB 中的資料 -function deleteFromDB(key) { - return new Promise((resolve, reject) => { - const transaction = db.transaction([storeName], 'readwrite'); - const store = transaction.objectStore(storeName); - const request = store.delete(key); - - request.onsuccess = function () { - resolve(); - }; - - request.onerror = function (event) { - reject(event.target.error); - }; - }); -} - -// 清除 IndexedDB -function clearDB() { - return new Promise((resolve, reject) => { - const transaction = db.transaction([storeName], 'readwrite'); - const store = transaction.objectStore(storeName); - const request = store.clear(); - - request.onsuccess = function () { - resolve(); - }; - - request.onerror = function (event) { - reject(event.target.error); - }; - }); -} - -// 讀取設定 -async function loadSettings() { - const settings = { - notNewFlag: await loadFromDB('notNewFlag', 'N') == 'Y', // 是否為舊檔案,預設為 N - scaleRate: await loadFromDB('scaleRate', 100) * 1, // 縮放比例,預設為 100% - smallMode: await loadFromDB('smallMode', 'N') == 'Y', // 是否小字模式,預設為 N - lineWidth: await loadFromDB('lineWidth', 12) * 1, // 筆寬,預設為 12 - brushType: await loadFromDB('brushType', 0) * 1, // 筆刷類型,預設為 0 - pressureMode: await loadFromDB('pressureMode', 'N') == 'Y', // 筆壓模式,預設為 N - pressureEffect: await loadFromDB('pressureEffect', 'none'), // 筆壓公式,預設為 none - gridType: await loadFromDB('gridType', '3x3grid'), // 格線類型,預設為 3x3grid - oldPressureMode: await loadFromDB('oldPressureMode', 'N') == 'Y', // 啟用舊版筆壓模式,預設為 N - fontNameEng: await loadFromDB('fontNameEng') || 'MyFreehandFont', - fontNameCJK: await loadFromDB('fontNameCJK') || fdrawer.fontNameCJK, - noFixedWidthFlag: await loadFromDB('noFixedWidthFlag', 'N') == 'Y', // 比例寬輸出,預設為 N - saveAsTester: await loadFromDB('saveAsTester', 'Y') == 'Y', // 是否為測試輸出,預設為 Y - testSerialNo: await loadFromDB('testSerialNo', 1) * 1, // 測試輸出序號,預設為 1 - customGlyphs: await loadFromDB('customGlyphs') // 自定義文字 - }; - - if (settings.customGlyphs && settings.customGlyphs != '') { // 如果有自定義文字,則添加到列表中 - var cglist = settings.customGlyphs.split(/,/); - glyphList[fdrawer.customList] = []; - for (var i = 0; i < cglist.length; i++) { - glyphList[fdrawer.customList].push(cglist[i]); - var uni = parseInt(cglist[i].replace(/^u(ni)?/g, ''), 16); - glyphMap[cglist[i]] = { c: String.fromCodePoint(uni), w: 'F' }; // 將自定義文字添加到映射中 - } - } - - console.log('Settings loaded:', settings); - - return settings; -} - -async function updateSetting(key, value) { - if (settings == null) settings = await loadSettings(); - if (typeof (value) != 'undefined') settings[key] = value; - if (typeof (settings[key]) == 'boolean') { - //console.log(`Updating setting ${key} to ${settings[key] ? 'Y' : 'N'}`); - await saveToDB(key, settings[key] ? 'Y' : 'N'); // 將布林值轉換為 'Y' 或 'N' - } else { - //console.log(`Updating setting ${key} to ${settings[key]}`); - await saveToDB(key, settings[key]); - } -} - -// 初始化 -async function initCanvas(canvas) { - canvas.addEventListener('touchstart', (e) => e.preventDefault(), { passive: false }); - canvas.addEventListener('touchmove', (e) => e.preventDefault(), { passive: false }); - - var scale = parseInt(settings.scaleRate, 10) / 100; // 轉換為小數 - - // 繪製底圖 - const gridCanvas = document.getElementById('gridCanvas'); - const gridCtx = gridCanvas.getContext('2d'); - gridCtx.clearRect(0, 0, gridCanvas.width, gridCanvas.height); - - const emWidth = gridCanvas.width / scale; // 字身框寬度 - const emHeight = gridCanvas.height / scale; // 字身框高度 - const gridXOff = (gridCanvas.width - emWidth) / 2; // X 軸偏移量 - const gridYOff = (gridCanvas.height - emHeight) / 2; // X 軸偏移量 - - //const gridWidth = Math.round(gridCanvas.width / scale / 3); // 每格寬度 - //const gridHeight = Math.round(gridCanvas.height / scale / 3); // 每格高度 - - gridCtx.strokeStyle = '#cccccc'; - gridCtx.lineWidth = 1; - - // 繪製格線 - let lines = 1; - - // 字身框 - gridCtx.beginPath(); - gridCtx.rect(gridXOff, gridYOff, emWidth, emHeight); - gridCtx.stroke(); - - if (settings.gridType == '3x3grid') lines = 3; - else if (settings.gridType == '3x3grid-new') lines = 4; - else if (settings.gridType == '2x2grid') lines = 2; - else if (settings.gridType == 'stargrid') lines = 2; - - for (let i = 1; i < lines; i++) { - if (settings.gridType == '3x3grid-new' && i == 2) continue; // 跳過新 3x3 格線的中間線 - - gridCtx.beginPath(); - gridCtx.moveTo(gridXOff + emWidth * i / lines, gridYOff); - gridCtx.lineTo(gridXOff + emWidth * i / lines, gridYOff + emHeight); - gridCtx.stroke(); - - gridCtx.beginPath(); - gridCtx.moveTo(gridXOff, gridYOff + emHeight * i / lines); - gridCtx.lineTo(gridXOff + emWidth, gridYOff + emHeight * i / lines); - gridCtx.stroke(); - } - - if (settings.gridType == 'stargrid') { - gridCtx.beginPath(); - gridCtx.moveTo(gridXOff, gridYOff); - gridCtx.lineTo(gridXOff + emWidth, gridYOff + emHeight); - gridCtx.stroke(); - gridCtx.beginPath(); - gridCtx.moveTo(gridXOff + emWidth, gridYOff); - gridCtx.lineTo(gridXOff, gridYOff + emHeight); - gridCtx.stroke(); - } else if (settings.gridType == 'boxgrid') { - gridCtx.beginPath(); - gridCtx.rect(gridXOff + emWidth * 0.15, gridYOff + emHeight * 0.15, emWidth * 0.7, emHeight * 0.7); - gridCtx.stroke(); - } - - if (settings.gridType == 'boxgrid' || settings.gridType == 'nogrid') { - let boxLen = 15; - gridCtx.beginPath(); - gridCtx.moveTo(gridXOff - boxLen, gridYOff + emHeight * 0.5); - gridCtx.lineTo(gridXOff + boxLen, gridYOff + emHeight * 0.5); - gridCtx.stroke(); - gridCtx.beginPath(); - gridCtx.moveTo(gridXOff + emWidth - boxLen, gridYOff + emHeight * 0.5); - gridCtx.lineTo(gridXOff + emWidth + boxLen, gridYOff + emHeight * 0.5); - gridCtx.stroke(); - gridCtx.beginPath(); - gridCtx.moveTo(gridXOff + emWidth * 0.5, gridYOff - boxLen); - gridCtx.lineTo(gridXOff + emWidth * 0.5, gridYOff + boxLen); - gridCtx.stroke(); - gridCtx.beginPath(); - gridCtx.moveTo(gridXOff + emWidth * 0.5, gridYOff + emHeight - boxLen); - gridCtx.lineTo(gridXOff + emWidth * 0.5, gridYOff + emHeight + boxLen); - gridCtx.stroke(); - } - - // 繪製基線 - gridCtx.strokeStyle = '#ee9999'; // 基線顏色 - gridCtx.beginPath(); - gridCtx.moveTo(0, gridYOff + emHeight * 0.75); - gridCtx.lineTo(gridCanvas.width, gridYOff + emHeight * 0.75); - gridCtx.stroke(); - - // 依照設定值顯示筆寬、筆刷、筆壓UI - $('#lineWidthSelect').val(settings.lineWidth); - $('#brushSelector').empty().append($(brushes[settings.brushType])); - if (settings.pressureMode) { - $('#pressureSwitch').prop('checked', true); - } else { - $('#pressureSwitch').prop('checked', false); - } -} - -function initListSelect($listSelect) { - $listSelect.empty(); // 清空選單 - for (var list in glyphList) { - $listSelect.append( - $('').val(list).text(list) - ); - } -} - -async function createFont(glyphs, gidMap, verts, ccmps) { - if (settings.saveAsTester) { - settings.fontNameEng += settings.testSerialNo; - settings.fontNameCJK += settings.testSerialNo; - updateSetting('testSerialNo', settings.testSerialNo + 1); // 更新測試序號 - } - - const font = new opentype.Font({ - familyName: settings.fontNameEng, - fullName: settings.fontNameEng, - postScriptName: settings.fontNameEng.replace(/[^a-zA-Z0-9]/g, ''), // 去除特殊字符 - styleName: 'Regular', - designer: 'zi-hi.com', - designerURL: 'https://zi-hi.com', - manufacturer: 'zi-hi.com', - manufacturerURL: 'https://zi-hi.com', - - unitsPerEm: upm, - ascender: 880, - descender: -120, - glyphs: glyphs - }); - - for (var group in font.names) { - font.names[group].fontFamily[fdrawer.fontLang] = settings.fontNameCJK; - font.names[group].fullName[fdrawer.fontLang] = settings.fontNameCJK; - } - - font.tables.os2.achVendID = 'ZIHI'; - font.tables.os2.ulCodePageRange1 = fdrawer.codePage; // CodePage - font.tables.os2.usWinAscent = 920; // Windows ascent - font.tables.os2.usWinDescent = 200; // Windows ascent - font.tables.os2.xAvgCharWidth = upm; - - // ccmps - for (let i in ccmps) { - var gname_to = ccmps[i]; - var allpass = true; - var subfrom = []; - for (let i in glyphMap[gname_to].s) { - var gname_from = glyphMap[gname_to].s[i]; - if (!gidMap[gname_from]) allpass = false; - subfrom.push(gidMap[gname_from]); - } - if (!allpass) continue; - font.substitution.addLigature('ccmp', { sub: subfrom, by: gidMap[gname_to] }); - } - - // verts - for (let i in verts) { - var gname_v = verts[i]; - var gname_h = glyphMap[gname_v].v; - if (!gidMap[gname_v]) continue; // 如果沒有對應的 cid,則跳過 - if (!gidMap[gname_h]) continue; // 如果沒有對應的 cid,則跳過 - font.substitution.addSingle('vert', { sub: gidMap[gname_h], by: gidMap[gname_v] }); - } - - return font; -} - -$(document).ready(async function () { - const $listSelect = $('#listSelect'); - - const $canvas = $('#drawingCanvas'); - const canvas = $canvas[0]; - const ctx = canvas.getContext('2d'); - let ratio = canvas.height / $canvas.height(); - let isDrawing = false; - const undoStack = []; // 儲存畫布狀態的堆疊 - const $naviContainer = $('#navi-container'); - const $progressContainer = $('#progress-container'); - const $progressBar = $('#progress-bar'); - const $progressText = $('#progress-text'); - const download_container = document.getElementById('download_container'); - const settings_container = document.getElementById('settings_container'); - const settings_containerr_modal = new bootstrap.Modal(settings_container); - const hint_container = document.getElementById('hint_container'); - const listup_container = document.getElementById('listup_container'); - const listup_container_modal = new bootstrap.Modal(listup_container); - - // 初始化 IndexedDB - initDB().then(async () => { - console.log('IndexedDB 起動完成'); - settings = await loadSettings(); - initListSelect($listSelect); - initCanvas(canvas); // 初始化九宮格底圖 - $('#canvas-container').toggleClass('smallmode', settings.smallMode); - - $listSelect.change(); // 觸發一次 change 事件以載入第一個列表 - - // 初始化筆壓繪圖狀態 - await updatePressureDrawingStatus(); - - if (!settings.notNewFlag) { - settings_containerr_modal.show(); - } else { - if ($('#ads-container')) $('#ads-container').show(); - } - $('#spanDoneCount').text(await countGlyphFromDB()); - - $('#smallModeCheck').prop('checked', settings.smallMode); - var scale = settings.scaleRate; // 預設縮放比例為 100% - $('#scaleRateSlider').val(scale); - $('#scaleRateValue').text(scale + '%'); - $('#pressureEffectSelect').val(settings.pressureEffect); - $('#pressureDrawingEnabled').prop('checked', settings.oldPressureMode); - $('#gridTypeSelect').val(settings.gridType); - - }).catch((error) => { - console.error('IndexedDB 起動失敗', error); - }); - - // (舊筆壓模式) 初始化 PressureDrawing 實例 - const pressureDrawing = new PressureDrawing(); - //let pressureDrawingEnabled = false; - let pressureDrawingSettings = { - thinning: 0.5, - smoothing: 0.4, - streamline: 0.4 - }; - - // (舊筆壓模式) 更新筆壓繪圖狀態 - async function updatePressureDrawingStatus() { - const moduleInitialized = await pressureDrawing.initialize(); - - // 預設關閉筆壓繪圖 - settings.oldPressureMode = settings.oldPressureMode && moduleInitialized; - $('#brushSelector').toggle(!settings.oldPressureMode); // 如果舊筆壓繪圖啟用,則隱藏筆刷選擇器 - $('#pressureSwitchContainer').toggle(!settings.oldPressureMode); // 如果舊筆壓繪圖啟用,則隱藏筆壓開關 - } - - let nowList = null; - let nowGlyphIndex = null; - let nowGlyph = null; - - // 切換列表 - $listSelect.on('change', function () { - const selectedValue = $(this).val(); - if (selectedValue) { - nowList = glyphList[selectedValue]; - nowGlyphIndex = 0; // 重置當前字形索引 - setGlyph(0); - } - }); //.change(); // 觸發一次 change 事件以載入第一個列表 - - // 設定編輯中的字符 - function setGlyph(index) { - if (!nowList) return; - if (index < 0) index = nowList.length - 1; // 如果索引小於0,則設為最後一個字符 - if (index >= nowList.length) index = 0; // 如果索引大於字符數量,則設為第一個字符 - nowGlyphIndex = index; - nowGlyph = nowList[index]; // 取得當前字符的名稱 - - $('#glyphName').text(nowGlyph); // 更新顯示的字符 - $('#charSeq').text(glyphMap[nowGlyph].c).removeClass('vert'); - if (glyphMap[nowGlyph].v && nowGlyph.indexOf('.vert') > 0) $('#charSeq').addClass('vert'); - - $('#glyphNote').text(glyphMap[nowGlyph].n || ''); - - // 載入之前的畫布內容 - undoStack.length = 0; // 清空復原堆疊 - ctx.clearRect(0, 0, canvas.width, canvas.height); - loadCanvasData(nowGlyph); - - // 重置筆壓檢測狀態 - if (settings.oldPressureMode) { - pressureDrawing.resetPressureDetection(); - } - } - - var svgTimers = {}; // 用於控制 SVG 儲存的定時器 - - async function saveSVG(glyph, pngData) { - const svgData = await toSVG(glyph, pngData); - - if (svgData && svgData != '') { - await saveToDB('s_' + glyph, svgData); - } else { // 轉外框後才發現是空白的話,連同png一起清掉 - await deleteFromDB('g_' + glyph); - await deleteFromDB('s_' + glyph); - } - - $('#spanDoneCount').text(await countGlyphFromDB()); - } - - // 儲存畫布的功能 - async function saveToLocalDB(runNow = false) { - let saveGlyph = nowGlyph; // 嘗試解決非同步操作導致的 Race Condition - const pngData = canvas.toDataURL(); - await saveToDB('g_' + saveGlyph, pngData); - - if (svgTimers[saveGlyph]) clearTimeout(svgTimers[saveGlyph]); // 清除之前的定時器 - - if (runNow) { // 如果立即儲存 - await saveSVG(saveGlyph, pngData); // 儲存 SVG - } else { // 延遲儲存 - svgTimers[saveGlyph] = setTimeout(async function () { // 延遲轉外框 - saveSVG(saveGlyph, pngData); // 儲存 SVG - }, 1200); - } - } - - // 修改讀取畫布的功能 - async function loadCanvasData(glyph) { - const savedCanvas = await loadFromDB('g_' + glyph); - if (savedCanvas) { - const img = new Image(); - img.src = savedCanvas; - img.onload = function () { - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(img, 0, 0); - }; - } - } - - $('#prevButton').on('click', function () { setGlyph(nowGlyphIndex - 1); }); // 切換到上一個字符 - $('#nextButton').on('click', function () { setGlyph(nowGlyphIndex + 1); }); // 切換到下一個字符 - - $('#findButton').on('click', function () { - var char = prompt(fdrawer.findMsg); - if (!char) return; // 如果沒有輸入字符,則不進行任何操作 - char = char.trim(); // 去除前後空白 - if (char.length === 0) return; - - var breakFlag = false; - for (let i in glyphList) { - for (let j in glyphList[i]) { - if (glyphMap[glyphList[i][j]].c == char) { - nowList = glyphList[i]; - $listSelect.val(i); // 更新下拉選單的值 - setGlyph(j * 1); - breakFlag = true; - break; - } - } - if (breakFlag) break; - } - - // 找不到的話詢問要不要新增這個字 - if (!breakFlag) { - if (char.length == (char.codePointAt(0) < 65536 ? 1 : 2)) { - if (confirm(fdrawer.notFound + '\n' + fdrawer.confirmAdd)) { - var uni = char.codePointAt(0).toString(16).toUpperCase(); - var gn = uni.length <= 4 ? 'uni' + uni.padStart(4, '0') : 'u' + uni; // 生成 Unicode 名稱 - var chr = String.fromCodePoint(char.codePointAt(0)); - - if (!glyphList[fdrawer.customList]) { - glyphList[fdrawer.customList] = []; - initListSelect($listSelect); // 重新初始化下拉選單 - } - glyphList[fdrawer.customList].push(gn); // 將新字符添加到自定義列表 - glyphMap[gn] = { c: chr, w: 'F' }; // 將自定義文字添加到映射中 - updateSetting('customGlyphs', glyphList[fdrawer.customList].join(',')); // 儲存自定義字符 - - nowList = glyphList[fdrawer.customList]; - $listSelect.val(fdrawer.customList); // 更新下拉選單的值 - setGlyph(glyphList[fdrawer.customList].length - 1); - } - } else { - alert(fdrawer.notFound); - } - } - }); - - // 更新筆寬 - $('#lineWidthSelect').change(function () { - settings.lineWidth = parseInt($(this).val(), 10); - updateSetting('lineWidth'); // 儲存筆寬到 Local Storage - }); - - // 切換筆刷 - $('#brushSelector').on('click', function () { - settings.brushType++; - if (settings.brushType >= brushes.length) settings.brushType = 0; - - updateSetting('brushType'); // 儲存筆刷類型 - $('#brushSelector').empty().append($(brushes[settings.brushType])); - }); - - // 切換筆壓 - $('#pressureSwitch').on('click', function () { - settings.pressureMode = !settings.pressureMode; - updateSetting('pressureMode'); - }); - - // 切換畫筆與橡皮擦模式 - $('#penButton').on('click', function () { - $('#penButton').addClass('btn-primary'); - $('#penButton').removeClass('btn-light'); - $('#eraserButton').addClass('btn-light'); - $('#eraserButton').removeClass('btn-primary'); - eraseMode = false; - }); - $('#eraserButton').on('click', function () { - $('#eraserButton').addClass('btn-primary'); - $('#eraserButton').removeClass('btn-light'); - $('#penButton').addClass('btn-light'); - $('#penButton').removeClass('btn-primary'); - eraseMode = true; // 切換到橡皮擦模式 - }); - - let hasPointerEvent = false; // 這個筆畫是否有pointer事件 - let hasRealPressure = false; // 這個筆畫是否曾經有疑似真實的筆壓值 - let simulatePressure = false; // 模擬筆壓開關 - let lastPressure = 0.5; // 上一次的筆壓值 - - function getPressureValue(mode, event, x, y) { - if (!settings.pressureMode) return 0.5; - - let eventType = event.type; - if (mode == 'move' && hasPointerEvent && !eventType.includes('pointer')) return null; // 如果曾經有pointer事件,則只接受pointer事件 - - let toolType = event.originalEvent.pointerType; - let pressure = event.originalEvent.pressure; - let touchForce = event.originalEvent.touches && event.originalEvent.touches.length > 0 ? event.originalEvent.touches[0].force : null; - let webkitForce = event.originalEvent.webkitForce !== undefined ? event.originalEvent.webkitForce : null; - - if (mode == 'start') { - if (events.length > 1000) events.splice(0, events.length - 200); - if (eventType.includes('pointer')) hasPointerEvent = true; // 這個筆畫有pointer事件 - } else if (mode == 'end') { - simulatePressure = false; - hasTouchEvent = false; - hasRealPressure = false; - hasPointerEvent = false; - } - - events.push(`${mode} - ${eventType} / ${toolType} / P:${pressure} / T:${touchForce} / W:${webkitForce}`); // 儲存事件資訊 - //console.log(`${eventType} / ${toolType} / P:${pressure} / T:${touchForce} / W:${webkitForce}`); // 儲存事件資訊 - - let isRealPressure = typeof (pressure) != 'undefined'; - if (isRealPressure && toolType != 'pen' && pressure == 0) isRealPressure = false; - if (isRealPressure && toolType != 'pen' && !hasRealPressure && (pressure == 1 || pressure == 0.5)) isRealPressure = false; - if (toolType == 'pen' && pressure < 0.01) return null; - if (mode != 'start' && !simulatePressure && !isRealPressure) return null; - - if (isRealPressure) { - simulatePressure = false; // 如果移動中發現有真實筆壓值,則關閉模擬筆壓 - if (pressure > 0 && pressure < 1 && pressure != 0.5) hasRealPressure = true; // 出現過看似真實的筆壓值 - - // 真實筆壓值套用敏感度運算 - if (settings.pressureEffect == 'contrast') pressure = 0.5 + Math.sin((pressure * 0.9 - 0.45) * Math.PI) / 2; - if (settings.pressureEffect == 'enhance') pressure = Math.sin(pressure * Math.PI / 2); - if (settings.pressureEffect == 'enhancex') pressure = Math.sin(Math.sin(pressure * Math.PI / 2) * Math.PI / 2); - - if (mode != 'start') pressure = (lastPressure + pressure) / 2; - return lastPressure = pressure; - - } else if (mode == 'start') { - simulatePressure = true; // 如果開始繪製時沒有真實筆壓值,則開啟模擬筆壓 - return 0.5; - - } else { //if (simulatePressure && lastX && lastY) { - let distance = Math.sqrt(Math.pow(x - lastX, 2) + Math.pow(y - lastY, 2)); - let speedFactor = Math.min(1, 5 / Math.max(distance, 1)); - pressure = (lastPressure * 3 + speedFactor * 0.65 + 0.05) / 4; - return lastPressure = pressure; - } - } - - // 儲存背景用於筆壓繪圖的即時預覽 - let backgroundImageData = null; - let lastX, lastY, lastLW, isMoved = false; - var eraseMode = false; - - function drawBrush(ctx, brush, x, y, lw) { - if (userAgent.includes('macintosh') && userAgent.includes('safari') && !userAgent.includes('chrome')) { - // 在 Mac Safari 上使用臨時 canvas 繪製,避免直接繪圖造成污垢 - // 不知道為什麼我的Mac-Safari直接繪圖會很髒,只好建立一個臨時的畫筆 canvas - // 但這會造成Android上很慢,所以只在Mac-Safari上使用 - const brushCanvas = document.createElement('canvas'); - brushCanvas.width = lw; - brushCanvas.height = lw; - const brushCtx = brushCanvas.getContext('2d'); - brushCtx.drawImage(brush, 0, 0, lw, lw); - - ctx.drawImage(brushCanvas, x - lw / 2, y - lw / 2); - } else { - // 其他瀏覽器直接繪製 - ctx.drawImage(brush, x - lw / 2, y - lw / 2, lw + 1, lw + 1); - } - } - - // 開始繪製 - $canvas.on('mousedown touchstart pointerdown', function (event) { - if (event.touches && event.touches.length === 2) { - if (isDrawing) $('#undoButton').trigger('click'); // 先撤銷掉目前的筆劃 - isDrawing = false; - return; - } - - if (isDrawing && !event.type.includes('pointer')) return; - - const { x, y } = getCanvasCoordinates(event); - var pressureVal = getPressureValue('start', event, x, y); - ratio = canvas.height / $canvas.height(); // 筆畫開始時重新確認一次螢幕縮放比(因為有可能調過視窗大小等) - - var png = canvas.toDataURL(); - if (!isDrawing && png != undoStack[undoStack.length - 1]) undoStack.push(png); // 儲存當前畫布狀態到 undoStack - isDrawing = true; // 儲存畫布後正式宣告筆畫開始 - if (svgTimers[nowGlyph]) clearTimeout(svgTimers[nowGlyph]); // 停止SVG轉外框 (提高效能) - - if (settings.oldPressureMode) { // 舊筆壓模式 - const pressure = pressureDrawing.simulatePressure(event.originalEvent, 'start'); - pressureDrawing.startStroke(x * ratio, y * ratio, pressure); - backgroundImageData = ctx.getImageData(0, 0, canvas.width, canvas.height); // 儲存背景圖像用於即時預覽 - - // 防止預設的觸控行為(如滾動) - event.preventDefault(); - - } else { // 筆刷模式 - var lw = settings.lineWidth * pressureVal * 2; // 計算線寬 - ctx.globalCompositeOperation = eraseMode ? "destination-out" : "source-over"; // 如果是橡皮擦模式,則使用 destination-out,否則使用 source-over - //if (event.type.includes('pointer')) - //drawBrush(ctx, brushes[settings.brushType], x*ratio, y*ratio, lw); - - lastX = x; // 儲存最後的 X 座標 - lastY = y; // 儲存最後的 Y 座標 - lastLW = lw; - isMoved = false; - } - }); - - // 繪製中 - $canvas.on('mousemove touchmove pointermove', function (event) { - if (!isDrawing) return; - const { x, y } = getCanvasCoordinates(event); - var pressureVal = getPressureValue('move', event, x, y); - if (settings.pressureMode && pressureVal == null) return; // 筆壓模式必須要有筆壓值 - - if (settings.oldPressureMode) { // 舊筆壓模式 - // 使用筆壓繪圖系統:收集點並提供即時預覽 - const pressure = pressureDrawing.simulatePressure(event.originalEvent, 'move'); - pressureDrawing.addPoint(x * ratio, y * ratio, pressure); - - // 生成即時預覽筆跡 - pressureDrawingSettings.size = settings.lineWidth * pressureDelta; - const previewStroke = pressureDrawing.createPreviewStroke(pressureDrawingSettings); - if (previewStroke && backgroundImageData) { - ctx.putImageData(backgroundImageData, 0, 0); // 恢復背景圖像 - pressureDrawing.drawStrokeOnCanvas(ctx, previewStroke, eraseMode); // 繪製預覽筆跡 - } - - // 防止預設的觸控行為 - event.preventDefault(); - - } else { - ctx.globalCompositeOperation = eraseMode ? "destination-out" : "source-over"; // 如果是橡皮擦模式,則使用 destination-out,否則使用 source-over - - var lw = settings.lineWidth * pressureVal * 2; - - var d = Math.max(Math.abs(lastX - x), Math.abs(lastY - y)) * 1.5; - if (d > 40) events.push(`Long-DrawImage / ${pressureVal} / ${event.originalEvent.pointerType} / ${x}, ${y}, ${lw} (${lastX}, ${lastY}, ${lastLW}) ${d}`); // 儲存事件資訊 - if (d > 0) { - for (var t = d; t > 0; t--) { - var tx = (lastX + (x - lastX) * t / d) * ratio; - var ty = (lastY + (y - lastY) * t / d) * ratio; - var tlw = lastLW + (lw - lastLW) * t / d; // 線寬漸變 - - drawBrush(ctx, brushes[settings.brushType], tx, ty, tlw); - } - events.push(`Move-DrawImage / ${pressureVal} / ${event.originalEvent.pointerType} / ${x}, ${y}, ${lw} (${lastX}, ${lastY}, ${lastLW}) ${d}`); // 儲存事件資訊 - } - - lastX = x; // 更新最後的 X 座標 - lastY = y; // 更新最後的 Y 座標 - lastLW = lw; // 更新最後的筆寬 - isMoved = true; - } - }); - - // 停止繪製 - $canvas.on('mouseup mouseleave touchend pointerup pointerleave', function (event) { - if (!isDrawing) return; - isDrawing = false; - const { x, y } = getCanvasCoordinates(event); - getPressureValue('end', event, x, y); - - if (settings.oldPressureMode) { // 舊筆壓模式 - // 使用筆壓繪圖系統:生成最終筆跡並繪製 - pressureDrawingSettings.size = settings.lineWidth * pressureDelta; - const finalStroke = pressureDrawing.finishStroke(pressureDrawingSettings); - if (finalStroke && finalStroke.length > 0) { - if (backgroundImageData) ctx.putImageData(backgroundImageData, 0, 0); // 恢復背景圖像(如果有的話) - pressureDrawing.drawStrokeOnCanvas(ctx, finalStroke, eraseMode); // 繪製最終筆跡 - } - - // 清除背景圖像數據 - backgroundImageData = null; - } else { - if (!isMoved) { - ctx.globalCompositeOperation = eraseMode ? "destination-out" : "source-over"; // 如果是橡皮擦模式,則使用 destination-out,否則使用 source-over - drawBrush(ctx, brushes[settings.brushType], lastX * ratio, lastY * ratio, lastLW); - } - - lastX = null; - lastY = null; - lastLW = null; - isMoved = false; // 重置移動狀態 - } - - ctx.globalCompositeOperation = "source-over"; // 恢復正常繪圖模式(重要) - - saveToLocalDB(); // 停止繪製時儲存畫布內容到 Local Storage - }); - - // 復原功能 - $('#undoButton').on('click', function () { - if (undoStack.length > 0) { - const lastState = undoStack.pop(); - const img = new Image(); - img.src = lastState; - img.onload = function () { - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(img, 0, 0); - saveToLocalDB(); // 復原後更新 Local Storage - }; - } - }); - - // 雙指復原 - let undoTouchTime = null; - $(document).on('touchstart', function (event) { - if (event.touches.length === 2) { - undoTouchTime = new Date().getTime(); // 記錄雙指觸控的時間 - } - }).on('touchend', function (event) { - if (undoTouchTime && new Date().getTime() - undoTouchTime < 250) { // 如果雙指觸控時間夠短 - $('#undoButton').trigger('click'); - undoTouchTime = null; - } - }); - - // 清除畫布的功能 - $('#clearButton').on('click', async function () { - const savedCanvas = await loadFromDB('g_' + nowGlyph); - if (!savedCanvas) return; // 如果沒有儲存的畫布,則不進行任何操作 - undoStack.push(canvas.toDataURL()); // 儲存當前畫布狀態到 undoStack - ctx.clearRect(0, 0, canvas.width, canvas.height); - - //undoStack.length = 0; // 清空復原堆疊 - await deleteFromDB('g_' + nowGlyph); // 清除 IndexedDB 中的資料 - await deleteFromDB('s_' + nowGlyph); // 清除 IndexedDB 中的資料 - }); - - async function moveGlyph(xoff, yoff) { - const savedCanvas = await loadFromDB('g_' + nowGlyph); - if (!savedCanvas) return; // 如果沒有儲存的畫布,則不進行任何操作 - undoStack.push(canvas.toDataURL()); // 儲存當前畫布狀態到 undoStack - - const img = new Image(); - img.src = savedCanvas; - img.onload = function () { - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(img, xoff, yoff); - saveToLocalDB(); // 更新 Local Storage - }; - } - - $('#moveLeftButton').on('click', function () { moveGlyph(-10, 0); }); // 向左移動 10px - $('#moveRightButton').on('click', function () { moveGlyph(10, 0); }); // 向右移動 10px - $('#moveUpButton').on('click', function () { moveGlyph(0, -10); }); // 向上移動 10px - $('#moveDownButton').on('click', function () { moveGlyph(0, 10); }); // 向下移動 10px - - // 支援鍵盤方向鍵操作 - $(document).on('keydown', function (event) { - switch (event.key) { - case 'ArrowLeft': // 左方向鍵 - moveGlyph(-10, 0); - break; - case 'ArrowRight': // 右方向鍵 - moveGlyph(10, 0); - break; - case 'ArrowUp': // 上方向鍵 - moveGlyph(0, -10); - break; - case 'ArrowDown': // 下方向鍵 - moveGlyph(0, 10); - break; - case 'z': // Z 鍵 - 復原 - $('#undoButton').trigger('click'); - break; - case 'v': // V 鍵 - 畫筆 - $('#penButton').trigger('click'); - break; - case 'c': // V 鍵 - 橡皮擦 - $('#eraserButton').trigger('click'); - break; - case 'x': // X 鍵 - 清除 - $('#clearButton').trigger('click'); - break; - case 'b': // B 鍵 - 切換筆刷 - $('#brushSelector').trigger('click'); - break; - case 'n': // N 鍵 - 切換筆壓 - $('#pressureSwitch').trigger('click'); - break; - case 'PageDown': // PageDown 鍵 - 下一步 - case ']': // "]" 鍵 - 下一步 - $('#nextButton').trigger('click'); - break; - case 'PageUp': // PageUp 鍵 - 上一步 - case '[': // "]" 鍵 - 下一步 - $('#prevButton').trigger('click'); - break; - case 'Enter': // Enter 鍵 - 下一步 / 同時按shift - 上一步 - case ' ': // Space 鍵 - 下一步 / 同時按shift - 上一步 - $(event.shiftKey ? '#prevButton' : '#nextButton').trigger('click'); - break; - } - }); - - // 更新進度條 - function updateProgress(current, total) { - const percentage = Math.round((current / total) * 100); - $progressBar.val(percentage); - $progressText.text(`${percentage}%`); - } - - async function toSVG(gname, savedCanvas) { - // 建立一個臨時的 canvas - const tempCanvas = document.createElement('canvas'); - const tempCtx = tempCanvas.getContext('2d'); - tempCanvas.width = 500; - tempCanvas.height = 500; - - tempCtx.fillStyle = 'white'; - tempCtx.fillRect(0, 0, tempCanvas.width, tempCanvas.height); - const img = new Image(); - img.src = savedCanvas; - return new Promise((resolve) => { - img.onload = function () { - tempCtx.drawImage(img, 0, 0); - - // 使用 potrace.js 將臨時 canvas 轉換為 SVG - Potrace.loadImageFromUrl(tempCanvas.toDataURL('image/png')); - Potrace.setParameter({ - turdSize: 100, // 減少雜訊 - opttolerance: 0.5, // 調整優化容差 - }); - Potrace.process(function () { - var svgData = Potrace.getSVG(2); // 取得 SVG 資料 - svgData = svgData.replace(/^.+path d="/, '').replace(/".+$/, ''); - resolve(svgData); - }); - }; - }); - } - - async function loadSVG(gname) { - var savedSvg = await loadFromDB('s_' + gname); - if (savedSvg) return savedSvg; // 如果已經存在 SVG,則直接返回 - - var savedCanvas = await loadFromDB('g_' + gname); - if (!savedCanvas) return null; - var svgData = toSVG(gname, savedCanvas); // 如果不存在 SVG,則儲存並返回新的 SVG - await saveToDB('s_' + gname, svgData); - return svgData; - } - - function createGlyph(unicode, gname, adw, path) { - var glyphObj = { - name: gname, - advanceWidth: adw, - path: path || new opentype.Path() - }; - if (unicode) glyphObj.unicode = unicode; - return new opentype.Glyph(glyphObj); - } - - function padPath(path, pad) { - var boundingBox = path.getBoundingBox(); - var width = Math.round(boundingBox.x2 - boundingBox.x1); - var xoff = pad - Math.round(boundingBox.x1); // 單純指定邊界寬度 - - path.commands.forEach(c => { - c.x = c.x + xoff; - if (c.x1) c.x1 = c.x1 + xoff; - if (c.x2) c.x2 = c.x2 + xoff; - }); - return width + pad * 2; // 返回調整後的寬度 - } - - $('#saveAsTester').on('click', async function () { - updateSetting('saveAsTester', this.checked); // 儲存是否為測試儲存 - }); - - // 儲存字型檔 - $('#downloadFontButton').on('click', async function () { - // 顯示進度條 - $naviContainer.hide(); - $progressContainer.show(); - $progressBar.val(0); - $progressText.text('0%'); - - const glyphs = [ // 建立字符陣列,並加入一些空格字符(因程式機制上無法畫出空白字符,只能自動產生) - createGlyph(null, '.notdef', 600), // notdef - createGlyph(0x20, 'space', 300), // 空格 - createGlyph(0xA0, 'uni00A0', 300), // No-break Space - createGlyph(0x2c9, 'macron', 600), // 一聲 - createGlyph(0x3000, 'uni3000', upm), // Ideographic Space - createGlyph(0x2002, 'uni2002', upm / 2), // En Space - createGlyph(0x2003, 'uni2003', upm), // Em Space - ]; - - const gidMap = {}; - const fulls = []; - const verts = []; - const ccmps = []; - - const totalGlyphs = Object.keys(glyphMap).length; // 總字符數量 - let processedGlyphs = 0; - var scale = parseInt(settings.scaleRate, 10) / 100; - var scaleoff = (upm - scale * upm) / 2; // 縮放偏移量 - - for (let gname in glyphMap) { - // 更新進度條 - updateProgress(processedGlyphs, totalGlyphs); - processedGlyphs++; - - try { - let svgData = await loadSVG(gname); - if (!svgData) continue; - let path = await opentype.Path.fromSVG(svgData, { flipYBase: 0, scale: scale, y: 880 - scaleoff, x: scaleoff }); - - let adw = upm; - if (glyphMap[gname].w == 'P' || glyphMap[gname].w == 'H') { // 比例寬自動調整 - adw = padPath(path, 50); - } else if (settings.noFixedWidthFlag) { - adw = padPath(path, 100); - } - - let unicode = null; - if (gname.match(/^uni([0-9A-F]{4})$/i)) { - unicode = parseInt(RegExp.$1, 16); // 轉換為 Unicode 編碼 - } else if (gname.match(/^u([0-9A-F]{5})$/i)) { - unicode = parseInt(RegExp.$1, 16); // 轉換為 Unicode 編碼 - } else if (gname.indexOf('.vert') < 0 && glyphMap[gname].c.length == 1) { - unicode = glyphMap[gname].c.charCodeAt(0); // 使用字符的 Unicode 編碼 - } - let glyph = createGlyph(unicode, gname, adw, path); - glyphs.push(glyph); - gidMap[gname] = glyphs.length - 1; - - // 自動製作全形字符 - if (glyphMap[gname].f) { - let gnameF = glyphMap[gname].f; - let pathF = await opentype.Path.fromSVG(svgData, { flipYBase: 0, scale: scale, y: 880 - scaleoff, x: scaleoff }); - let adwF = upm; - if (settings.noFixedWidthFlag) adwF = padPath(pathF, 100); // 如果沒有固定寬度 - let unicodeF = null; - if (gnameF.match(/^uni([0-9A-F]{4})$/i)) unicodeF = parseInt(RegExp.$1, 16); // 轉換為 Unicode 編碼 - let glyphF = createGlyph(unicodeF, gnameF, adwF, pathF); - fulls.push(glyphF); - } - - if (glyphMap[gname].v) verts.push(gname); - if (glyphMap[gname].s) ccmps.push(gname); - } catch (err) { - console.error(`Error processing glyph ${gname}:`, err); - } - } - - // 加入全形字符在後面 - for (let i in fulls) { - var glyphF = fulls[i]; - glyphs.push(glyphF); - gidMap[glyphF.name] = glyphs.length - 1; - } - const font = await createFont(glyphs, gidMap, verts, ccmps); - - // 建立下載連結 - const link = document.createElement('a'); - link.download = font.names.windows.postScriptName.en + '.otf'; //'drawing.otf'; - link.href = window.URL.createObjectURL(new Blob([font.toArrayBuffer()]), { type: "font/opentype" }); - link.click(); - - // 隱藏進度條 - $naviContainer.show(); - $progressContainer.hide(); - }); - - // 顯示設定畫面 - function updateSettingsContainer() { - $('#settings-title').text(settings.notNewFlag ? fdrawer.settingsTitle : fdrawer.welcomeTitle); - $('#span-welcome').toggle(!settings.notNewFlag); - - $('#fontNameEng').val(settings.fontNameEng); - $('#fontNameCJK').val(settings.fontNameCJK); - $('#noFixedWidthFlag').prop('checked', settings.noFixedWidthFlag); - - if (!settings.notNewFlag) updateSetting('notNewFlag', true); // 如果是第一次使用,則設定 notNewFlag 為 true - } - settings_container.addEventListener('shown.bs.modal', updateSettingsContainer); - - $('#fontNameEng').on('change', function () { updateSetting('fontNameEng', $(this).val().replace(/[^a-zA-Z0-9 ]/g, '')); }); - $('#fontNameCJK').on('change', function () { updateSetting('fontNameCJK', $(this).val()); }); - $('#smallModeCheck').on('click', async function () { - await updateSetting('smallMode', $(this).prop('checked')); - $('#canvas-container').toggleClass('smallmode', settings.smallMode); - }); - $('#noFixedWidthFlag').on('click', function () { updateSetting('noFixedWidthFlag', $(this).prop('checked')); }); - $('#scaleRateSlider').on('input', function () { - var rate = parseInt($(this).val(), 10); - $('#scaleRateValue').text(rate + '%'); - updateSetting('scaleRate', rate); - initCanvas(canvas); - }); - $('#pressureEffectSelect').change(function () { updateSetting('pressureEffect', $(this).val()); }); - $('#gridTypeSelect').change(function () { - updateSetting('gridType', $(this).val()); - initCanvas(canvas); - }); - - // 筆壓繪圖設定事件監聽器 - $('#pressureDrawingEnabled').on('change', async function () { - updateSetting('oldPressureMode', $(this).prop('checked')); - // 立即更新筆壓繪圖狀態 - await updatePressureDrawingStatus(); - - $('#brushSelector').toggle(!settings.oldPressureMode); // 如果舊筆壓繪圖啟用,則隱藏筆刷選擇器 - $('#pressureSwitchContainer').toggle(!settings.oldPressureMode); // 如果舊筆壓繪圖啟用,則隱藏筆壓開關 - }); - - // 顯示字表畫面 - listup_container.addEventListener('shown.bs.modal', async function () { - saveToLocalDB(true); // 儲存當前畫布內容到 Local Storage - - $('#listup-body').empty(); // 清空 - - // 計算 viewBox - var scale = parseInt(settings.scaleRate, 10) / 100; - var emSize = Math.round(upm / scale); - var emOff = Math.round((upm - emSize) / 2); - var viewBox = `${emOff} ${emOff} ${emSize} ${emSize}`; - - for (let i in nowList) { - var gname = nowList[i]; - var svgData = await loadFromDB('s_' + gname); - if (svgData) { // 已寫過 - $('#listup-body').append( - $('').html('').data('index', i).on('click', function () { - setGlyph($(this).data('index') * 1); - listup_container_modal.hide(); - }) - ); - } else { - var cell = $('').text(glyphMap[gname].c).data('index', i).on('click', function () { - setGlyph($(this).data('index') * 1); - listup_container_modal.hide(); - }); - if (glyphMap[gname].v && gname.indexOf('.vert') > 0) cell.addClass('vert'); - $('#listup-body').append(cell); - } - } - - $('

').appendTo($('#listup-body')); - }); - - // 顯示提示畫面 - hint_container.addEventListener('shown.bs.modal', function () { - $('#version').text(version); - }); - - // 顯示下載畫面 - download_container.addEventListener('shown.bs.modal', async function () { - $('#saveAsTester').prop('checked', settings.saveAsTester); // 設定是否為測試儲存 - }); - - // 關閉廣告畫面 - $('#closeAdsButton').on('click', function () { - $('#ads-container').hide(); - }); - - - // 取得滑鼠或觸控座標 - function getCanvasCoordinates(event) { - const rect = canvas.getBoundingClientRect(); - const touch = event.type.includes('touch') ? event.originalEvent.touches[0] : event; - return { - x: touch.clientX - rect.left, - y: touch.clientY - rect.top - }; - } - - // 匯出事件 - Debugger - $('#exportEventsButton').on('click', async function () { - const data = events.join('\n'); - if (data.length > 0) { - const blob = new Blob([data], { type: 'text/plain' }); - const link = document.createElement('a'); - link.download = settings.fontNameEng + '-EventLog' + (new Date()).toISOString() + '.txt'; - link.href = window.URL.createObjectURL(blob); - link.click(); - } else { - alert(fdrawer.noDataToExport); - } - }); - - // 匯出資料 - $('#exportDataButton').on('click', async function () { - const transaction = db.transaction([storeName], 'readonly'); - const store = transaction.objectStore(storeName); - const request = store.getAll(); - - request.onsuccess = async function (event) { - const data = event.target.result.map(item => `${item.key}\t${item.value}`).join('\n'); - if (data.length > 0) { - const blob = new Blob([data], { type: 'text/plain' }); - const link = document.createElement('a'); - link.download = settings.fontNameEng + '-' + (new Date()).toISOString() + '.txt'; - link.href = window.URL.createObjectURL(blob); - link.click(); - } else { - alert(fdrawer.noDataToExport); - } - }; - }); - - // 匯入資料 - $('#importDataFile').on('change', async function () { - if (confirm(fdrawer.importConfirm)) { - const fileInput = $(this); - const file = fileInput[0].files[0]; - if (file) { - const reader = new FileReader(); - reader.onload = async function (e) { - await clearDB(); // 清除現有的 IndexedDB 資料 - const data = e.target.result; - const lines = data.split('\n'); - for (const line of lines) { - if (line.trim() === '') continue; // 跳過空行 - const parts = line.split('\t'); - if (parts.length < 2) continue; // 如果格式不正確,跳過 - const key = parts[0].trim(); - const value = parts[1].trim(); - await saveToDB(key, value); - } - alert(fdrawer.importDone); - location.reload(); // 重新載入頁面 - }; - reader.readAsText(file); - } - } else { - $(this).val(''); // 清除選擇的檔案 - } - }); - - // 修改清除所有資料的功能 - $('#clearAllButton').on('click', async function () { - if (confirm(fdrawer.clearConfirm)) { - await clearDB(); - alert(fdrawer.clearDone); - location.reload(); // 重新載入頁面 - } - }); -}); - -document.addEventListener('DOMContentLoaded', function () { - // 判斷是否在 in-app browser 中 - const userAgent = navigator.userAgent || navigator.vendor || window.opera; - - if (/FBAN|FBAV|Instagram|Line|Threads/i.test(userAgent)) { - // 如果是 Facebook、Instagram 或 Line 的 in-app browser - alert(fdrawer.inAppNotice); - } - - // 解決 iOS Safari 按鈕點兩下容易不小心放大視窗的問題 - if (/iphone|ipad|ipod/.test(userAgent.toLowerCase()) && /safari/.test(userAgent.toLowerCase())) { - document.querySelectorAll('body').forEach(function (btn) { - btn.addEventListener('dblclick', function (e) { - e.preventDefault(); - }, { passive: false }); - }); - } -}); diff --git a/pages/fonts/GenYoExt3-R.woff b/pages/fonts/GenYoExt3-R.woff new file mode 100644 index 0000000000000000000000000000000000000000..07090938387b016fca87caaae8fff36bb80609d4 GIT binary patch literal 71456 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

7$G?Cn?vtHW{#4xfGBUf(tSv0b~aYxj*? z`Ece!oyLx9MA$`J=4gb~fkg@?pa2!_Y=wFSS}+B3umBTKgyE{z z3(bixiPl6*Xd1J1pu`+?jhajBLUW=u(UNG(_91rnh~4qcDdIO@H2V#zFM$VbnWsxN zMN|Ujpa2y(9S957ktcyy1Xcpxf;HNcPyH+Z1BvuJuuk9$(1P`+!)&t#dT}xn4P&$q}X zviD;XZXb?KK8*~^neLx+&JRR4O?T4Ab2;nWZgqoq6y>7d`smPZc5ZRI zZ5Qip8~I(c8T%6}%$YpSVlV+YC_o7+P=hI$fq7sWqCYNjkb?sK5>%iDQ!oSZys^Ox z73P&nP(7-K-lN!zRAm`D;|xqcyj;f*FZU3A1<1h?)S&rrJQ(B&`RUgCzb~I;wA#SL zfW;>_{>?00C)kcR@ZjhOb#BZxmT4Grhu8qzt!6_!!jBH-l(eMfU|vD{ zbG}j)uEw&4Fm#h#MY~BouQ8|hJ^>C(TIi^ag{@DWTrNk)pmli1Vr^%%YPffRmeTE% zjWXFJiY@;z=+q4Mbg-Z>Z(~*aoDXYScO6V<1O9gl3sZmTOdBKGYk64md<*mSVCSzs zIh(N$xV1&9HS)$eUd;soB$+o=G)=1R4se$3v*byq`ao>N5#ZpKACd;xHpr_Nym}Fu zVGsl+v4z9Bg<{7?@rIo(+M93i9|BwxbOP z#}&B(;Fx~R2hf5#gyX#1q1|}euL(t~loTKiT9g?lbO><>I6<^IIH}(3`AMO@5j@0^ zL;1)2wKusb4y8LgJ*VD;UgO#(S3ZZ0Ge<~H)S*@ z`N4jrhso%l^je&ZmOP#~d_0pBjjHF*1}Vy?89i6}JX7#It^BzXT_5j!PBd()FL%N+g!>Cq>;RQuy;SF*t)ajkNCBwqSA#ESV4GFLm)0vB>-Jp@3hb8Iu zya7XgrmSuIp9@d~^K)UUcsp=i2{@=BmT83C46&roUe^$ap6tI;L5FRLMIE)tT+oq8 z>yV#xXJaA>;XPxLoE~3swT)5Mh^FNu6Aq^KP1)q6+{KliEd`S?jbhJlz>>5~()5&c=us=MRHxmm zlfPZECSEk{-EK)9`PCDZ=w7=*{(*BAa<9c}N1NP*KqV|e zL(X;2-&Dz9q3%-1?-}Xl|7(gFQ$*;NBt5E5%!?It>ujn-EZ99({!F_?+mc;g$Id70#1*$1Hk8H*CgK$Nze+i>wBsAb_I3 z1z!SFW;83n-CcuQaJK|^UrcO+)T?TGcI%w?B}9qO9f^2B=ZA%(QPH^`!I;1U<5AIb zU_#)5Nt#~46b+cB0W&mUHYz#iIz@9LPnC*Fo>R?>Jk{wyow;KfMrY9x4*wl&%BoyqbKBl)M1{7Y8G!MBm%$4KxS z6>IdDZN9v=82UlC{L>^KgQ<@Cd}TTx)Qx5TzpNYn0HD4BO?Uxg@ZQ02A}C@bBV%9W z2F9Hn3>*x}1sfUIowhPC7$~qXXo1)cT(+#HEUFx$94uT=0ViflCS5jJHn0G<(_a1t z-UiMF)&>R^25z7Tztdg@2M7d<>||hOU~t)}!q^cQvB9Au0>n>o*{A{H@8Dnn3V;手寫字型產生器 by 字嗨 - - + + -

-