From decwrl!purdue!mailrus!ncar!tank!nic.MR.NET!hal!ncoast!allbery Sun Nov 13 00:44:10 PST 1988 Article 720 of comp.sources.misc: Path: granite!decwrl!purdue!mailrus!ncar!tank!nic.MR.NET!hal!ncoast!allbery From: jef@helios.ee.lbl.gov (Jef Poskanzer) Newsgroups: comp.sources.misc Subject: v05i044: portable bitmap routines (4 of 5) Message-ID: <8811010237.AA02700@helios.ee.lbl.gov> Date: 9 Nov 88 02:40:02 GMT Sender: allbery@ncoast.UUCP Reply-To: jef@helios.ee.lbl.gov (Jef Poskanzer) Lines: 1765 Approved: allbery@ncoast.UUCP Posting-number: Volume 5, Issue 44 Submitted-by: "Jef Poskanzer" Archive-name: pbm3/Part4 #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # pbmtomacp.1 # pbmtox10wd.c # pbmtox10wd.1 # pbmtoxwd.c # pbmtoxwd.1 # brushtopbm.c # brushtopbm.1 # libpbm1.c # libpbm2.c # libpbm3.c # libpbm4.c # libpbm5.c # giftopbm.c # giftopbm.1 # This archive created: Mon Oct 31 18:33:38 1988 # By: Jef Poskanzer (Paratheo-Anametamystikhood Of Eris Esoteric, Ada Lovelace Cabal) export PATH; PATH=/bin:$PATH echo shar: extracting "'pbmtomacp.1'" '(1091 characters)' if test -f 'pbmtomacp.1' then echo shar: will not over-write existing file "'pbmtomacp.1'" else sed 's/^X//' << \SHAR_EOF > 'pbmtomacp.1' X.TH pbmtomacp 1 "31 August 1988" X.SH NAME Xpbmtomacp - convert portable bitmap into MacPaint X.SH SYNOPSIS Xpbmtomacp [-l left] [-r right] [-b bottom] [-t top] [pbmfile] X.SH DESCRIPTION XReads a portable bitmap as input. XIf no input-file is given, standard input is assumed. XProduces a MacPaint file as output. X.LP XLeft, right,bottom & top let you define a square into the pbm file, Xthat must be converted. XDefault is the whole file. XIf the file is too large for a MacPaint-file, the bitmap is cut to fit Xfrom ( left, top ). X.SH BUGS XThe source code contains comments in a language other than English. X.SH "SEE ALSO" Xmacptopbm(1), pbm(5) X.SH AUTHOR XCopyright (C) 1988 by Douwe van der Schaaf. XUSENET: ..!mcvax!uvapsy!vdschaaf X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, provided Xthat the above copyright notice appear in all copies and that both that Xcopyright notice and this permission notice appear in supporting Xdocumentation. This software is provided "as is" without express or Ximplied warranty. SHAR_EOF if test 1091 -ne "`wc -c < 'pbmtomacp.1'`" then echo shar: error transmitting "'pbmtomacp.1'" '(should have been 1091 characters)' fi fi # end of overwriting check echo shar: extracting "'pbmtox10wd.c'" '(2873 characters)' if test -f 'pbmtox10wd.c' then echo shar: will not over-write existing file "'pbmtox10wd.c'" else sed 's/^X//' << \SHAR_EOF > 'pbmtox10wd.c' X/* pbmtox10wd.c - read a portable bitmap and produce an X10 window dump X** X** Copyright (C) 1988 by Jef Poskanzer. X** X** Permission to use, copy, modify, and distribute this software and its X** documentation for any purpose and without fee is hereby granted, provided X** that the above copyright notice appear in all copies and that both that X** copyright notice and this permission notice appear in supporting X** documentation. This software is provided "as is" without express or X** implied warranty. X*/ X X#include X#ifdef OS_SYSV X#include X#else OS_SYSV X#include X#endif OS_SYSV X#include "pbm.h" X#include "x10wd.h" X Xmain( argc, argv ) Xint argc; Xchar *argv[]; X { X FILE *ifd; X bit **bits; X int rows, cols, padright, row, col; X char name[100], *cp; X X if ( argc > 2 ) X { X fprintf( stderr, "usage: %s [pbmfile]\n", argv[0] ); X exit( 1 ); X } X X if ( argc == 2 ) X { X ifd = fopen( argv[1], "r" ); X if ( ifd == NULL ) X { X fprintf( stderr, "%s: can't open.\n", argv[1] ); X exit( 1 ); X } X strcpy( name, argv[1] ); X X#ifdef OS_SYSV X if ( ( cp = strchr( name, '.' ) ) != 0 ) X#else OS_SYSV X if ( ( cp = index( name, '.' ) ) != 0 ) X#endif OS_SYSV X *cp = '\0'; X } X else X { X ifd = stdin; X strcpy( name, "noname" ); X } X X bits = pbm_readpbm( ifd, &cols, &rows ); X X if ( ifd != stdin ) X fclose( ifd ); X X /* Compute padding to round cols up to the nearest multiple of 16. */ X padright = ( ( cols + 15 ) / 16 ) * 16 - cols; X X putinit( cols, rows, name ); X for ( row = 0; row < rows; row++ ) X { X for ( col = 0; col < cols; col++ ) X putbit( bits[row][col] ); X for ( col = 0; col < padright; col++ ) X putbit( 0 ); X } X putrest( ); X X exit( 0 ); X } X X Xshort item; Xint bitsperitem, bitshift; X X Xputinit( cols, rows, name ) Xint cols, rows; Xchar *name; X { X X10WDFileHeader h10; X X h10.header_size = sizeof(h10) + (strlen(name) + 1) * sizeof(char); X h10.file_version = X10WD_FILE_VERSION; X h10.display_type = -1; /* random number */ X h10.display_planes = 1; X h10.pixmap_format = XYFormat; X h10.pixmap_width = cols; X h10.pixmap_height = rows; X h10.window_width = cols; X h10.window_height = rows; X h10.window_x = 0; /* arbitrary */ X h10.window_y = 0; /* likewise */ X h10.window_bdrwidth = 0; X h10.window_ncolors = 0; X X fwrite( &h10, sizeof(h10), 1, stdout ); X fwrite( name, sizeof(char), strlen(name) + 1, stdout ); X X item = 0; X bitsperitem = 0; X bitshift = 0; X } X Xputbit( b ) Xbit b; X { X if ( bitsperitem == 16 ) X putitem( ); X bitsperitem++; X if ( ! b ) X item += 1 << bitshift; X bitshift++; X } X Xputrest( ) X { X if ( bitsperitem > 0 ) X putitem( ); X } X Xputitem( ) X { X fwrite( &item, sizeof(item), 1, stdout ); X item = 0; X bitsperitem = 0; X bitshift = 0; X } SHAR_EOF if test 2873 -ne "`wc -c < 'pbmtox10wd.c'`" then echo shar: error transmitting "'pbmtox10wd.c'" '(should have been 2873 characters)' fi fi # end of overwriting check echo shar: extracting "'pbmtox10wd.1'" '(691 characters)' if test -f 'pbmtox10wd.1' then echo shar: will not over-write existing file "'pbmtox10wd.1'" else sed 's/^X//' << \SHAR_EOF > 'pbmtox10wd.1' X.TH pbmtox10wd 1 "31 August 1988" X.SH NAME Xpbmtox10wd - convert portable bitmaps into X10 window dumps X.SH SYNOPSIS Xpbmtox10wd [pbmfile] X.SH DESCRIPTION XReads a portable bitmap as input. XProduces an X10 window dump as output. X.SH "SEE ALSO" Xpbmtoxwd(1), xwdtopbm(1), pbm(5) X.SH AUTHOR XCopyright (C) 1988 by Jef Poskanzer. X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, provided Xthat the above copyright notice appear in all copies and that both that Xcopyright notice and this permission notice appear in supporting Xdocumentation. This software is provided "as is" without express or Ximplied warranty. SHAR_EOF if test 691 -ne "`wc -c < 'pbmtox10wd.1'`" then echo shar: error transmitting "'pbmtox10wd.1'" '(should have been 691 characters)' fi fi # end of overwriting check echo shar: extracting "'pbmtoxwd.c'" '(3517 characters)' if test -f 'pbmtoxwd.c' then echo shar: will not over-write existing file "'pbmtoxwd.c'" else sed 's/^X//' << \SHAR_EOF > 'pbmtoxwd.c' X/* pbmtoxwd.c - read a portable bitmap and produce an X11 window dump X** X** Copyright (C) 1988 by Jef Poskanzer. X** X** Permission to use, copy, modify, and distribute this software and its X** documentation for any purpose and without fee is hereby granted, provided X** that the above copyright notice appear in all copies and that both that X** copyright notice and this permission notice appear in supporting X** documentation. This software is provided "as is" without express or X** implied warranty. X*/ X X#include X#ifdef OS_SYSV X#include X#else OS_SYSV X#include X#endif OS_SYSV X#include "pbm.h" X#include "x11wd.h" X Xmain( argc, argv ) Xint argc; Xchar *argv[]; X { X FILE *ifd; X bit **bits; X int rows, cols, padright, row, col; X char name[100], *cp; X X if ( argc > 2 ) X { X fprintf( stderr, "usage: %s [pbmfile]\n", argv[0] ); X exit( 1 ); X } X X if ( argc == 2 ) X { X ifd = fopen( argv[1], "r" ); X if ( ifd == NULL ) X { X fprintf( stderr, "%s: can't open.\n", argv[1] ); X exit( 1 ); X } X strcpy( name, argv[1] ); X X#ifdef OS_SYSV X if ( ( cp = strchr( name, '.' ) ) != 0 ) X#else OS_SYSV X if ( ( cp = index( name, '.' ) ) != 0 ) X#endif OS_SYSV X *cp = '\0'; X } X else X { X ifd = stdin; X strcpy( name, "noname" ); X } X X bits = pbm_readpbm( ifd, &cols, &rows ); X X if ( ifd != stdin ) X fclose( ifd ); X X /* Compute padding to round cols up to the nearest multiple of 32. */ X padright = ( ( cols + 31 ) / 32 ) * 32 - cols; X X putinit( cols, rows, name ); X for ( row = 0; row < rows; row++ ) X { X for ( col = 0; col < cols; col++ ) X putbit( bits[row][col] ); X for ( col = 0; col < padright; col++ ) X putbit( 0 ); X } X putrest( ); X X exit( 0 ); X } X X Xlong item; Xint bitsperitem, bitshift; X X Xputinit( cols, rows, name ) Xint cols, rows; Xchar *name; X { X X11WDFileHeader h11; X X11XColor color; X X h11.header_size = sizeof(h11) + (strlen(name) + 1) * sizeof(char); X h11.file_version = X11WD_FILE_VERSION; X h11.pixmap_format = ZPixmap; X h11.pixmap_depth = 1; X h11.pixmap_width = cols; X h11.pixmap_height = rows; X h11.xoffset = 0; X h11.byte_order = MSBFirst; X h11.bitmap_unit = 32; X h11.bitmap_bit_order = MSBFirst; X h11.bitmap_pad = 32; X h11.bits_per_pixel = 1; X h11.bytes_per_line = ( ( cols + 31 ) / 32 ) * 4; X h11.visual_class = 0; X h11.red_mask = 0; X h11.green_mask = 0; X h11.blue_mask = 0; X h11.bits_per_rgb = 1; X h11.colormap_entries = 2; X h11.ncolors = 2; X h11.window_width = cols; X h11.window_height = rows; X h11.window_x = 0; /* arbitrary */ X h11.window_y = 0; /* arbitrary */ X h11.window_bdrwidth = 0; X fwrite( &h11, sizeof(h11), 1, stdout ); X X fwrite( name, sizeof(char), strlen(name) + 1, stdout ); X X color.pixel = 0; X color.red = 65535; X color.green = 65535; X color.blue = 65535; X color.flags = 7; X color.pad = 0; X fwrite( &color, sizeof(color), 1, stdout ); X color.pixel = 1; X color.red = 0; X color.green = 0; X color.blue = 0; X fwrite( &color, sizeof(color), 1, stdout ); X X item = 0; X bitsperitem = 0; X bitshift = 31; X } X Xputbit( b ) Xbit b; X { X if ( bitsperitem == 32 ) X putitem( ); X bitsperitem++; X if ( b ) X item += 1 << bitshift; X bitshift--; X } X Xputrest( ) X { X if ( bitsperitem > 0 ) X putitem( ); X } X Xputitem( ) X { X fwrite( &item, sizeof(item), 1, stdout ); X item = 0; X bitsperitem = 0; X bitshift = 31; X } SHAR_EOF if test 3517 -ne "`wc -c < 'pbmtoxwd.c'`" then echo shar: error transmitting "'pbmtoxwd.c'" '(should have been 3517 characters)' fi fi # end of overwriting check echo shar: extracting "'pbmtoxwd.1'" '(742 characters)' if test -f 'pbmtoxwd.1' then echo shar: will not over-write existing file "'pbmtoxwd.1'" else sed 's/^X//' << \SHAR_EOF > 'pbmtoxwd.1' X.TH pbmtoxwd 1 "31 August 1988" X.SH NAME Xpbmtoxwd - convert portable bitmaps into X11 window dumps X.SH SYNOPSIS Xpbmtoxwd [pbmfile] X.SH DESCRIPTION XReads a portable bitmap as input. XProduces an X11 window dump as output. XThis window dump can be displayed using the xwud tool. X.SH "SEE ALSO" Xpbmtox10wd(1), xwdtopbm(1), pbm(5) X.SH AUTHOR XCopyright (C) 1988 by Jef Poskanzer. X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, provided Xthat the above copyright notice appear in all copies and that both that Xcopyright notice and this permission notice appear in supporting Xdocumentation. This software is provided "as is" without express or Ximplied warranty. SHAR_EOF if test 742 -ne "`wc -c < 'pbmtoxwd.1'`" then echo shar: error transmitting "'pbmtoxwd.1'" '(should have been 742 characters)' fi fi # end of overwriting check echo shar: extracting "'brushtopbm.c'" '(2333 characters)' if test -f 'brushtopbm.c' then echo shar: will not over-write existing file "'brushtopbm.c'" else sed 's/^X//' << \SHAR_EOF > 'brushtopbm.c' X/* brushtopbm.c - read a doodle brush file and write a portable bitmap X** X** Copyright (C) 1988 by Jef Poskanzer. X** X** Permission to use, copy, modify, and distribute this software and its X** documentation for any purpose and without fee is hereby granted, provided X** that the above copyright notice appear in all copies and that both that X** copyright notice and this permission notice appear in supporting X** documentation. This software is provided "as is" without express or X** implied warranty. X*/ X X#include X#include "pbm.h" X Xmain( argc, argv ) Xint argc; Xchar *argv[]; X { X FILE *ifd; X bit **bits, getbit(); X int rows, cols, padright, row, col; X X if ( argc > 2 ) X { X fprintf( stderr, "usage: %s [brushfile]\n", argv[0] ); X exit( 1 ); X } X X if ( argc == 2 ) X { X ifd = fopen( argv[1], "r" ); X if ( ifd == NULL ) X { X fprintf( stderr, "%s: can't open.\n", argv[1] ); X exit( 1 ); X } X } X else X ifd = stdin; X X getinit( ifd, &cols, &rows ); X X bits = pbm_allocarray( cols, rows ); X X /* Compute padding to round cols up to the next multiple of 16. */ X padright = ( ( cols + 15 ) / 16 ) * 16 - cols; X X for ( row = 0; row < rows; row++ ) X { X /* Get data. */ X for ( col = 0; col < cols; col++ ) X bits[row][col] = getbit( ifd ); X /* Discard line padding. */ X for ( col = 0; col < padright; col++ ) X (void) getbit( ifd ); X } X X if ( ifd != stdin ) X fclose( ifd ); X X pbm_writepbm( stdout, bits, cols, rows ); X X exit( 0 ); X } X X Xint item, bitsperitem, bitshift; X Xgetinit( file, colp, rowp ) XFILE *file; Xint *colp, *rowp; X { X int i; X X if ( getc( file ) != 1 ) X { X fprintf( stderr, "Bad magic number 1.\n" ); X exit( 1 ); X } X if ( getc( file ) != 0 ) X { X fprintf( stderr, "Bad magic number 2.\n" ); X exit( 1 ); X } X *colp = getc( file ) << 8; X *colp += getc( file ); X *rowp = getc( file ) << 8; X *rowp += getc( file ); X bitsperitem = 8; X X /* Junk rest of header. */ X for ( i = 0; i < 10; i++ ) /* 10 is just a guess at the header size */ X (void) getc( file ); X } X Xbit Xgetbit( file ) XFILE *file; X { X bit b; X X if ( bitsperitem == 8 ) X { X item = getc( file ); X bitsperitem = 0; X bitshift = 7; X } X bitsperitem++; X b = 1 - ( ( item >> bitshift) & 1 ); X bitshift--; X return b; X } SHAR_EOF if test 2333 -ne "`wc -c < 'brushtopbm.c'`" then echo shar: error transmitting "'brushtopbm.c'" '(should have been 2333 characters)' fi fi # end of overwriting check echo shar: extracting "'brushtopbm.1'" '(729 characters)' if test -f 'brushtopbm.1' then echo shar: will not over-write existing file "'brushtopbm.1'" else sed 's/^X//' << \SHAR_EOF > 'brushtopbm.1' X.TH brushtopbm 1 "28 August 1988" X.SH NAME Xbrushtopbm - convert doodle brush files into portable bitmaps X.SH SYNOPSIS Xbrushtopbm [brushfile] X.SH DESCRIPTION XReads a Xerox doodle brush file as input. XProduces a portable bitmap as output. X.LP XNote that there is currently no pbmtobrush tool. X.SH "SEE ALSO" Xpbm(5) X.SH AUTHOR XCopyright (C) 1988 by Jef Poskanzer. X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, provided Xthat the above copyright notice appear in all copies and that both that Xcopyright notice and this permission notice appear in supporting Xdocumentation. This software is provided "as is" without express or Ximplied warranty. SHAR_EOF if test 729 -ne "`wc -c < 'brushtopbm.1'`" then echo shar: error transmitting "'brushtopbm.1'" '(should have been 729 characters)' fi fi # end of overwriting check echo shar: extracting "'libpbm1.c'" '(789 characters)' if test -f 'libpbm1.c' then echo shar: will not over-write existing file "'libpbm1.c'" else sed 's/^X//' << \SHAR_EOF > 'libpbm1.c' X/* libpbm1.c - pbm utility library part 1 X** X** Copyright (C) 1988 by Jef Poskanzer. X** X** Permission to use, copy, modify, and distribute this software and its X** documentation for any purpose and without fee is hereby granted, provided X** that the above copyright notice appear in all copies and that both that X** copyright notice and this permission notice appear in supporting X** documentation. This software is provided "as is" without express or X** implied warranty. X*/ X X#include X#include "pbm.h" X#include "libpbm.h" X X Xbit ** Xpbm_allocarray( cols, rows ) Xint cols, rows; X { X bit **bits; X int i; X X bits = (bit **) malloc( rows * sizeof( bit *) ); X for ( i = 0; i < rows; i++ ) X { X bits[i] = (bit *) malloc( cols * sizeof( bit ) ); X } X X return bits; X } SHAR_EOF if test 789 -ne "`wc -c < 'libpbm1.c'`" then echo shar: error transmitting "'libpbm1.c'" '(should have been 789 characters)' fi fi # end of overwriting check echo shar: extracting "'libpbm2.c'" '(2492 characters)' if test -f 'libpbm2.c' then echo shar: will not over-write existing file "'libpbm2.c'" else sed 's/^X//' << \SHAR_EOF > 'libpbm2.c' X/* libpbm2.c - pbm utility library part 2 X** X** Copyright (C) 1988 by Jef Poskanzer. X** X** Permission to use, copy, modify, and distribute this software and its X** documentation for any purpose and without fee is hereby granted, provided X** that the above copyright notice appear in all copies and that both that X** copyright notice and this permission notice appear in supporting X** documentation. This software is provided "as is" without express or X** implied warranty. X*/ X X#include X#include "pbm.h" X#include "libpbm.h" X X Xstatic char Xpbm_getc( file ) XFILE *file; X { X int ich; X char ch; X X ich = getc( file ); X if ( ich == NULL ) X { X fprintf( stderr, "Premature EOF.\n" ); X exit( 1 ); X } X ch = (char) ich; X X if ( ch == '#' ) X { X do X { X ich = getc( file ); X if ( ich == NULL ) X { X fprintf( stderr, "Premature EOF.\n" ); X exit( 1 ); X } X ch = (char) ich; X } X while ( ch != '\n' ); X } X X return ch; X } X Xstatic int Xpbm_getint( file ) XFILE *file; X { X char ch; X int i; X X do X { X ch = pbm_getc( file ); X } X while ( ch == ' ' || ch == '\t' || ch == '\n' ); X X if ( ch < '0' || ch > '9' ) X { X fprintf( stderr, "Junk in file where an integer should be!\n" ); X exit( 1 ); X } X X i = 0; X do X { X i = i * 10 + ch - '0'; X ch = pbm_getc( file ); X } X while ( ch >= '0' && ch <= '9' ); X X return i; X } X Xstatic bit Xpbm_getbit( file ) XFILE *file; X { X char ch; X X do X { X ch = pbm_getc( file ); X } X while ( ch == ' ' || ch == '\t' || ch == '\n' ); X X if ( ch != '0' && ch != '1' ) X { X fprintf( stderr, "Junk in file where bits should be!\n" ); X exit( 1 ); X } X X return ( ch == '1' ) ? 1 : 0; X } X X Xbit ** Xpbm_readpbm( file, colsP, rowsP ) XFILE *file; Xint *colsP, *rowsP; X { X int ich1, ich2; X bit **bits; X int row, col; X X /* Check for magic number. */ X ich1 = getc( file ); X if ( ich1 == NULL ) X { X fprintf( stderr, "Premature EOF.\n" ); X exit( 1 ); X } X ich2 = getc( file ); X if ( ich2 == NULL ) X { X fprintf( stderr, "Premature EOF.\n" ); X exit( 1 ); X } X if ( ich1 != PBM_MAGIC1 || ich2 != PBM_MAGIC2 ) X { X fprintf( stderr, "Bad magic number - not a pbm file.\n" ); X exit( 1 ); X } X X /* Read size. */ X *colsP = pbm_getint( file ); X *rowsP = pbm_getint( file ); X X bits = pbm_allocarray( *colsP, *rowsP ); X X for ( row = 0; row < *rowsP; row++ ) X for ( col = 0; col < *colsP; col++ ) X bits[row][col] = pbm_getbit( file ); X X return bits; X } SHAR_EOF if test 2492 -ne "`wc -c < 'libpbm2.c'`" then echo shar: error transmitting "'libpbm2.c'" '(should have been 2492 characters)' fi fi # end of overwriting check echo shar: extracting "'libpbm3.c'" '(1018 characters)' if test -f 'libpbm3.c' then echo shar: will not over-write existing file "'libpbm3.c'" else sed 's/^X//' << \SHAR_EOF > 'libpbm3.c' X/* libpbm3.c - pbm utility library part 3 X** X** Copyright (C) 1988 by Jef Poskanzer. X** X** Permission to use, copy, modify, and distribute this software and its X** documentation for any purpose and without fee is hereby granted, provided X** that the above copyright notice appear in all copies and that both that X** copyright notice and this permission notice appear in supporting X** documentation. This software is provided "as is" without express or X** implied warranty. X*/ X X#include X#include "pbm.h" X#include "libpbm.h" X X Xpbm_writepbm( file, bits, cols, rows ) XFILE *file; Xbit **bits; Xint cols, rows; X { X int row, col, linecount; X X fprintf( file, "%c%c\n%d %d\n", PBM_MAGIC1, PBM_MAGIC2, cols, rows ); X X for ( row = 0; row < rows; row++ ) X { X linecount = 0; X for ( col = 0; col < cols; col++ ) X { X if ( linecount >= 70 ) X { X putc( '\n', file ); X linecount = 0; X } X putc( bits[row][col] ? '1' : '0', file ); X linecount++; X } X putc( '\n', file ); X } X } SHAR_EOF if test 1018 -ne "`wc -c < 'libpbm3.c'`" then echo shar: error transmitting "'libpbm3.c'" '(should have been 1018 characters)' fi fi # end of overwriting check echo shar: extracting "'libpbm4.c'" '(2929 characters)' if test -f 'libpbm4.c' then echo shar: will not over-write existing file "'libpbm4.c'" else sed 's/^X//' << \SHAR_EOF > 'libpbm4.c' X/* libpbm4.c - pbm utility library part 4 X** X** Copyright (C) 1988 by Jef Poskanzer. X** X** Permission to use, copy, modify, and distribute this software and its X** documentation for any purpose and without fee is hereby granted, provided X** that the above copyright notice appear in all copies and that both that X** copyright notice and this permission notice appear in supporting X** documentation. This software is provided "as is" without express or X** implied warranty. X*/ X X#include X#include "pbm.h" X#include "libpbm.h" X X Xstatic int version, item, bitsinitem, bitshift; Xstatic int bitspercount, count, repeatbits, repeatindex; Xstatic bit repeat, repeatbuf[MAX_REPEATBITS]; Xstatic FILE *cbm_file; X X Xstatic Xcbm_getinit( file, colsP, rowsP ) XFILE *file; Xint *colsP, *rowsP; X { X int magic2; X X if ( getc( file ) != CBM_MAGIC1 ) X { X fprintf( stderr, "Bad first magic number.\n" ); X exit( 1 ); X } X if ( ( magic2 = getc( file ) ) != OCBM_MAGIC2 && magic2 != NCBM_MAGIC2 ) X { X fprintf( stderr, "Bad second magic number.\n" ); X exit( 1 ); X } X X if ( magic2 == OCBM_MAGIC2 ) X version = VERSION_OLDCBM; X else X { X version = getc( file ); X switch ( version ) X { X case VERSION_RUNLEN: X bitspercount = getc( file ); X repeatbits = getc( file ); X count = 0; X break; X X default: X fprintf( stderr, "Unknown cbm version %d.\n", version ); X exit( 1 ); X } X } X X *colsP = getc( file ) << 8; X *colsP += getc( file ); X *rowsP = getc( file ) << 8; X *rowsP += getc( file ); X X bitsinitem = 8; X cbm_file = file; X } X Xstatic bit Xcbm_getbit( ) X { X bit b; X X if ( bitsinitem == 8 ) X { X item = getc( cbm_file ); X bitsinitem = 0; X bitshift = 7; X } X bitsinitem++; X b = ( item >> bitshift) & 1; X bitshift--; X return b; X } X Xstatic bit Xcbm_getrlbit( ) X { X int i; X X if ( count == 0 ) X { X repeat = cbm_getbit( ); X X for ( i = 0; i < bitspercount; i++ ) X count = ( count << 1 ) + cbm_getbit( ); X if ( count == 0 ) X { X fprintf( stderr, "Error - zero count in cbm file.\n" ); X exit( 1 ); X } X X if ( repeat ) X { X for ( i = 0; i < repeatbits; i++ ) X repeatbuf[i] = cbm_getbit( ); X repeatindex = repeatbits - 1; X } X } X X count--; X if ( repeat ) X { X repeatindex = ( repeatindex + 1 ) % repeatbits; X return repeatbuf[repeatindex]; X } X else X return cbm_getbit( ); X } X Xbit ** Xpbm_readcbm( file, colsP, rowsP ) XFILE *file; Xint *colsP, *rowsP; X { X bit **bits; X int row, col; X X cbm_getinit( file, colsP, rowsP ); X X bits = pbm_allocarray( *colsP, *rowsP ); X X switch ( version ) X { X case VERSION_OLDCBM: X for ( row = 0; row < *rowsP; row++ ) X for ( col = 0; col < *colsP; col++ ) X bits[row][col] = cbm_getbit( ); X break; X X case VERSION_RUNLEN: X for ( row = 0; row < *rowsP; row++ ) X for ( col = 0; col < *colsP; col++ ) X bits[row][col] = cbm_getrlbit( ); X break; X } X X return bits; X } SHAR_EOF if test 2929 -ne "`wc -c < 'libpbm4.c'`" then echo shar: error transmitting "'libpbm4.c'" '(should have been 2929 characters)' fi fi # end of overwriting check echo shar: extracting "'libpbm5.c'" '(4574 characters)' if test -f 'libpbm5.c' then echo shar: will not over-write existing file "'libpbm5.c'" else sed 's/^X//' << \SHAR_EOF > 'libpbm5.c' X/* libpbm5.c - pbm utility library part 5 X** X** Copyright (C) 1988 by Jef Poskanzer. X** X** Permission to use, copy, modify, and distribute this software and its X** documentation for any purpose and without fee is hereby granted, provided X** that the above copyright notice appear in all copies and that both that X** copyright notice and this permission notice appear in supporting X** documentation. This software is provided "as is" without express or X** implied warranty. X*/ X X#include X#include "pbm.h" X#include "libpbm.h" X X Xstatic int item, bitsinitem, bitshift; Xstatic int bitspercount, count, maxcount, repeatbits, repeatcount, repeatindex; Xstatic bit repeat, bitbuf[MAX_MAXCOUNT], repeatbuf[MAX_REPEATBITS]; Xstatic FILE *cbm_file; X X Xstatic Xcbm_putinit( cols, rows, file ) Xint cols, rows; XFILE *file; X { X putc( (char) CBM_MAGIC1, file ); X putc( (char) NCBM_MAGIC2, file ); X X putc( (char) VERSION_RUNLEN, file ); X X bitspercount = DEFAULT_BITSPERCOUNT; X maxcount = ( 1 << bitspercount ) - 1; X putc( (char) bitspercount, file ); X X repeatbits = DEFAULT_REPEATBITS; X putc( (char) repeatbits, file ); X X putc( (char) ( ( cols >> 8 ) & 0xff ), file ); X putc( (char) ( cols & 0xff ), file ); X putc( (char) ( ( rows >> 8 ) & 0xff ), file ); X putc( (char) ( rows & 0xff ), file ); X X /* Initialize statics for run-length encoding. */ X repeat = 1; X count = 0; X repeatindex = 0; X X /* Initialize statics for bit-to-byte encoding. */ X bitsinitem = 0; X item = 0; X bitshift = 7; X cbm_file = file; X } X Xstatic Xcbm_putitem( ) X { X putc( (char) item, cbm_file ); X bitsinitem = 0; X item = 0; X bitshift = 7; X } X Xstatic Xcbm_putbit( b ) Xbit b; X { X if ( bitsinitem == 8 ) X cbm_putitem( ); X bitsinitem++; X if ( b ) X item += 1 << bitshift; X bitshift--; X } X Xstatic Xcbm_putrest( ) X { X if ( bitsinitem > 0 ) X cbm_putitem( ); X } X Xstatic Xcbm_putrlbuffer( ) X { X int i; X X cbm_putbit( repeat ); X X for ( i = bitspercount - 1; i >= 0; i-- ) X if ( count & ( 1 << i ) ) X cbm_putbit( 1 ); X else X cbm_putbit( 0 ); X X if ( repeat ) X for ( i = 0; i < repeatbits; i++ ) X cbm_putbit( repeatbuf[i] ); X else X for ( i = 0; i < count; i++ ) X cbm_putbit( bitbuf[i] ); X X repeat = 1; X count = 0; X } X Xstatic Xcbm_putrlbit( b ) Xbit b; X { X int i; X X if ( count == maxcount ) X { X cbm_putrlbuffer( ); X repeatindex = 0; X } X X if ( repeat && count < repeatbits ) X { /* Still initializing a repeat buf. */ X bitbuf[count] = repeatbuf[repeatindex] = b; X count++; X repeatindex = ( repeatindex + 1 ) % repeatbits; X } X else if ( repeat ) X { /* Repeating - watch for end of run. */ X if ( b == repeatbuf[repeatindex] ) X { /* Run continues. */ X bitbuf[count] = b; X count++; X repeatindex = ( repeatindex + 1 ) % repeatbits; X } X else X { /* Run ended - is it long enough to dump? */ X if ( count > bitspercount + 1 ) X { /* Yes, dump a repeat-mode buffer and start a new one. */ X cbm_putrlbuffer( ); X repeatindex = 0; X bitbuf[count] = repeatbuf[repeatindex] = b; X count++; X repeatindex++; X } X else X { /* Not long enough - convert to non-repeat mode. */ X repeat = 0; X bitbuf[count] = b; X count++; X for ( i = 0; i < repeatbits; i++ ) X repeatbuf[i] = bitbuf[count - repeatbits + i]; X repeatcount = repeatbits; X repeatindex = 0; X } X } X } X else X { /* Not repeating - watch for a run worth repeating. */ X if ( b == repeatbuf[repeatindex] ) X { /* Possible run continues. */ X repeatcount++; X repeatindex = ( repeatindex + 1 ) % repeatbits; X if ( repeatcount > 2 + 2 * bitspercount + repeatbits ) X { /* Long enough - dump non-repeat part and start repeat. */ X count = count - ( repeatcount - 1 ); X cbm_putrlbuffer( ); X count = repeatcount; X /* ??? */ X } X else X { /* Not long enough yet - continue as non-repeat buf. */ X bitbuf[count] = b; X count++; X } X } X else X { /* Broken run. */ X bitbuf[count] = b; X count++; X for ( i = 0; i < repeatbits; i++ ) X repeatbuf[i] = bitbuf[count - repeatbits + i]; X repeatcount = repeatbits; X repeatindex = 0; X } X } X } X Xstatic Xcbm_putrlrest( ) X { X if ( count > 0 ) X cbm_putrlbuffer( ); X cbm_putrest( ); X } X X Xpbm_writecbm( file, bits, cols, rows ) XFILE *file; Xbit **bits; Xint cols, rows; X { X int row, col, linecount; X X cbm_putinit( cols, rows, file ); X X for ( row = 0; row < rows; row++ ) X for ( col = 0; col < cols; col++ ) X cbm_putrlbit( bits[row][col] ); X X cbm_putrlrest( ); X } SHAR_EOF if test 4574 -ne "`wc -c < 'libpbm5.c'`" then echo shar: error transmitting "'libpbm5.c'" '(should have been 4574 characters)' fi fi # end of overwriting check echo shar: extracting "'giftopbm.c'" '(13188 characters)' if test -f 'giftopbm.c' then echo shar: will not over-write existing file "'giftopbm.c'" else sed 's/^X//' << \SHAR_EOF > 'giftopbm.c' X/*- X * gif2ras.c - Converts from a Compuserve GIF (tm) image to a Sun Raster image. X * X * Copyright (c) 1988 by Patrick J. Naughton X * X * Author: Patrick J. Naughton X * naughton@wind.sun.com X * X * Permission to use, copy, modify, and distribute this software and its X * documentation for any purpose and without fee is hereby granted, X * provided that the above copyright notice appear in all copies and that X * both that copyright notice and this permission notice appear in X * supporting documentation. X * X * This file is provided AS IS with no warranties of any kind. The author X * shall have no liability with respect to the infringement of copyrights, X * trade secrets or any patents by this file or any part thereof. In no X * event will the author be liable for any lost revenue or profits or X * other special, indirect and consequential damages. X * X * Comments and additions should be sent to the author: X * X * Patrick J. Naughton X * Sun Microsystems, Inc. X * 2550 Garcia Ave, MS 14-40 X * Mountain View, CA 94043 X * (415) 336-1080 X * X * Revision History: X * 28-Aug-88: Modified by Jef Poskanzer to output PBM instead of Sun raster. X * 27-Jul-88: Updated to use libpixrect to fix 386i byteswapping problems. X * 11-Apr-88: Converted to C and changed to write Sun rasterfiles. X * 19-Jan-88: GIFSLOW.PAS posted to comp.graphics by Jim Briebel, X * a Turbo Pascal 4.0 program to painfully slowly display X * GIF images on an EGA equipped IBM-PC. X * X * Description: X * This program takes a Compuserve "Graphics Interchange Format" or "GIF" X * file as input and writes a file known as a Sun rasterfile. This datafile X * can be loaded by the NeWS "readcanvas" operator and is of the same format X * as the files in /usr/NeWS/smi/*. Under X11R2 there is a program called X * xraster to display these files. X * X * Portability: X * To make this program convert to some image format other than PBM X * format simply seach for the tag "PBMS:" in the source and X * replace these simple mechanisms with the appropriate ones for the X * other output format. I have marked all (six) PBM Specific pieces X * of code with this comment. X * X * SS: compile with "cc -o gif2ras -O gif2ras.c -lpixrect" X * PBMS: compile with "cc -o giftopbm -O giftopbm.c libpbm.a X */ X X#include X#ifdef notdefSS X#include /* SS: main Pixrect header file */ X#endif notdefSS X#include X#include "pbm.h" /* PBMS: main PBM header file */ X Xtypedef int boolean; X#define True (1) X#define False (0) X X#define NEXTSHORT (*ptr++ + (0x100 * *ptr++)) X#define NEXTBYTE (*ptr++) X#define IMAGESEP 0x2c X#define INTERLACEMASK 0x40 X#define COLORMAPMASK 0x80 X Xint BitOffset = 0, /* Bit Offset of next code */ X XC = 0, YC = 0, /* Output X and Y coords of current pixel */ X Pass = 0, /* Used by output routine if interlaced pic */ X OutCount = 0, /* Decompressor output 'stack count' */ X RWidth, RHeight, /* screen dimensions */ X Width, Height, /* image dimensions */ X LeftOfs, TopOfs, /* image offset */ X BitsPerPixel, /* Bits per pixel, read from GIF header */ X ColorMapSize, /* number of colors */ X CodeSize, /* Code size, read from GIF header */ X InitCodeSize, /* Starting code size, used during Clear */ X Code, /* Value returned by ReadCode */ X MaxCode, /* limiting value for current code size */ X ClearCode, /* GIF clear code */ X EOFCode, /* GIF end-of-information code */ X CurCode, OldCode, InCode, /* Decompressor variables */ X FirstFree, /* First free code, generated per GIF spec */ X FreeCode, /* Decompressor, next free slot in hash table */ X FinChar, /* Decompressor variable */ X BitMask, /* AND mask for data size */ X ReadMask; /* Code AND mask for current code size */ X Xboolean Interlace, HasColormap; X X#ifdef notdefSS X/* SS: defined in pixrect/pixrect_hs.h */ XPixrect *Output; /* The Sun Pixrect */ Xcolormap_t Colormap; /* The Pixrect Colormap */ Xu_char *Image; /* The result array */ X#endif notdefSS X/* PBMS: defined in pbm.h */ Xbit **bits; /* The PBM bit array */ X Xu_char *RawGIF; /* The heap array to hold it, raw */ Xu_char *Raster; /* The raster data stream, unblocked */ X X /* The hash table used by the decompressor */ Xint Prefix[4096]; Xint Suffix[4096]; X X /* An output array used by the decompressor */ Xint OutCode[1025]; X X /* The color map, read from the GIF header */ Xu_char Red[256], Green[256], Blue[256]; X Xchar *id = "GIF87a"; X Xchar *pname; /* program name (used for error messages) */ X Xvoid Xerror(s1, s2) Xchar *s1, *s2; X{ X fprintf(stderr, s1, pname, s2); X exit(1); X} X X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ XFILE *fp; Xchar *infname = argv[1]; Xchar *outfname = argv[2]; Xint filesize; Xregister u_char ch, ch1; Xregister u_char *ptr, *ptr1; Xregister int i; X X setbuf(stderr, NULL); X pname = argv[0]; X X if (argc < 3) X error("usage: %s GIFfile rasterfile\n", NULL); X X if (!(fp = fopen(infname, "r"))) X error("%s: %s not found.\n", infname); X X /* find the size of the file */ X X fseek(fp, 0L, 2); X filesize = ftell(fp); X fseek(fp, 0L, 0); X X if (!(ptr = RawGIF = (u_char *) malloc(filesize))) X error("%s: not enough memory to read gif file.\n", NULL); X X if (!(Raster = (u_char *) malloc(filesize))) X error("%s: not enough memory to read gif file.\n", NULL); X X fread(ptr, filesize, 1, fp); X X if (strncmp(ptr, id, 6)) X error("%s: %s is not a GIF file.\n", infname); X ptr += 6; X X/* Get variables from the GIF screen descriptor */ X X RWidth = NEXTSHORT; /* screen dimensions... not used. */ X RHeight = NEXTSHORT; X X ch = NEXTBYTE; X HasColormap = ((ch & COLORMAPMASK) ? True : False); X X BitsPerPixel = (ch & 7) + 1; X ColorMapSize = 1 << BitsPerPixel; X BitMask = ColorMapSize - 1; X X ch = NEXTBYTE; /* background color... not used. */ X X if (NEXTBYTE) /* supposed to be NULL */ X error("%s: %s is a corrupt GIF file.\n", infname); X X/* Read in global colormap. */ X X if (HasColormap) { X fprintf(stderr, "%s is %d bits per pixel, (%d colors).\n", X infname, BitsPerPixel, ColorMapSize); X for (i = 0; i < ColorMapSize; i++) { X Red[i] = NEXTBYTE; X Green[i] = NEXTBYTE; X Blue[i] = NEXTBYTE; X } X X#ifdef notdefSS X/* SS: Fill in the Pixrect colormap struct */ X Colormap.type = RMT_EQUAL_RGB; X Colormap.length = ColorMapSize; X Colormap.map[0] = Red; X Colormap.map[1] = Green; X Colormap.map[2] = Blue; X#endif notdefSS X /* PBMS: PBM only handles bitmaps. Reject any pixmaps here. */ X if (BitsPerPixel != 1) X error("%s: %s has more than one bit per pixel - it's not a bitmap.\n", infname); X } X else error("%s: %s does not have a colormap.\n", infname); X X X/* Check for image seperator */ X X if (NEXTBYTE != IMAGESEP) X error("%s: %s is a corrupt GIF file.\n", infname); X X/* Now read in values from the image descriptor */ X X LeftOfs = NEXTSHORT; X TopOfs = NEXTSHORT; X Width = NEXTSHORT; X Height = NEXTSHORT; X Interlace = ((NEXTBYTE & INTERLACEMASK) ? True : False); X X fprintf(stderr, "Reading a %d by %d %sinterlaced image...", X Width, Height, (Interlace) ? "" : "non-"); X X X/* Note that I ignore the possible existence of a local color map. X * I'm told there aren't many files around that use them, and the spec X * says it's defined for future use. This could lead to an error X * reading some files. X */ X X/* Start reading the raster data. First we get the intial code size X * and compute decompressor constant values, based on this code size. X */ X X CodeSize = NEXTBYTE; X ClearCode = (1 << CodeSize); X EOFCode = ClearCode + 1; X FreeCode = FirstFree = ClearCode + 2; X X/* The GIF spec has it that the code size is the code size used to X * compute the above values is the code size given in the file, but the X * code size used in compression/decompression is the code size given in X * the file plus one. (thus the ++). X */ X X CodeSize++; X InitCodeSize = CodeSize; X MaxCode = (1 << CodeSize); X ReadMask = MaxCode - 1; X X/* Read the raster data. Here we just transpose it from the GIF array X * to the Raster array, turning it from a series of blocks into one long X * data stream, which makes life much easier for ReadCode(). X */ X X ptr1 = Raster; X do { X ch = ch1 = NEXTBYTE; X while (ch--) *ptr1++ = NEXTBYTE; X } while(ch1); X X free(RawGIF); /* We're done with the raw data now... */ X X fprintf(stderr, "done.\n"); X fprintf(stderr, "Decompressing..."); X X X#ifdef notdefSS X/* SS: Allocate the Sun Pixrect and make "Image" point to the image data. */ X Output = mem_create(Width, Height, 8); X if (Output == (Pixrect *) NULL) X error("%s: not enough memory for output data.\n", NULL); X Image = (u_char *) mpr_d(Output)->md_image; X#endif notdefSS X/* PBMS: Allocate the PBM bit array. */ X bits = pbm_allocarray(Width, Height); X X X/* Decompress the file, continuing until you see the GIF EOF code. X * One obvious enhancement is to add checking for corrupt files here. X */ X X Code = ReadCode(); X while (Code != EOFCode) { X X/* Clear code sets everything back to its initial value, then reads the X * immediately subsequent code as uncompressed data. X */ X X if (Code == ClearCode) { X CodeSize = InitCodeSize; X MaxCode = (1 << CodeSize); X ReadMask = MaxCode - 1; X FreeCode = FirstFree; X CurCode = OldCode = Code = ReadCode(); X FinChar = CurCode & BitMask; X AddToPixel(FinChar); X } X else { X X/* If not a clear code, then must be data: save same as CurCode and InCode */ X X CurCode = InCode = Code; X X/* If greater or equal to FreeCode, not in the hash table yet; X * repeat the last character decoded X */ X X if (CurCode >= FreeCode) { X CurCode = OldCode; X OutCode[OutCount++] = FinChar; X } X X/* Unless this code is raw data, pursue the chain pointed to by CurCode X * through the hash table to its end; each code in the chain puts its X * associated output code on the output queue. X */ X X while (CurCode > BitMask) { X OutCode[OutCount++] = Suffix[CurCode]; X CurCode = Prefix[CurCode]; X } X X/* The last code in the chain is treated as raw data. */ X X FinChar = CurCode & BitMask; X OutCode[OutCount++] = FinChar; X X/* Now we put the data out to the Output routine. X * It's been stacked LIFO, so deal with it that way... X */ X X for (i = OutCount - 1; i >= 0; i--) X AddToPixel(OutCode[i]); X OutCount = 0; X X/* Build the hash table on-the-fly. No table is stored in the file. */ X X Prefix[FreeCode] = OldCode; X Suffix[FreeCode] = FinChar; X OldCode = InCode; X X/* Point to the next slot in the table. If we exceed the current X * MaxCode value, increment the code size unless it's already 12. If it X * is, do nothing: the next code decompressed better be CLEAR X */ X X FreeCode++; X if (FreeCode >= MaxCode) { X if (CodeSize < 12) { X CodeSize++; X MaxCode *= 2; X ReadMask = (1 << CodeSize) - 1; X } X } X } X Code = ReadCode(); X } X X free(Raster); X X fprintf(stderr, "done.\n"); X X if (!(fp = fopen(outfname, "w"))) X error("%s: can't create %s.\n", outfname); X X#ifdef notdefSS X/* SS: Pixrect Rasterfile output code. */ X fprintf(stderr, "Writing Sun Rasterfile: %s...", outfname); X if (pr_dump(Output, fp, &Colormap, RT_STANDARD, 0) == PIX_ERR) X error("%s: error writing Sun Rasterfile: %s\n", outfname); X#endif notdefSS X/* PBMS: PBM output code. */ X pbm_writepbm(stdout, bits, Width, Height); X X fclose(fp); X X fprintf(stderr, "done.\n"); X} X X X/* Fetch the next code from the raster data stream. The codes can be X * any length from 3 to 12 bits, packed into 8-bit bytes, so we have to X * maintain our location in the Raster array as a BIT Offset. We compute X * the byte Offset into the raster array by dividing this by 8, pick up X * three bytes, compute the bit Offset into our 24-bit chunk, shift to X * bring the desired code to the bottom, then mask it off and return it. X */ XReadCode() X{ Xint RawCode, ByteOffset; X X ByteOffset = BitOffset / 8; X RawCode = Raster[ByteOffset] + (0x100 * Raster[ByteOffset + 1]); X if (CodeSize >= 8) X RawCode += (0x10000 * Raster[ByteOffset + 2]); X RawCode >>= (BitOffset % 8); X BitOffset += CodeSize; X return(RawCode & ReadMask); X} X X XAddToPixel(Index) Xu_char Index; X{ X#ifdef notdefSS X *(Image + YC * Width + XC) = Index; X#endif notdefSS X/* PBMS: Store a pixel. */ X bits[YC][XC] = Index; X X/* Update the X-coordinate, and if it overflows, update the Y-coordinate */ X X if (++XC == Width) { X X/* If a non-interlaced picture, just increment YC to the next scan line. X * If it's interlaced, deal with the interlace as described in the GIF X * spec. Put the decoded scan line out to the screen if we haven't gone X * past the bottom of it X */ X X XC = 0; X if (!Interlace) YC++; X else { X switch (Pass) { X case 0: X YC += 8; X if (YC >= Height) { X Pass++; X YC = 4; X } X break; X case 1: X YC += 8; X if (YC >= Height) { X Pass++; X YC = 2; X } X break; X case 2: X YC += 4; X if (YC >= Height) { X Pass++; X YC = 1; X } X break; X case 3: X YC += 2; X break; X default: X break; X } X } X } X} SHAR_EOF if test 13188 -ne "`wc -c < 'giftopbm.c'`" then echo shar: error transmitting "'giftopbm.c'" '(should have been 13188 characters)' fi fi # end of overwriting check echo shar: extracting "'giftopbm.1'" '(952 characters)' if test -f 'giftopbm.1' then echo shar: will not over-write existing file "'giftopbm.1'" else sed 's/^X//' << \SHAR_EOF > 'giftopbm.1' X.TH giftopbm 1 "29 August 1988" X.SH NAME Xgiftopbm - convert GIF files into portable bitmaps X.SH SYNOPSIS Xgiftopbm [giffile] X.SH DESCRIPTION XReads a GIF file as input. XProduces a portable bitmap as output. X.LP XNote that there is currently no pbmtogif tool. X.LP XAlso note that, since PBM only supports monochrome, this tool is Xuseless for 99% of the GIF files out there. X.SH BUGS XThis tool has not been tested in its PBM form AT ALL. XHowever, in the original gif2ras form, it worked fine. X.SH "SEE ALSO" Xpbm(5) X.SH AUTHOR XTrivial modifications to produce PBM by Jef Poskanzer. Otherwise: X XCopyright (c) 1988 by Patrick J. Naughton X(naughton@wind.sun.com) X XPermission to use, copy, modify, and distribute this software and its Xdocumentation for any purpose and without fee is hereby granted, Xprovided that the above copyright notice appear in all copies and that Xboth that copyright notice and this permission notice appear in Xsupporting documentation. SHAR_EOF if test 952 -ne "`wc -c < 'giftopbm.1'`" then echo shar: error transmitting "'giftopbm.1'" '(should have been 952 characters)' fi fi # end of overwriting check # End of shell archive exit 0