File:  [Plan 9 NeXT] / lucent / sys / src / libgnot / gballoc.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 18:01:05 2018 UTC (8 years, 1 month ago) by root
Branches: lucent, MAIN
CVS tags: plan9, HEAD
Plan 9 NeXT

#include <u.h>
#include <libc.h>
#include <libg.h>
#include <gnot.h>

#define OKRECT(r)	((r).min.x<(r).max.x && (r).min.y<(r).max.y)

GBitmap *
gballoc(Rectangle r, int ldepth)
{
	long lsize;
	int wsize;	/* word size in pixels */
	GBitmap *bp;

	if(ldepth<0 || ldepth>3 || !OKRECT(r))
		return 0;
	wsize = 1<<(5-ldepth);	/* ldepth==0 is 32 pixels per word */
	if(r.max.x >= 0)
		lsize = (r.max.x+wsize-1)/wsize;
	else
		lsize = r.max.x/wsize;
	if(r.min.x >= 0)
		lsize -= r.min.x/wsize;
	else
		lsize -= (r.min.x-wsize+1)/wsize;
	if((bp=malloc(sizeof(GBitmap))) == 0)
		return 0;
	bp->zero = lsize*r.min.y;
	if(r.min.x >= 0)
		bp->zero += r.min.x/wsize;
	else
		bp->zero += (r.min.x-wsize+1)/wsize;
	bp->zero = -bp->zero;
	bp->width = lsize;
	bp->ldepth = ldepth;
	bp->r = r;
	bp->clipr = r;
	bp->cache = 0;
	lsize *= Dy(r);
	lsize *= sizeof(ulong);
	bp->base = malloc(lsize);
	if(bp->base == 0){
		free(bp);
		return 0;
	}
	memset(bp->base, 0, lsize);
	return bp;
}

void
gbfree(GBitmap *bp)
{
	if(bp){
		if(bp->base)
			free(bp->base);
		free(bp);
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.