Provided by: libnetpbm10-dev_10.0-15.4_amd64 bug

NAME

       libpnm - functions to support pnm and pam programs

EXAMPLE

       /* Example program fragment to read a PAM or PNM image
          from stdin, add up the values of every sample in it
          (I don't know why), and write the image unchanged to
          stdout.  */

       #include <pam.h>

       struct pam inpam, outpam; unsigned int row;

       pnm_init(&argc, argv);

       pnm_readpaminit(stdin, &inpam, sizeof(inpam));

       outpam = inpam; outpam.file = stdout;

       pnm_writepaminit(&outpam);

       tuplerow = pnm_allocpamrow(&inpam);

       for (row = 0; row < inpam.height; row++) {
           unsigned int col;
           pnm_readpamrow(&inpam, tuplerow);
           for (column = 0; column < inpam.width; column++) {
               unsigned int plane;
               for (plane = 0; plane < inpam.depth; column++) {
                   grand_total += tuplerow[row][column][plane];
               }
           }
           pnm_writepamrow(&outpam, tuplerow); }

       pnm_freepamrow(tuplerow);

SYNOPSIS

       #include <pnm.h>

       void pnm_init( int *argcP, char *argv[] );

       tuple ** pnm_allocpamarray( struct pam *pamP);

       xel ** pnm_allocarray( int cols, int rows);

       tuple * pnm_allocpamrow( struct pam *pamP);

       xel * pnm_allocrow( int cols);

       void pnm_freepamarray( tuple **tuplearray, struct pam *pamP);

       void pnm_freearray( xel **xels, int rows);

       void pnm_freepamrow( tuple *tuplerow);

       void pnm_freerow( xel *xelrow);

       tuple * allocpamtuple( struct pam *pamP);

       void pnm_freepamtuple( tuple tuple );

       void pnm_readpaminit( FILE *file, struct pam *pamP, int size);

       void pnm_readpnminit( FILE *fp, int *colsP, int *rowsP, xelval *maxvalP, int *formatP );

       void pnm_readpamrow( struct pam *pamP, tuple *tuplerow);

       void pnm_readpnmrow( FILE *fp, xel *xelrow, int cols,
       xelval maxval, int format );

       tuple ** pnm_readpam( FILE *file, struct pam *pamP,
       int size);

       xel ** pnm_readpnm( FILE *fp, int *colsP, int *rowsP,
       xelval *maxvalP, int* formatP );"

       void pnm_writepaminit( struct pam *pamP);

       void pnm_writepnminit( FILE *  fp , int cols, int rows, xelval maxval, int format, int forceplain);

       void pnm_writepamrow( struct pam *pamP, const tuple *tuplerow);

       void pnm_writepnmrow( FILE *fp, xel *xelrow, int cols, xelval maxval, int format, int forceplain );

       void pnm_writepam( struct pam *pamP, const tuple * const *tuplearray);

       void  pnm_writepnm(  FILE *fp, xel ** xels, int cols, int rows, xelval maxval, int format, int forceplain
       );

       void pnm_checkpam( struct pam *pamP, const enum pm_check_type check_type, enum pm_check_code *retvalP);

       void pnm_nextimage( FILE *file, int * const eofP);

       void pnm_check( FILE * file, const enum pm_check_type check_type, const int format, const int cols, const
       int rows, const xelval maxval, enum pm_check_code *retvalP);

       void  pnm_promoteformatrow(  xel  *xelrow,  int  cols,  xelval  maxval, int format, xelval newmaxval, int
       newformat);

       void pnm_promoteformatrow( xel **xels, int  cols,  xelval  maxval,  int  format,  xelval  newmaxval,  int
       newformat);

       xel pnm_whitexel( xelval maxval, int format);

       xel pnm_blackxel( xelval maxval, int format);

       void pnm_invertxel( xel *x, xelval maxval, int format);

       xel pnm_backgroundxelrow( xel *xelrow, int cols, xelval maxval, int format);

       xel pnm_backgroundxel( xel **xels, int cols, int rows, xelval maxval, int format);

       void pnm_YCbCrtuple( tupletuple, double *YP, double *CrP, double *CbP);

       struct pam {
       int size
       int len
       FILE * file
       int format
       int plainformat
       int height
       int width
       int depth
       sample maxval
       int bytes_per_sample
       char tuple_type[256]; }

       typedef ... sample;

       typedef ... tuple;

       typedef ... xelval;

       typedef ... xel;

       extern xelval pnm_pbmmaxval;

       #define PNM_MAXMAXVAL ...

       #define PNM_OVERALLMAXVAL ...

       #define PNM_FORMAT ...

       #define PNM_ASSIGN1(x,v) ...

       #define PNM_GET1(x) ...

       #define PNM_EQUAL(x,y) ...

       #define PAM_FORMAT_TYPE(format) ...

       #define PNM_FORMAT_TYPE(format) ...

DESCRIPTION

   PAM VERSUS PNM FUNCTIONS
       The  PNM  library  contains  two classes of functions:  The pam functions and the pnm functions.  The pam
       functions are enhancements of the pnm functions and you should use them unless you need to be  compatible
       with older PNM libraries that don't have them (those released before August 2000).

       The  pnm  functions  operate on PBM, PGM, and PPM images and files.  They are similar to the functions in
       the PBM, PGM, and PPM libraries, except the pnm functions let you operate on all three, both reading  and
       writing, without a lot of concern for which of the three formats you are processing.

       The  pam  functions provide all the same functions for operating on PBM, PGM, and PPM libraries, but also
       operate on the newer PAM images and files.  The pam functions are easier to use than  the  pnm  functions
       due to improved parameter lists.

       There is no separate PAM library specific to the PAM format, as there is for PBM, PGM, and PPM.

   THE pam STRUCTURE
       The  pam  functions  take  most of their arguments in the form of a single pam structure.  This is not an
       opaque object, but just a convenient way to organize  the  information  upon  which  most  the  functions
       depend.   So  you are free to access or set the elements of the structure however you want.  But you will
       find in most cases it is most convenient to call  pnm_readpaminit()  or  pnm_writepaminit()  to  set  the
       fields  in  the pam structure before calling any other pam functions, and then just to pass the structure
       unchanged in all future calls to pam functions.

       The fields are:

       size   The storage size in bytes of this entire structure.

       len    The length, in bytes, of the information in this structure.  The information starts in  the  first
              byte  and  is  contiguous.   This  cannot  be greater than size.  size and len can be used to make
              programs compatible with newer and older versions of the Netpbm libraries.

       file   The file.

       format The format code of the raw image.  This is PAM_FORMAT unless the PAM image is really a view  of  a
              PBM, PGM, or PPM image.  Then it's PBM_FORMAT, RPBM_FORMAT, etc.

       plainformat
              This  is a boolean value and means:  The format above is a plain (text) format as opposed to a raw
              (binary) format.  This is entirely redundant with the format  member  and  exists  as  a  separate
              member only for computational speed.

       height The height of the image in rows.

       width  The width of the image in number of columns (tuples per row).

       depth  The depth of the image (degree of or number of samples in each tuple).

       maxval The maxval of the image.  See definitions in pam(5).

       bytes_per_sample
              The number of bytes used to represent each sample in the image file.  See the format definition in
              pam(5).  This is entirely redundant with maxval.  It exists as a separate member for computational
              speed.

       tuple_type
              The  tuple  type  of the image.  See definitions in pam(5).  Netpbm does not define any values for
              this except the following, which are used for a PAM image which is really a view of a PBM, PGM, or
              PPM image: PAM_PBM_TUPLETYPE, PAM_PGM_TUPLETYPE, PAM_PPM_TUPLETYPE.

   PLAIN VERSUS RAW FORMAT
       The  PNM  formats  each  come  in two varieties: the older plain (text) format and the newer raw (binary)
       format.  There are different format codes for the plain and raw formats, but which of the two formats the
       pnm and pam functions write is independent of the format code you pass to them.

       The  pam  functions  always  write raw formats.  If you specify the format code for a plain format, a pam
       function assumes instead the raw version of that format.

       The pnm functions choose between plain and raw based on the forceplain parameter  that  every  write-type
       pnm  function  has.   If  this boolean value is true, the function writes the plain version of the format
       specified by the format code.  If it is false,  the  function  writes  the  raw  version  of  the  format
       specified by the format code.

       We  are  trying to stamp out the older plain formats, so it would be a wise choice not to write a program
       that sets forceplain true under any  circumstance.   A  user  who  needs  a  plain  format  can  use  the
       pnmtoplainpnm program to convert the output of your program to plain format.

   PNM TYPES AND CONSTANTS
       Each  xel  contains  three  xelvals,  each  of  which  should  contain  only  the  values  between  0 and
       PNM_MAXMAXVAL, inclusive.  pnm_pbmmaxval is the maxval  used  when  a  PNM  program  reads  a  PBM  file.
       Normally it is 1; however, for some programs, a larger value gives better results.

   PNM XEL MANIPULATIONS
       The  PNM_GET1 macro extracts a single value from an xel, when you know it's from a PBM or PGM file.  When
       it's from a PPM file, use PPM_GETR(), PPM_GETG(), and PPM_GETB().

       The PNM_ASSIGN1 macro assigns a single value to an xel, when you know it's from a PBM or PGM file.   When
       it's  from  a  PPM  file,  use  PPM_ASSIGN.   The  PNM_EQUAL  macro  checks  two  xels for equality.  The
       PNM_FORMAT_TYPE and PAM_FORMAT_TYPE macros compute a format type code from a  format  code.   The  format
       types  are  PBM,  PGM,  PPM,  and PAM.  But note that PBM, PGM, and PPM each are two different formats: a
       plain one and a raw one.  So there are four format types, but seven formats.   PNM_FORMAT_TYPE  does  not
       work on the PAM format code.

   INITIALIZATION
       All PNM and PAM programs must call pnm_init() just after startup, before they process their arguments.

       pnm_init(), among other things, processes Netpbm universal parameters and removes them from the parameter
       list.

   MEMORY MANAGEMENT
       pnm_allocpamarray() allocates space for an array of tuples.   pnm_freepamarray()  frees  an  array  space
       allocated by pnm_allocpamarray() or pnm_readpam().

       pnm_allocarray() allocates space for an array of xels.  pnm_freearray() frees an array space allocated by
       pnm_allocarray() or pnm_readpnm().

       pnm_allocpamrow() allocates space for a row of a PAM image.  pnm_freepamrow() frees it.

       pnm_allocrow() allocates space for a row of a PNM image.  pnm_freerow() frees it.

   READING PNM FILES
       pnm_readpaminit() reads the header of a PAM or PNM image.  It returns the information from the header  in
       the  *pamP  structure.   It does not require any members of *pamP to be set at invocation, and sets every
       member.  size is the storage size of the *pamP structure, normally sizeof(struct pam).

       The function expects to find the image file  positioned  to  the  start  of  the  header  and  leaves  it
       positioned to the start of the raster.

       pnm_readpnminit()  is  similar  to  pnm_readpaminit(),  but  reads  only  PNM  images and has a different
       parameter list.

       pnm_readpamrow() reads a row of the raster from a PAM or PNM image file.  It expects all of  the  members
       of the *pamP structure to be set upon invocation and does not modify any of them.  It expects to find the
       file positioned to the start of the row in question in the raster and leaves it positioned just after it.
       It returns the row as the array of tuples tuplerow, which must already have its column pointers set up so
       that it forms a C 2-dimensional array.  The leftmost tuple is Element 0 of this array.

       pnm_readpnmrow() is similar to pnm_readpamrow() but  only  works  on  PNM  images  and  has  a  different
       parameter list and returns the row as an array of xels instead of tuples.

       pnm_readpam()  reads  an  entire  image  from a PAM or PNM image file and allocates the space in which to
       return the raster.  It expects to find the file positioned to the first byte of the image and  leaves  it
       positioned just after the image.

       The  function  does  not  require  *pamP  to  have any of its members set and sets them all.  size is the
       storage size in bytes of the *pamP structure, normally sizeof(struct pam).

       The return value is a newly allocated array of the rows of the image, with the top row being Element 0 of
       the array.  Each row is represented as pnm_readpamrow() would return.

       The  return  value  is  also  effectively  a  3-dimensional  C  array  of  samples,  with  the dimensions
       corresponding to the height, width, and depth of the image, in that order.

       pnm_readpam() combines  the  functions  of  pnm_allocpamarray(),  pnm_readpaminit(),  and  iterations  of
       pnm_readpamrow().  It may require more dynamic storage than you can afford.

       pnm_readpnm()  is  similar  to  pnm_readpam()  except  that it reads only PNM images and uses a different
       parameter list and returns an array of rows such that pnm_readpnmrow() would return rather than such that
       pnm_readpamrow() would return.

   WRITING FILES
       pnm_writepnminit()  writes  the  header  of a PAM or PNM image and computes some of the fields of the pam
       structure.

       The following members of the *pamP structure must be set upon invocation to tell  the  function  how  and
       what to write.  size, len, file, format, height, width, depth, maxval, tuple_type.

       pnm_writepaminit() sets the plainformat and bytes_per_sample members based on the information supplied.

       pnm_writepnminit()  is similar to pnm_writepaminit() except that it can write only a PNM header and has a
       different parameter list.

       See the description of forceplain above.

       pnm_writepamrow() writes a row of the raster into a PAM or PNM image file.  It expects to find  the  file
       positioned where the row should start and leaves it positioned just after the row.  The function requires
       all the elements of *pamP to be set upon invocation and doesn't modify them.

       tuplerow is an array of tuples representing the row.  The leftmost tuple is Element 0 of this array.

       pnm_writepnmrow() is similar to pnm_writepamrow() except that it works only  on  PNM  images  and  has  a
       different  parameter  list and takes an array of xels instead of an array of tuples.  See the description
       of forceplain above.

       pnm_writepam() writes an entire PAM or PNM image to a PAM or PNM image file.  It expects to find the file
       positioned to where the image should start and leaves it positioned just after the image.

       The  following  members  of  the *pamP structure must be set upon invocation to tell the function how and
       what to write: size, len, file, format, height, width, depth, maxval, tuple_type.

       pnm_writepam() sets the plainformat and bytes_per_sample members based on the information supplied.

       tuplearray is an array of rows such that you would pass to pnm_writepamrow(),  with  the  top  row  being
       Element 0 of the array.

       pnm_writepam()  combines  the functions of pnm_writepaminit(), and iterations of pnm_writepamrow().  It's
       raster input may be more storage than you can afford.

       pnm_writepnm() is similar to pnm_writepam() except that it works only  on  PNM  image,  has  a  different
       parameter  list,  and  takes  an  array  of  rows of xels instead of an array of rows of tuples.  See the
       description of forceplain above.

   MISCELLANEOUS
       pnm_nextimage()  positions  a  PNM  input  file  to  the  next  image  in  it  (so  that   a   subsequent
       pnm_readpnminit() reads its header).

       pnm_nextimage() is identical to pbm_nextimage().

       pam_check()  checks  for  the common file integrity error where the file is the wrong size to contain the
       raster, according to the information in the header.  This works on PAM and PNM images.

       pnm_check() is similar to pam_check() except it works only on PNM images.

       pnm_check() is identical to ppm_check().

   PNM FORMAT PROMOTION
       pnm_promoteformatrow() promotes a row of xels from one maxval and format to a new set.  Use this when you
       are  combining multiple anymaps of different types - just take the maximum of the maxvals and the maximum
       of the formats, and promote them all to that.

       pnm_promoteformat() promotes an entire anymap.

   PNM XEL MANIPULATION
       pnm_whitexel() and pnm_blackxel() return a white or black xel, respectively, for  the  given  maxval  and
       format.

       pnm_invertxel() inverts an xel.

       pnm_backgroundxelrow()  figures  out an appropriate background xel based on the row of xels xelrow, which
       is cols xels wide, has maxval maxval, and represents an image with format format.

       This estimate works best when the row is the top or bottom row of the image.

       pnm_backgroundxel() does the same thing as  pnm_backgroundxelrow(),  except  based  on  an  entire  image
       instead of just one row.  This tends to do a slightly better job than pnmbackgroundxelrow().

       pnm_YCbCrtuple() Returns the Y/Cb/Cr luminance/chrominance representation of the color represented by the
       input tuple, assuming that the tuple is an RGB color representation (which is the case  if  it  was  read
       from  a  PPM  image).  The output components are based on the same scale (maxval) as the input tuple, but
       are floating point nonetheless to avoid losing information due to rounding.  Divide them by the maxval to
       get normalized [0..1] values.

SEE ALSO

       pbm(5), pgm(5), ppm(5), pam(5), libpbm(3), libpgm(3), libppm(3)

AUTHOR

       Copyright (C) 1989, 1991 by Tony Hansen and Jef Poskanzer.

                                                                                                       libpnm(3)