From f532d5c565bb1b453e4f865162660068df6d3a11 Mon Sep 17 00:00:00 2001 From: William Barnes Date: Thu, 28 Apr 2022 21:14:59 -0400 Subject: [PATCH] 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