shithub: rd

Download patch

ref: 1025d6ab452ace62b65cf4a07f8bb2d8a46bc9fb
parent: f85425aad78787d12eb6f0941686b9fb5e114e62
author: Yaroslav Kolomiiets <yarikos@gmail.com>
date: Tue Aug 9 11:31:41 EDT 2016

drawing cuts

--- a/dat.h
+++ b/dat.h
@@ -212,8 +212,7 @@
 	int	source;
 	int	shareid;
 	int	ncap;
-	int	nord;
-	int	nrect;
+	int	nr;
 	int	x;
 	int	y;
 	int	err;
@@ -261,7 +260,6 @@
 int	getimgupd(Imgupd*, uchar*, uint);
 int	getfupd(Imgupd*, uchar*, uint);
 
-void	loadmemimg(Rdp*, Imgupd*);
 void	drawmemimg(Rdp*, Imgupd*);
 
 
--- a/draw.c
+++ b/draw.c
@@ -1,7 +1,3 @@
-/*
- * depending on CanMemBlt servers will only do
- * either loadmeming+drawmemimg or drawimgupdate.
- */
 #include <u.h>
 #include <libc.h>
 #include <draw.h>
@@ -12,6 +8,7 @@
 static Image*	icache[3][600];
 
 static	void	drawupd(Rdp*,Imgupd*);
+static	void	padresize(Rdp*);
 
 /* 2.2.9.1.1.3.1.2.1 Bitmap Update Data (TS_UPDATE_BITMAP_DATA) */
 void
@@ -19,24 +16,16 @@
 {
 	uchar* p, *ep;
 	int n, nr;
-	Rectangle rs;
 	Imgupd u;
 
 	assert(s->type == ShUimg);
 	p = s->data;
 	ep = s->data + s->ndata;
-	nr = s->nrect;
+	nr = s->nr;
 
 	if(display->locking)
 		lockdisplay(display);
 
-	rs = rectaddpt(Rpt(ZP, Pt(c->xsz+4, c->ysz+4)), screen->r.min);
-	if(pad==nil || eqrect(pad->r, rs) == 0){
-		freeimage(pad);
-		pad = allocimage(display, rs, c->chan, 0, DNofill);
-		if(pad==nil)
-			sysfatal("drawimgupdate: %r");
-	}
 	while(p<ep && nr>0){
 		if((n = getimgupd(&u, p, ep-p)) < 0)
 			sysfatal("getimgupd: %r");
@@ -57,10 +46,12 @@
 	uchar *p, *ep;
 	Imgupd u;
 
-	count = as->nord;
+	count = as->nr;
 	p = as->data;
 	ep = as->data + as->ndata;
 
+	if(display->locking)
+		lockdisplay(display);
 	while(count> 0 && p<ep){
 		n = getfupd(&u, p, ep-p);
 		drawupd(c, &u);
@@ -67,51 +58,46 @@
 		p += n;
 		count--;
 	}
-	if(display->locking)
-		lockdisplay(display);
 	flushimage(display, 1);
 	if(display->locking)
 		unlockdisplay(display);
 }
 
-void
-scroll(Display* d, Rectangle r, Rectangle sr)
+static void
+padresize(Rdp* c)
 {
-	if(d && d->locking)
-		lockdisplay(d);
-	if(d)
-		draw(d->screenimage, r, d->screenimage, nil, sr.min);
-	if(d && d->locking)
-		unlockdisplay(d);
+	Rectangle rs;
+
+	rs = rectaddpt(Rpt(ZP, Pt(c->xsz+4, c->ysz+4)), screen->r.min);
+	if(pad==nil || eqrect(pad->r, rs) == 0){
+		freeimage(pad);
+		pad = allocimage(display, rs, c->chan, 0, DNofill);
+		if(pad==nil)
+			sysfatal("drawimgupdate: %r");
+	}
 }
 
-void
-loadmemimg(Rdp* c, Imgupd* iu)
+static void
+imgupd(Rdp* c, Imgupd* up)
 {
-	int (*loadfn)(Image*,Rectangle,uchar*,int,uchar*);
-	Image* img;
 	Rectangle r;
+	int (*loadfn)(Image*,Rectangle,uchar*,int,uchar*);
 
+	padresize(c);	// BUG call elsewhere - whenever c->xsz changes
+
+	if(up->depth != pad->depth)
+		sysfatal("bad image depth");
+
 	loadfn = loadbmp;
-	if(iu->iscompr)
+	if(up->iscompr)
 		loadfn = loadrle;
 
-	r = Rect(0, 0, iu->xsz, iu->ysz);
+	r = rectaddpt(Rect(up->x, up->y, up->x+up->xsz, up->y+up->ysz), screen->r.min);
+	if(loadfn(pad, r, up->bytes, up->nbytes, c->cmap) < 0)
+		sysfatal("drawimgupdate: %r");
 
-	if(iu->cid >= nelem(icache) || iu->coff >= nelem(*icache))
-		sysfatal("cacheimage2: bad cache spec [%d %d]", iu->cid, iu->coff);
-
-	img = icache[iu->cid][iu->coff];
-	if(img==nil || eqrect(img->r, r)==0){
-		freeimage(img);
-		img = allocimage(display, r, c->chan, 0, DNofill);
-		if(img == nil)
-			sysfatal("cacheimage2: %r");
-		icache[iu->cid][iu->coff] = img;
-	}
-
-	if(loadfn(img, r, iu->bytes, iu->nbytes, c->cmap) < 0)
-		sysfatal("loadmemimg: %r");
+	r = rectaddpt(Rect(up->x, up->y, up->xm+1, up->ym+1), screen->r.min);
+	draw(screen, r, pad, nil, r.min);
 }
 
 void
@@ -141,57 +127,54 @@
 
 
 static void
-imgupd(Rdp* c, Imgupd* up)
+scrblt(Rdp*, Imgupd* up)
 {
 	Rectangle r;
-	int (*loadfn)(Image*,Rectangle,uchar*,int,uchar*);
+	Point p;
 
-	if(up->depth != pad->depth)
-		sysfatal("bad image depth");
-
-	loadfn = loadbmp;
-	if(up->iscompr)
-		loadfn = loadrle;
-
 	r = rectaddpt(Rect(up->x, up->y, up->x+up->xsz, up->y+up->ysz), screen->r.min);
-	if(loadfn(pad, r, up->bytes, up->nbytes, c->cmap) < 0)
-		sysfatal("drawimgupdate: %r");
-
-	r = rectaddpt(Rect(up->x, up->y, up->xm+1, up->ym+1), screen->r.min);
-	draw(screen, r, pad, nil, r.min);
+	p = addpt(Pt(up->sx, up->sy), screen->r.min);
+	draw(screen, r, screen, nil, p);
 }
 
 static void
-scrblt(Rdp*, Imgupd* up)
-{
-	Rectangle r, sr;
-
-	r = rectaddpt(Rect(up->x, up->y, up->x+up->xsz, up->y+up->ysz), screen->r.min);
-	sr = rectaddpt(Rpt(Pt(up->sx, up->sy), Pt(Dx(r), Dy(r))), screen->r.min);
-	scroll(display, r, sr);
-}
-
-static void
 memblt(Rdp* c, Imgupd* up)
 {
-	if(display->locking)
-		lockdisplay(display);
 	if(up->clipped)
 		replclipr(screen, screen->repl, rectaddpt(up->clipr, screen->r.min));
 	drawmemimg(c, up);
 	if(up->clipped)
 		replclipr(screen, screen->repl, screen->r);
-	if(display->locking)
-		unlockdisplay(display);
 }
 
-
 static void
 cacheimage2(Rdp* c, Imgupd* up)
 {
-	loadmemimg(c, up);
-}
+	int (*loadfn)(Image*,Rectangle,uchar*,int,uchar*);
+	Image* img;
+	Rectangle r;
 
+	loadfn = loadbmp;
+	if(up->iscompr)
+		loadfn = loadrle;
+
+	r = Rect(0, 0, up->xsz, up->ysz);
+
+	if(up->cid >= nelem(icache) || up->coff >= nelem(*icache))
+		sysfatal("cacheimage2: bad cache spec [%d %d]", up->cid, up->coff);
+
+	img = icache[up->cid][up->coff];
+	if(img==nil || eqrect(img->r, r)==0){
+		freeimage(img);
+		img = allocimage(display, r, c->chan, 0, DNofill);
+		if(img == nil)
+			sysfatal("cacheimage2: %r");
+		icache[up->cid][up->coff] = img;
+	}
+
+	if(loadfn(img, r, up->bytes, up->nbytes, c->cmap) < 0)
+		sysfatal("loadmemimg: %r");
+}
 
 static void
 cachecmap(Rdp*, Imgupd*)
--- a/fns.h
+++ b/fns.h
@@ -53,5 +53,3 @@
 void		pbshort(uchar*,int);
 
 uchar*	putsdh(uchar*,uchar*,int,int,int,int);
-
-void		scroll(Display*, Rectangle, Rectangle);
--- a/mpas.c
+++ b/mpas.c
@@ -106,7 +106,7 @@
 			return -1;
 		}
 		as->type = ShUorders;
-		as->nord = GSHORT(p);
+		as->nr = GSHORT(p);
 		as->data = p+2;
 		as->ndata = ep-(p+2);
 		break;
@@ -116,7 +116,7 @@
 			return -1;
 		}
 		as->type = ShUimg;
-		as->nrect = GSHORT(p+2);
+		as->nr = GSHORT(p+2);
 		as->data = p+4;
 		as->ndata = ep-(p+4);
 		break;
@@ -259,7 +259,7 @@
 					return -1;
 				}
 				as->type = ShUorders;
-				as->nord = GSHORT(p+4);
+				as->nr = GSHORT(p+4);
 				as->data = p+8;
 				as->ndata = ep-(p+8);
 				break;
@@ -269,7 +269,7 @@
 					return -1;
 				}
 				as->type = ShUimg;
-				as->nrect = GSHORT(p+2);
+				as->nr = GSHORT(p+2);
 				as->data = p+4;
 				as->ndata = ep-(p+4);
 				break;