shithub: riscv

Download patch

ref: fbea9119d7046808354350c32ff774f34dbcd9a7
parent: 2339cfc51541b3f62a7a92d67885b1918f8570c1
parent: c274f902e102c75e129572bdbbd2c65df83422ee
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jan 12 21:28:56 EST 2025

merge

--- a/sys/src/libdraw/bytesperline.c
+++ b/sys/src/libdraw/bytesperline.c
@@ -6,19 +6,9 @@
 int
 unitsperline(Rectangle r, int d, int bitsperunit)
 {
-	ulong l, t;
-
 	if(d <= 0 || d > 32)	/* being called wrong.  d is image depth. */
 		abort();
-
-	if(r.min.x >= 0){
-		l = (r.max.x*d+bitsperunit-1)/bitsperunit;
-		l -= (r.min.x*d)/bitsperunit;
-	}else{			/* make positive before divide */
-		t = (-r.min.x*d+bitsperunit-1)/bitsperunit;
-		l = t+(r.max.x*d+bitsperunit-1)/bitsperunit;
-	}
-	return l;
+	return (r.max.x*d - (r.min.x*d & -bitsperunit) + bitsperunit - 1) / bitsperunit;
 }
 
 int
--- a/sys/src/libmemdraw/alloc.c
+++ b/sys/src/libmemdraw/alloc.c
@@ -24,7 +24,6 @@
 allocmemimaged(Rectangle r, ulong chan, Memdata *md)
 {
 	int d;
-	ulong l;
 	Memimage *i;
 
 	if((d = chantodepth(chan)) == 0) {
@@ -36,21 +35,15 @@
 		return nil;
 	}
 
-	l = wordsperline(r, d);
-
 	i = mallocz(sizeof(Memimage), 1);
 	if(i == nil)
 		return nil;
 
 	i->data = md;
-	i->zero = sizeof(ulong)*l*r.min.y;
-	
-	if(r.min.x >= 0)
-		i->zero += (r.min.x*d)/8;
-	else
-		i->zero -= (-r.min.x*d+7)/8;
+	i->width = wordsperline(r, d);
+	i->zero = r.min.y*(int)(sizeof(ulong)*i->width) + ((r.min.x*d) >> 3);
 	i->zero = -i->zero;
-	i->width = l;
+
 	i->r = r;
 	i->clipr = r;
 	i->flags = 0;
@@ -67,8 +60,8 @@
 allocmemimage(Rectangle r, ulong chan)
 {
 	int d;
+	ulong nw;
 	uchar *p;
-	ulong l, nw;
 	Memdata *md;
 	Memimage *i;
 
@@ -80,10 +73,8 @@
 		werrstr("bad rectangle %R", r);
 		return nil;
 	}
+	nw = wordsperline(r, d)*Dy(r);
 
-	l = wordsperline(r, d);
-
-	nw = l*Dy(r);
 	md = malloc(sizeof(Memdata));
 	if(md == nil)
 		return nil;
@@ -141,23 +132,8 @@
 uchar*
 byteaddr(Memimage *i, Point p)
 {
-	uchar *a;
-
-	a = i->data->bdata+i->zero+(int)(sizeof(ulong)*p.y*i->width);
-	if(i->depth < 8){
-		/*
-		 * We need to always round down,
-		 * but C rounds toward zero.
-		 */
-		int np;
-		np = 8/i->depth;
-		if(p.x < 0)
-			return a+(p.x-np+1)/np;
-		else
-			return a+p.x/np;
-	}
-	else
-		return a+p.x*(i->depth/8);
+	uchar *a = i->data->bdata+i->zero;
+	return a + p.y*(int)(sizeof(ulong)*i->width) + ((p.x*i->depth) >> 3);
 }
 
 int
--