X-Git-Url: http://git.imager.perl.org/imager.git/blobdiff_plain/92bda6321b472bb18726d950da8833b950abf4ee..e1c0692925:/raw.c diff --git a/raw.c b/raw.c index 8b363d5a..bae403d0 100644 --- a/raw.c +++ b/raw.c @@ -23,14 +23,15 @@ intrl: interlace flag, 0 = sample interleaving 1 = line interleaving - 2 = image interleaving + 2 = image interleaving (not implemented) */ static void -interleave(unsigned char *inbuffer,unsigned char *outbuffer,int rowsize,int channels) { - int ch,ind,i; +interleave(unsigned char *inbuffer,unsigned char *outbuffer,i_img_dim rowsize,int channels) { + i_img_dim ind,i; + int ch; i=0; if (inbuffer == outbuffer) return; /* Check if data is already in interleaved format */ for (ind=0; ind datachannels ? datachannels : storechannels; + if (inbuffer == outbuffer) + return; /* Check if data is already in expanded format */ + for(x = 0; x < xsize; x++) { + for (ch = 0; ch < copy_chans; ch++) + outbuffer[x*storechannels+ch] = inbuffer[x*datachannels+ch]; + for (; ch < storechannels; ch++) + outbuffer[x*storechannels+ch] = 0; + } } i_img * -i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, int intrl) { +i_readraw_wiol(io_glue *ig, i_img_dim x, i_img_dim y, int datachannels, int storechannels, int intrl) { i_img* im; - int rc,k; - + ssize_t rc; + i_img_dim k; + unsigned char *inbuffer; unsigned char *ilbuffer; unsigned char *exbuffer; - int inbuflen,ilbuflen,exbuflen; + size_t inbuflen,ilbuflen,exbuflen; - io_glue_commit_types(ig); - mm_log((1, "i_readraw(ig %p,x %d,y %d,datachannels %d,storechannels %d,intrl %d)\n", - ig, x, y, datachannels, storechannels, intrl)); + i_clear_error(); + + mm_log((1, "i_readraw(ig %p,x %" i_DF ",y %" i_DF ",datachannels %d,storechannels %d,intrl %d)\n", + ig, i_DFc(x), i_DFc(y), datachannels, storechannels, intrl)); + + if (intrl != 0 && intrl != 1) { + i_push_error(0, "raw_interleave must be 0 or 1"); + return NULL; + } + if (storechannels < 1 || storechannels > 4) { + i_push_error(0, "raw_storechannels must be between 1 and 4"); + return NULL; + } im = i_img_empty_ch(NULL,x,y,storechannels); if (!im) @@ -72,7 +90,8 @@ i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, i ilbuflen = inbuflen; exbuflen = im->xsize*storechannels; inbuffer = (unsigned char*)mymalloc(inbuflen); - mm_log((1,"inbuflen: %d, ilbuflen: %d, exbuflen: %d.\n",inbuflen,ilbuflen,exbuflen)); + mm_log((1,"inbuflen: %ld, ilbuflen: %ld, exbuflen: %ld.\n", + (long)inbuflen, (long)ilbuflen, (long)exbuflen)); if (intrl==0) ilbuffer = inbuffer; else ilbuffer=mymalloc(inbuflen); @@ -82,8 +101,18 @@ i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, i k=0; while( kysize ) { - rc = ig->readcb(ig, inbuffer, inbuflen); - if (rc != inbuflen) { fprintf(stderr,"Premature end of file.\n"); exit(2); } + rc = i_io_read(ig, inbuffer, inbuflen); + if (rc != inbuflen) { + if (rc < 0) + i_push_error(0, "error reading file"); + else + i_push_error(0, "premature end of file"); + i_img_destroy(im); + myfree(inbuffer); + if (intrl != 0) myfree(ilbuffer); + if (datachannels != storechannels) myfree(exbuffer); + return NULL; + } interleave(inbuffer,ilbuffer,im->xsize,datachannels); expandchannels(ilbuffer,exbuffer,im->xsize,datachannels,storechannels); /* FIXME: Do we ever want to save to a virtual image? */ @@ -104,15 +133,14 @@ i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, i undef_int i_writeraw_wiol(i_img* im, io_glue *ig) { - int rc; + ssize_t rc; - io_glue_commit_types(ig); i_clear_error(); mm_log((1,"writeraw(im %p,ig %p)\n", im, ig)); if (im == NULL) { mm_log((1,"Image is empty\n")); return(0); } if (!im->virtual) { - rc = ig->writecb(ig,im->idata,im->bytes); + rc = i_io_write(ig,im->idata,im->bytes); if (rc != im->bytes) { i_push_error(errno, "Could not write to file"); mm_log((1,"i_writeraw: Couldn't write to file\n")); @@ -122,14 +150,14 @@ i_writeraw_wiol(i_img* im, io_glue *ig) { if (im->type == i_direct_type) { /* just save it as 8-bits, maybe support saving higher bit count raw images later */ - int line_size = im->xsize * im->channels; + size_t line_size = im->xsize * im->channels; unsigned char *data = mymalloc(line_size); - int y = 0; + i_img_dim y = 0; rc = line_size; while (rc == line_size && y < im->ysize) { i_gsamp(im, 0, im->xsize, y, data, NULL, im->channels); - rc = ig->writecb(ig, data, line_size); + rc = i_io_write(ig, data, line_size); ++y; } if (rc != line_size) { @@ -141,14 +169,14 @@ i_writeraw_wiol(i_img* im, io_glue *ig) { /* paletted image - assumes the caller puts the palette somewhere else */ - int line_size = sizeof(i_palidx) * im->xsize; + size_t line_size = sizeof(i_palidx) * im->xsize; i_palidx *data = mymalloc(sizeof(i_palidx) * im->xsize); - int y = 0; + i_img_dim y = 0; rc = line_size; while (rc == line_size && y < im->ysize) { i_gpal(im, 0, im->xsize, y, data); - rc = ig->writecb(ig, data, line_size); + rc = i_io_write(ig, data, line_size); ++y; } myfree(data); @@ -159,7 +187,8 @@ i_writeraw_wiol(i_img* im, io_glue *ig) { } } - ig->closecb(ig); + if (i_io_close(ig)) + return 0; return(1); }