unloadimage.c (1006B)
1 #include <u.h> 2 #include <libc.h> 3 #include <draw.h> 4 5 int 6 unloadimage(Image *i, Rectangle r, uchar *data, int ndata) 7 { 8 int bpl, n, ntot, dy; 9 uchar *a; 10 Display *d; 11 12 if(!rectinrect(r, i->r)){ 13 werrstr("unloadimage: bad rectangle"); 14 return -1; 15 } 16 bpl = bytesperline(r, i->depth); 17 if(ndata < bpl*Dy(r)){ 18 werrstr("unloadimage: buffer too small"); 19 return -1; 20 } 21 22 d = i->display; 23 flushimage(d, 0); /* make sure subsequent flush is for us only */ 24 ntot = 0; 25 while(r.min.y < r.max.y){ 26 a = bufimage(d, 1+4+4*4); 27 if(a == 0){ 28 werrstr("unloadimage: %r"); 29 return -1; 30 } 31 dy = 8000/bpl; 32 if(dy <= 0){ 33 werrstr("unloadimage: image too wide"); 34 return -1; 35 } 36 if(dy > Dy(r)) 37 dy = Dy(r); 38 a[0] = 'r'; 39 BPLONG(a+1, i->id); 40 BPLONG(a+5, r.min.x); 41 BPLONG(a+9, r.min.y); 42 BPLONG(a+13, r.max.x); 43 BPLONG(a+17, r.min.y+dy); 44 if(flushimage(d, 0) < 0) 45 return -1; 46 n = _displayrddraw(d, data+ntot, ndata-ntot); 47 if(n < 0) 48 return n; 49 ntot += n; 50 r.min.y += dy; 51 } 52 return ntot; 53 }