xref: /plan9-contrib/sys/src/libmemdraw/addr.c (revision 6f1f24dd981116678e9fd1c5fb4c6ae548570725)
1*6f1f24ddSDavid du Colombier #include <u.h>
2*6f1f24ddSDavid du Colombier #include <libc.h>
3*6f1f24ddSDavid du Colombier #include <draw.h>
4*6f1f24ddSDavid du Colombier #include <memdraw.h>
5*6f1f24ddSDavid du Colombier 
6*6f1f24ddSDavid du Colombier /*
7*6f1f24ddSDavid du Colombier  * Wordaddr is deprecated.
8*6f1f24ddSDavid du Colombier  */
9*6f1f24ddSDavid du Colombier ulong*
wordaddr(Memimage * i,Point p)10*6f1f24ddSDavid du Colombier wordaddr(Memimage *i, Point p)
11*6f1f24ddSDavid du Colombier {
12*6f1f24ddSDavid du Colombier 	return (ulong*) ((uintptr)byteaddr(i, p) & ~(sizeof(ulong)-1));
13*6f1f24ddSDavid du Colombier }
14*6f1f24ddSDavid du Colombier 
15*6f1f24ddSDavid du Colombier uchar*
byteaddr(Memimage * i,Point p)16*6f1f24ddSDavid du Colombier byteaddr(Memimage *i, Point p)
17*6f1f24ddSDavid du Colombier {
18*6f1f24ddSDavid du Colombier 	uchar *a;
19*6f1f24ddSDavid du Colombier 
20*6f1f24ddSDavid du Colombier 	a = i->data->bdata+i->zero+sizeof(ulong)*p.y*i->width;
21*6f1f24ddSDavid du Colombier 
22*6f1f24ddSDavid du Colombier 	if(i->depth < 8){
23*6f1f24ddSDavid du Colombier 		/*
24*6f1f24ddSDavid du Colombier 		 * We need to always round down,
25*6f1f24ddSDavid du Colombier 		 * but C rounds toward zero.
26*6f1f24ddSDavid du Colombier 		 */
27*6f1f24ddSDavid du Colombier 		int np;
28*6f1f24ddSDavid du Colombier 		np = 8/i->depth;
29*6f1f24ddSDavid du Colombier 		if(p.x < 0)
30*6f1f24ddSDavid du Colombier 			return a+(p.x-np+1)/np;
31*6f1f24ddSDavid du Colombier 		else
32*6f1f24ddSDavid du Colombier 			return a+p.x/np;
33*6f1f24ddSDavid du Colombier 	}
34*6f1f24ddSDavid du Colombier 	else
35*6f1f24ddSDavid du Colombier 		return a+p.x*(i->depth/8);
36*6f1f24ddSDavid du Colombier }
37