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;
+}