Make all windows Refbackup. Implement painter's algorithm to redraw screen. Position windows' backing canvases directly with css because redraw was too slow. . Reference: /n/atom/patch/applied/wd-screen-refback Date: Fri Jun 13 19:33:12 CES 2014 Signed-off-by: root@davidrhoskin.com --- /usr/web/9wd/9wd.html Fri Jun 13 19:29:56 2014 +++ /usr/web/9wd/9wd.html Fri Jun 13 19:29:57 2014 @@ -37,6 +37,7 @@
cursor /dev/draw + cover
--- /usr/web/9wd/css/9wd.css Fri Jun 13 19:30:00 2014 +++ /usr/web/9wd/css/9wd.css Fri Jun 13 19:30:01 2014 @@ -17,6 +17,14 @@ position: absolute; top: 0em; left: 0em; + z-index: 9000; +} + +#cover { + position: absolute; + top: 0em; + left: 0em; + z-index: 9001; } #cons { --- /usr/web/9wd/js/composetab.js Fri Jun 13 19:30:04 2014 +++ /usr/web/9wd/js/composetab.js Fri Jun 13 19:30:05 2014 @@ -1,3 +1,4 @@ +/* Generated by latin2js. */ var Composetab = { " ": {from:" i", to:"␣ı"}, "!~": {from:"-=~", to:"≄≇≉"}, --- /usr/web/9wd/js/init.js Fri Jun 13 19:30:08 2014 +++ /usr/web/9wd/js/init.js Fri Jun 13 19:30:09 2014 @@ -24,6 +24,7 @@ var wsurl = Socket.wsurl(window.location.toString()); //var wsurl = Socket.wsurl("http://wd.9atom.org/9wd.html"); var webdraw = elem("webdraw"); + var cover = elem("cover"); basetime = Date.now(); cons = new Cons(); @@ -40,13 +41,13 @@ Draw9p.imgnames["webdraw"] = Draw9p.RootImage(); Draw9p.label = "webdraw".toUTF8Array(); - setevent(webdraw, "mousedown", function(e){ + setevent(cover, "mousedown", function(e){ return mouse.handlebutton(e, 1); }); - setevent(webdraw, "mouseup", function(e){ + setevent(cover, "mouseup", function(e){ return mouse.handlebutton(e, 0); }); - setevent(webdraw, "mousemove", function(e){ + setevent(cover, "mousemove", function(e){ return mouse.handlemove(e); }); setevent(window, "keydown", function(e){ @@ -58,24 +59,24 @@ setevent(window, "keyup", function(e){ return cons.handlekeys(e, cons.kbd.up); }); - setevent(webdraw, "contextmenu", function(e){ + setevent(cover, "contextmenu", function(e){ e.preventDefault(); e.stopPropagation(); return false; }); - setevent(webdraw, "click", function(e){ + setevent(cover, "click", function(e){ e.preventDefault(); e.stopPropagation(); if( - document.pointerLockElement !== webdraw && - document.mozPointerLockElement !== webdraw && - document.webkitPointerLockElement !== webdraw + document.pointerLockElement !== cover && + document.mozPointerLockElement !== cover && + document.webkitPointerLockElement !== cover ){ - webdraw.requestPointerLock = - webdraw.requestPointerLock || - webdraw.mozRequestPointerLock || - webdraw.webkitRequestPointerLock; - webdraw.requestPointerLock(); + cover.requestPointerLock = + cover.requestPointerLock || + cover.mozRequestPointerLock || + cover.webkitRequestPointerLock; + cover.requestPointerLock(); return false; }else{ return false; --- /usr/web/9wd/js/draw/data.js Fri Jun 13 19:30:13 2014 +++ /usr/web/9wd/js/draw/data.js Fri Jun 13 19:30:14 2014 @@ -191,6 +191,7 @@ if(screen){ delete screen.imgs[id]; } + img.canvas.parentNode.removeChild(img.canvas); delete conn.imgs[id]; }, "F": function(conn, offset, ai){ @@ -314,6 +315,16 @@ }catch(e){ throw("short draw message"); } + if(conn.imgs[id] == undefined){ + throw("invalid image id"); + } + var img = conn.imgs[id]; + if(img.screen == undefined){ + throw("image is not a window"); + } + img.r = rectaddpt(img.r, subpt(rmin, img.r.min)); + img.clipr = rectaddpt(img.clipr, subpt(rmin, img.clipr.min)); + img.scrmove(scr); }, "O": function(conn, offset, ai){ try{ @@ -488,7 +499,9 @@ } }, "v": function(conn, offset, ai){ - //cons.log("writedrawdata: 'v' (flush) unimplemented!"); + for(var i in conn.screens){ + conn.screens[i].repaint(); + } }, "y": function(conn, offset, ai){ try{ --- /usr/web/9wd/js/draw/image.js Fri Jun 13 19:30:17 2014 +++ /usr/web/9wd/js/draw/image.js Fri Jun 13 19:30:18 2014 @@ -48,28 +48,61 @@ this.ctx.putImageData(data, 0, 0); } -/* XXX ScreenImage will not work as a drawing source */ -/* due to the assumption that the canvas maps 1-1 to the image data. */ Draw9p.ScreenImage = function(screen, refresh, chan, repl, r, clipr, color){ if(screen == undefined || screen.backimg == undefined){ throw("invalid screen"); } this.screen = screen; + this.scrmin = r.min; /* if(chan != this.screen.backimg.chan){ */ /* throw("chan mismatch between image and screen"); */ /* } */ + /* refresh methods */ + /* Refbackup = 0, */ + /* Refnone = 1, */ + /* Refmesg = 2 */ + this.refresh = refresh; this.chan = chan; this.repl = repl; this.r = r; this.clipr = clipr; - /* XXX We should create a backing store, depending on refresh value. */ - this.canvas = this.screen.backimg.canvas; + this.canvas = document.createElement("canvas"); + this.canvas.width = r.max.x - r.min.x; + this.canvas.height = r.max.y - r.min.y; this.ctx = CtxWrap(this.canvas.getContext("2d")); - /* XXX Fill ScreenImage with background colour. */ + + var red = (color >> 24) & 0xFF; + var green = (color >> 16) & 0xFF; + var blue = (color >> 8) & 0xFF; + var alpha = (color) & 0xFF; + + var data = this.ctx.createImageData(this.canvas.width, this.canvas.height); + for(var i = 0; i < data.data.length; i += 4){ + data.data[i + 0] = red; + data.data[i + 1] = green; + data.data[i + 2] = blue; + data.data[i + 3] = alpha; + } + + this.ctx.putImageData(data, 0, 0); + + this.screen.imgs.push(this); + this.screen.repaint(); + this.canvas.style.position = "absolute"; + document.getElementById("container").appendChild(this.canvas); + this.canvas.style.left = this.scrmin.x + "px"; + this.canvas.style.top = this.scrmin.y + "px"; +} + +Draw9p.ScreenImage.prototype.scrmove = function(scrmin){ + this.scrmin = scrmin; + this.canvas.style.left = this.scrmin.x + "px"; + this.canvas.style.top = this.scrmin.y + "px"; + this.screen.dirty = true; } /* XXX Creating a new rootwindow object for each connection will probably */ --- /usr/web/9wd/js/draw/memdraw.js Fri Jun 13 19:30:22 2014 +++ /usr/web/9wd/js/draw/memdraw.js Fri Jun 13 19:30:23 2014 @@ -129,6 +129,9 @@ dst.ctx.pdrawImage(src.canvas, addpt(subpt(r.min, dst.r.min), subpt(src.r.min, sp))); } dst.ctx.restore(); + + if(dst.screen != undefined) + dst.screen.dirty = true; return; } --- /usr/web/9wd/js/draw/screen.js Fri Jun 13 19:30:26 2014 +++ /usr/web/9wd/js/draw/screen.js Fri Jun 13 19:30:27 2014 @@ -2,6 +2,28 @@ this.id = id; this.public = public; this.backimg = backimg; + drawmasked(backimg, backimg.r, fillimg, fillimg.r.min, undefined, undefined, Memdraw.Opdefs.SoverD.key); + this.dirty = true; + cons.log("new screen"); /* Memdraw.draw(this.backimg, this.fillimg); */ this.imgs = []; /* not sure how this should be represented? */ +} + +Draw9p.Screen.prototype.repaint = function(){ + var i; + + return "repaint disabled"; + + if(this.dirty == true) + this.dirty = false; + else + return; + + for(i in this.imgs){ + //rectsubpt(this.imgs[i].r, this.imgs[i].scrmin), + drawmasked(this.backimg, this.imgs[i].r, + this.imgs[i], this.imgs[i].r.min, + undefined, undefined, + Memdraw.Opdefs.SoverD.key); + } }