X-Git-Url: http://git.imager.perl.org/imager.git/blobdiff_plain/a73aeb5fb8bf417b91c9f8e13905acf6a8692a37..b96f5e9e574301854c7f78f3f55a40f3cc5e85e9:/raw.c diff --git a/raw.c b/raw.c index 928b33af..bae403d0 100644 --- a/raw.c +++ b/raw.c @@ -1,4 +1,4 @@ -#include "image.h" +#include "imager.h" #include #include "iolayer.h" #ifndef _MSC_VER @@ -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) + return NULL; inbuflen = im->xsize*datachannels; 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); @@ -80,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? */ @@ -92,6 +123,9 @@ i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, i myfree(inbuffer); if (intrl != 0) myfree(ilbuffer); if (datachannels != storechannels) myfree(exbuffer); + + i_tags_add(&im->tags, "i_format", 0, "raw", -1, 0); + return im; } @@ -99,34 +133,31 @@ 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")); return(0); } } else { - int y; - 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) { @@ -138,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); @@ -155,5 +186,9 @@ i_writeraw_wiol(i_img* im, io_glue *ig) { } } } + + if (i_io_close(ig)) + return 0; + return(1); }