URI:
       tloadimage.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tloadimage.c (983B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <draw.h>
            4 
            5 int
            6 loadimage(Image *i, Rectangle r, uchar *data, int ndata)
            7 {
            8         long dy;
            9         int n, bpl;
           10         uchar *a;
           11         int chunk;
           12 
           13         chunk = i->display->bufsize - 64;
           14 
           15         if(!rectinrect(r, i->r)){
           16                 werrstr("loadimage: bad rectangle");
           17                 return -1;
           18         }
           19         bpl = bytesperline(r, i->depth);
           20         n = bpl*Dy(r);
           21         if(n > ndata){
           22                 werrstr("loadimage: insufficient data");
           23                 return -1;
           24         }
           25         ndata = 0;
           26         while(r.max.y > r.min.y){
           27                 dy = r.max.y - r.min.y;
           28                 if(dy*bpl > chunk)
           29                         dy = chunk/bpl;
           30                 if(dy <= 0){
           31                         werrstr("loadimage: image too wide for buffer");
           32                         return -1;
           33                 }
           34                 n = dy*bpl;
           35                 a = bufimage(i->display, 21+n);
           36                 if(a == nil){
           37                         werrstr("bufimage failed");
           38                         return -1;
           39                 }
           40                 a[0] = 'y';
           41                 BPLONG(a+1, i->id);
           42                 BPLONG(a+5, r.min.x);
           43                 BPLONG(a+9, r.min.y);
           44                 BPLONG(a+13, r.max.x);
           45                 BPLONG(a+17, r.min.y+dy);
           46                 memmove(a+21, data, n);
           47                 ndata += n;
           48                 data += n;
           49                 r.min.y += dy;
           50         }
           51         if(flushimage(i->display, 0) < 0)
           52                 return -1;
           53         return ndata;
           54 }