From f532d5c565bb1b453e4f865162660068df6d3a11 Mon Sep 17 00:00:00 2001 From: William Barnes Date: Thu, 28 Apr 2022 21:14:59 -0400 Subject: [PATCH 1/7] Prototyped Draw function. Implemented stand-in for Varptr$. Fixed hexrep permutation and alpha scale. --- codemirror/qb-lang.js | 4 +- qb.js | 259 +++++++++++++++++++++++++++++++++++++++++- qb2js.js | 2 + tools/qb2js.bas | 2 + 4 files changed, 262 insertions(+), 5 deletions(-) diff --git a/codemirror/qb-lang.js b/codemirror/qb-lang.js index b65da59..60dee5d 100644 --- a/codemirror/qb-lang.js +++ b/codemirror/qb-lang.js @@ -40,10 +40,10 @@ CodeMirror.defineMode("qbjs", function(conf, parserConf) { '_keyhit', '_loadimage', '_mousebutton', '_mouseinput', '_mousex', '_mousey', '_newimage', '_pi', '_printstring', '_printwidth', '_putimage', '_r2d', '_red', '_red32', '_resize', '_resizewidth', '_resizeheight', '_rgb', '_rgba', '_rgb32', '_rgba32', '_round', '_screenexists', '_sinh', '_sndclose', '_sndopen', '_sndplay', '_sndloop', '_sndpause', '_sndstop', '_sndvol', - '_title', '_trim', '_width', 'abs', 'asc', 'atn', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'exp', + '_title', '_trim', '_width', 'abs', 'asc', 'atn', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'draw', 'exp', 'fix', 'hex', 'input', 'inkey', 'instr', 'int', 'lbound', 'left', 'lcase', 'len', 'line', 'locate', 'log', 'ltrim', 'mid', 'mki', 'mkl', 'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr', 'str', 'swap', 'tan', - 'timer', 'ubound', 'ucase', 'val', + 'timer', 'ubound', 'ucase', 'val', 'varptr', // QBJS-specific 'export', 'import'] //'alert', 'confirm', 'domadd', 'domcontainer', 'domcreate', 'domevent','domget', 'domgetimage', 'domremove', 'export', diff --git a/qb.js b/qb.js index a73d4f2..8f295f8 100644 --- a/qb.js +++ b/qb.js @@ -408,10 +408,10 @@ var QB = new function() { a: a, rgba: function() { return "rgba(" + this.r + "," + this.g + "," + this.b + "," + this.a + ")"; }, toString: function() { - var hexrep = ("00" + r.toString(16)).slice(-2) + + var hexrep = ("00" + (255*a).toString(16)).slice(-2) + + ("00" + r.toString(16)).slice(-2) + ("00" + g.toString(16)).slice(-2) + - ("00" + b.toString(16)).slice(-2) + - ("00" + a.toString(16)).slice(-2); + ("00" + b.toString(16)).slice(-2); return parseInt(hexrep, 16).toString(); } } @@ -625,6 +625,253 @@ var QB = new function() { return result; } + this.sub_Draw = function(t) { + + var u; + + u = t.replace("=","").toUpperCase(); + u = u.split(" ").join("").split(""); + + var d; + var elem; + var flag; + d = u[0]; + if (!isNaN(String(d) * 1)) { + flag = 0; // number + } else if ((d >= 'A' && d <= 'Z') || (d >= 'a' && d <= 'z')) { + flag = 1; // letter + } else { + flag = -1; // symbol + } + elem = d; + + var v = [[]]; + v.shift(); + for (var i=1; i= 'A' && d <= 'Z') || (d >= 'a' && d <= 'z')) { + v.push([elem,flag]); + elem = d; + flag = 1; + } else { + if (flag == -1) { + elem += d; + } else { + v.push([elem,flag]); + elem = d; + flag = -1; + } + } + } + v.push([elem,flag]); + + var cursS = 4; + var cursA = -Math.PI/2; + var tok; + var tok1; + var tok2; + var cursReturn = false; + var cursSkipdraw = false; + var cursX0; + var cursY0; + var cursXt; + var cursYt; + var dx; + var dy; + var dlen; + var tmp = [[]]; + var fac; + + var screen = _images[_activeImage]; + var ctx = screen.ctx; + var cursX = screen.lastX; + var cursY = screen.lastY; + ctx.strokeStyle = _fgColor.rgba(); + + var lines = [["U",0],["E",Math.PI/4],["R",Math.PI/2],["F",Math.PI*(3/4)],["D",Math.PI],["G",Math.PI*(5/4)],["L",Math.PI*(3/2)],["H",Math.PI*(7/4)]]; + + while (v.length) { + tok = v.shift(); + + if (tok[1] == 1) { + + if (tok[0] == "C") { + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok1 = v.shift(); + ctx.strokeStyle = _color(Math.floor(tok1[0])).rgba(); + } + } + + } else if (tok[0] == "S") { + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok1 = v.shift(); + cursS = tok1[0]; + } + } + + } else if (tok[0] == "N") { + cursX0 = cursX; + cursY0 = cursY; + cursReturn = true; + + } else if (tok[0] == "B") { + cursSkipdraw = true; + + } else if (tok[0] == "A") { + tok1 = v.shift(); + if (tok1[1] == 0) { + if (tok1[0] == 1) { + cursA = -Math.PI; + } else if (tok1[0] == 2) { + cursA = -Math.PI*(3/2); + } else if (tok1[0] == 3) { + cursA = 0; + } + if (cursA > Math.PI*2) { cursA -= Math.PI*2; } + if (cursA < -Math.PI*2) { cursA += Math.PI*2; } + } + + } else if (tok[0] == "T") { + if (v.length) { + tmp = v[0]; + if (tmp[1] == 1) { + tok1 = v.shift(); + if (tok1[0] == "A") { + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok2 = v.shift(); + cursA = -Math.PI/2 - tok2[0]*Math.PI/180; + } + } + } + } + } + + } else if (tok[0] == "M") { + if (v.length) { + tmp = v[0]; + if (tmp[1] == -1) { + tok1 = v.shift(); + if (tok1[0] == "+") { + fac = 1; + } else if (tok1[0] == "-") { + fac = -1; + } + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok2 = v.shift(); + cursX = cursX + fac * tok2[0]; + } + } + } else if (tmp[1] == 0) { + tok1 = v.shift(); + cursX = tok1[0]; + } + } + if (v.length) { + tmp = v[0]; + if ((tmp[1] == -1) && (tmp[0] == ",")) { + tmp = v.shift(); + if (v.length) { + tmp = v[0]; + if (tmp[1] == -1) { + tok1 = v.shift(); + if (tok1[0] == "+") { + fac = 1; + } else if (tok1[0] == "-") { + fac = -1; + } + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok2 = v.shift(); + cursX = cursY + fac * tok2[0]; + } + } + } else if (tmp[1] == 0) { + tok1 = v.shift(); + cursY = tok1[0]; + } + } + } + } + + } else if (tok[0] == "P") { + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok1 = v.shift(); + tok2 = tok1; + if (v.length) { + tmp = v[0]; + if ((tmp[1] == -1) && (tmp[0] == ",")) { + tmp = v.shift(); + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok2 = v.shift(); + } + } + } + } + this.sub_Paint(undefined, cursX, cursY, _color(Math.floor(tok1[0])), _color(Math.floor(tok2[0]))); + } + } + + } else { // "UERFDGLH" + for (i=0 ; i Date: Thu, 28 Apr 2022 21:21:06 -0400 Subject: [PATCH 2/7] Resync and update qb-lang.js. --- codemirror/qb-lang.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/codemirror/qb-lang.js b/codemirror/qb-lang.js index 6bdc4a7..7cab5f6 100644 --- a/codemirror/qb-lang.js +++ b/codemirror/qb-lang.js @@ -40,10 +40,10 @@ CodeMirror.defineMode("qbjs", function(conf, parserConf) { '_keyhit', '_loadimage', '_mousebutton', '_mouseinput', '_mousex', '_mousey', '_newimage', '_pi', '_printstring', '_printwidth', '_putimage', '_r2d', '_red', '_red32', '_resize', '_resizewidth', '_resizeheight', '_rgb', '_rgba', '_rgb32', '_rgba32', '_round', '_screenexists', '_sinh', '_sndclose', '_sndopen', '_sndplay', '_sndloop', '_sndpause', '_sndstop', '_sndvol', - '_title', '_trim', '_width', 'abs', 'asc', 'atn', 'beep', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'exp', + '_title', '_trim', '_width', 'abs', 'asc', 'atn', 'beep', 'chr', 'circle', 'cls', 'color', 'command', 'cos', 'cvi', 'cvl', 'draw', 'exp', 'fix', 'hex', 'input', 'inkey', 'instr', 'int', 'lbound', 'left', 'lcase', 'len', 'line', 'locate', 'log', 'ltrim', 'mid', 'mki', 'mkl', 'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr', - 'str', 'swap', 'tan', 'timer', 'ubound', 'ucase', 'val', + 'str', 'swap', 'tan', 'time', 'timer', 'ubound', 'ucase', 'val', 'varptr', // QBJS-specific 'export', 'from', 'import'] From a9ca6c49bc79bcf615d5161a18180824e8e20be6 Mon Sep 17 00:00:00 2001 From: William Barnes Date: Fri, 29 Apr 2022 01:00:28 -0400 Subject: [PATCH 3/7] Improvements to Draw, set fgColor default after graphics call. --- qb.js | 111 +++++++++++++++++++++++++++++------------------- qb2js.js | 1 + tools/qb2js.bas | 1 + 3 files changed, 70 insertions(+), 43 deletions(-) diff --git a/qb.js b/qb.js index 1caf120..edcd6a8 100644 --- a/qb.js +++ b/qb.js @@ -657,76 +657,77 @@ var QB = new function() { this.sub_Draw = function(t) { - var u; + var u = t.toString(); + u = u.replace(" ",""); + u = u.replace("=",""); + u = u.toUpperCase(); + u = u.split(""); - u = t.replace("=","").toUpperCase(); - u = u.split(" ").join("").split(""); - - var d; + var ch; var elem; var flag; - d = u[0]; - if (!isNaN(String(d) * 1)) { + ch = u[0]; + if (!isNaN(String(ch) * 1)) { flag = 0; // number - } else if ((d >= 'A' && d <= 'Z') || (d >= 'a' && d <= 'z')) { + } else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { flag = 1; // letter } else { flag = -1; // symbol } - elem = d; + elem = ch; var v = [[]]; v.shift(); for (var i=1; i= 'A' && d <= 'Z') || (d >= 'a' && d <= 'z')) { + } else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { v.push([elem,flag]); - elem = d; + elem = ch; flag = 1; } else { - if (flag == -1) { - elem += d; - } else { - v.push([elem,flag]); - elem = d; - flag = -1; - } + v.push([elem,flag]); + elem = ch; + flag = -1; } } v.push([elem,flag]); - var cursS = 4; - var cursA = -Math.PI/2; var tok; var tok1; var tok2; - var cursReturn = false; - var cursSkipdraw = false; + var cursS = 4; + var cursA = -Math.PI/2; + var cursX; + var cursY; var cursX0; var cursY0; var cursXt; var cursYt; + var cursReturn = false; + var cursSkipdraw = false; var dx; var dy; var dlen; + var multiplier; + var color; var tmp = [[]]; - var fac; + + var lines = [["U",0],["E",Math.PI/4],["R",Math.PI/2],["F",Math.PI*(3/4)],["D",Math.PI],["G",Math.PI*(5/4)],["L",Math.PI*(3/2)],["H",Math.PI*(7/4)]]; var screen = _images[_activeImage]; var ctx = screen.ctx; - var cursX = screen.lastX; - var cursY = screen.lastY; - ctx.strokeStyle = _fgColor.rgba(); + cursX = screen.lastX; + cursY = screen.lastY; - var lines = [["U",0],["E",Math.PI/4],["R",Math.PI/2],["F",Math.PI*(3/4)],["D",Math.PI],["G",Math.PI*(5/4)],["L",Math.PI*(3/2)],["H",Math.PI*(7/4)]]; + ctx.strokeStyle = _fgColor.rgba(); while (v.length) { tok = v.shift(); @@ -738,7 +739,9 @@ var QB = new function() { tmp = v[0]; if (tmp[1] == 0) { tok1 = v.shift(); - ctx.strokeStyle = _color(Math.floor(tok1[0])).rgba(); + color = Math.floor(tok1[0]); + ctx.strokeStyle = _color(color).rgba(); + _fgColor = _color(color); } } @@ -796,20 +799,20 @@ var QB = new function() { if (tmp[1] == -1) { tok1 = v.shift(); if (tok1[0] == "+") { - fac = 1; + multiplier = 1; } else if (tok1[0] == "-") { - fac = -1; + multiplier = -1; } if (v.length) { tmp = v[0]; if (tmp[1] == 0) { tok2 = v.shift(); - cursX = cursX + fac * tok2[0]; + cursXt = cursX + multiplier * tok2[0]; } } } else if (tmp[1] == 0) { tok1 = v.shift(); - cursX = tok1[0]; + cursXt = tok1[0]; } } if (v.length) { @@ -821,23 +824,33 @@ var QB = new function() { if (tmp[1] == -1) { tok1 = v.shift(); if (tok1[0] == "+") { - fac = 1; + multiplier = 1; } else if (tok1[0] == "-") { - fac = -1; + multiplier = -1; } if (v.length) { tmp = v[0]; if (tmp[1] == 0) { tok2 = v.shift(); - cursX = cursY + fac * tok2[0]; + cursYt = cursY + multiplier * tok2[0]; } } } else if (tmp[1] == 0) { tok1 = v.shift(); - cursY = tok1[0]; + cursYt = tok1[0]; } } } + if (cursSkipdraw == false) { + ctx.beginPath(); + ctx.moveTo(cursX, cursY); + ctx.lineTo(cursXt, cursYt); + ctx.stroke(); + } else { + cursSkipdraw = false; + } + cursX = cursXt; + cursY = cursYt; } } else if (tok[0] == "P") { @@ -862,7 +875,7 @@ var QB = new function() { } } - } else { // "UERFDGLH" + } else { for (i=0 ; i Date: Fri, 29 Apr 2022 01:26:57 -0400 Subject: [PATCH 4/7] Update qb.js --- qb.js | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/qb.js b/qb.js index edcd6a8..df52b44 100644 --- a/qb.js +++ b/qb.js @@ -657,12 +657,14 @@ var QB = new function() { this.sub_Draw = function(t) { + // Turn input string into array of characters. var u = t.toString(); u = u.replace(" ",""); u = u.replace("=",""); u = u.toUpperCase(); u = u.split(""); + // Prime data prep loop. var ch; var elem; var flag; @@ -676,6 +678,7 @@ var QB = new function() { } elem = ch; + // Turn character data into tokens. var v = [[]]; v.shift(); for (var i=1; i Date: Fri, 29 Apr 2022 08:05:52 -0400 Subject: [PATCH 5/7] Remove stray VS folder. --- .vs/qbjs/v17/.suo | Bin 14336 -> 0 bytes .vs/slnx.sqlite | Bin 90112 -> 0 bytes .vs/slnx.sqlite-journal | Bin 21032 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .vs/qbjs/v17/.suo delete mode 100644 .vs/slnx.sqlite delete mode 100644 .vs/slnx.sqlite-journal diff --git a/.vs/qbjs/v17/.suo b/.vs/qbjs/v17/.suo deleted file mode 100644 index c6ed25a9e4315788a2420aa23501ec719f05536b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14336 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 Date: Fri, 29 Apr 2022 21:22:25 -0400 Subject: [PATCH 6/7] Improved Draw routine. --- qb.js | 127 +++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 86 insertions(+), 41 deletions(-) diff --git a/qb.js b/qb.js index ec59ab2..cdbd349 100644 --- a/qb.js +++ b/qb.js @@ -8,7 +8,10 @@ var QB = new function() { this.SQUAREPIXELS = Symbol("SQUAREPIXELS"); this.OFF = Symbol("OFF"); - var _strokeThickness = 2; + var _strokeLineThickness = 2; + var _strokeDrawLength = 4; + var _strokeDrawAngle = -Math.PI/2; + var _strokeDrawColor; var _fgColor = null; var _bgColor = null; var _colormap = []; @@ -682,7 +685,7 @@ var QB = new function() { } this.sub_Draw = function(t) { - + // Turn input string into array of characters. var u = t.toString(); u = u.replace(" ",""); @@ -729,37 +732,51 @@ var QB = new function() { } v.push([elem,flag]); - var color; - var cursS = 4; - var cursA = -Math.PI/2; + // Draw-specific variables. + //var color; var cursX, cursY; var cursX0, cursY0; var cursXt, cursYt; + var ux, uy, ux0, uy0, uxx, uyy; var cursReturn = false; var cursSkipdraw = false; var dx, dy, dlen; - var multiplier; + var multiplier = 1; var tok, tok1, tok2; var tmp = [[]]; - var lines = [["U",0],["E",Math.PI/4],["R",Math.PI/2],["F",Math.PI*(3/4)],["D",Math.PI],["G",Math.PI*(5/4)],["L",Math.PI*(3/2)],["H",Math.PI*(7/4)]]; + var lines = [["U",0,1], + ["E",Math.PI/4,Math.sqrt(2)], + ["R",Math.PI/2,1], + ["F",Math.PI*(3/4),Math.sqrt(2)], + ["D",Math.PI,1], + ["G",Math.PI*(5/4),Math.sqrt(2)], + ["L",Math.PI*(3/2),1], + ["H",Math.PI*(7/4),Math.sqrt(2)]]; + // Screen variables. var screen = _images[_activeImage]; var ctx = screen.ctx; cursX = screen.lastX; cursY = screen.lastY; - ctx.strokeStyle = _fgColor.rgba(); while (v.length) { tok = v.shift(); if (tok[1] == 1) { - if (tok[0] == "C") { + + if (tok[0] == "B") { + cursSkipdraw = true; + + } else if (tok[0] == "N") { + cursX0 = cursX; + cursY0 = cursY; + cursReturn = true; + + } else if (tok[0] == "C") { if (v.length) { tmp = v[0]; if (tmp[1] == 0) { tok1 = v.shift(); - color = Math.floor(tok1[0]); - ctx.strokeStyle = _color(color).rgba(); - _fgColor = _color(color); + _strokeDrawColor = Math.floor(tok1[0]); } } @@ -768,30 +785,22 @@ var QB = new function() { tmp = v[0]; if (tmp[1] == 0) { tok1 = v.shift(); - cursS = tok1[0]; + _strokeDrawLength = (tok1[0]) * Math.sqrt(2); } } - } else if (tok[0] == "N") { - cursX0 = cursX; - cursY0 = cursY; - cursReturn = true; - - } else if (tok[0] == "B") { - cursSkipdraw = true; - } else if (tok[0] == "A") { tok1 = v.shift(); if (tok1[1] == 0) { if (tok1[0] == 1) { - cursA = -Math.PI; + _strokeDrawAngle = -Math.PI; } else if (tok1[0] == 2) { - cursA = -Math.PI*(3/2); + _strokeDrawAngle = -Math.PI*(3/2); } else if (tok1[0] == 3) { - cursA = 0; + _strokeDrawAngle = 0; } - if (cursA > Math.PI*2) { cursA -= Math.PI*2; } - if (cursA < -Math.PI*2) { cursA += Math.PI*2; } + if (_strokeDrawAngle > Math.PI*2) { _strokeDrawAngle -= Math.PI*2; } + if (_strokeDrawAngle < -Math.PI*2) { _strokeDrawAngle += Math.PI*2; } } } else if (tok[0] == "T") { @@ -800,11 +809,27 @@ var QB = new function() { if (tmp[1] == 1) { tok1 = v.shift(); if (tok1[0] == "A") { + if (v.length) { + tmp = v[0]; + if (tmp[1] == -1) { + if (tmp[0] == "-") { + multiplier = -1; + } else if (tmp[0] == "+") { + multiplier = 1; + } + tmp = v.shift(); + tmp = v[0]; + } else { + multiplier = 1; + } + } if (v.length) { tmp = v[0]; if (tmp[1] == 0) { tok2 = v.shift(); - cursA = -Math.PI/2 - tok2[0]*Math.PI/180; + _strokeDrawAngle = -(Math.PI/2) - multiplier * (tok2[0])*Math.PI/180; + if (_strokeDrawAngle > Math.PI*2) { _strokeDrawAngle -= Math.PI*2; } + if (_strokeDrawAngle < -Math.PI*2) { _strokeDrawAngle += Math.PI*2; } } } } @@ -812,27 +837,36 @@ var QB = new function() { } } else if (tok[0] == "M") { + multiplier = 1; if (v.length) { tmp = v[0]; if (tmp[1] == -1) { tok1 = v.shift(); + ux0 = 0; + uy0 = 0; if (tok1[0] == "+") { multiplier = 1; + ux0 = cursX; + uy0 = cursY; } else if (tok1[0] == "-") { multiplier = -1; + ux0 = cursX; + uy0 = cursY; } if (v.length) { tmp = v[0]; if (tmp[1] == 0) { tok2 = v.shift(); - cursXt = cursX + multiplier * tok2[0]; + ux = multiplier * (_strokeDrawLength/4) * (tok2[0]); } } } else if (tmp[1] == 0) { tok1 = v.shift(); - cursXt = tok1[0]; + ux = multiplier * (_strokeDrawLength/4) * (tok1[0]); } + } + multiplier = 1; if (v.length) { tmp = v[0]; if ((tmp[1] == -1) && (tmp[0] == ",")) { @@ -844,23 +878,31 @@ var QB = new function() { if (tok1[0] == "+") { multiplier = 1; } else if (tok1[0] == "-") { - multiplier = -1; + multiplier = 1; } if (v.length) { tmp = v[0]; if (tmp[1] == 0) { tok2 = v.shift(); - cursYt = cursY + multiplier * tok2[0]; + uy = multiplier * (_strokeDrawLength/4) * (tok2[0]); } } } else if (tmp[1] == 0) { tok1 = v.shift(); - cursYt = tok1[0]; + uy = multiplier * (_strokeDrawLength/4) * (tok1[0]); } + + uxx = ux * Math.cos(_strokeDrawAngle + Math.PI/2) - uy * Math.sin(_strokeDrawAngle + Math.PI/2); + uyy = ux * Math.sin(_strokeDrawAngle + Math.PI/2) + uy * Math.cos(a_strokeDrawAngle + Math.PI/2); + uxx = uxx / Math.sqrt(2); + uyy = uyy / Math.sqrt(2); + cursXt = ux0 + uxx; + cursYt = uy0 + uyy; } } if (cursSkipdraw == false) { ctx.beginPath(); + ctx.strokeStyle = _color(_strokeDrawColor).rgba(); ctx.moveTo(cursX, cursY); ctx.lineTo(cursXt, cursYt); ctx.stroke(); @@ -900,17 +942,18 @@ var QB = new function() { tmp = v[0]; if (tmp[1] == 0) { tok1 = v.shift(); - dlen = tok1[0]; + dlen = (tok1[0]) * (_strokeDrawLength/4) * (lines[i][2]); } else { - dlen = cursS/4; + dlen = (_strokeDrawLength/4) * (lines[i][2]); } } - dx = dlen * Math.cos(cursA + lines[i][1]); - dy = dlen * Math.sin(cursA + lines[i][1]); + dx = dlen * Math.cos(_strokeDrawAngle + lines[i][1]); + dy = dlen * Math.sin(_strokeDrawAngle + lines[i][1]); cursXt = cursX*1.0 + dx; cursYt = cursY*1.0 + dy; if (cursSkipdraw == false) { ctx.beginPath(); + ctx.strokeStyle = _color(_strokeDrawColor).rgba(); ctx.moveTo(cursX, cursY); ctx.lineTo(cursXt, cursYt); ctx.stroke(); @@ -1077,7 +1120,7 @@ var QB = new function() { screen.lastY = y; var ctx = screen.ctx; - ctx.lineWidth = _strokeThickness; + ctx.lineWidth = _strokeLineThickness; ctx.strokeStyle = color.rgba(); ctx.beginPath(); if (aspect == undefined) { @@ -1090,7 +1133,7 @@ var QB = new function() { } } ctx.stroke(); - _fgColor = _color(color); + _strokeDrawColor = _color(color); }; this.sub_Line = function(sstep, sx, sy, estep, ex, ey, color, style, pattern) { @@ -1127,7 +1170,7 @@ var QB = new function() { screen.lastY = ey; var ctx = screen.ctx; - ctx.lineWidth = _strokeThickness; + ctx.lineWidth = _strokeLineThickness; if (style == "B") { ctx.strokeStyle = color.rgba(); @@ -1146,7 +1189,7 @@ var QB = new function() { ctx.lineTo(ex, ey); ctx.stroke(); } - _fgColor = _color(color); + _strokeDrawColor = _color(color); }; this.sub_LineInput = async function(values, preventNewline, addQuestionPrompt, prompt) { @@ -1320,6 +1363,7 @@ var QB = new function() { }; this.sub_Print = async function(args) { + // Print called with no arguments if (args == undefined || args == null || args.length < 1) { args = [""]; @@ -1421,7 +1465,7 @@ var QB = new function() { ctx.fillStyle = color.rgba(); ctx.beginPath(); ctx.fillRect(x, y, 1, 1); - _fgColor = _color(color); + _strokeDrawColor = _color(color); }; this.func_Right = function(value, n) { @@ -1480,6 +1524,7 @@ var QB = new function() { _bgColor = _color(0); _locX = 0; _locY = 0; + _strokeDrawColor = _color(15); _lastKey = null; _inputMode = false; From 6595b68da9ee82871ce07f9fb42720cc43babe3f Mon Sep 17 00:00:00 2001 From: William Barnes Date: Fri, 29 Apr 2022 21:26:25 -0400 Subject: [PATCH 7/7] Improved Draw routine. --- qb.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qb.js b/qb.js index cdbd349..02da2f8 100644 --- a/qb.js +++ b/qb.js @@ -893,7 +893,7 @@ var QB = new function() { } uxx = ux * Math.cos(_strokeDrawAngle + Math.PI/2) - uy * Math.sin(_strokeDrawAngle + Math.PI/2); - uyy = ux * Math.sin(_strokeDrawAngle + Math.PI/2) + uy * Math.cos(a_strokeDrawAngle + Math.PI/2); + uyy = ux * Math.sin(_strokeDrawAngle + Math.PI/2) + uy * Math.cos(_strokeDrawAngle + Math.PI/2); uxx = uxx / Math.sqrt(2); uyy = uyy / Math.sqrt(2); cursXt = ux0 + uxx;