unsigned int img_seek(IMAGE *image, unsigned int y, unsigned int z) { if(img_badrow(image,y,z)) { i_errhdlr("img_seek: row number out of range\n"); return EOF; } image->x = 0; image->y = y; image->z = z; if(ISVERBATIM(image->type)) { switch(image->dim) { case 1: return img_optseek(image, 512); case 2: return img_optseek(image,512+(y*image->xsize)*BPP(image->type)); case 3: return img_optseek(image, 512+(y*image->xsize+z*image->xsize*image->ysize)* BPP(image->type)); default: i_errhdlr("img_seek: weird dim\n"); break; } } else if(ISRLE(image->type)) { switch(image->dim) { case 1: return img_optseek(image, image->rowstart[0]); case 2: return img_optseek(image, image->rowstart[y]); case 3: return img_optseek(image, image->rowstart[y+z*image->ysize]); default: i_errhdlr("img_seek: weird dim\n"); break; } } else i_errhdlr("img_seek: weird image type\n"); return((unsigned int)-1); }
int putrow( IMAGE *image, IMushort *buffer, int y, int z ) { register IMushort *sptr; register unsigned char *cptr; register unsigned int x; register IMulong min, max; register int cnt; if( !(image->flags & (_IORW|_IOWRT)) ) return -1; if(image->dim<3) z = 0; if(image->dim<2) y = 0; if(ISVERBATIM(image->type)) { switch(BPP(image->type)) { case 1: min = image->min; max = image->max; cptr = (unsigned char *)image->tmpbuf; sptr = buffer; for(x=image->xsize; x--;) { *cptr = *sptr++; if (*cptr > max) max = *cptr; if (*cptr < min) min = *cptr; cptr++; } image->min = min; image->max = max; img_seek(image,y,z); cnt = image->xsize; if (img_write(image,(char *)image->tmpbuf,cnt) != cnt) return -1; else return cnt; case 2: min = image->min; max = image->max; sptr = buffer; for(x=image->xsize; x--;) { if (*sptr > max) max = *sptr; if (*sptr < min) min = *sptr; sptr++; } image->min = min; image->max = max; img_seek(image,y,z); cnt = image->xsize<<1; if(image->dorev) cvtshorts(buffer,cnt); if (img_write(image,(char *)buffer,cnt) != cnt) { if(image->dorev) cvtshorts(buffer,cnt); return -1; } else { if(image->dorev) cvtshorts(buffer,cnt); return image->xsize; } default: i_errhdlr("putrow: wierd bpp\n"); } } else if(ISRLE(image->type)) { switch(BPP(image->type)) { case 1: min = image->min; max = image->max; sptr = buffer; for(x=image->xsize; x--;) { if (*sptr > max) max = *sptr; if (*sptr < min) min = *sptr; sptr++; } image->min = min; image->max = max; cnt = img_rle_compact(buffer,2,image->tmpbuf,1,image->xsize); img_setrowsize(image,cnt,y,z); img_seek(image,y,z); if (img_write(image,(char *)image->tmpbuf,cnt) != cnt) return -1; else return image->xsize; break; case 2: min = image->min; max = image->max; sptr = buffer; for(x=image->xsize; x--;) { if (*sptr > max) max = *sptr; if (*sptr < min) min = *sptr; sptr++; } image->min = min; image->max = max; cnt = img_rle_compact(buffer,2,image->tmpbuf,2,image->xsize); cnt <<= 1; img_setrowsize(image,cnt,y,z); img_seek(image,y,z); if(image->dorev) cvtshorts(image->tmpbuf,cnt); if (img_write(image,(char *)image->tmpbuf,cnt) != cnt) { if(image->dorev) cvtshorts(image->tmpbuf,cnt); return -1; } else { if(image->dorev) cvtshorts(image->tmpbuf,cnt); return image->xsize; } break; default: i_errhdlr("putrow: wierd bpp\n"); } } else i_errhdlr("putrow: wierd image type\n"); return 0; }
int getrow( IMAGE *image, IMushort *buffer, int y, int z ) { register int i; register unsigned char *cptr; register IMushort *sptr; register int cnt; if( !(image->flags & (_IORW|_IOREAD)) ) return -1; if(image->dim<3) z = 0; if(image->dim<2) y = 0; img_seek(image, y, z); if(ISVERBATIM(image->type)) { switch(BPP(image->type)) { case 1: if (img_read(image,(char *)image->tmpbuf,image->xsize) != image->xsize) return -1; else { cptr = (unsigned char *)image->tmpbuf; sptr = buffer; for(i=image->xsize; i--;) *sptr++ = *cptr++; } return image->xsize; case 2: cnt = image->xsize<<1; if (img_read(image,(char *)buffer,cnt) != cnt) return -1; else { if(image->dorev) cvtshorts(buffer,cnt); return image->xsize; } default: i_errhdlr("getrow: wierd bpp\n"); break; } } else if(ISRLE(image->type)) { switch(BPP(image->type)) { case 1: if( (cnt = img_getrowsize(image)) == -1 ) return -1; if( img_read(image,(char *)image->tmpbuf,cnt) != cnt ) return -1; else { img_rle_expand(image->tmpbuf,1,buffer,2); return image->xsize; } case 2: if( (cnt = img_getrowsize(image)) == -1 ) return -1; if( cnt != img_read(image,(char *)image->tmpbuf,cnt) ) return -1; else { if(image->dorev) cvtshorts(image->tmpbuf,cnt); img_rle_expand(image->tmpbuf,2,buffer,2); return image->xsize; } default: i_errhdlr("getrow: wierd bpp\n"); break; } } else i_errhdlr("getrow: wierd image type\n"); return 0; }