]> git.imager.perl.org - imager.git/blobdiff - raw.c
t1 no longer needs a type check
[imager.git] / raw.c
diff --git a/raw.c b/raw.c
index 90eb487b77a5b6fb92c8c427fb72f758332d30e0..912aaf903e8fb7a7b2b4570068eaf6be2b746ea4 100644 (file)
--- a/raw.c
+++ b/raw.c
@@ -1,4 +1,4 @@
-#include "image.h"
+#include "imager.h"
 #include <stdio.h>
 #include "iolayer.h"
 #ifndef _MSC_VER
@@ -23,7 +23,7 @@
           intrl: interlace flag,
                        0 = sample interleaving
                        1 = line interleaving
-                       2 = image interleaving
+                       2 = image interleaving (not implemented)
 
 */
 
@@ -41,28 +41,44 @@ interleave(unsigned char *inbuffer,unsigned char *outbuffer,int rowsize,int chan
 static
 void
 expandchannels(unsigned char *inbuffer, unsigned char *outbuffer, 
-              int chunks, int datachannels, int storechannels) {
-  int ch,i;
-  if (inbuffer == outbuffer) return; /* Check if data is already in expanded format */
-  for(ch=0; ch<chunks; ch++) 
-    for (i=0; i<storechannels; i++) 
-      outbuffer[ch*storechannels+i] = inbuffer[ch*datachannels+i];
+              int xsize, int datachannels, int storechannels) {
+  int x, ch;
+  int copy_chans = storechannels > 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_img* im;
   int rc,k;
-  
+
   unsigned char *inbuffer;
   unsigned char *ilbuffer;
   unsigned char *exbuffer;
   
   int inbuflen,ilbuflen,exbuflen;
 
+  i_clear_error();
+  
   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));
+
+  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)
@@ -83,7 +99,17 @@ i_readraw_wiol(io_glue *ig, int x, int y, int datachannels, int storechannels, i
   k=0;
   while( k<im->ysize ) {
     rc = ig->readcb(ig, inbuffer, inbuflen);
-    if (rc != inbuflen) { fprintf(stderr,"Premature end of file.\n"); exit(2); }
+    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? */
@@ -119,8 +145,6 @@ i_writeraw_wiol(i_img* im, io_glue *ig) {
       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 */