diff --git a/.vs/qbjs/v17/.suo b/.vs/qbjs/v17/.suo deleted file mode 100644 index c6ed25a..0000000 Binary files a/.vs/qbjs/v17/.suo and /dev/null differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index 677adcf..0000000 Binary files a/.vs/slnx.sqlite and /dev/null differ diff --git a/.vs/slnx.sqlite-journal b/.vs/slnx.sqlite-journal deleted file mode 100644 index 93aede8..0000000 Binary files a/.vs/slnx.sqlite-journal and /dev/null differ diff --git a/codemirror/qb-lang.js b/codemirror/qb-lang.js index 0af1209..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', 'csrlin', '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', 'pos', 'preset', 'print', 'pset', 'right', 'rtrim', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', - 'sqr', 'str', 'swap', 'tan', 'timer', 'ubound', 'ucase', 'val', + 'oct', 'paint', 'point', 'preset', 'print', 'pset', 'right', 'rtrim', 'rnd', 'screen', 'shared', 'sgn', 'sin', 'sleep', 'space', 'sqr', + 'str', 'swap', 'tan', 'time', 'timer', 'ubound', 'ucase', 'val', 'varptr', // QBJS-specific 'export', 'from', 'import'] diff --git a/qb.js b/qb.js index 7164147..02da2f8 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 = []; @@ -440,10 +443,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(); } } @@ -681,6 +684,298 @@ var QB = new function() { return result; } + 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; + ch = u[0]; + if (!isNaN(String(ch) * 1)) { + flag = 0; // number + } else if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { + flag = 1; // letter + } else { + flag = -1; // symbol + } + elem = ch; + + // Turn character data into tokens. + var v = [[]]; + v.shift(); + for (var i=1; i= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) { + v.push([elem,flag]); + elem = ch; + flag = 1; + } else { + v.push([elem,flag]); + elem = ch; + flag = -1; + } + } + v.push([elem,flag]); + + // 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 = 1; + var tok, tok1, tok2; + var tmp = [[]]; + 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; + + while (v.length) { + tok = v.shift(); + if (tok[1] == 1) { + + 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(); + _strokeDrawColor = Math.floor(tok1[0]); + } + } + + } else if (tok[0] == "S") { + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok1 = v.shift(); + _strokeDrawLength = (tok1[0]) * Math.sqrt(2); + } + } + + } else if (tok[0] == "A") { + tok1 = v.shift(); + if (tok1[1] == 0) { + if (tok1[0] == 1) { + _strokeDrawAngle = -Math.PI; + } else if (tok1[0] == 2) { + _strokeDrawAngle = -Math.PI*(3/2); + } else if (tok1[0] == 3) { + _strokeDrawAngle = 0; + } + if (_strokeDrawAngle > Math.PI*2) { _strokeDrawAngle -= Math.PI*2; } + if (_strokeDrawAngle < -Math.PI*2) { _strokeDrawAngle += 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] == -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(); + _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; } + } + } + } + } + } + + } 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(); + ux = multiplier * (_strokeDrawLength/4) * (tok2[0]); + } + } + } else if (tmp[1] == 0) { + tok1 = v.shift(); + ux = multiplier * (_strokeDrawLength/4) * (tok1[0]); + } + + } + multiplier = 1; + 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] == "+") { + multiplier = 1; + } else if (tok1[0] == "-") { + multiplier = 1; + } + if (v.length) { + tmp = v[0]; + if (tmp[1] == 0) { + tok2 = v.shift(); + uy = multiplier * (_strokeDrawLength/4) * (tok2[0]); + } + } + } else if (tmp[1] == 0) { + tok1 = v.shift(); + 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(_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(); + } else { + cursSkipdraw = false; + } + cursX = cursXt; + cursY = cursYt; + } + + } 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 { + for (i=0 ; i