diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-19 03:12:28 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-19 03:12:28 +0000 |
commit | 1fd361a1ea06e44286c213ca1f814f49306fdc43 (patch) | |
tree | 64c8c96cf54d8718847339a403e5e67b922e8c3f /converter/pgm/hipstopgm.c | |
download | netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.gz netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.xz netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.zip |
Create Subversion repository
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/pgm/hipstopgm.c')
-rw-r--r-- | converter/pgm/hipstopgm.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/converter/pgm/hipstopgm.c b/converter/pgm/hipstopgm.c new file mode 100644 index 00000000..826a8511 --- /dev/null +++ b/converter/pgm/hipstopgm.c @@ -0,0 +1,181 @@ +/* hipstopgm.c - read a HIPS file and produce a portable graymap +** +** Copyright (C) 1989 by Jef Poskanzer. +** +** Permission to use, copy, modify, and distribute this software and its +** documentation for any purpose and without fee is hereby granted, provided +** that the above copyright notice appear in all copies and that both that +** copyright notice and this permission notice appear in supporting +** documentation. This software is provided "as is" without express or +** implied warranty. +*/ + +#include <string.h> + +#include "nstring.h" +#include "pgm.h" + +struct HIPS_Header { + char* orig_name; /* An indication of the originator of this sequence. */ + char* seq_name; /* The sequence name. */ + int num_frame; /* The number of frames in this sequence. */ + char* orig_date; /* The date the sequence was originated. */ + int rows; /* The number of rows in each image, the height. */ + int cols; /* The number of columns in each image, the width. */ + int bits_per_pixel; /* The number of significant bits per pixel. */ + int bit_packing; /* Nonzero if the bits were packed such as to + eliminate any unused bits resulting from a + bits_per_pixel value which was not an even + multiple of eight. */ + int pixel_format; /* An indication of the format of each pixel. */ + char* seq_history; /* A description of the sequence of transformations + leading up to the current image. */ + char* seq_desc; /* A free form description of the contents of the + sequence. */ +}; +#define HIPS_PFBYTE 0 +#define HIPS_PFSHORT 1 +#define HIPS_PFINT 2 +#define HIPS_PFFLOAT 3 +#define HIPS_PFCOMPLEX 4 + + + +static void +read_line(FILE * const fd, + char * const buf, + int const size) { + + if (fgets( buf, size, fd ) == NULL) + pm_error("error reading header"); +} + + + + +static void +read_hips_header( fd, hP ) + FILE* fd; + struct HIPS_Header* hP; +{ + char buf[5000]; + + /* Read and toss orig_name. */ + read_line( fd, buf, 5000 ); + + /* Read and toss seq_name. */ + read_line( fd, buf, 5000 ); + + /* Read num_frame. */ + read_line( fd, buf, 5000 ); + hP->num_frame = atoi( buf ); + + /* Read and toss orig_date. */ + read_line( fd, buf, 5000 ); + + /* Read rows. */ + read_line( fd, buf, 5000 ); + hP->rows = atoi( buf ); + + /* Read cols. */ + read_line( fd, buf, 5000 ); + hP->cols = atoi( buf ); + + /* Read bits_per_pixel. */ + read_line( fd, buf, 5000 ); + hP->bits_per_pixel = atoi( buf ); + + /* Read bit_packing. */ + read_line( fd, buf, 5000 ); + hP->bit_packing = atoi( buf ); + + /* Read pixel_format. */ + read_line( fd, buf, 5000 ); + hP->pixel_format = atoi( buf ); + + /* Now read and toss lines until we get one with just a period. */ + do + { + read_line( fd, buf, 5000 ); + } + while ( !STREQ( buf, ".\n" ) ); +} + + + +int +main(int argc, char * argv[]) { + + FILE* ifp; + gray* grayrow; + register gray* gP; + int argn, row; + register int col; + int maxval; + int rows, cols; + struct HIPS_Header h; + + + pgm_init( &argc, argv ); + + argn = 1; + + if ( argn < argc ) + { + ifp = pm_openr( argv[argn] ); + argn++; + } + else + ifp = stdin; + + if ( argn != argc ) + pm_usage( "[hipsfile]" ); + + read_hips_header( ifp, &h ); + + cols = h.cols; + rows = h.rows * h.num_frame; + + switch ( h.pixel_format ) + { + case HIPS_PFBYTE: + if ( h.bits_per_pixel != 8 ) + pm_error( + "can't handle unusual bits_per_pixel %d", h.bits_per_pixel ); + if ( h.bit_packing != 0 ) + pm_error( "can't handle bit_packing" ); + maxval = 255; + break; + + default: + pm_error( "unknown pixel format %d", h.pixel_format ); + } + + pgm_writepgminit( stdout, cols, rows, (gray) maxval, 0 ); + grayrow = pgm_allocrow( cols ); + for ( row = 0; row < rows; row++) + { + for ( col = 0, gP = grayrow; col < cols; col++, gP++ ) + { + int ich; + + switch ( h.pixel_format ) + { + case HIPS_PFBYTE: + ich = getc( ifp ); + if ( ich == EOF ) + pm_error( "EOF / read error" ); + *gP = (gray) ich; + break; + + default: + pm_error( "can't happen" ); + } + } + pgm_writepgmrow( stdout, grayrow, cols, (gray) maxval, 0 ); + } + pm_close( ifp ); + pm_close( stdout ); + + return 0; +} |