From 3aca6c84be278eaba2b396bffaf8e04ae66da53f Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 16 Nov 2020 13:30:20 +0900 Subject: [PATCH] antialiased font --- assets/emittest.js | 11 +++++++++++ assets/tbas/basic.js | 2 +- cp437_fira_code.kra | 3 +++ cp437_fira_code.png | Bin 0 -> 13418 bytes src/net/torvald/tsvm/AppLoader.java | 4 ++-- .../tsvm/peripheral/GraphicsAdapter.kt | 18 +++++++++++++++--- .../torvald/tsvm/peripheral/TexticsAdapter.kt | 8 ++++---- 7 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 assets/emittest.js create mode 100644 cp437_fira_code.kra create mode 100644 cp437_fira_code.png diff --git a/assets/emittest.js b/assets/emittest.js new file mode 100644 index 0000000..89a6732 --- /dev/null +++ b/assets/emittest.js @@ -0,0 +1,11 @@ +con.clear(); +con.move(1,1); +for (let i = 0; i < 2048; i++) { + if (i < 1024) con.color_pair(239, 0); else con.color_pair(0, 239); + + let cx = (i%80)+1; + let cy = ((i/80)|0)+1; + //serial.printerr(cx+","+cy); + con.move(cy,cx); + con.addch(i%256); +} \ No newline at end of file diff --git a/assets/tbas/basic.js b/assets/tbas/basic.js index 05e8d94..5f50c8d 100644 --- a/assets/tbas/basic.js +++ b/assets/tbas/basic.js @@ -549,7 +549,7 @@ bStatus.builtin = { let varname = asgnObj.asgnVarName // check for variable name collision (e.g. 10 K=1TO10 \n 20 FOR I=K should work but 20 FOR K=K must not) - if (bStatus.vars[varname] !== undefined)) throw lang.dupDef(lnum, varname); + if (bStatus.vars[varname] !== undefined) throw lang.dupDef(lnum, varname); // assign new variable bStatus.vars[varname] = asgnObj.asgnValue diff --git a/cp437_fira_code.kra b/cp437_fira_code.kra new file mode 100644 index 0000000..eb45025 --- /dev/null +++ b/cp437_fira_code.kra @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f5b072f194909e4952f5ae26242956a8780767777df5a15df3c5cd07f06de5df +size 92849 diff --git a/cp437_fira_code.png b/cp437_fira_code.png new file mode 100644 index 0000000000000000000000000000000000000000..bcec388c3b24357d771009c2a33f97d6f78300cd GIT binary patch literal 13418 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