[comp.sources.unix] v19i048: FBM, image manipulation library, Part02/08

rsalz@uunet.uu.net (Rich Salz) (06/09/89)

Submitted-by: Michael.Mauldin@NL.CS.CMU.EDU
Posting-number: Volume 19, Issue 48
Archive-name: fbm/part02

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 8)."
# Contents:  clr2gray.c fbcat.1 fbcat.c fbclean.c fbedge.c fbext.1
#   fbhist.c fbinfo.c fbmask.c fbquant.1 fbrot.c fbsample.1 fbsharp.c
#   flcavg.c flthre.c flwrfb.c gray2clr.c qrt2fbm.c
# Wrapped by rsalz@fig.bbn.com on Fri Jun  9 08:38:21 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'clr2gray.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'clr2gray.c'\"
else
echo shar: Extracting \"'clr2gray.c'\" \(2601 characters\)
sed "s/^X//" >'clr2gray.c' <<'END_OF_FILE'
X/*****************************************************************
X * clr2gray.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * USAGE
X *	% clr2gray [ -r<red> -g<grn> -b<blu> ] [ -<type> ] < color > gray
X *
X * EDITLOG
X *	LastEditDate = Tue Mar  7 19:56:03 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/clr2gray.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 06-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Added options for RGB weights
X *
X *  1-Dec-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X# define USAGE \
X"Usage: clr2gray [ -r<red> -g<grn> -b<blu> ] [ -<type> ] < color > gray"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM clr2gray.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ FBM input, output;
X  int outtype = DEF_8BIT;
X  int rw=0, gw=0, bw=0;
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      { 
X	case 'r':	rw = atoi (*argv+1); SKIPARG; break;
X	case 'g':	gw = atoi (*argv+1); SKIPARG; break;
X	case 'b':	bw = atoi (*argv+1); SKIPARG; break;
X	case 'A':	outtype = FMT_ATK; break;
X	case 'B':	outtype = FMT_FACE; break;
X	case 'F':	outtype = FMT_FBM; break;
X	case 'G':	outtype = FMT_GIF; break;
X	case 'I':	outtype = FMT_IFF; break;
X	case 'L':	outtype = FMT_LEAF; break;
X	case 'M':	outtype = FMT_MCP; break;
X	case 'P':	outtype = FMT_PBM; break;
X	case 'S':	outtype = FMT_SUN; break;
X	case 'T':	outtype = FMT_TIFF; break;
X	case 'X':	outtype = FMT_X11; break;
X	case 'Z':	outtype = FMT_PCX; break;
X	default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X
X  /* Use NTSC weights for defaults */
X  if (rw + gw + bw <= 0)
X  { rw = 299; gw = 587; bw = 114; }
X
X  /* Clear the memory pointers so alloc_fbm won't be confused */
X  input.cm  = input.bm  = (unsigned char *) NULL;
X  output.cm = output.bm = (unsigned char *) NULL;
X
X  /* Read the image and convert it, use NTSC weights */
X  if (read_bitmap (&input, (char *) NULL) &&
X      clr2gray (&input, &output, rw, gw, bw) &&
X      write_bitmap (&output, stdout, outtype))
X  { exit (0); }
X
X  exit (1);
X}
END_OF_FILE
if test 2601 -ne `wc -c <'clr2gray.c'`; then
    echo shar: \"'clr2gray.c'\" unpacked with wrong size!
fi
# end of 'clr2gray.c'
fi
if test -f 'fbcat.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbcat.1'\"
else
echo shar: Extracting \"'fbcat.1'\" \(2241 characters\)
sed "s/^X//" >'fbcat.1' <<'END_OF_FILE'
X.TH FBCAT 1 07-Mar-89
X.CM 3
X.SH NAME
Xfbcat \- convert image format
X.SH SYNOPSIS
X.nf
Xfbcat [ -a<aspect> -t'title' -c'credits' ] [ -<type> ] [ image ] > image
X.fi
X.SH DESCRIPTION
X.PP
XA general format converter.  It can read any of the known formats
Xand write one of the specified output formats (see fbm(1) for format
Xdetails).  Note that some conversions require more than simple format
Xchanges, such as color to grayscale or grayscale to 1bit.  For these
Xconversion you must use a pipeline of ther commands.
X.SH OPTIONS
X.TP
X.BR -a<aspect>
X.I aspect ratio,
Xa floating point number which is the ratio of the height of a pixel to
Xits width.  Some formats specify this, and for GIF images the reader
Xattempts to guess from the size of the image.  This option overrides
Xthe input or guessed aspect ratio.  So if you know that your GIF image
Xhas a 1-1 aspect ratio, you should specify -a1 to override the guess.
X.TP
X.BR -t'title'
X.I title,
Xspecify a character string (up to 80 characters) to describe the image.
XThe default is no title.
X.TP
X.BR -c'credits'
X.I credits or subtitle,
Xspecify a second character string (up to 80 characters) to describe the
Ximage.  The default is no credit string.
X.TP
X.BR -B
X.I face
Xformat, as used by Bennet Yee's
X.I face
Xprogram at CMU. 
X.TP
X.BR -F
X.I FBM,
Xformat (by default, the default).  You are guaranteed not
Xto lose information by specifying FBM as the default.
X.TP
X.BR -G
X.I GIF,
XCompuserve GIF format.
X.TP
X.BR -I
X.I IFF
Xformat, interleaved bitmaps (ILBM), used by Amigas.
X.TP
X.BR -P
X.I PBM,
XJef Poskanzer's bitmap format.
X.TP
X.BR -S
X.I sun,
XSun rasterfiles (not run length encoded).
X.SH EXAMPLE
X.PP
XTo convert a GIF file to an IFF file
X.sp
X    % fbcat -I < foo.gif > foo.iff
X.sp
XTo convert a Sun raster file to an FBM file, adding a title:
X.sp
X    % fbcat -t'Title String' < bar.8bit > bar.fbm
X.SH SEE ALSO
Xfbm(1) for general discussion, pbm(1) for PBM routines.
X.SH BUGS
XNone known.
X.SH HISTORY
XCopyright (c) 1989 by Michael L. Mauldin.  
XPermission is granted to use this program in whole or in part provided
Xthat you do not sell it for profit and that this copyright notice is
Xretained unchanged.
X.TP
X07-Mar-89  Michael L. Mauldin at Carnegie Mellon University
XBeta release (version 0.9) mlm@cs.cmu.edu
END_OF_FILE
if test 2241 -ne `wc -c <'fbcat.1'`; then
    echo shar: \"'fbcat.1'\" unpacked with wrong size!
fi
# end of 'fbcat.1'
fi
if test -f 'fbcat.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbcat.c'\"
else
echo shar: Extracting \"'fbcat.c'\" \(3257 characters\)
sed "s/^X//" >'fbcat.c' <<'END_OF_FILE'
X/*****************************************************************
X * fbcat.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * fbcat.c: 
X *	Convert an image from one format to another.  Input image type
X *	is determined by magic number.  Output is specified by argument.
X *	Note that the ascpect ratio, size and number of colors is not
X *	changed, and that some conversions (such as grayscale to bitmap
X *	or color to gray require more processing than fbcat can do.
X *	For these transformations you must use other programs like
X *	clr2gray, gray2clr, fbhalf, and fbsample.
X *
X * USAGE
X *	% fbcat [ -t'title' -c'credits' ] [ -<type> ] [ image ] > image
X *
X * EDITLOG
X *	LastEditDate = Wed May  3 22:03:33 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/fbcat.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 29-Nov-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X
X# include <stdio.h>
X# include "fbm.h"
X
X# define USAGE \
X"Usage: fbcat [ -a<aspect> -t'title' -c'credits' ]\n\
X	     [ -<type> ] [ image ] > image"
X
X/****************************************************************
X * main
X ****************************************************************/
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM fbcat.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ FBM image;
X  int outtype = FMT_FBM;
X  double aspect = 0.0;
X  char *title = NULL, *credits = NULL;
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      {
X	case 'a':	aspect = atof (*argv+1); SKIPARG; break;
X	case 't':	title = *argv+1; SKIPARG; break;
X	case 'c':	credits = *argv+1; SKIPARG; break;
X	case 'A':	outtype = FMT_ATK; break;
X	case 'B':	outtype = FMT_FACE; break;
X	case 'F':	outtype = FMT_FBM; break;
X	case 'G':	outtype = FMT_GIF; break;
X	case 'I':	outtype = FMT_IFF; break;
X	case 'M':	outtype = FMT_MCP; break;
X	case 'P':	outtype = FMT_PBM; break;
X	case 'S':	outtype = FMT_SUN; break;
X	case 'T':	outtype = FMT_TIFF; break;
X	case 'X':	outtype = FMT_X11; break;
X	case 'Z':	outtype = FMT_PCX; break;
X	default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X
X  /* Clear the memory pointers so alloc_fbm won't be confused */
X  image.cm  = image.bm  = (unsigned char *) NULL;
X
X  /* Now read in the Sun format image and write an FBM format file */
X  if (read_bitmap (&image, (argc > 0) ? *argv : (char *) NULL))
X  {
X    if (aspect != 0.0)
X    { fprintf (stderr,
X	       "Overiding aspect ratio read (%1.3lf) with (%1.3lf)\n",
X	       image.hdr.aspect, aspect);
X      image.hdr.aspect = aspect;
X    }
X
X    if (title)
X    { strncpy (image.hdr.title, title, FBM_MAX_TITLE); }
X
X    if (credits)
X    { strncpy (image.hdr.credits, credits, FBM_MAX_TITLE); }
X
X    if (write_bitmap (&image, stdout, outtype))
X    { exit (0);
X    }
X  }
X
X  exit (1);
X}
END_OF_FILE
if test 3257 -ne `wc -c <'fbcat.c'`; then
    echo shar: \"'fbcat.c'\" unpacked with wrong size!
fi
# end of 'fbcat.c'
fi
if test -f 'fbclean.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbclean.c'\"
else
echo shar: Extracting \"'fbclean.c'\" \(3425 characters\)
sed "s/^X//" >'fbclean.c' <<'END_OF_FILE'
X/*****************************************************************
X * fbclean.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin & Gary Sherwin.
X * Permission is granted to use this file in whole or in part provided
X * that you do not sell it for profit and that this copyright notice
X * is retained unchanged.
X *
X * fbclean.c: Normalize contrast and brightness of image
X *
X * USAGE
X *      % fbclean [ flag ] < image > image2
X *
X * EDITLOG
X *	New Filename = fbclean.c  Mon Nov 7 09:24:00 1988 - Gary Sherwin
X *	LastEditDate = Mon Oct 31 08:34:55 1988 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/images/bsharp.c
X *      LastEditDate = Tue Mar  7 17:46:17 1989 - Michael Mauldin
X *      LastFileName = /usr2/mlm/src/misc/fbm/fbclean.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 07-Nov-88  Gary W. Sherwin (sherwin) at Westinghouse R&D
X *	Changed to fbclean.
X *
X * 10-Sep-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X# define USAGE \
X  "Usage: fbclean [ -b<cleaner> -t<threshhold> -n<nbr> ]\n\
X	       [ -<type> ] < bitmap > bitmap"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM fbclean.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ int w, h, k;
X  int cleaner = 5;
X  int blacktrp = 0;
X  int nbr = 5;
X  int outtype = DEF_1BIT;
X  FBM input, output;
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      { case 'b':       cleaner = atoi (*argv+1); SKIPARG; break;
X        case 't':	blacktrp = atoi (*argv+1); SKIPARG; break;
X        case 'n':	nbr = atoi (*argv+1); SKIPARG; break;
X	case 'A':	outtype = FMT_ATK; break;
X	case 'B':	outtype = FMT_FACE; break;
X	case 'F':	outtype = FMT_FBM; break;
X	case 'G':	outtype = FMT_GIF; break;
X	case 'I':	outtype = FMT_IFF; break;
X	case 'L':	outtype = FMT_LEAF; break;
X	case 'M':	outtype = FMT_MCP; break;
X	case 'P':	outtype = FMT_PBM; break;
X	case 'S':	outtype = FMT_SUN; break;
X	case 'T':	outtype = FMT_TIFF; break;
X	case 'X':	outtype = FMT_X11; break;
X	case 'Z':	outtype = FMT_PCX; break;
X        default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X  
X  /* Clear the memory pointers so alloc_fbm won't be confused */
X  input.cm  = input.bm  = (unsigned char *) NULL;
X  output.cm = output.bm = (unsigned char *) NULL;
X
X  /* Read the image and clean it */
X  if (read_bitmap (&input, (char *) NULL))
X  {
X    if (input.hdr.bits != 8 || input.hdr.physbits != 8)
X    { fprintf (stderr,
X	       "Can't handle images with %d bits and %d physbits per pixel\n",
X	       input.hdr.bits, input.hdr.physbits);
X      exit (1);
X    }
X
X    /* Determine output height & width (oh*ow <= size) */
X    h = input.hdr.rows;
X    w = input.hdr.cols;
X    k = input.hdr.planes;
X
X    fprintf (stderr,
X	     "Cleaning \"%s\", # of Neighbors %2d, nbr %d [%dx%dx%d]\n",
X	     input.hdr.title[0] ? input.hdr.title : "(untitled)",
X	     cleaner, nbr, w, h, k);
X
X    /* Clean the image using a digitial Laplacian */
X    if (clean_fbm (&input, &output, cleaner, blacktrp, nbr) &&
X        write_bitmap (&output, stdout, outtype))
X    { exit (0); }
X  }
X  
X  exit (1);
X}
END_OF_FILE
if test 3425 -ne `wc -c <'fbclean.c'`; then
    echo shar: \"'fbclean.c'\" unpacked with wrong size!
fi
# end of 'fbclean.c'
fi
if test -f 'fbedge.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbedge.c'\"
else
echo shar: Extracting \"'fbedge.c'\" \(3190 characters\)
sed "s/^X//" >'fbedge.c' <<'END_OF_FILE'
X/*****************************************************************
X * fbedge.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin & Gary Sherwin.
X * Permission is granted to use this file in whole or in part provided
X * that you do not sell it for profit and that this copyright notice
X * is retained unchanged.
X *
X * fbedge.c: Take derivative and edge detect image
X *
X * USAGE
X *      % fbedge [ flag ] < image > image2
X *
X * EDITLOG
X *	New Filename = fbedge.c  Mon Nov 7 09:24:00 1988 - Gary Sherwin
X *	LastEditDate = Mon Oct 31 08:34:55 1988 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/images/bsharp.c
X *      LastEditDate = Tue Mar  7 17:50:04 1989 - Michael Mauldin
X *      LastFileName = /usr2/mlm/src/misc/fbm/fbedge.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 07-Nov-88  Gary W. Sherwin (sherwin) at Westinghouse R&D
X *	Changed to fbedge.
X *
X * 10-Sep-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X# define USAGE "Usage: fbedge [ -t<threshhold> ] < bitmap > bitmap"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM fbedge.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ int w, h, k;
X  int blacktrp = 0;
X  int outtype = DEF_1BIT;
X  FBM input, output;
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      { case 't':	blacktrp = atoi (*argv+1); SKIPARG; break;
X	case 'A':	outtype = FMT_ATK; break;
X	case 'B':	outtype = FMT_FACE; break;
X	case 'F':	outtype = FMT_FBM; break;
X	case 'G':	outtype = FMT_GIF; break;
X	case 'I':	outtype = FMT_IFF; break;
X	case 'L':	outtype = FMT_LEAF; break;
X	case 'M':	outtype = FMT_MCP; break;
X	case 'P':	outtype = FMT_PBM; break;
X	case 'S':	outtype = FMT_SUN; break;
X	case 'T':	outtype = FMT_TIFF; break;
X	case 'X':	outtype = FMT_X11; break;
X	case 'Z':	outtype = FMT_PCX; break;
X        default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X  
X  /* Clear the memory pointers so alloc_fbm won't be confused */
X  input.cm  = input.bm  = (unsigned char *) NULL;
X  output.cm = output.bm = (unsigned char *) NULL;
X
X  /* Read the image and clean it */
X  if (read_bitmap (&input, (char *) NULL))
X  {
X    if (input.hdr.bits != 8 || input.hdr.physbits != 8)
X    { fprintf (stderr,
X	       "Can't handle images with %d bits and %d physbits per pixel\n",
X	       input.hdr.bits, input.hdr.physbits);
X      exit (1);
X    }
X
X    /* Determine output height & width (oh*ow <= size) */
X    h = input.hdr.rows;
X    w = input.hdr.cols;
X    k = input.hdr.planes;
X
X    fprintf (stderr,
X	     "Edge detect\"%s\", Black-trip %2d [%dx%dx%d]\n",
X	     input.hdr.title[0] ? input.hdr.title : "(untitled)",
X	     blacktrp, w, h, k);
X
X    /* Edge detect the image using a digitial Laplacian */
X    if (findedge_fbm (&input, &output, blacktrp) &&
X        write_bitmap (&output, stdout, outtype))
X    { exit (0); }
X  }
X  
X  exit (1);
X}
END_OF_FILE
if test 3190 -ne `wc -c <'fbedge.c'`; then
    echo shar: \"'fbedge.c'\" unpacked with wrong size!
fi
# end of 'fbedge.c'
fi
if test -f 'fbext.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbext.1'\"
else
echo shar: Extracting \"'fbext.1'\" \(2772 characters\)
sed "s/^X//" >'fbext.1' <<'END_OF_FILE'
X.TH FBEXT 1 07-Mar-89
X.CM 3
X.SH NAME
Xfbext \- extract a rectangle from an image, resize, change aspect ratio
X.SH SYNOPSIS
X.nf
Xfbext [ -w<width> -h<height> -W<maxwdith> -H<maxheight>
X        -s<size> -a<aspect> -t'title' -c'credits' ] [ -<type> ]
X        [ x y [ width height ] ]     < bitmap > bitmap
X.fi
X.SH DESCRIPTION
X.PP
XExtract a rectangle from a bitmap and resize it.  There are lots of
Xarguments, but you'll typically only give it a few.  For example, you
Xshould only specify two of width, height and aspect ratio, and it will
Xcalculate the third.  The rectangle spec is given as 2 or 4 positional
Xarguments after the flags, and if omitted the entire input image is
Xcopied.
X.sp
XThe maximum width and height override all other size specifications, so
Xthey can be used ot keep the results displayable on your screen.
X.sp
XWhen working with Amiga images, remember that the original input has an
Xaspect ratio of 1.2, so a common operation is "fbext -a1" which expands
Xthe smaller dimension to give an output with an aspect ratio of 1.
X.SH OPTIONS
X.TP
X.B -SPFB
X.I output file format,
XS=sun, P=pbm, F=fbm, B=face format.  Only one may be specified.
X.TP
X.B -a
X.I aspect ratio,
Xspecify desired output aspect ratio.
X.TP
X.B -w
X.I width,
Xspecify desired output width in pixels.
X.TP
X.B -h
X.I height,
Xspecify desired output height in pixels.
X.TP
X.B -s
X.I size,
Xspecify desired number of pixels in output (eg: 320x200 is 64000 pixels.
X.TP
X.B -W
X.I maximum width,
Xof output.  The image will be expanded up to this size, keeping the
Xspecified aspect ratio.
X.TP
X.B -H
X.I maximum height.,
X.TP
X.BR -t'title'
X.I title,
Xspecify a character string (up to 80 characters) to describe the image.
XThe default is no title.
X.TP
X.BR -c'credits'
X.I credits or subtitle,
Xspecify a second character string (up to 80 characters) to describe the
Ximage.  The default is no credit string.
X.PP
X.SH EXAMPLE
X.PP
XSuppose you have a GIF file with 320 by 200 pixels and an aspect ratio
Xof 1.2 (that is, it looks right at 320 by 240 pixels).  You want to
Xblow it up to fit your Sun screen (1152 by 900). You want the output
Xratio adjusted to be 1.0 so it will look right on the Sun.
X.sp
Xfbext -S -W1152 -H900 -a1.0 < foo.gif > foo.raster
X.sp
XYou have an FBM format file 512 by 384 and you want to extract a
Xrectangle 300 by 200 from the middle:
X.sp
Xfbext -F 106 92 300 200 < foo.fbm > bar.fbm
X.sp
X.SH SEE ALSO
Xfbm(1) for general discussion, pbm(1) for PBM routines.
X.SH BUGS
XNone known.
X.SH HISTORY
XCopyright (c) 1989 by Michael L. Mauldin.  
XPermission is granted to use this program in whole or in part provided
Xthat you do not sell it for profit and that this copyright notice is
Xretained unchanged.
X.TP
X07-Mar-89  Michael L. Mauldin at Carnegie Mellon University
XBeta release (version 0.9) mlm@cs.cmu.edu
END_OF_FILE
if test 2772 -ne `wc -c <'fbext.1'`; then
    echo shar: \"'fbext.1'\" unpacked with wrong size!
fi
# end of 'fbext.1'
fi
if test -f 'fbhist.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbhist.c'\"
else
echo shar: Extracting \"'fbhist.c'\" \(2725 characters\)
sed "s/^X//" >'fbhist.c' <<'END_OF_FILE'
X/*****************************************************************
X * fbhist.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * fbhist.c: 
X *
X * USAGE
X *	% fbhist [-h] < image
X *
X * EDITLOG
X *	LastEditDate = Tue Mar  7 17:52:50 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/fbhist.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 21-Aug-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X#define USAGE "Usage: fbhist [ -h ] < 8bit"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM fbhist.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ FBM image;
X  register int ch, size, cnt;
X  register unsigned char *bmptr, *tail;
X  int min = BYTE, max = -1;
X  int hist[BYTE], dohist = 0;
X  double sum = 0.0, sumsq = 0.0, avg, std;
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      { case 'h':	dohist++; break;
X	default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X
X  /* Clear the memory pointer so alloc_fbm won't be confused */
X  image.cm  = image.bm  = (unsigned char *) NULL;
X
X  /* Clear the histogram */
X  for (ch=0; ch<BYTE; ch++)
X  { hist[ch] = 0; }
X
X  /* Read the file and count the gray levels */
X  if (read_bitmap (&image, (char *) NULL))
X  { size = image.hdr.rows * image.hdr.cols;
X    bmptr = image.bm;
X    tail = bmptr+size;
X
X    while (bmptr < tail)
X    { hist[*bmptr++]++; }
X    
X    for (ch=0; ch<BYTE; ch++)
X    { cnt = hist[ch];
X
X      if (cnt && ch < min) min = ch;
X      if (cnt && ch > max) max = ch;
X      
X      sum += cnt * ch;
X      sumsq += cnt * ch*ch;
X    }
X    
X    avg = sum / size;
X
X    if (size < 2)
X    { std = 0.0; }
X    else
X    { double t1 = (size * sumsq - sum * sum);
X      double t2 = ((double) size * (size-1));
X      std = sqrt (t1 / t2);
X    }
X
X    printf ("%s [%dx%d  %d bits  %1.3lf aspect ratio]\n",
X	    *image.hdr.title ? image.hdr.title : "Untitled",
X	    image.hdr.cols, image.hdr.rows, image.hdr.bits, image.hdr.aspect);
X
X    printf ("Mean %1.2lf +- %1.2lf, range %d..%d\n",
X	    avg, std, min, max);
X
X    if (dohist)
X    { for (ch=0; ch<BYTE; ch++)
X      { if (hist[ch]) printf ("%3d: %6d\n", ch, hist[ch]); }
X    }
X    
X  }
X  else
X  { exit (1); }
X  
X  exit (0);
X}
END_OF_FILE
if test 2725 -ne `wc -c <'fbhist.c'`; then
    echo shar: \"'fbhist.c'\" unpacked with wrong size!
fi
# end of 'fbhist.c'
fi
if test -f 'fbinfo.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbinfo.c'\"
else
echo shar: Extracting \"'fbinfo.c'\" \(2683 characters\)
sed "s/^X//" >'fbinfo.c' <<'END_OF_FILE'
X/*****************************************************************
X * fbinfo.c: FBM Library 0.93 (Beta test) 03-May-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * fbinfo.c: 
X *
X * USAGE
X *	% fbinfo files...
X *
X * EDITLOG
X *	LastEditDate = Wed May  3 23:07:18 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/fbinfo.c
X *
X * HISTORY
X * 03-May-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.93) mlm@cs.cmu.edu
X *
X * 26-Sep-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X# define USAGE "Usage: fbinfo files..."
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM fbinfo.c <0.93> 03-May-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ register int i;
X  FILE *infile;
X  char name[128], cmd[256];
X
X  if (argc == 1)
X  { binfo ((char *) NULL, stdin); }
X  else
X  { for (i=1; i<argc; i++)
X    { strcpy (name, argv[i]);
X
X      if (strcmp (name + strlen (name) - 2, ".Z") == 0)
X      { sprintf (cmd, "(uncompress < %s | select 0 255) 2> /dev/null", name); 
X        if (infile = popen (cmd, "r"))
X	{ binfo (name, infile); pclose (infile); }
X	else
X	{ perror (cmd); }
X      }
X      else if (infile = fopen (argv[i], "r"))
X      { binfo (argv[i], infile); fclose (infile); }
X      else
X      { perror (argv[i]); }
X    }
X  }
X}
X
Xbinfo (name, file)
Xchar *name;
XFILE *file;
X{ FBM image;
X  FBMHDR *hdr;
X
X  image.cm = image.bm = (unsigned char *) NULL;
X
X  /* Read the file header format the bitmap description */
X  if (read_hdr_fbm (&image, file, (char *) NULL, 0))
X  { hdr = &(image.hdr);
X
X    if (name) printf ("%-15s\t", name);
X
X    if (hdr->title[0])		{ printf ("\"%s\"\n", hdr->title); }
X    else			{ printf ("(untitled)\n"); }
X
X    if (hdr->credits[0])
X    { if (name) printf ("\t\t");
X      printf ("[ %s ]\n", hdr->credits);
X    }
X    
X    if (name) printf ("\t\t");
X
X    if (hdr->planes == 1)
X    { printf ("[%dx%dx%d]    %d physbits  %1.4lg aspect ratio\n",
X	      hdr->cols, hdr->rows, hdr->bits, hdr->physbits, hdr->aspect);
X    }
X    else
X    { printf ("[%dx%dx%dx%d]  %d physbits  %1.4lg aspect ratio\n",
X	      hdr->planes, hdr->cols, hdr->rows, hdr->bits, hdr->physbits, 
X	      hdr->aspect);
X    }
X
X    if (name) printf ("\t\t");
X
X    printf ("row length %d, plane length %d, colormap length %d\n",
X	    hdr->rowlen, hdr->plnlen, hdr->clrlen);
X
X    return (1);
X  }
X
X  return (0);
X}
END_OF_FILE
if test 2683 -ne `wc -c <'fbinfo.c'`; then
    echo shar: \"'fbinfo.c'\" unpacked with wrong size!
fi
# end of 'fbinfo.c'
fi
if test -f 'fbmask.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbmask.c'\"
else
echo shar: Extracting \"'fbmask.c'\" \(2815 characters\)
sed "s/^X//" >'fbmask.c' <<'END_OF_FILE'
X/*****************************************************************
X * fbmask.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * fbmask.c: Mask a rectangle with a value (or average)
X *
X * USAGE
X *	% fbmask [ flags ] arguments
X *
X * EDITLOG
X *	LastEditDate = Tue Mar  7 19:56:33 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/fbmask.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 29-Aug-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X# define USAGE "Usage: fbmask [ -<type> ] x0 y0 x1 y1 value < 8bit > 8bit"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM fbmask.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ FBM image;
X  register int j, i, val, rowlen;
X  int x1, x0, y1, y0, n;
X  int outtype = DEF_8BIT;
X
X  /* Clear the memory pointer so alloc_fbm won't be confused */
X  image.cm  = image.bm  = (unsigned char *) NULL;
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      {
X	case 'A':	outtype = FMT_ATK; break;
X	case 'B':	outtype = FMT_FACE; break;
X	case 'F':	outtype = FMT_FBM; break;
X	case 'G':	outtype = FMT_GIF; break;
X	case 'I':	outtype = FMT_IFF; break;
X	case 'L':	outtype = FMT_LEAF; break;
X	case 'M':	outtype = FMT_MCP; break;
X	case 'P':	outtype = FMT_PBM; break;
X	case 'S':	outtype = FMT_SUN; break;
X	case 'T':	outtype = FMT_TIFF; break;
X	case 'X':	outtype = FMT_X11; break;
X	case 'Z':	outtype = FMT_PCX; break;
X	default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X
X  /* Get arguments */
X  if (argc != 5)
X  { fprintf (stderr, "%s\n", USAGE);
X    exit (1);
X  }
X
X  x0  = atoi (argv[0]);
X  y0  = atoi (argv[1]);
X  x1  = atoi (argv[2]);
X  y1  = atoi (argv[3]);
X  val = atoi (argv[4]);
X  
X  /* Assure x0<x1 and y0<y1, swap if necessary */
X  if (x0 > x1) { n=x0; x0=x1; x1=n; }
X  if (y0 > y1) { n=y0; y0=y1; y1=n; }
X
X  if (read_bitmap (&image, (char *) NULL))
X  {
X    if (image.hdr.planes > 1 ||
X        image.hdr.clrlen > 0 ||
X        image.hdr.physbits != 8)
X    { fprintf (stderr, "fbmask works only for 8bit grayscale files\n");
X      exit (1);
X    }
X
X    rowlen = image.hdr.rowlen;
X
X    for (j=y0; j<=y1; j++)
X    { for (i=x0; i<=x1; i++)
X      { image.bm[j*rowlen + i] = val; }
X    }
X    
X    write_bitmap (&image, stdout, outtype);
X  }
X  else
X  { exit (1); }
X  
X  exit (0);
X}
END_OF_FILE
if test 2815 -ne `wc -c <'fbmask.c'`; then
    echo shar: \"'fbmask.c'\" unpacked with wrong size!
fi
# end of 'fbmask.c'
fi
if test -f 'fbquant.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbquant.1'\"
else
echo shar: Extracting \"'fbquant.1'\" \(2737 characters\)
sed "s/^X//" >'fbquant.1' <<'END_OF_FILE'
X.TH FBQUANT 1 07-Apr-89
X.CM 3
X.SH NAME
Xfbquant \- quantize a 24 bit color image
X.SH SYNOPSIS
X.nf
Xfbquant [ -c<numcolors> ] [ -<type> ] [ -m<map> ] < rgb-image > mapped-image
X.fi
X.SH DESCRIPTION
X.PP
XConverts a 3 plane red-green-blue color image into a
Xmapped color image.  Uses Heckbert's adaptive partitioning
Xcolor quantizing algorithm.  It is strongly suggested that you make the
Xnumber of colors used a power of 2, but not necessary for proper
Xoperation of FBM.
X.sp
XIf you wish to requantize an image that is already mapped (for example,
Xto reduce the number of colors), use "gray2clr -u" to unmap the image
Xfirst.  This unmapping step is also necessary to resize a color image
Xusing fbext(1).
X.sp
XYou may specify a particular color map with the
X.B -m
Xoption.  The argument is another mapped color image.
X.sp
XNote that even if you specify fewer than 256 colors, some output
Xformats (SUN and FBM) will still use 8 bits to store each color index.
XThe color map will be the specified length.
X.SH OPTIONS
X.TP
X.BR -c<num>
X.I number of colors
Xto use for dithering.  The range is 8 to 256, and the default is 256.
X.TP
X.BR -m<map>
X.I colormap
Xoption, specifies that the colormap from the
X.I map
Ximage is to be used to quantize he input.  Colormaps may be efficiently
Xstored by extracting very small rectangles
Xfrom another color image:
X.sp
X	% fbext 0 0 1 1 < image.clr > map.clr
X.sp
Xwhich stores a 1 pixel image with the desired map.
X.TP
X.BR -F
X.I FBM,
Xformat (by default, the default).  You are guaranteed not
Xto lose information by specifying FBM as the default.
X.TP
X.BR -G
X.I GIF,
XCompuserve GIF format.
X.TP
X.BR -I
X.I IFF
Xformat, interleaved bitmaps (ILBM), used by Amigas.
XIt is recommended that you use 16 or 32 colors, because the EL Arts
Xcode limits IFF files to 6 planes, and most Amiga software cannot
Xhandle more than 32 colors anyway.
X.TP
X.BR -S
X.I sun,
XSun rasterfiles (not run length encoded).
X.SH EXAMPLE
X.PP
XTo convert a 24 bit Sun rasterfile to an 8 bit mapped color rasterfile:
X.sp
X    % fbquant -S < foo.24bit > foo.clr
X.sp
XTo convert a 24 bit Sun rasterfile to a 32 color Amiga image:
X.sp
X    % fbext -a1.2 -w320 < foo.24bit | \
X.br
X      fbquant -I -c32 > foo.iff
X.sp
XTo convert an FBM format RGB color image to a 16 color GIF image:
X    % fbext -a1.2 -w320 < foo.24bit | \
X.br
X      fbquant -G -c16 > foo.gif
X.SH SEE ALSO
Xfbm(1) for general discussion, pbm(1) for PBM routines.
X.SH BUGS
XNone known.
X.SH HISTORY
XCopyright (c) 1989 by Michael L. Mauldin.  
XPermission is granted to use this program in whole or in part provided
Xthat you do not sell it for profit and that this copyright notice is
Xretained unchanged.
X.TP
X07-Mar-89  Michael L. Mauldin at Carnegie Mellon University
XBeta release (version 0.9) mlm@cs.cmu.edu
END_OF_FILE
if test 2737 -ne `wc -c <'fbquant.1'`; then
    echo shar: \"'fbquant.1'\" unpacked with wrong size!
fi
# end of 'fbquant.1'
fi
if test -f 'fbrot.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbrot.c'\"
else
echo shar: Extracting \"'fbrot.c'\" \(2490 characters\)
sed "s/^X//" >'fbrot.c' <<'END_OF_FILE'
X/*****************************************************************
X * fbrot.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * fbrot.c: Rotate image 90 degrees clockwise
X *
X * USAGE
X *     % fbrot < image1 > image2
X *
X * EDITLOG
X *     LastEditDate = Tue Mar  7 19:56:41 1989 - Michael Mauldin
X *     LastFileName = /usr2/mlm/src/misc/fbm/fbrot.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 22-Aug-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *     Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X# define USAGE \
X  "Usage: fbrot [ -<type> ] [ -90 | -180 | -270 ] < image > image"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM fbrot.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ FBM input, output;
X  int outtype = -1, rot = 90;
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      {
X	case '9':	rot=90; SKIPARG; break;
X	case '1':	rot=180; SKIPARG; break;
X	case '2':	rot=270; SKIPARG; break;
X	case 'A':	outtype = FMT_ATK; break;
X	case 'B':	outtype = FMT_FACE; break;
X	case 'F':	outtype = FMT_FBM; break;
X	case 'G':	outtype = FMT_GIF; break;
X	case 'I':	outtype = FMT_IFF; break;
X	case 'L':	outtype = FMT_LEAF; break;
X	case 'M':	outtype = FMT_MCP; break;
X	case 'P':	outtype = FMT_PBM; break;
X	case 'S':	outtype = FMT_SUN; break;
X	case 'T':	outtype = FMT_TIFF; break;
X	case 'X':	outtype = FMT_X11; break;
X	case 'Z':	outtype = FMT_PCX; break;
X	default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X
X  /* Clear the memory pointers so alloc_fbm won't be confused */
X  input.cm  = input.bm  = (unsigned char *) NULL;
X  output.cm = output.bm = (unsigned char *) NULL;
X
X  /* Read the image and rotate it */
X  if (read_bitmap (&input, (char *) NULL))
X  { if (outtype < 0)
X    { if (input.hdr.planes == 1 && input.hdr.bits == 1)
X      { outtype = DEF_1BIT; }
X      else
X      { outtype = DEF_8BIT; }
X    }
X
X    if (rotate_fbm (&input, &output, rot) &&
X        write_bitmap (&output, stdout, outtype))
X    { exit (0); }
X  }
X
X  exit (1);
X}
END_OF_FILE
if test 2490 -ne `wc -c <'fbrot.c'`; then
    echo shar: \"'fbrot.c'\" unpacked with wrong size!
fi
# end of 'fbrot.c'
fi
if test -f 'fbsample.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbsample.1'\"
else
echo shar: Extracting \"'fbsample.1'\" \(2585 characters\)
sed "s/^X//" >'fbsample.1' <<'END_OF_FILE'
X.TH FBSAMPLE 1 07-Mar-89
X.CM 3
X.SH NAME
Xfbsample \- convert 1bit image to grayscale by sampling
X.SH SYNOPSIS
X.nf
Xfbsample [ -t'title' -c'credits' -g'grain' -n'nbr']
X         [ -<type> ] < bitmap > image
X.fi
X.SH DESCRIPTION
X.PP
XSamples a 1 bit deep pbm file using a square neighborhood of the
Xspecified size, and outputs an 8 bit file.  You will want to run
X.I fbnorm
Xon the output to expand the scale to 255, and there will be a small
Xloss of sharpness, so
X.I fbsharp
Xwill also be useful.  Once you have an 8 bit file, you can resize it
Xarbitrarily, and then convert it back to a 1 bit file, if need be.
XThe default neighborhood size is 8 by 8, which gives 65 different gray
Xlevels.
X.SH OPTIONS
X.TP
X.B -g
X.I grain
Xsize.  The sample is taken every
X.I grain
Xpixels.
X.TP
X.B -n
X.I neighborhood
Xsize.  The value will be the number of light pixels in the nearby NxN
Xsquare.  The values can range from 1 to 16.
X.TP
X.BR -t'title'
X.I title,
Xspecify a character string (up to 80 characters) to describe the image.
XThe default is no title.
X.TP
X.BR -c'credits'
X.I credits or subtitle,
Xspecify a second character string (up to 80 characters) to describe the
Ximage.  The default is no credit string.
X.TP
X.BR -B
X.I face
Xformat, as used by Bennet Yee's
X.I face
Xprogram at CMU. 
X.TP
X.BR -F
X.I FBM,
Xformat (by default, the default).  You are guaranteed not
Xto lose information by specifying FBM as the default.
X.TP
X.BR -G
X.I GIF,
XCompuserve GIF format.
X.TP
X.BR -I
X.I IFF
Xformat, interleaved bitmaps (ILBM), used by Amigas.
X.TP
X.BR -P
X.I PBM,
XJef Poskanzer's bitmap format.
X.TP
X.BR -S
X.I sun,
XSun rasterfiles (not run length encoded).
X.PP
X.SH EXAMPLE
X.PP
XSuppose you have a 480 by 600 face format file (-B) that you wish to
Xshrink to 300 by 375 and convert to PostScript (say for inclusion 
Xin your door label).  Here's a pipeline to do that:
X.sp
X.nf
X    % fbsample -n5 -g1 < my.face | \    # sample 5x5
X      fbnorm -b4 -w1 |                  # normalize
X      fbext -w300 | \                   # make 300 pixels wide
X      fbhalf -s20 | \                   # halftone and really sharpen
X      pbm2ps -s 1 > sdoor.ps            # convert to postscript
X.fi
X.SH SEE ALSO
Xfbnorm(1) to normalize the output,
Xfbm(1) for general discussion, pbm(1) for PBM routines.
X.SH BUGS
XNone known.
X.SH HISTORY
XCopyright (c) 1989 by Michael L. Mauldin.  
XPermission is granted to use this program in whole or in part provided
Xthat you do not sell it for profit and that this copyright notice is
Xretained unchanged.
X.TP
X07-Mar-89  Michael L. Mauldin at Carnegie Mellon University
XBeta release (version 0.9) mlm@cs.cmu.edu
END_OF_FILE
if test 2585 -ne `wc -c <'fbsample.1'`; then
    echo shar: \"'fbsample.1'\" unpacked with wrong size!
fi
# end of 'fbsample.1'
fi
if test -f 'fbsharp.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fbsharp.c'\"
else
echo shar: Extracting \"'fbsharp.c'\" \(2905 characters\)
sed "s/^X//" >'fbsharp.c' <<'END_OF_FILE'
X/*****************************************************************
X * fbsharp.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * fbsharp.c: Sharpen an image by using a Laplacian edge enhancement
X *
X * USAGE
X *	% fbsharp [ flags ] arguments
X *
X * EDITLOG
X *	LastEditDate = Tue Mar  7 19:56:44 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/fbsharp.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 10-Sep-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X# define USAGE "fbsharp [ -SF ] beta < 8bit > 8bit"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM fbsharp.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ int w, h, k;
X  double beta = 2.0;
X  FBM input, output;
X  int outtype = DEF_8BIT;
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      { 
X	case 'A':	outtype = FMT_ATK; break;
X	case 'B':	outtype = FMT_FACE; break;
X	case 'F':	outtype = FMT_FBM; break;
X	case 'G':	outtype = FMT_GIF; break;
X	case 'I':	outtype = FMT_IFF; break;
X	case 'L':	outtype = FMT_LEAF; break;
X	case 'M':	outtype = FMT_MCP; break;
X	case 'P':	outtype = FMT_PBM; break;
X	case 'S':	outtype = FMT_SUN; break;
X	case 'T':	outtype = FMT_TIFF; break;
X	case 'X':	outtype = FMT_X11; break;
X	case 'Z':	outtype = FMT_PCX; break;
X	default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X
X  /* Clear the memory pointers so alloc_fbm won't be confused */
X  input.cm  = input.bm  = (unsigned char *) NULL;
X  output.cm = output.bm = (unsigned char *) NULL;
X
X  /* Read the image and sharpen it */
X  if (read_bitmap (&input, (char *) NULL))
X  {
X    if (input.hdr.bits != 8 || input.hdr.physbits != 8)
X    { fprintf (stderr,
X	       "Can't handle images with %d bits and %d physbits per pixel\n",
X	       input.hdr.bits, input.hdr.physbits);
X      exit (1);
X    }
X
X    /* Argument is amount of sharpening */
X    if (argc > 0)		{ beta = atof (argv[0]); }
X
X    /* Determine output height & width (oh*ow <= size) */
X    h = input.hdr.rows;
X    w = input.hdr.cols;
X    k = input.hdr.planes;
X
X    fprintf (stderr,
X	     "Sharpen \"%s\", beta %1.3lf [%dx%dx%d]\n",
X	     input.hdr.title[0] ? input.hdr.title : "(untitled)",
X	     beta, w, h, k);
X
X    /* Sharpen the image using a digitial Laplacian */
X    if (sharpen_fbm (&input, &output, beta) &&
X        write_bitmap (&output, stdout, outtype))
X    { exit (0); }
X  }
X  
X  exit (1);
X}
END_OF_FILE
if test 2905 -ne `wc -c <'fbsharp.c'`; then
    echo shar: \"'fbsharp.c'\" unpacked with wrong size!
fi
# end of 'fbsharp.c'
fi
if test -f 'flcavg.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'flcavg.c'\"
else
echo shar: Extracting \"'flcavg.c'\" \(3162 characters\)
sed "s/^X//" >'flcavg.c' <<'END_OF_FILE'
X/*****************************************************************
X * flcavg.c: FBM Library 0.94 (Beta test) 20-May-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * flcavg.c: Constrained average halftoning
X *
X * CONTENTS
X *	constravg_fbm (input, output, gamma)
X *
X * EDITLOG
X *	LastEditDate = Sat May 20 19:07:06 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/flcavg.c
X *
X * HISTORY
X * 20-May-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Bug fix from Dave Cohrs <dave@cs.wisc.edu>
X *
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 12-Nov-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include <ctype.h>
X# include "fbm.h"
X
X/****************************************************************
X * constravg_fbm: Constrained Average halftoning
X * Reference: Jarvis & Roberts, IEEE Trans. on Commun., v24n8, p 891-898
X ****************************************************************/
X
X# define NBR 9
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM flcavg.c <0.94> 20-May-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xconstravg_fbm (input, output, gamma)
XFBM *input, *output;
Xdouble gamma;
X{ register unsigned char *bmp, *obm;
X  register int i, j, rowlen, w, h, sum, thresh, outrow;
X  int gamma100 = gamma * 100;
X
X  if (input->hdr.planes != 1)
X  { fprintf (stderr, "constravg_fbm: can't halftone color images\n");
X    return (0);
X  }
X
X  fprintf (stderr, "Constrained average halftoning, gamma %1.2lf\n", gamma);
X
X  /* Allocate output */
X  output->hdr = input->hdr;
X  output->hdr.bits = 1;
X  output->hdr.physbits = 8;
X  outrow = 16 * ((input->hdr.cols + 15) / 16); /* Pad to even byte boundary */
X  output->hdr.rowlen = outrow;
X  output->hdr.plnlen = outrow*output->hdr.rows;
X  alloc_fbm (output);
X
X  w = input->hdr.cols;
X  h = input->hdr.rows;
X  rowlen = input->hdr.rowlen;
X
X  /* Use threshold of 1/2 in the output border */
X  for (j=0; j<h; j++)
X  { output->bm[j*outrow]         = input->bm[j*rowlen]         > (WHITE/2);
X    output->bm[j*outrow + (w-1)] = input->bm[j*rowlen + (w-1)] > (WHITE/2);
X  }
X
X  for (i=0; i<w; i++)
X  { output->bm[i]                = input->bm[i]                > (WHITE/2);
X    output->bm[outrow*(h-1) + i] = input->bm[rowlen*(h-1) + i] > (WHITE/2);
X  }
X
X  /*
X   * Now process the interior bits (use sum instead of average and divide
X   * by 9 when we are all done -- this allows fixed point arithmetic)
X   */
X
X  for (j=1; j<h-1; j++)
X  { bmp = &input->bm[j*rowlen];
X    obm = &output->bm[j*outrow];
X
X    for (i=1; i<w-1; i++)
X    { sum = bmp[(i-w) - 1] + bmp[(i-w)] + bmp[(i-w) + 1] +
X	    bmp[i-1]       + bmp[i]     + bmp[i+1] +
X	    bmp[i+w-1]     + bmp[i+w]   + bmp[i+w+1];
X      
X      thresh = gamma100/100 + (sum*WHITE - 2*gamma100*sum/100) / (NBR*WHITE);
X      obm[i] = (bmp[i] > thresh) ? 1 : 0;
X    }
X  }
X
X  return (1);
X}
END_OF_FILE
if test 3162 -ne `wc -c <'flcavg.c'`; then
    echo shar: \"'flcavg.c'\" unpacked with wrong size!
fi
# end of 'flcavg.c'
fi
if test -f 'flthre.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'flthre.c'\"
else
echo shar: Extracting \"'flthre.c'\" \(2328 characters\)
sed "s/^X//" >'flthre.c' <<'END_OF_FILE'
X1/*****************************************************************
X * flthre.c: FBM Library 0.94 (Beta test) 20-May-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * flthre.c: 
X *
X * CONTENTS:
X *	thesh_fbm (input, output, thresh)
X *
X * EDITLOG
X *	LastEditDate = Sat May 20 19:06:37 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/flthre.c
X *
X * HISTORY
X * 20-May-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Bug fix from Dave Cohrs <dave@cs.wisc.edu>
X *
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 10-Dec-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X
X# include <stdio.h>
X# include <math.h>
X# include <ctype.h>
X# include "fbm.h"
X
X/*****************************************************************
X * thesh_fbm: Threshhold halftoning
X *****************************************************************/
X
X# define RAND(RN) (((seed = 1103515245 * seed + 12345) >> 12) % (RN))
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM flthre.c <0.94> 20-May-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xthesh_fbm (input, output, thresh)
XFBM *input, *output;
Xregister int thresh;
X{ register unsigned char *bmp, *obm;
X  register int i, j, rowlen, w, h, outrow;
X
X  if (input->hdr.planes != 1)
X  { fprintf (stderr, "thesh_fbm: can't halftone color images\n");
X    return (0);
X  }
X
X  fprintf (stderr, "Threshhold halftoning, thesh %d\n", thresh);
X
X  /* Allocate output */
X  free_fbm (output);
X  output->hdr = input->hdr;
X  output->hdr.bits = 1;
X  output->hdr.physbits = 8;
X  outrow = 16 * ((input->hdr.cols + 15) / 16); /* Pad to even byte boundary */
X  output->hdr.rowlen = outrow;
X  output->hdr.plnlen = outrow*output->hdr.rows;
X  alloc_fbm (output);
X
X  w = input->hdr.cols;
X  h = input->hdr.rows;
X  rowlen = input->hdr.rowlen;
X  
X  /* Now do threshholding */
X  for (j=0; j<h; j++)
X  { /* scan left to right */
X    bmp = &input->bm[j*rowlen];
X    obm = &output->bm[j*outrow];
X
X    for (i=1; i<w; i++)
X    { obm[i] = bmp[i] > thresh ? WHITE : BLACK; }
X  }
X  
X  return (1);
X}
END_OF_FILE
if test 2328 -ne `wc -c <'flthre.c'`; then
    echo shar: \"'flthre.c'\" unpacked with wrong size!
fi
# end of 'flthre.c'
fi
if test -f 'flwrfb.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'flwrfb.c'\"
else
echo shar: Extracting \"'flwrfb.c'\" \(2921 characters\)
sed "s/^X//" >'flwrfb.c' <<'END_OF_FILE'
X/*****************************************************************
X * flwrfb.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * flwrfb.c: 
X *
X * CONTENTS
X *	write_fbm (image, wfile)
X *	write_hdr_fbm (image, wfile)
X *
X * EDITLOG
X *	LastEditDate = Tue Mar  7 19:57:39 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/flwrfb.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X * 12-Nov-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include <ctype.h>
X# include "fbm.h"
X
X/****************************************************************
X * write_fbm: Write an image to a stream
X ****************************************************************/
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM flwrfb.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xwrite_fbm (image, wfile)
Xregister FBM *image;
Xregister FILE *wfile;
X{ register int k, j, rowlen, plnlen;
X  register unsigned char *bmptr;
X
X  if (! write_hdr_fbm (image, wfile)) return (0);
X
X  rowlen = image->hdr.rowlen;
X  plnlen = image->hdr.plnlen;
X  
X  if (image->hdr.clrlen > 0)
X  { if (!fwrite (image->cm, image->hdr.clrlen, 1, wfile))
X    { perror ("write_fbm (colormap)"); return (0); }
X  }
X
X  for (k=0; k<image->hdr.planes; k++)
X  { bmptr = &(image->bm[k*plnlen]);
X    
X    for (j=0; j<image->hdr.rows; j++, bmptr += rowlen)
X    { if (! fwrite (bmptr, 1, rowlen, wfile))
X      { perror ("write_fbm"); return (0); }
X    }
X  }
X    
X  return (1);
X}
X
X/****************************************************************
X * write_hdr_fbm: Write an image header to a stream
X ****************************************************************/
X
Xwrite_hdr_fbm (image, wfile)
Xregister FBM *image;
Xregister FILE *wfile;
X{ FBMFILEHDR file_hdr;
X
X  strncpy (file_hdr.magic, FBM_MAGIC, 8);
X  sprintf (file_hdr.cols, "%7d", image->hdr.cols);
X  sprintf (file_hdr.rows, "%7d", image->hdr.rows);
X  sprintf (file_hdr.planes, "%7d", image->hdr.planes);
X  sprintf (file_hdr.bits, "%7d", image->hdr.bits);
X  sprintf (file_hdr.physbits, "%7d", image->hdr.physbits);
X  sprintf (file_hdr.rowlen, "%11d", image->hdr.rowlen);
X  sprintf (file_hdr.plnlen, "%11d", image->hdr.plnlen);
X  sprintf (file_hdr.clrlen, "%11d", image->hdr.clrlen);
X  sprintf (file_hdr.aspect, "%11.6lf", image->hdr.aspect);
X  strncpy (file_hdr.title, image->hdr.title, FBM_MAX_TITLE);
X  strncpy (file_hdr.credits, image->hdr.credits, FBM_MAX_TITLE);
X
X  if (! fwrite (&file_hdr, sizeof (file_hdr), 1, wfile))
X  { perror ("write_fbm (header)"); return (0); }
X    
X  return (1);
X}
END_OF_FILE
if test 2921 -ne `wc -c <'flwrfb.c'`; then
    echo shar: \"'flwrfb.c'\" unpacked with wrong size!
fi
# end of 'flwrfb.c'
fi
if test -f 'gray2clr.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'gray2clr.c'\"
else
echo shar: Extracting \"'gray2clr.c'\" \(2410 characters\)
sed "s/^X//" >'gray2clr.c' <<'END_OF_FILE'
X/*****************************************************************
X * gray2clr.c: FBM Library 0.9 (Beta test) 07-Mar-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * gray2clr.c: 
X *
X * USAGE
X *	% gray2clr [ flags ] arguments
X *
X * EDITLOG
X *	LastEditDate = Thu Apr 20 17:05:31 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/gray2clr.c
X *
X * HISTORY
X * 07-Mar-89  Michael Mauldin (mlm) at Carnegie Mellon University
X *	Beta release (version 0.9) mlm@cs.cmu.edu
X *
X *  1-Dec-88  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Created.
X *****************************************************************/
X
X# include <stdio.h>
X# include <math.h>
X# include "fbm.h"
X
X# define USAGE "gray2clr [ -<type> ] [ -u ] < gray > color"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM gray2clr.c <0.9> 07-Mar-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ FBM input, output;
X  int outtype = DEF_8BIT;
X  int mapped = 1;
X
X  /* If invoked as 'unmap', set option to mapped=0 */
X  if (strcmp (argv[0] + strlen (argv[0]) - 5, "unmap") == 0)
X  { mapped = 0; }
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      { case 'u':	mapped = 0; break;
X	case 'A':	outtype = FMT_ATK; break;
X	case 'B':	outtype = FMT_FACE; break;
X	case 'F':	outtype = FMT_FBM; break;
X	case 'G':	outtype = FMT_GIF; break;
X	case 'I':	outtype = FMT_IFF; break;
X	case 'L':	outtype = FMT_LEAF; break;
X	case 'M':	outtype = FMT_MCP; break;
X	case 'P':	outtype = FMT_PBM; break;
X	case 'S':	outtype = FMT_SUN; break;
X	case 'T':	outtype = FMT_TIFF; break;
X	case 'X':	outtype = FMT_X11; break;
X	case 'Z':	outtype = FMT_PCX; break;
X	default:        fprintf (stderr, "%s\n", USAGE);
X                        exit (1);
X      }
X    }
X  }
X
X  /* Clear the memory pointers so alloc_fbm won't be confused */
X  input.cm  = input.bm  = (unsigned char *) NULL;
X  output.cm = output.bm = (unsigned char *) NULL;
X
X  /* Read the image and convert it */
X  if (read_bitmap (&input, (char *) NULL) &&
X      (mapped ?
X       gray2clr (&input, &output, outtype == FMT_SUN) :
X       clr_unmap (&input, &output)) &&
X      write_bitmap (&output, stdout, outtype))
X  { exit (0); }
X
X  exit (1);
X}
END_OF_FILE
if test 2410 -ne `wc -c <'gray2clr.c'`; then
    echo shar: \"'gray2clr.c'\" unpacked with wrong size!
fi
# end of 'gray2clr.c'
fi
if test -f 'qrt2fbm.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'qrt2fbm.c'\"
else
echo shar: Extracting \"'qrt2fbm.c'\" \(2571 characters\)
sed "s/^X//" >'qrt2fbm.c' <<'END_OF_FILE'
X/*****************************************************************
X * qrt2fbm.c: FBM Library 0.91 (Beta Test)  7-Apr-89  Michael Mauldin
X *
X * Copyright (C) 1989 by Michael Mauldin.  Permission is granted to
X * use this file in whole or in part provided that you do not sell it
X * for profit and that this copyright notice is retained unchanged.
X *
X * qrt2fbm.c: Convert QRT format (from the QRT ray tracer)
X *
X * USAGE
X *	 % qrt2fbm -t'title' -c'credits' < qrtfile > fbm
X *
X * EDITLOG
X *	LastEditDate = Wed May  3 23:35:24 1989 - Michael Mauldin
X *	LastFileName = /usr2/mlm/src/misc/fbm/qrt2fbm.c
X *
X * HISTORY
X *  7-Apr-89  Michael Mauldin (mlm) at Carnegie-Mellon University
X *	Installed, code by Butler Hines.
X *
X *****************************************************************/
X
X# include <stdio.h>
X# include "fbm.h"
X
X# define USAGE \
X"Usage: qrt2fbm [ -t'title' -c'credits' ] < qrtfile > fbm"
X
X#ifndef lint
Xstatic char *fbmid =
X	"$FBM qrt2fbm.c <0.91> 07-Apr-89  (C) 1989 by Michael Mauldin$";
X#endif
X
Xmain (argc, argv)
Xchar *argv[];
X{ register int j, k, rowlen;
X  double aspect = 0.56;
X  int rows, cols, line, len, planes=3;
X  FBMHDR hdr;
X  unsigned char *buf;
X  char title[FBM_MAX_TITLE], credits[FBM_MAX_TITLE];
X
X  /* Get the options */
X  while (--argc > 0 && (*++argv)[0] == '-')
X  { while (*++(*argv))
X    { switch (**argv)
X      { 
X	case 't':	strncpy (title, *argv+1, FBM_MAX_TITLE);
X			title[FBM_MAX_TITLE-1] = '\0';
X			CLRARG; break;
X	case 'c':	strncpy (credits, *argv+1, FBM_MAX_TITLE);
X			credits[FBM_MAX_TITLE-1] = '\0';
X			CLRARG; break;
X	default:	fprintf (stderr, "%s\n", USAGE);
X			exit (1);
X      }
X    }
X  }
X
X  cols = getchar();
X  cols |= (getchar()<<8);
X  rows = getchar();
X  rows |= (getchar()<<8);
X  
X  rowlen = 2 * ((cols * 8 + 15) / 16);
X
X  /* Build header */
X  hdr.rows = rows;
X  hdr.cols = cols;
X  hdr.planes = planes;
X  hdr.bits = 8;
X  hdr.physbits = 8;
X  hdr.rowlen = rowlen;
X  hdr.plnlen = hdr.rowlen * rows;
X  hdr.clrlen = 0;
X  hdr.aspect = aspect;
X  strcpy (hdr.title, title);
X  strcpy (hdr.credits, credits);
X  
X  write_hdr_fbm (&hdr, stdout);
X  
X  len = planes*cols; 
X  buf = (unsigned char *) malloc (rows*len);
X
X  for (j=0; j<rows; j++){
X    line = getchar();
X    line |= (getchar()<<8);
X    if (! fread (&buf[j*len], len, 1, stdin))
X      { fprintf (stderr, "premature end of file on input at line %d\n", line);
X        break;
X      }
X    }
X
X  for(k=0; k<planes; k++){
X    for (j=0; j<rows; j++){
X      if (! fwrite (&buf[j*len+k*cols], rowlen, 1, stdout))
X        { perror ("qrt2fbm"); exit (1); }
X      }
X    }
X  
X  exit (0);
X}
END_OF_FILE
if test 2571 -ne `wc -c <'qrt2fbm.c'`; then
    echo shar: \"'qrt2fbm.c'\" unpacked with wrong size!
fi
# end of 'qrt2fbm.c'
fi
echo shar: End of archive 2 \(of 8\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 8 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.