8 /* Convert image to a single channel, one byte per pixel */
40 * Convert to one byte per pixel, RGBV or grey, depending
45 load(Image *image, Memimage *memimage)
47 uchar *data, *p, *q0, *q1, *q2;
49 int depth, ndata, dx, dy, i, v;
60 depth = memimage->depth;
61 chan = memimage->chan;
67 * Read image data into memory
68 * potentially one extra byte on each end of each scan line.
70 ndata = dy*(2+bytesperline(r, depth));
75 ndata = unloadmemimage(memimage, r, data, ndata);
77 ndata = unloadimage(image, r, data, ndata);
79 werrstr("onechan: %r");
87 memset(&ri, 0, sizeof(ri));
93 ri.chans[0] = malloc(ri.chanlen);
94 ri.chans[1] = malloc(ri.chanlen);
95 ri.chans[2] = malloc(ri.chanlen);
96 if(ri.chans[0]==nil || ri.chans[1]==nil || ri.chans[2]==nil){
113 werrstr("can't handle image type 0x%lux", chan);
116 for(i=0; i<ri.chanlen; i++, p+=2){
117 pixel = (p[1]<<8)|p[0]; /* rrrrrggg gggbbbbb */
118 v = (pixel & 0xF800) >> 8;
120 v = (pixel & 0x07E0) >> 3;
122 v = (pixel & 0x001F) << 3;
127 for(i=0; i<ri.chanlen; i++){
134 for(i=0; i<ri.chanlen; i++){
142 for(i=0; i<ri.chanlen; i++){
152 nri = torgbv(&ri, 1);
154 rgbv = nri->chans[0];
174 if(easycase(i->chan))
177 ni = allocimage(display, i->r, RGB24, 0, DNofill);
180 draw(ni, ni->r, i, nil, i->r.min);
181 data = load(ni, nil);
188 ni = allocimage(display, i->r, CMAP8, 0, DNofill);
190 if(loadimage(ni, ni->r, data, Dx(ni->r)*Dy(ni->r)) < 0){
199 memonechan(Memimage *i)
207 if(easycase(i->chan))
210 ni = allocmemimage(i->r, RGB24);
213 memimagedraw(ni, ni->r, i, i->r.min, nil, ZP, S);
214 data = load(nil, ni);
221 ni = allocmemimage(i->r, CMAP8);
223 if(loadmemimage(ni, ni->r, data, Dx(ni->r)*Dy(ni->r)) < 0){