]> git.imager.perl.org - imager.git/blobdiff - pnm.c
start of bmp support (just writing so far)
[imager.git] / pnm.c
diff --git a/pnm.c b/pnm.c
index 350d3537144f831f98818be5cec8d7aa1edcf296..2765c4c7006514fb8c6cb1c42f89c859b156162d 100644 (file)
--- a/pnm.c
+++ b/pnm.c
@@ -412,14 +412,36 @@ i_writeppm(i_img *im,int fd) {
 
   if (im->channels==3) {
     sprintf(header,"P6\n#CREATOR: Imager\n%d %d\n255\n",im->xsize,im->ysize);
-    
+
     if (mywrite(fd,header,strlen(header))<0) {
       i_push_error(errno, "could not write ppm header");
       mm_log((1,"i_writeppm: unable to write ppm header.\n"));
       return(0);
     }
     
-    rc=mywrite(fd,im->data,im->bytes);
+    if (!im->virtual && im->bits == i_8_bits && im->type == i_direct_type) {
+      rc=mywrite(fd,im->idata,im->bytes);
+    }
+    else {
+      unsigned char *data = mymalloc(3 * im->xsize);
+      if (data != NULL) {
+        int y = 0;
+        int x, ch;
+        unsigned char *p;
+        static int rgb_chan[3] = { 0, 1, 2 };
+
+        rc = 0;
+        while (y < im->ysize && rc >= 0) {
+          i_gsamp(im, 0, im->xsize, y, data, rgb_chan, 3);
+          rc = mywrite(fd, data, im->xsize * 3);
+        }
+        myfree(data);
+      }
+      else {
+        i_push_error(0, "Out of memory");
+        return 0;
+      }
+    }
     if (rc<0) {
       i_push_error(errno, "could not write ppm data");
       mm_log((1,"i_writeppm: unable to write ppm data.\n"));
@@ -434,8 +456,30 @@ i_writeppm(i_img *im,int fd) {
       mm_log((1,"i_writeppm: unable to write pgm header.\n"));
       return(0);
     }
-    
-    rc=mywrite(fd,im->data,im->bytes);
+
+    if (!im->virtual && im->bits == i_8_bits && im->type == i_direct_type) {
+      rc=mywrite(fd,im->idata,im->bytes);
+    }
+    else {
+      unsigned char *data = mymalloc(im->xsize);
+      if (data != NULL) {
+        int y = 0;
+        int x, ch;
+        int chan = 0;
+        unsigned char *p;
+
+        rc = 0;
+        while (y < im->ysize && rc >= 0) {
+          i_gsamp(im, 0, im->xsize, y, data, &chan, 1);
+          rc = mywrite(fd, data, im->xsize);
+        }
+        myfree(data);
+      }
+      else {
+        i_push_error(0, "Out of memory");
+        return 0;
+      }
+    }
     if (rc<0) {
       i_push_error(errno, "could not write pgm data");
       mm_log((1,"i_writeppm: unable to write pgm data.\n"));
@@ -466,16 +510,37 @@ i_writeppm_wiol(i_img *im, io_glue *ig) {
 
   io_glue_commit_types(ig);
 
-  if (im->channels==3) {
+  if (im->channels == 3) {
     sprintf(header,"P6\n#CREATOR: Imager\n%d %d\n255\n",im->xsize,im->ysize);
-    
-    if (ig->writecb(ig, header, strlen(header) )<0) {
+    if (ig->writecb(ig,header,strlen(header))<0) {
       i_push_error(errno, "could not write ppm header");
       mm_log((1,"i_writeppm: unable to write ppm header.\n"));
       return(0);
     }
-    
-    rc = ig->writecb(ig, im->data, im->bytes);
+
+    if (!im->virtual && im->bits == i_8_bits && im->type == i_direct_type) {
+      rc = ig->writecb(ig,im->idata,im->bytes);
+    }
+    else {
+      unsigned char *data = mymalloc(3 * im->xsize);
+      if (data != NULL) {
+        int y = 0;
+        int x, ch;
+        unsigned char *p;
+        static int rgb_chan[3] = { 0, 1, 2 };
+
+        rc = 0;
+        while (y < im->ysize && rc >= 0) {
+          i_gsamp(im, 0, im->xsize, y, data, rgb_chan, 3);
+          rc = ig->writecb(ig, data, im->xsize * 3);
+        }
+        myfree(data);
+      }
+      else {
+        i_push_error(0, "Out of memory");
+        return 0;
+      }
+    }
     if (rc<0) {
       i_push_error(errno, "could not write ppm data");
       mm_log((1,"i_writeppm: unable to write ppm data.\n"));
@@ -485,13 +550,35 @@ i_writeppm_wiol(i_img *im, io_glue *ig) {
   else if (im->channels == 1) {
     sprintf(header, "P5\n#CREATOR: Imager\n%d %d\n255\n",
            im->xsize, im->ysize);
-    if (ig->writecb(ig, header, strlen(header)) < 0) {
+    if (ig->writecb(ig,header, strlen(header)) < 0) {
       i_push_error(errno, "could not write pgm header");
       mm_log((1,"i_writeppm: unable to write pgm header.\n"));
       return(0);
     }
-    
-    rc = ig->writecb(ig, im->data, im->bytes);
+
+    if (!im->virtual && im->bits == i_8_bits && im->type == i_direct_type) {
+      rc=ig->writecb(ig,im->idata,im->bytes);
+    }
+    else {
+      unsigned char *data = mymalloc(im->xsize);
+      if (data != NULL) {
+        int y = 0;
+        int x, ch;
+        int chan = 0;
+        unsigned char *p;
+
+        rc = 0;
+        while (y < im->ysize && rc >= 0) {
+          i_gsamp(im, 0, im->xsize, y, data, &chan, 1);
+          rc = ig->writecb(ig, data, im->xsize);
+        }
+        myfree(data);
+      }
+      else {
+        i_push_error(0, "Out of memory");
+        return 0;
+      }
+    }
     if (rc<0) {
       i_push_error(errno, "could not write pgm data");
       mm_log((1,"i_writeppm: unable to write pgm data.\n"));
@@ -503,6 +590,6 @@ i_writeppm_wiol(i_img *im, io_glue *ig) {
     mm_log((1,"i_writeppm: ppm/pgm is 1 or 3 channel only (current image is %d)\n",im->channels));
     return(0);
   }
-  
+
   return(1);
 }