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