xref: /inferno-os/os/boot/mpc/gbitbltclip.c (revision 7ef44d652ae9e5e1f5b3465d73684e4a54de73c0)
1 #include <u.h>
2 #include <libc.h>
3 #include <libg.h>
4 #include <gnot.h>
5 
6 void
7 gbitbltclip(void *vp)
8 {
9 	int dx, dy;
10 	int i;
11 	struct{
12 		GBitmap *dm;
13 		Point p;
14 		GBitmap *sm;
15 		Rectangle r;
16 		Fcode f;
17 	}*bp;
18 
19 	bp = vp;
20 	dx = Dx(bp->r);
21 	dy = Dy(bp->r);
22 	if(bp->p.x < bp->dm->clipr.min.x){
23 		i = bp->dm->clipr.min.x-bp->p.x;
24 		bp->r.min.x += i;
25 		bp->p.x += i;
26 		dx -= i;
27 	}
28 	if(bp->p.y < bp->dm->clipr.min.y){
29 		i = bp->dm->clipr.min.y-bp->p.y;
30 		bp->r.min.y += i;
31 		bp->p.y += i;
32 		dy -= i;
33 	}
34 	if(bp->p.x+dx > bp->dm->clipr.max.x)
35 		bp->r.max.x -= bp->p.x+dx-bp->dm->clipr.max.x;
36 	if(bp->p.y+dy > bp->dm->clipr.max.y)
37 		bp->r.max.y -= bp->p.y+dy-bp->dm->clipr.max.y;
38 	if(bp->r.min.x < bp->sm->clipr.min.x){
39 		i = bp->sm->clipr.min.x-bp->r.min.x;
40 		bp->p.x += i;
41 		bp->r.min.x += i;
42 	}
43 	if(bp->r.min.y < bp->sm->clipr.min.y){
44 		i = bp->sm->clipr.min.y-bp->r.min.y;
45 		bp->p.y += i;
46 		bp->r.min.y += i;
47 	}
48 	if(bp->r.max.x > bp->sm->clipr.max.x)
49 		bp->r.max.x = bp->sm->clipr.max.x;
50 	if(bp->r.max.y > bp->sm->clipr.max.y)
51 		bp->r.max.y = bp->sm->clipr.max.y;
52 }
53