changeset 164:a99c3050162e

Correctly return alpha layer. Texinfo docstring.
author sjvdw
date Thu, 13 Oct 2005 12:43:14 +0000
parents ccfeb2a529bc
children 443f7f82518c
files pngread.cc
diffstat 1 files changed, 40 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/pngread.cc
+++ b/pngread.cc
@@ -53,15 +53,19 @@
 
 canvas *load_canvas(char *filename);
 
-DEFUN_DLD (pngread, args, nargout ,"\
-Read a PNG file from disk.\n\n\
-usage: I = pngread('filename')\n\
+DEFUN_DLD (pngread, args, nargout ,
+"-*- texinfo -*-\n\
+@deftypefn {Loadable Function} {[@var{I}, @var{alpha}] =} pngread(@var{filename})\n\
+\n\
+Read a PNG file from disk.\n\
 \n\
-For a grey-level image, the output is an MxN matrix. For a\n\
-colour image, an MxNx3 matrix is returned, containing the\n\
-red, green and blue components. The output is of class 'uint8'.\n\
+The image is returned as a matrix of dimension MxN (for grey-level images)\n\
+or MxNx3 (for colour images).  The numeric type of @var{I} and @var{alpha}\n\
+is @code{uint8} for grey-level and RGB images, or @code{logical} for\n\
+black-and-white images.\n\
 \n\
-See also: imread.")
+@end deftypefn\n\
+@seealso{imread}")
 {
   octave_value_list retval;
   int nargin  = args.length();
@@ -94,32 +98,44 @@
   if (pic->bit_depth > 1 && pic->bit_depth < 8)
       pic->bit_depth = 8;
 
-  NDArray out = NDArray(dim, 0);
+  NDArray out(dim);
   
+  dim.resize(2);
+  NDArray alpha(dim);
+   
   Array<int> coord = Array<int> (3);
-  Matrix alpha ( pic->height , pic->width );
   
   for (unsigned long j=0; j < pic->height; j++) {
       coord(0) = j;
       for (unsigned long i=0; i < pic->width; i++) {
 	  coord(1) = i;
 
-	  for (int c = 0; c < dim(2); c++) {
+	  for (int c = 0; c < out.dims()(2); c++) {
 	      coord(2) = c;
-	      out(coord) = pic->row_pointers[j][i*3+c];
+	      out(coord) = pic->row_pointers[j][i*4+c];
 	  }
-	  alpha(j,i) = pic->row_pointers[j][i*3+3];
+	  alpha(j,i) = pic->row_pointers[j][i*4+3];
       }
   }
   out = out.squeeze();
 
   switch (pic->bit_depth) {
-  case 1: retval.append((boolNDArray)out); break;
-  case 8: retval.append((uint8NDArray)out); break;
-  case 16: retval.append((uint16NDArray)out); break;
-  default: retval.append(out);
+  case 1: 
+     retval.append((boolNDArray)out);
+     retval.append((boolNDArray)alpha);
+     break;
+  case 8:
+     retval.append((uint8NDArray)out);
+     retval.append((uint8NDArray)alpha);
+     break;
+  case 16:
+     retval.append((uint16NDArray)out);
+     retval.append((uint16NDArray)alpha);
+     break;
+  default:
+     retval.append(out);
+     retval.append(alpha);
   }
-  retval.append(alpha);
 
   delete_canvas(pic);
   return retval;
@@ -190,15 +206,15 @@
       png_set_tRNS_to_alpha(png_ptr);
   }
   
-  // Assume black background
-  if (color_type & PNG_COLOR_MASK_ALPHA) {
-      png_set_strip_alpha(png_ptr);
-  }
-
   // Always transform image to RGB
   if (color_type == PNG_COLOR_TYPE_GRAY 
       || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 
-      png_set_gray_to_rgb(png_ptr);  
+      png_set_gray_to_rgb(png_ptr);
+   
+  // If no alpha layer is present, create one
+  if (color_type == PNG_COLOR_TYPE_GRAY
+      || color_type == PNG_COLOR_TYPE_RGB)
+     png_set_add_alpha(png_ptr, 0xff, PNG_FILLER_AFTER);
 
   if (bit_depth < 8) {
       png_set_packing(png_ptr);
@@ -208,10 +224,9 @@
   if (bit_depth == 16) {
       png_set_strip_16(png_ptr);
   }
-
+   
   png_read_update_info(png_ptr,info_ptr);
 
-
   // Read the data from the file
   int stride = png_get_rowbytes(png_ptr, info_ptr);
   canvas *can = new_canvas(width, height, stride);