9webdraw: l request: left[1] is signed. Since JavaScript is a high-level language, I have to implement two's-complement myself! Also remove logging of implemented draw requests, and implement a couple of trivial ones. Reference: /n/atom/patch/applied/9wd-lfont-signed Date: Mon Mar 10 21:25:09 CET 2014 Signed-off-by: root@davidrhoskin.com --- /usr/web/9wd/9wd.html Mon Mar 10 21:21:29 2014 +++ /usr/web/9wd/9wd.html Mon Mar 10 21:21:30 2014 @@ -10,6 +10,7 @@ + --- /usr/web/9wd/js/draw/data.js Mon Mar 10 21:21:31 2014 +++ /usr/web/9wd/js/draw/data.js Mon Mar 10 21:21:33 2014 @@ -8,7 +8,7 @@ var ai = new ArrayIterator(data); while(ai.hasRemainingBytes()){ var c = String.fromCharCode(ai.getChar()); - cons.log("writedrawdata: " + c); + //cons.log("writedrawdata: " + c); if(this.drawdatahandlers[c] == undefined){ throw("bad draw command"); }else{ @@ -98,6 +98,12 @@ }catch(e){ throw("short draw message"); } + var dst = conn.imgs[dstid]; + if(dst == undefined){ + throw("invalid image id"); + } + dst.repl = repl; + dst.clipr = clipr; }, "d": function(conn, offset, ai){ try{ @@ -134,6 +140,7 @@ } }, "e": function(conn, offset, ai){ + cons.log("writedrawdata: 'e' (ellipse outline) unimplemented!"); try{ var dstid = ai.getLong(); var srcid = ai.getLong(); @@ -178,8 +185,18 @@ }catch(e){ throw("short draw message"); } + var img = conn.imgs[id]; + if(img == undefined){ + throw("invalid image id"); + } + var screen = img.screen; + if(screen){ + delete screen.imgs[id]; + } + delete conn.imgs[id]; }, "F": function(conn, offset, ai){ + cons.log("writedrawdata: 'F' (free screen) unimplemented!"); try{ var id = ai.getLong(); }catch(e){ @@ -210,7 +227,7 @@ var index = ai.getShort(); var r = ai.getRect(); var sp = ai.getPoint(); - var left = ai.getChar(); + var left = signed8dec(ai.getChar()); var width = ai.getChar(); }catch(e){ throw("short draw message"); @@ -292,6 +309,7 @@ conn.imgs[id] = imgnames[name]; }, "o": function(conn, offset, ai){ + cons.log("writedrawdata: 'o' (translate window) unimplemented!"); try{ var id = ai.getLong(); var rmin = ai.getPoint(); @@ -370,6 +388,7 @@ Memdraw.fillpoly(dst, dp, wind, src, sp, conn.op); }, "r": function(conn, offset, ai){ + cons.log("writedrawdata: 'r' (read back rectangle) unimplemented!"); try{ var id = ai.getLong(); var r = ai.getRect(); @@ -450,6 +469,7 @@ Memdraw.string(dst, src, font, dp, clipr, sp, bg, bp, index, conn.op); }, "S": function(conn, offset, ai){ + cons.log("writedrawdata: 'S' (screen attach public) unimplemented!"); try{ var id = ai.getLong(); var chan = ai.getLong(); @@ -458,6 +478,7 @@ } }, "t": function(conn, offset, ai){ + cons.log("writedrawdata: 't' (top of window stack) unimplemented!"); try{ var top = ai.getChar(); var n = ai.getShort(); @@ -470,6 +491,7 @@ } }, "v": function(conn, offset, ai){ + //cons.log("writedrawdata: 'v' (flush) unimplemented!"); }, "y": function(conn, offset, ai){ try{ --- /usr/web/9wd/js/draw/memdraw.js Mon Mar 10 21:21:33 2014 +++ /usr/web/9wd/js/draw/memdraw.js Mon Mar 10 21:21:36 2014 @@ -250,7 +250,7 @@ for(var i = 0; i < index.length; ++i){ if(index[i] == 0 || index[i] >= font.nchar){ throw("font cache index out of bounds"); - }cons.log("char: " + index[i]); + } drawchar(dst, p, src, sp, bg, bp, font, font.fchar[index[i]], op); } }, --- /usr/web/9wd/js/util/twoscmpl.js Thu Jan 1 00:00:00 1970 +++ /usr/web/9wd/js/util/twoscmpl.js Mon Mar 10 21:21:38 2014 @@ -0,0 +1,6 @@ +function signed8dec(val){ + if(val > 0x7F) + return -(~(val - 1) & 0xFF); + else + return val; +}