xref: /plan9/sys/src/cmd/unix/drawterm/libmemlayer/load.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <draw.h>
4*8ccd4a63SDavid du Colombier #include <memdraw.h>
5*8ccd4a63SDavid du Colombier #include <memlayer.h>
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier int
memload(Memimage * dst,Rectangle r,uchar * data,int n,int iscompressed)87dd7cddfSDavid du Colombier memload(Memimage *dst, Rectangle r, uchar *data, int n, int iscompressed)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier 	int (*loadfn)(Memimage*, Rectangle, uchar*, int);
117dd7cddfSDavid du Colombier 	Memimage *tmp;
127dd7cddfSDavid du Colombier 	Memlayer *dl;
137dd7cddfSDavid du Colombier 	Rectangle lr;
147dd7cddfSDavid du Colombier 	int dx;
157dd7cddfSDavid du Colombier 
167dd7cddfSDavid du Colombier 	loadfn = loadmemimage;
177dd7cddfSDavid du Colombier 	if(iscompressed)
187dd7cddfSDavid du Colombier 		loadfn = cloadmemimage;
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier     Top:
217dd7cddfSDavid du Colombier 	dl = dst->layer;
227dd7cddfSDavid du Colombier 	if(dl == nil)
237dd7cddfSDavid du Colombier 		return loadfn(dst, r, data, n);
247dd7cddfSDavid du Colombier 
257dd7cddfSDavid du Colombier 	/*
267dd7cddfSDavid du Colombier  	 * Convert to screen coordinates.
277dd7cddfSDavid du Colombier 	 */
287dd7cddfSDavid du Colombier 	lr = r;
297dd7cddfSDavid du Colombier 	r.min.x += dl->delta.x;
307dd7cddfSDavid du Colombier 	r.min.y += dl->delta.y;
317dd7cddfSDavid du Colombier 	r.max.x += dl->delta.x;
327dd7cddfSDavid du Colombier 	r.max.y += dl->delta.y;
337dd7cddfSDavid du Colombier 	dx = dl->delta.x&(7/dst->depth);
347dd7cddfSDavid du Colombier 	if(dl->clear && dx==0){
357dd7cddfSDavid du Colombier 		dst = dl->screen->image;
367dd7cddfSDavid du Colombier 		goto Top;
377dd7cddfSDavid du Colombier 	}
387dd7cddfSDavid du Colombier 
397dd7cddfSDavid du Colombier 	/*
407dd7cddfSDavid du Colombier 	 * dst is an obscured layer or data is unaligned
417dd7cddfSDavid du Colombier 	 */
427dd7cddfSDavid du Colombier 	if(dl->save && dx==0){
437dd7cddfSDavid du Colombier 		n = loadfn(dl->save, lr, data, n);
447dd7cddfSDavid du Colombier 		if(n > 0)
457dd7cddfSDavid du Colombier 			memlexpose(dst, r);
467dd7cddfSDavid du Colombier 		return n;
477dd7cddfSDavid du Colombier 	}
487dd7cddfSDavid du Colombier 	tmp = allocmemimage(lr, dst->chan);
497dd7cddfSDavid du Colombier 	if(tmp == nil)
507dd7cddfSDavid du Colombier 		return -1;
517dd7cddfSDavid du Colombier 	n = loadfn(tmp, lr, data, n);
52*8ccd4a63SDavid du Colombier 	memdraw(dst, lr, tmp, lr.min, nil, lr.min, S);
537dd7cddfSDavid du Colombier 	freememimage(tmp);
547dd7cddfSDavid du Colombier 	return n;
557dd7cddfSDavid du Colombier }
56