int iclose(RGB_IMAGE *image) { long tablesize, ret; iflush(image); img_optseek(image, 0); if (image->flags&_IOWRT) { if (image->dorev) cvtimage((long *)image); swapImage(image) ; if (img_write(image,(char *)image,sizeof(RGB_IMAGE)) != sizeof(RGB_IMAGE)) { i_errhdlr("iclose: error on write of image header\n",0,0,0,0); return EOF; } swapImage(image) ; if (image->dorev) cvtimage((long *)image); if (ISRLE(image->type)) { img_optseek(image, 512L); tablesize = image->ysize*image->zsize*sizeof(long); if (image->dorev) cvtlongs((long *)image->rowstart,(long)tablesize); if (img_write(image,(char *)(image->rowstart),tablesize) != tablesize) { i_errhdlr("iclose: error on write of rowstart\n",0,0,0,0); return EOF; } if (image->dorev) cvtlongs((long *)image->rowsize,tablesize); if (img_write(image,(char *)(image->rowsize),tablesize) != tablesize) { i_errhdlr("iclose: error on write of rowsize\n",0,0,0,0); return EOF; } } } if (image->base) { free(image->base); image->base = 0; } if (image->tmpbuf) { free(image->tmpbuf); image->tmpbuf = 0; } if (ISRLE(image->type)) { free(image->rowstart); image->rowstart = 0; free(image->rowsize); image->rowsize = 0; } ret = close(image->file); if (ret != 0) i_errhdlr("iclose: error on close of file\n",0,0,0,0); free(image); return ret; }
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; }