v13i032: ImageMagick - Graphics display programs, Part16/21

cristy at dupont.com cristy at dupont.com
Fri May 24 13:19:55 AEST 1991


Submitted-by: cristy at dupont.com
Posting-number: Volume 13, Issue 32
Archive-name: imagemagic/part16

#!/bin/sh
# this is img.16 (part 16 of ImageMagick)
# do not concatenate these parts, unpack them in order with /bin/sh
# file ImageMagick/filters/MIFFtoMTV.c continued
#
if test ! -r _shar_seq_.tmp; then
	echo 'Please unpack part 1 first!'
	exit 1
fi
(read Scheck
 if test "$Scheck" != 16; then
	echo Please unpack part "$Scheck" next!
	exit 1
 else
	exit 0
 fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
	echo 'x - still skipping ImageMagick/filters/MIFFtoMTV.c'
else
echo 'x - continuing file ImageMagick/filters/MIFFtoMTV.c'
sed 's/^X//' << 'SHAR_EOF' >> 'ImageMagick/filters/MIFFtoMTV.c' &&
X    exit(1);
X  (void) strcpy(image->filename,argv[2]);
X  WriteMTVImage(image);
X  (void) fprintf(stderr,"%s=> %s  %dx%d\n",argv[1],argv[2],image->columns,
X    image->rows);
X  return(False);
}
SHAR_EOF
echo 'File ImageMagick/filters/MIFFtoMTV.c is complete' &&
chmod 0755 ImageMagick/filters/MIFFtoMTV.c ||
echo 'restore of ImageMagick/filters/MIFFtoMTV.c failed'
Wc_c="`wc -c < 'ImageMagick/filters/MIFFtoMTV.c'`"
test 9938 -eq "$Wc_c" ||
	echo 'ImageMagick/filters/MIFFtoMTV.c: original size 9938, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= ImageMagick/filters/MIFFtoRGB.c ==============
if test -f 'ImageMagick/filters/MIFFtoRGB.c' -a X"$1" != X"-c"; then
	echo 'x - skipping ImageMagick/filters/MIFFtoRGB.c (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting ImageMagick/filters/MIFFtoRGB.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/MIFFtoRGB.c' &&
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%                 EEEEE  X   X  PPPP    OOO   RRRR    TTTTT                   %
%                 E       X X   P   P  O   O  R   R     T                     %
%                 EEE      X    PPPP   O   O  RRRR      T                     %
%                 E       X X   P      O   O  R R       T                     %
%                 EEEEE  X   X  P       OOO   R  R      T                     %
%                                                                             %
%                                                                             %
%                  Export MIFF image to a RGB raster format.                  %
%                                                                             %
%                                                                             %
%                                                                             %
%                           Software Design                                   %
%                             John Cristy                                     %
%                            January  1991                                    %
%                                                                             %
%                                                                             %
%  Copyright 1991 E. I. Dupont de Nemours & Company                           %
%                                                                             %
%  Permission to use, copy, modify, distribute, and sell this software and    %
%  its documentation for any purpose is hereby granted without fee,           %
%  provided that the above Copyright notice appear in all copies and that     %
%  both that Copyright notice and this permission notice appear in            %
%  supporting documentation, and that the name of E. I. Dupont de Nemours     %
%  & Company not be used in advertising or publicity pertaining to            %
%  distribution of the software without specific, written prior               %
%  permission.  E. I. Dupont de Nemours & Company makes no representations    %
%  about the suitability of this software for any purpose.  It is provided    %
%  "as is" without express or implied warranty.                               %
%                                                                             %
%  E. I. Dupont de Nemours & Company disclaims all warranties with regard     %
%  to this software, including all implied warranties of merchantability      %
%  and fitness, in no event shall E. I. Dupont de Nemours & Company be        %
%  liable for any special, indirect or consequential damages or any           %
%  damages whatsoever resulting from loss of use, data or profits, whether    %
%  in an action of contract, negligence or other tortious action, arising     %
%  out of or in connection with the use or performance of this software.      %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Command syntax:
%
%  export image.miff image.rgb
%
%  Specify 'image.miff' as '-' for standard input.  
%  Specify 'image.rgb' as '-' for standard output.
%
%
*/
X
#include "display.h"
#include "image.h"
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   E r r o r                                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Function Error displays an error message and then terminates the program.
%
%  The format of the Error routine is:
%
%      Error(message,qualifier)
%
%  A description of each parameter follows:
%
%    o message:  Specifies the message to display before terminating the
%      program.
%
%    o qualifier:  Specifies any qualifier to the message.
%
%
*/
static void Error(message,qualifier)
char
X  *message,
X  *qualifier;
{
X  (void) fprintf(stderr,"%s: %s",application_name,message); 
X  if (qualifier != (char *) NULL)
X    (void) fprintf(stderr," %s",qualifier);
X  (void) fprintf(stderr,".\n");
X  exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   U s a g e                                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Procedure Usage displays the program usage;
%
%  The format of the Usage routine is:
%
%      Usage(message)
%
%  A description of each parameter follows:
%
%    message:  Specifies a specific message to display to the user.
%
*/
static void Usage(message)
char
X  *message;
{
X  if (message != (char *) NULL)
X    (void) fprintf(stderr,"Can't continue, %s\n\n",message);
X  (void) fprintf(stderr,"Usage: %s image.miff image.rgb\n\n",application_name);
X  (void) fprintf(stderr,"Specify 'image.miff' as '-' for standard input.\n");
X  (void) fprintf(stderr,"Specify 'image.rgb' as '-' for standard output.\n");
X  exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   W r i t e R G B I m a g e                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Procedure WriteRGBImage writes an image to a file on disk in red, green,
%  blue rasterfile format.
%
%  The format of the WriteRGBImage routine is:
%
%      WriteRGBImage(image)
%
%  A description of each parameter follows.
%
%    o image:  A pointer to a Image structure.
%
%
*/
static void WriteRGBImage(image)
Image
X  *image;
{
X  register int
X    i,
X    j;
X
X  register RunlengthPacket
X    *p;
X
X  register unsigned char
X    *q;
X
X  unsigned char
X    *pixels;
X
X  /*
X    Open output image file.
X  */
X  if (*image->filename == '-')
X    image->file=stdout;
X  else
X    if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0)
X      image->file=fopen(image->filename,"w");
X    else
X      {
X        char
X          command[256];
X
X        /*
X          Image file is compressed-- uncompress it.
X        */
X        (void) sprintf(command,"compress -c > %s",image->filename);
X        image->file=(FILE *) popen(command,"w");
X      }
X  if (image->file == (FILE *) NULL)
X    Error("unable to open file",image->filename);
X  /*
X    Convert MIFF to RGB raster pixels.
X  */
X  pixels=(unsigned char *) 
X    malloc(3*image->columns*image->rows*sizeof(unsigned char));
X  if (pixels == (unsigned char *) NULL)
X    Error("unable to allocate memory",(char *) NULL);
X  p=image->pixels;
X  q=pixels;
X  for (i=0; i < image->packets; i++)
X  {
X    for (j=0; j <= p->length; j++)
X    {
X      *q++=p->red;
X      *q++=p->green;
X      *q++=p->blue;
X    }
X    p++;
X  }
X  (void) fwrite((char *) pixels,sizeof(unsigned char),
X    (int) 3*image->columns*image->rows,image->file);
X  (void) free((char *) pixels);
X  if (image->file != stdin)
X    if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0)
X      (void) fclose(image->file);
X    else
X      (void) pclose(image->file);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%    M a i n                                                                  %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
*/
int main(argc,argv)
int
X  argc;
X
char
X  *argv[];
{
X  Image
X    *image;
X
X  application_name=argv[0];
X  if (argc < 3)
X    Usage((char *) NULL);
X  image=ReadImage(argv[1]);
X  if (image == (Image *) NULL)
X    exit(1);
X  (void) strcpy(image->filename,argv[2]);
X  WriteRGBImage(image);
X  (void) fprintf(stderr,"%s=> %s  %dx%d\n",argv[1],argv[2],image->columns,
X    image->rows);
X  return(False);
}
SHAR_EOF
chmod 0755 ImageMagick/filters/MIFFtoRGB.c ||
echo 'restore of ImageMagick/filters/MIFFtoRGB.c failed'
Wc_c="`wc -c < 'ImageMagick/filters/MIFFtoRGB.c'`"
test 9872 -eq "$Wc_c" ||
	echo 'ImageMagick/filters/MIFFtoRGB.c: original size 9872, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= ImageMagick/filters/MIFFtoXWD.c ==============
if test -f 'ImageMagick/filters/MIFFtoXWD.c' -a X"$1" != X"-c"; then
	echo 'x - skipping ImageMagick/filters/MIFFtoXWD.c (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting ImageMagick/filters/MIFFtoXWD.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/MIFFtoXWD.c' &&
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%                 EEEEE  X   X  PPPP    OOO   RRRR    TTTTT                   %
%                 E       X X   P   P  O   O  R   R     T                     %
%                 EEE      X    PPPP   O   O  RRRR      T                     %
%                 E       X X   P      O   O  R R       T                     %
%                 EEEEE  X   X  P       OOO   R  R      T                     %
%                                                                             %
%                                                                             %
%                  Export MIFF image to a XWD raster format.                  %
%                                                                             %
%                                                                             %
%                                                                             %
%                           Software Design                                   %
%                             John Cristy                                     %
%                            January  1991                                    %
%                                                                             %
%                                                                             %
%  Copyright 1991 E. I. Dupont de Nemours & Company                           %
%                                                                             %
%  Permission to use, copy, modify, distribute, and sell this software and    %
%  its documentation for any purpose is hereby granted without fee,           %
%  provided that the above Copyright notice appear in all copies and that     %
%  both that Copyright notice and this permission notice appear in            %
%  supporting documentation, and that the name of E. I. Dupont de Nemours     %
%  & Company not be used in advertising or publicity pertaining to            %
%  distribution of the software without specific, written prior               %
%  permission.  E. I. Dupont de Nemours & Company makes no representations    %
%  about the suitability of this software for any purpose.  It is provided    %
%  "as is" without express or implied warranty.                               %
%                                                                             %
%  E. I. Dupont de Nemours & Company disclaims all warranties with regard     %
%  to this software, including all implied warranties of merchantability      %
%  and fitness, in no event shall E. I. Dupont de Nemours & Company be        %
%  liable for any special, indirect or consequential damages or any           %
%  damages whatsoever resulting from loss of use, data or profits, whether    %
%  in an action of contract, negligence or other tortious action, arising     %
%  out of or in connection with the use or performance of this software.      %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Command syntax:
%
%  export image.miff image.xwd
%
%  Specify 'image.miff' as '-' for standard input.  
%  Specify 'image.xwd' as '-' for standard output.
%
%
*/
X
#include "display.h"
#include "image.h"
#include "X.h"
#include "X11/XWDFile.h"
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   E r r o r                                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Function Error displays an error message and then terminates the program.
%
%  The format of the Error routine is:
%
%      Error(message,qualifier)
%
%  A description of each parameter follows:
%
%    o message:  Specifies the message to display before terminating the
%      program.
%
%    o qualifier:  Specifies any qualifier to the message.
%
%
*/
static void Error(message,qualifier)
char
X  *message,
X  *qualifier;
{
X  (void) fprintf(stderr,"%s: %s",application_name,message); 
X  if (qualifier != (char *) NULL)
X    (void) fprintf(stderr," %s",qualifier);
X  (void) fprintf(stderr,".\n");
X  exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%  M S B F i r s t O r d e r L o n g                                          %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Function MSBFirstOrderLong converts a least-significant byte first buffer
%  of long integers to most-significant byte first.
%
%  The format of the MSBFirstOrderLong routine is:
%
%       MSBFirstOrderLong(p,length);
%
%  A description of each parameter follows.
%
%   o  p:  Specifies a pointer to a buffer of integers.
%
%   o  length:  Specifies the length of the buffer.
%
%
*/
MSBFirstOrderLong(p,length)
register char
X  *p;
X
register unsigned
X  length;
{
X  register char
X    c,
X    *q,
X    *sp;
X
X  q=p+length;
X  while (p < q)
X  {
X    sp=p+3;
X    c=(*sp);
X    *sp=(*p);
X    *p++=c;
X    sp=p+1;
X    c=(*sp);
X    *sp=(*p);
X    *p++=c;
X    p+=2;
X  }
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%  M S B F i r s t O r d e r S h o r t                                        %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Function MSBFirstOrderShort converts a least-significant byte first buffer
%  of short integers to most-significant byte first.
%
%  The format of the MSBFirstOrderShort routine is:
%
%       MSBFirstOrderShort(p,length);
%
%  A description of each parameter follows.
%
%   o  p:  Specifies a pointer to a buffer of integers.
%
%   o  length:  Specifies the length of the buffer.
%
%
*/
MSBFirstOrderShort(p,length)
register char
X  *p;
X
register unsigned
X  length;
{
X  register char
X    c,
X    *q;
X
X  q=p+length;
X  while (p < q)
X  {
X    c=(*p);
X    *p=(*(p+1));
X    p++;
X    *p++=c;
X  }
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   U s a g e                                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Procedure Usage displays the program usage;
%
%  The format of the Usage routine is:
%
%      Usage(message)
%
%  A description of each parameter follows:
%
%    message:  Specifies a specific message to display to the user.
%
*/
static void Usage(message)
char
X  *message;
{
X  if (message != (char *) NULL)
X    (void) fprintf(stderr,"Can't continue, %s\n\n",message);
X  (void) fprintf(stderr,"Usage: %s image.miff image.xwd\n\n",application_name);
X  (void) fprintf(stderr,"Specify 'image.miff' as '-' for standard input.\n");
X  (void) fprintf(stderr,"Specify 'image.xwd' as '-' for standard output.\n");
X  exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   W r i t e R a s t e r I m a g e                                           %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Procedure WriteXWDImage writes an image to a file on disk in XWD 
%  rasterfile format.
%
%  The format of the WriteXWDImage routine is:
%
%      WriteXWDImage(image)
%
%  A description of each parameter follows.
%
%    o image:  A pointer to a Image structure.
%
%
*/
static void WriteXWDImage(image)
Image
X  *image;
{
X  register int
X    i,
X    j,
X    x;
X
X  register RunlengthPacket
X    *p;
X
X  register unsigned char
X    *q;
X
X  unsigned char
X    *xwd_pixels;
X
X  unsigned long
X    lsb_first;
X
X  XWDFileHeader
X    xwd_header;
X
X  /*
X    Open output image file.
X  */
X  if (*image->filename == '-')
X    image->file=stdout;
X  else
X    if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0)
X      image->file=fopen(image->filename,"w");
X    else
X      {
X        char
X          command[256];
X
X        /*
X          Image file is compressed-- uncompress it.
X        */
X        (void) sprintf(command,"compress -c > %s",image->filename);
X        image->file=(FILE *) popen(command,"w");
X      }
X  if (image->file == (FILE *) NULL)
X    Error("unable to open file",image->filename);
X  /*
X    Initialize XWD file header.
X  */
X  xwd_header.header_size=sizeof(xwd_header)+strlen(image->filename)+1;
X  xwd_header.file_version=(unsigned long) XWD_FILE_VERSION;
X  xwd_header.pixmap_format=(unsigned long) ZPixmap;
X  xwd_header.pixmap_depth=(unsigned long) 
X    (image->class == DirectClass ? 24 : 8);
X  xwd_header.pixmap_width=(unsigned long) image->columns;
X  xwd_header.pixmap_height=(unsigned long) image->rows;
X  xwd_header.xoffset=(unsigned long) 0;
X  xwd_header.byte_order=(unsigned long) MSBFirst;
X  xwd_header.bitmap_unit=(unsigned long) 
X    (image->class == DirectClass ? 24 : 8);
X  xwd_header.bitmap_bit_order=(unsigned long) MSBFirst;
X  xwd_header.bitmap_pad=(unsigned long) 
X    (image->class == DirectClass ? 24 : 8);
X  xwd_header.bits_per_pixel=(unsigned long) 
X    (image->class == DirectClass ? 24 : 8);
X  xwd_header.bytes_per_line=(unsigned long) image->columns*
X    (image->class == DirectClass ? 3 : 1);
X  xwd_header.visual_class=(unsigned long) 
X    (image->class == DirectClass ? DirectColor : PseudoColor);
X  xwd_header.red_mask=(unsigned long) 
X    (image->class == DirectClass ? 0xff0000 : 0);
X  xwd_header.green_mask=(unsigned long) 
X    (image->class == DirectClass ? 0xff00 : 0);
X  xwd_header.blue_mask=(unsigned long) 
X    (image->class == DirectClass ? 0xff : 0);
X  xwd_header.bits_per_rgb=(unsigned long) 
X    (image->class == DirectClass ? 24 : 8);
X  xwd_header.colormap_entries=(unsigned long) 
X    (image->class == DirectClass ? 256 : image->colors);
X  xwd_header.ncolors=(image->class == DirectClass ? 0 : image->colors);
X  xwd_header.window_width=(unsigned long) image->columns;
X  xwd_header.window_height=(unsigned long) image->rows;
X  xwd_header.window_x=0;
X  xwd_header.window_y=0;
X  xwd_header.window_bdrwidth=(unsigned long) 0;
X  /*
X    Ensure the xwd_header byte-order is most-significant byte first.
X  */
X  lsb_first=1;
X  if (*(char *) &lsb_first)
X    MSBFirstOrderLong((char *) &xwd_header,sizeof(xwd_header));
X  (void) fwrite((char *) &xwd_header,sizeof(xwd_header),1,image->file);
X  (void) fwrite((char *) image->filename,1,strlen(image->filename)+1,
X    image->file);
X  if (image->class == PseudoClass)
X    {
X      XColor
X        *colors;
X
X      /*
X         Dump colormap to file.
X      */
X      colors=(XColor *) malloc((unsigned int) image->colors*sizeof(XColor));
X      if (colors == (XColor *) NULL)
X        Error("unable to allocate memory",(char *) NULL);
X      for (i=0; i < image->colors; i++)
X      {
X        colors[i].pixel=i;
X        colors[i].red=image->colormap[i].red << 8;
X        colors[i].green=image->colormap[i].green << 8;
X        colors[i].blue=image->colormap[i].blue << 8;
X        colors[i].flags=DoRed | DoGreen | DoBlue;
X        colors[i].pad=0;
X        if (*(char *) &lsb_first)
X          {
X            MSBFirstOrderLong((char *) &colors[i].pixel,sizeof(long));
X            MSBFirstOrderShort((char *) &colors[i].red,3*sizeof(short));
X          }
X      }
X      (void) fwrite((char *) colors,sizeof(XColor),image->colors,image->file);
X      (void) free((char *) colors);
X    }
X  /*
X    Convert MIFF to XWD raster pixels.
X  */
X  xwd_pixels=(unsigned char *) 
X    malloc((unsigned int) xwd_header.bytes_per_line*xwd_header.pixmap_height);
X  if (xwd_pixels == (unsigned char *) NULL)
X    Error("unable to allocate memory",(char *) NULL);
X  p=image->pixels;
X  q=xwd_pixels;
X  x=0;
X  for (i=0; i < image->packets; i++)
X  {
X    for (j=0; j <= p->length; j++)
X    {
X      if (image->class == PseudoClass)
X        *q++=p->index;
X      else
X        {
X          *q++=p->red;
X          *q++=p->green;
X          *q++=p->blue;
X        }
X    }
X    p++;
X  }
X  /*
X    Dump pixels to file.
X  */
X  (void) fwrite((char *) xwd_pixels,sizeof(char),
X    xwd_header.bytes_per_line*xwd_header.pixmap_height,image->file);
X  (void) free((char *) xwd_pixels);
X  if (image->file != stdin)
X    if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0)
X      (void) fclose(image->file);
X    else
X      (void) pclose(image->file);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%    M a i n                                                                  %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
*/
int main(argc,argv)
int
X  argc;
X
char
X  *argv[];
{
X  Image
X    *image;
X
X  application_name=argv[0];
X  if (argc < 3)
X    Usage((char *) NULL);
X  image=ReadImage(argv[1]);
X  if (image == (Image *) NULL)
X    exit(1);
X  (void) strcpy(image->filename,argv[2]);
X  WriteXWDImage(image);
X  (void) fprintf(stderr,"%s=> %s  %dx%d\n",argv[1],argv[2],image->columns,
X    image->rows);
X  return(False);
}
SHAR_EOF
chmod 0755 ImageMagick/filters/MIFFtoXWD.c ||
echo 'restore of ImageMagick/filters/MIFFtoXWD.c failed'
Wc_c="`wc -c < 'ImageMagick/filters/MIFFtoXWD.c'`"
test 15929 -eq "$Wc_c" ||
	echo 'ImageMagick/filters/MIFFtoXWD.c: original size 15929, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= ImageMagick/filters/README ==============
if test -f 'ImageMagick/filters/README' -a X"$1" != X"-c"; then
	echo 'x - skipping ImageMagick/filters/README (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting ImageMagick/filters/README (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/README' &&
X  The X utilites read and write MIFF images.  You can find filters to
X  convert to and from the MIFF format in this directory.  
X
X  To compile, type
X
X    xmkmf
X    make
X
X  Two examples of using a filter follow:
X
X    GIFtoMIFF image.gif - | display -
X
X      or
X
X    TIFFtoMIFF image.tiff image.miff
X    display image.miff
X
X  The TIFFtoMIFF and MIFFtoTIFF filters require Sam Leffler's TIFF
X  software available via FTP as ucbvax.berkeley.edu:pub/tiff/v2.2.tar.Z.
X
X  The PPMtoMIFF and MIFFtoPPM filters require Jef Poskanzer's PBMPLUS
X  software available via FTP as export.lcs.mit.edu:contrib/pbmplus.tar.Z.
X
X  To succesfully compile the PPMtoMIFF and MIFFtoPPM filters, first compile
X  the pbmplus routines.  Next copy pbmplus.h, pbm/pbm.h, pgm/pgm.h, 
X  ppm/ppm.h, and pnm/pnm.h to /usr/local/include.  Change
X
X    #include "../pbmplus.h"
X
X  to
X
X    #include "pbmplus.h"
X
X  in /usr/local/include/pbm.h.
X
X  Next copy pbm/libpbm.a, pgm/libpgm.a, ppm/libppm.a, and pnm/libpnm.a
X  to /usr/local/lib.
X
X  Finally, type 
X
X    make PPMtoMIFF
X    make MIFFtoPPM
X
SHAR_EOF
chmod 0755 ImageMagick/filters/README ||
echo 'restore of ImageMagick/filters/README failed'
Wc_c="`wc -c < 'ImageMagick/filters/README'`"
test 1055 -eq "$Wc_c" ||
	echo 'ImageMagick/filters/README: original size 1055, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= ImageMagick/filters/RGBtoMIFF.c ==============
if test -f 'ImageMagick/filters/RGBtoMIFF.c' -a X"$1" != X"-c"; then
	echo 'x - skipping ImageMagick/filters/RGBtoMIFF.c (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting ImageMagick/filters/RGBtoMIFF.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/RGBtoMIFF.c' &&
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%                 IIIII  M   M  PPPP    OOO   RRRR    TTTTT                   %
%                   I    MM MM  P   P  O   O  R   R     T                     %
%                   I    M M M  PPPP   O   O  RRRR      T                     %
%                   I    M   M  P      O   O  R R       T                     %
%                 IIIII  M   M  P       OOO   R  R      T                     % 
%                                                                             %
%                                                                             %
%                 Import RGB raster image to a MIFF format.                   %
%                                                                             %
%                                                                             %
%                                                                             %
%                           Software Design                                   %
%                             John Cristy                                     %
%                            January  1991                                    %
%                                                                             %
%                                                                             %
%  Copyright 1991 E. I. Dupont de Nemours & Company                           %
%                                                                             %
%  Permission to use, copy, modify, distribute, and sell this software and    %
%  its documentation for any purpose is hereby granted without fee,           %
%  provided that the above Copyright notice appear in all copies and that     %
%  both that Copyright notice and this permission notice appear in            %
%  supporting documentation, and that the name of E. I. Dupont de Nemours     %
%  & Company not be used in advertising or publicity pertaining to            %
%  distribution of the software without specific, written prior               %
%  permission.  E. I. Dupont de Nemours & Company makes no representations    %
%  about the suitability of this software for any purpose.  It is provided    %
%  "as is" without express or implied warranty.                               %
%                                                                             %
%  E. I. Dupont de Nemours & Company disclaims all warranties with regard     %
%  to this software, including all implied warranties of merchantability      %
%  and fitness, in no event shall E. I. Dupont de Nemours & Company be        %
%  liable for any special, indirect or consequential damages or any           %
%  damages whatsoever resulting from loss of use, data or profits, whether    %
%  in an action of contract, negligence or other tortious action, arising     %
%  out of or in connection with the use or performance of this software.      %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 
%  Command syntax:
%
%  import width height image.rgb image.miff
%  
%  Specify 'image.rgb' as '-' for standard input.  
%  Specify 'image.miff' as '-' for standard output.
%  
%
*/
X
#include <string.h>
#include "display.h"
#include "image.h"
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   E r r o r                                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Function Error displays an error message and then terminates the program.
%
%  The format of the Error routine is:
%
%      Error(message,qualifier)
%
%  A description of each parameter follows:
%
%    o message:  Specifies the message to display before terminating the
%      program.
%
%    o qualifier:  Specifies any qualifier to the message.
%
%
*/
static void Error(message,qualifier)
char
X  *message,
X  *qualifier;
{
X  (void) fprintf(stderr,"%s: %s",application_name,message); 
X  if (qualifier != (char *) NULL)
X    (void) fprintf(stderr," %s",qualifier);
X  (void) fprintf(stderr,".\n");
X  exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%  R e a d R G B I m a g e                                                    %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Function ReadRGBImage reads an image file and returns it.  It allocates the 
%  memory necessary for the new Image structure and returns a pointer to the 
%  new image.
%
%  The format of the ReadRGBImage routine is:
%
%      image=ReadRGBImage(filename,columns,rows)
%
%  A description of each parameter follows:
%
%    o image:  Function ReadRGBImage returns a pointer to the image after 
%      reading.  A null image is returned if there is a a memory shortage or 
%      if the image cannot be read.
%
%    o filename:  Specifies the name of the image to read.
%
%
*/
static Image *ReadRGBImage(filename,columns,rows)
char
X  *filename;
X
unsigned int
X  columns,
X  rows;
{
X  Image
X    *image;
X
X  register int
X    i;
X
X  register RunlengthPacket
X    *q;
X
X  register unsigned char
X    blue,
X    green,
X    *p,
X    red;
X
X  unsigned char
X    *rgb_pixels;
X
X  /*
X    Allocate image structure.
X  */
X  image=(Image *) malloc(sizeof(Image));
X  if (image == (Image *) NULL)
X    Error("memory allocation error",(char *) NULL);
X  /*
X    Initialize Image structure.
X  */
X  image->id=UnknownId;
X  image->class=DirectClass;
X  image->compression=RunlengthEncodedCompression;
X  image->columns=columns;
X  image->rows=rows;
X  image->packets=0;
X  image->colors=0;
X  image->scene=0;
X  image->colormap=(ColorPacket *) NULL;
X  image->pixels=(RunlengthPacket *) NULL;
X  image->comments=(char *) NULL;
X  /*
X    Open image file.
X  */
X  (void) strcpy(image->filename,filename);
X  if (*image->filename == '-')
X    image->file=stdin;
X  else
X    if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0)
X      image->file=fopen(image->filename,"r");
X    else
X      {
X        char
X          command[256];
X
X        /*
X          Image file is compressed-- uncompress it.
X        */
X        (void) sprintf(command,"uncompress -c %s",image->filename);
X        image->file=(FILE *) popen(command,"r");
X      }
X  if (image->file == (FILE *) NULL)
X    Error("unable to open file",image->filename);
X  /*
X    Create image.
X  */
X  rgb_pixels=(unsigned char *) 
X    malloc(3*image->columns*image->rows*sizeof(unsigned char));
X  image->pixels=(RunlengthPacket *) 
X    malloc(image->columns*image->rows*sizeof(RunlengthPacket));
X  if ((rgb_pixels == (unsigned char *) NULL) ||
X      (image->pixels == (RunlengthPacket *) NULL))
X    Error("memory allocation error",(char *) NULL);
X  /*
X    Convert raster image to runlength-encoded packets.
X  */
X  (void) ReadData((char *) rgb_pixels,3,image->columns*image->rows,
X    image->file);
X  p=rgb_pixels;
X  image->packets=0;
X  q=image->pixels;
X  q->length=MaxRunlength;
X  for (i=0; i < (image->columns*image->rows); i++)
X  {
X    red=(*p++);
X    green=(*p++);
X    blue=(*p++);
X    if ((red == q->red) && (green == q->green) && (blue == q->blue) && 
X        (q->length < MaxRunlength))
X      q->length++;
X    else
X      {
X        if (image->packets > 0)
X          q++;
X        image->packets++;
X        q->red=red;
X        q->green=green;
X        q->blue=blue;
X        q->index=0;
X        q->length=0;
X      }
X  }
X  (void) free((char *) rgb_pixels);
X  if (image->file != stdin)
X    if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0)
X      (void) fclose(image->file);
X    else
X      (void) pclose(image->file);
X  if (image->packets > ((image->columns*image->rows*3) >> 2))
X    image->compression=NoCompression;
X  image->pixels=(RunlengthPacket *)
X    realloc((char *) image->pixels,image->packets*sizeof(RunlengthPacket));
X  return(image);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   U s a g e                                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Function Usage displays the program usage;
%
%  The format of the Usage routine is:
%
%      Usage(message)
%
%  A description of each parameter follows:
%
%    message:  Specifies a specific message to display to the user.
%
*/
static void Usage(message)
char
X  *message;
{
X  if (message != (char *) NULL)
X    (void) fprintf(stderr,"Can't continue, %s\n\n",message);
X  (void) fprintf(stderr,
X    "Usage: %s [-scene] width height image.rgb image.miff\n",application_name);
X  (void) fprintf(stderr,"\nSpecify 'image.rgb' as '-' for standard input.\n");
X  (void) fprintf(stderr,"Specify 'image.miff' as '-' for standard output.\n");
X  exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%  M a i n                                                                    %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
*/
int main(argc,argv)
int
X  argc;
X   
char
X  *argv[];
{
X  char
X    filename[256];
X
X  Image
X    *image;
X
X  int
X    i;
X
X  unsigned int
X    columns,
X    rows,
X    scene;
X
X  /*
X    Initialize program variables.
X  */
X  application_name=argv[0];
X  i=1;
X  scene=0;
X  if (argc < 5)
X    Usage((char *) NULL);
X  /*
X    Read image and convert to MIFF format.
X  */
X  if (strncmp(argv[i],"-scene",2) == 0)
X    {
X      i++;
X      scene=atoi(argv[i++]);
X    }
X  columns=atoi(argv[i++]);
X  rows=atoi(argv[i++]);
X  (void) strcpy(filename,argv[i++]);
X  image=ReadRGBImage(filename,columns,rows);
X  if (image == (Image *) NULL)
X    exit(1);
X  (void) strcpy(image->filename,argv[i++]);
X  image->scene=scene;
X  (void) WriteImage(image);
X  (void) fprintf(stderr,"%s => %s  %dx%d\n",filename,image->filename,
X    image->columns,image->rows);
X  DestroyImage(image);
X  return(False);
}
SHAR_EOF
chmod 0755 ImageMagick/filters/RGBtoMIFF.c ||
echo 'restore of ImageMagick/filters/RGBtoMIFF.c failed'
Wc_c="`wc -c < 'ImageMagick/filters/RGBtoMIFF.c'`"
test 12104 -eq "$Wc_c" ||
	echo 'ImageMagick/filters/RGBtoMIFF.c: original size 12104, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= ImageMagick/filters/MIFFtoGIF.c ==============
if test -f 'ImageMagick/filters/MIFFtoGIF.c' -a X"$1" != X"-c"; then
	echo 'x - skipping ImageMagick/filters/MIFFtoGIF.c (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting ImageMagick/filters/MIFFtoGIF.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/filters/MIFFtoGIF.c' &&
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%                 EEEEE  X   X  PPPP    OOO   RRRR    TTTTT                   %
%                 E       X X   P   P  O   O  R   R     T                     %
%                 EEE      X    PPPP   O   O  RRRR      T                     %
%                 E       X X   P      O   O  R R       T                     %
%                 EEEEE  X   X  P       OOO   R  R      T                     %
%                                                                             %
%                                                                             %
%                  Export MIFF image to a GIF raster format.                  %
%                                                                             %
%                                                                             %
%                                                                             %
%                           Software Design                                   %
%                             John Cristy                                     %
%                            January  1991                                    %
%                                                                             %
%                                                                             %
%  Copyright 1991 E. I. Dupont de Nemours & Company                           %
%                                                                             %
%  Permission to use, copy, modify, distribute, and sell this software and    %
%  its documentation for any purpose is hereby granted without fee,           %
%  provided that the above Copyright notice appear in all copies and that     %
%  both that Copyright notice and this permission notice appear in            %
%  supporting documentation, and that the name of E. I. Dupont de Nemours     %
%  & Company not be used in advertising or publicity pertaining to            %
%  distribution of the software without specific, written prior               %
%  permission.  E. I. Dupont de Nemours & Company makes no representations    %
%  about the suitability of this software for any purpose.  It is provided    %
%  "as is" without express or implied warranty.                               %
%                                                                             %
%  E. I. Dupont de Nemours & Company disclaims all warranties with regard     %
%  to this software, including all implied warranties of merchantability      %
%  and fitness, in no event shall E. I. Dupont de Nemours & Company be        %
%  liable for any special, indirect or consequential damages or any           %
%  damages whatsoever resulting from loss of use, data or profits, whether    %
%  in an action of contract, negligence or other tortious action, arising     %
%  out of or in connection with the use or performance of this software.      %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Command syntax:
%
%  export image.miff image.gif
%
%  Specify 'image.miff' as '-' for standard input.  
%  Specify 'image.gif' as '-' for standard output.
%
%
*/
X
#include "display.h"
#include "image.h"
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   E r r o r                                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Function Error displays an error message and then terminates the program.
%
%  The format of the Error routine is:
%
%      Error(message,qualifier)
%
%  A description of each parameter follows:
%
%    o message:  Specifies the message to display before terminating the
%      program.
%
%    o qualifier:  Specifies any qualifier to the message.
%
%
*/
void Error(message,qualifier)
char
X  *message,
X  *qualifier;
{
X  (void) fprintf(stderr,"%s: %s",application_name,message); 
X  if (qualifier != (char *) NULL)
X    (void) fprintf(stderr," %s",qualifier);
X  (void) fprintf(stderr,".\n");
X  exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   U s a g e                                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Procedure Usage displays the program usage;
%
%  The format of the Usage routine is:
%
%      Usage(message)
%
%  A description of each parameter follows:
%
%    message:  Specifies a specific message to display to the user.
%
*/
static void Usage(message)
char
X  *message;
{
X  if (message != (char *) NULL)
X    (void) fprintf(stderr,"Can't continue,%s\n\n",message);
X  (void) fprintf(stderr,"Usage: %s image.miff image.gif\n\n",application_name);
X  (void) fprintf(stderr,"Specify 'image.miff' as '-' for standard input.\n");
X  (void) fprintf(stderr,"Specify 'image.gif' as '-' for standard output.\n");
X  exit(1);
}
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%   W r i t e G I F I m a g e                                                 %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Procedure WriteGIFImage writes an image to a file on disk in GIF 
%  rasterfile format.
%
%  The format of the WriteGIFImage routine is:
%
%      WriteGIFImage(image)
%
%  A description of each parameter follows.
%
%    o image:  A pointer to a Image structure.
%
%
*/
static void WriteGIFImage(image)
Image
X  *image;
{
X  register int
X    i,
X    j,
X    x;
X
X  register RunlengthPacket
X    *p;
X
X  register unsigned char
X    *q;
X
X  unsigned char
X    Blue[256],
X    Green[256],
X    *pixels,
X    Red[256];
X
X /*
X    Open output image file.
X  */
X  if (*image->filename == '-')
X    image->file=stdout;
X  else
X    if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0)
X      image->file=fopen(image->filename,"w");
X    else
X      {
X        char
X          command[256];
X
X       /*
X          Image file is compressed-- uncompress it.
X        */
X        (void) sprintf(command,"compress -c > %s",image->filename);
X        image->file=(FILE *) popen(command,"w");
X      }
X  if (image->file == (FILE *) NULL)
X    Error("unable to open file",image->filename);
X /*
X    Image must be less than or equal to 256 colors.
X  */
X  if ((image->class == DirectClass) || (image->colors > 256))
X    QuantizeImage(image,256,0,False,True);
X  for (i=0; i < image->colors; i++)
X  {
X    Red[i]=image->colormap[i].red;
X    Green[i]=image->colormap[i].green;
X    Blue[i]=image->colormap[i].blue;
X  }
X /*
X    Convert runlength packets to a rectangular array of colormap indexes.
X  */
X  pixels=(unsigned char *) 
X    malloc(image->columns*image->rows*sizeof(unsigned char));
X  if (pixels == (unsigned char *) NULL)
X    Error("unable to allocate memory",(char *) NULL);
X  p=image->pixels;
X  q=pixels;
X  for (i=0; i < image->packets; i++)
X  {
X    for (j=0; j <= p->length; j++)
X      *q++=p->index;
X    p++;
X  }
X /*
X    Convert MIFF to GIF raster pixels.
X  */
X  WriteGIF(image->file,pixels,image->columns,image->rows,Red,Green,Blue,
X    image->colors,image->colors == 2 ? 2 : 0);
X  (void) free((char *) pixels);
X  if (image->file != stdin)
X    if (strcmp(image->filename+strlen(image->filename)-2,".Z") != 0)
X      (void) fclose(image->file);
X    else
X      (void) pclose(image->file);
}
X
/*****************************************************************
X * Portions of this code Copyright (C) 1989 by Michael Mauldin.
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 * and the names of all authors are retained unchanged.
X *
X * Authors:  Michael Mauldin (mlm at cs.cmu.edu)
X *           David Rowley (mgardi at watdcsu.waterloo.edu)
X *
X * Based on: compress.c - File compression ala IEEE Computer,June 1984.
X *
X *  Spencer W. Thomas       (decvax!harpo!utah-cs!utah-gr!thomas)
X *  Jim McKie               (decvax!mcvax!jim)
X *  Steve Davies            (decvax!vax135!petsd!peora!srd)
X *  Ken Turkowski           (decvax!decwrl!turtlevax!ken)
X *  James A. Woods          (decvax!ihnp4!ames!jaw)
X *  Joe Orost               (decvax!vax135!petsd!joe)
X *****************************************************************/
X
typedef long int        count_int;
X
static int  Width,Height;
static int  curx,cury;
static long CountDown;
static int  Interlace;
static unsigned char bw[2]={0,0xff};
X
static void putword(),compress(),output(),cl_block(),cl_hash();
static void char_init(),char_out(),flush_char();
X
/*************************************************************/
int WriteGIF(fp,pic,w,h,rmap,gmap,bmap,numcols,colorstyle)
FILE *fp;
unsigned char *pic;
int   w,h;
unsigned char *rmap,*gmap,*bmap;
int   numcols,colorstyle;
{
X  int RWidth,RHeight;
X  int LeftOfs,TopOfs;
X  int Resolution,ColorMapSize,InitCodeSize,Background,BitsPerPixel;
X  int i,j;
X
X
X /* if writing B/W stipple... */
X  if (colorstyle==2) {
X    rmap=gmap=bmap=bw;
X    numcols=2;
X  }
X
X  Interlace=0;
X  Background=0;
X
X /* figure out 'BitsPerPixel' */
X  for (i=1; i<8; i++)
X    if ((1<<i) >= numcols) break;
X  
X  BitsPerPixel=i;
X
X  ColorMapSize=1 << BitsPerPixel;
X  
X  RWidth =Width =w;
X  RHeight=Height=h;
X  LeftOfs=TopOfs=0;
X  
X  Resolution=BitsPerPixel;
X
X  CountDown=w * h;   /* # of pixels we'll be doing */
X
X  if (BitsPerPixel <= 1) InitCodeSize=2;
X                    else InitCodeSize=BitsPerPixel;
X
X  curx=cury=0;
X
X  if (!fp) {
X    fprintf(stderr, "WriteGIF: file not open for writing\n");
X    return (1);
X  }
X
X  fwrite("GIF87a",1,6,fp);   /* the GIF magic number */
X
X  putword(RWidth,fp);          /* screen descriptor */
X  putword(RHeight,fp);
X
X  i=0x80;                  /* Yes,there is a color map */
X  i |= (8-1)<<4;                /* OR in the color resolution (hardwired 8) */
X  i |= (BitsPerPixel - 1);      /* OR in the # of bits per pixel */
X  fputc(i,fp);          
X
X  fputc(Background,fp);        /* background color */
X
X  fputc(0,fp);                 /* future expansion unsigned char */
X
X
X  if (colorstyle == 1) {        /* greyscale */
X    for (i=0; i<ColorMapSize; i++) {
X      j=(rmap[i]*77+gmap[i]*150+bmap[i]*29) >> 8;
X      fputc(j,fp);
X      fputc(j,fp);
X      fputc(j,fp);
X    }
X  }
X  else {
X    for (i=0; i<ColorMapSize; i++) {      /* write out Global colormap */
X      fputc(rmap[i],fp);
X      fputc(gmap[i],fp);
X      fputc(bmap[i],fp);
X    }
X  }
X
X  fputc(',',fp);             /* image separator */
X
X /* Write the Image header */
X  putword(LeftOfs,fp);
X  putword(TopOfs, fp);
X  putword(Width,  fp);
X  putword(Height, fp);
X  if (Interlace) fputc(0x40,fp);  /* Use Global Colormap,maybe Interlace */
X            else fputc(0x00,fp);
X
X  fputc(InitCodeSize,fp);
X  compress(InitCodeSize+1,fp,pic,w*h);
X
X  fputc(0,fp);                     /* Write out a Zero-length packet (EOF) */
X  fputc(';',fp);                   /* Write GIF file terminator */
X
X  return (0);
}
X
/******************************/
static void putword(w,fp)
int w;
FILE *fp;
{
X /* writes a 16-bit integer in GIF order (LSB first) */
X  fputc(w & 0xff,fp);
X  fputc((w>>8)&0xff,fp);
}
X
X
X
X
/***********************************************************************/
X
X
static unsigned long cur_accum=0;
static int           cur_bits=0;
X
X
#define min(a,b)        ((a>b) ? b : a)
X
#define BITS  12
#define MSDOS  1
X
#define HSIZE  5003           /* 80% occupancy */
X
typedef unsigned char   char_type;
X
X
static int n_bits;                  /* number of bits/code */
static int maxbits=BITS;          /* user settable max # bits/code */
static int maxcode;                 /* maximum code,given n_bits */
static int maxmaxcode=1 << BITS;  /* NEVER generate this */
X
#define MAXCODE(n_bits)     ((1 << (n_bits)) - 1)
X
static  count_int      htab [HSIZE];
static  unsigned short codetab [HSIZE];
#define HashTabOf(i)   htab[i]
#define CodeTabOf(i)   codetab[i]
X
static int hsize=HSIZE;           /* for dynamic table sizing */
X
/*
X * To save much memory,we overlay the table used by compress() with those
X * used by decompress().  The tab_prefix table is the same size and type
X * as the codetab.  The tab_suffix table needs 2**BITS characters.  We
X * get this from the beginning of htab.  The output stack uses the rest
X * of htab,and contains characters.  There is plenty of room for any
X * possible stack (stack used to be 8000 characters).
X */
X
#define tab_prefixof(i) CodeTabOf(i)
#define tab_suffixof(i)        ((char_type *)(htab))[i]
#define de_stack               ((char_type *)&tab_suffixof(1<<BITS))
X
static int free_ent=0;                 /* first unused entry */
X
/*
X * block compression parameters -- after all codes are used up,
X * and compression rate changes,start over.
X */
static int clear_flg=0;
X
static long int in_count=1;           /* length of input */
static long int out_count=0;          /* # of codes output (for debugging) */
X
/*
X * compress stdin to stdout
X *
X * Algorithm:  use open addressing double hashing (no chaining) on the 
X * prefix code/g next character combination.  We do a variant of Knuth's
X * algorithm D (vol. 3,sec. 6.4) along with G. Knott's relatively-prime
X * secondary probe.  Here,the modular division first probe is gives way
X * to a faster exclusive-or manipulation.  Also do block compression with
X * an adaptive reset,whereby the code table is cleared when the compression
X * ratio decreases,but after the table fills.  The variable-length output
X * codes are re-sized at this point,and a special CLEAR code is generated
X * for the decompressor.  Late addition:  construct the table according to
X * file size for noticeable speed improvement on small files.  Please direct
X * questions about this implementation to ames!jaw.
X */
X
static int g_init_bits;
static FILE *g_outfile;
X
static int ClearCode;
static int EOFCode;
X
X
/********************************************************/
static void compress(init_bits,outfile,data,len)
int   init_bits;
FILE *outfile;
unsigned char *data;
int   len;
{
X  register long fcode;
X  register int i=0;
X  register int c;
X  register int ent;
X  register int disp;
X  register int hsize_reg;
X  register int hshift;
X
X /*
X   * Set up the globals:  g_init_bits - initial number of bits
X   *                      g_outfile   - pointer to output file
X   */
X  g_init_bits=init_bits;
X  g_outfile  =outfile;
X
X /* initialize 'compress' globals */
X  maxbits=BITS;
X  maxmaxcode=1<<BITS;
X  memset((char *) htab,0,sizeof(htab));
X  memset((char *) codetab,0,sizeof(codetab));
X  hsize=HSIZE;
X  free_ent=0;
X  clear_flg=0;
X  in_count=1;
X  out_count=0;
X  cur_accum=0;
X  cur_bits=0;
X
X /*
X   * Set up the necessary values
X   */
X  out_count=0;
X  clear_flg=0;
X  in_count=1;
X  maxcode=MAXCODE(n_bits=g_init_bits);
X
X  ClearCode=(1 << (init_bits - 1));
X  EOFCode=ClearCode+1;
X  free_ent=ClearCode+2;
X
X  char_init();
X  ent=(*data++);  len--;
X
X  hshift=0;
X  for (fcode=(long) hsize;  fcode < 65536L; fcode *= 2L)
X    hshift++;
X  hshift=8 - hshift;               /* set hash code range bound */
X
X  hsize_reg=hsize;
X  cl_hash((count_int) hsize_reg);           /* clear hash table */
X
X  output(ClearCode);
X    
X  while (len) {
X    c=(*data++);  len--;
X    in_count++;
X
X    fcode=(long) (((long) c << maxbits)+ent);
X    i=(((int) c << hshift) ^ ent);   /* xor hashing */
X
X    if (HashTabOf (i) == fcode) {
X      ent=CodeTabOf (i);
X      continue;
X    }
X
X    else if ((long)HashTabOf (i) < 0)     /* empty slot */
X      goto nomatch;
X
X    disp=hsize_reg - i;          /* secondary hash (after G. Knott) */
X    if (i == 0)
X      disp=1;
X
probe:
X    if ((i -= disp) < 0)
X      i += hsize_reg;
X
X    if (HashTabOf (i) == fcode) {
X      ent=CodeTabOf (i);
X      continue;
X    }
X
X    if ((long)HashTabOf (i) > 0) 
X      goto probe;
X
nomatch:
X    output(ent);
X    out_count++;
X    ent=c;
X
X    if (free_ent < maxmaxcode) {
X      CodeTabOf (i)=free_ent++;/* code -> hashtable */
X      HashTabOf (i)=fcode;
X    }
X    else
X      cl_block();
X  }
X
X /* Put out the final code */
X  output(ent);
X  out_count++;
X  output(EOFCode);
}
X
X
/*****************************************************************
X * TAG(output)
X *
X * Output the given code.
X * Inputs:
X *      code:   A n_bits-bit integer.  If == -1,then EOF.  This assumes
X *              that n_bits =< (long)wordsize - 1.
X * Outputs:
X *      Outputs code to the file.
X * Assumptions:
X *      Chars are 8 bits long.
X * Algorithm:
X *      Maintain a BITS character long buffer (so that 8 codes will
X * fit in it exactly).  Use the VAX insv instruction to insert each
X * code in turn.  When the buffer fills up empty it and start over.
X */
X
static
unsigned long masks[]={ 0x0000,0x0001,0x0003,0x0007,0x000F,
X                                  0x001F,0x003F,0x007F,0x00FF,
X                                  0x01FF,0x03FF,0x07FF,0x0FFF,
X                                  0x1FFF,0x3FFF,0x7FFF,0xFFFF };
X
static void output(code)
int code;
{
X  cur_accum &= masks[cur_bits];
X
X  if (cur_bits > 0)
X    cur_accum |= ((long)code << cur_bits);
X  else
X    cur_accum=code;
X  
X  cur_bits += n_bits;
X
X  while(cur_bits >= 8) {
X    char_out((unsigned int) (cur_accum & 0xff));
X    cur_accum >>= 8;
X    cur_bits -= 8;
X  }
X
X /*
X   * If the next entry is going to be too big for the code size,
X   * then increase it,if possible.
X   */
X
X  if (free_ent > maxcode || clear_flg) {
X
X    if(clear_flg) {
X      maxcode=MAXCODE (n_bits=g_init_bits);
X      clear_flg=0;
X    }
X    else {
X      n_bits++;
X      if (n_bits == maxbits)
X  maxcode=maxmaxcode;
X      else
X  maxcode=MAXCODE(n_bits);
X    }
X  }
X  
X  if(code == EOFCode) {
X   /* At EOF,write the rest of the buffer */
X    while(cur_bits > 0) {
X      char_out((unsigned int)(cur_accum & 0xff));
X      cur_accum >>= 8;
X      cur_bits -= 8;
X    }
X
X    flush_char();
X  
X    fflush(g_outfile);
X
X    if(ferror(g_outfile))
X      Error("unable to write GIF file",(char *) NULL);
X  }
}
X
X
/********************************/
static void cl_block ()            /* table clear for block compress */
{
X /* Clear out the hash table */
X
X  cl_hash ((count_int) hsize);
X  free_ent=ClearCode+2;
X  clear_flg=1;
X
X  output(ClearCode);
}
X
X
/********************************/
static void cl_hash(hsize)         /* reset code table */
register count_int hsize;
{
X  register count_int *htab_p=htab+hsize;
X  register long i;
X  register long m1=(-1);
X
X  i=hsize - 16;
X  do {                           /* might use Sys V memset(3) here */
X    *(htab_p-16)=m1;
X    *(htab_p-15)=m1;
X    *(htab_p-14)=m1;
X    *(htab_p-13)=m1;
X    *(htab_p-12)=m1;
X    *(htab_p-11)=m1;
X    *(htab_p-10)=m1;
X    *(htab_p-9)=m1;
X    *(htab_p-8)=m1;
X    *(htab_p-7)=m1;
X    *(htab_p-6)=m1;
X    *(htab_p-5)=m1;
X    *(htab_p-4)=m1;
X    *(htab_p-3)=m1;
X    *(htab_p-2)=m1;
X    *(htab_p-1)=m1;
X    htab_p -= 16;
X  } while ((i -= 16) >= 0);
X
X  for (i += 16; i > 0; i--)
X    *--htab_p=m1;
}
X
X
/******************************************************************************
X *
X * GIF Specific routines
X *
X ******************************************************************************/
X
/*
X * Number of characters so far in this 'packet'
X */
static int a_count;
X
/*
X * Set up the 'unsigned char output' routine
X */
static void char_init()
{
X  a_count=0;
}
X
/*
X * Define the storage for the packet accumulator
X */
static char accum[256];
X
/*
X * Add a character to the end of the current packet,and if it is 254
X * characters,flush the packet to disk.
X */
static void char_out(c)
int c;
{
X  accum[a_count++]=c;
X  if(a_count >= 254) 
X    flush_char();
}
X
/*
X * Flush the packet to disk,and reset the accumulator
X */
static void flush_char()
{
X  if(a_count > 0) {
X    fputc(a_count,g_outfile);
X    fwrite(accum,1,a_count,g_outfile);
X    a_count=0;
X  }
}  
X
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%    M a i n                                                                  %
%                                                                             %
%                                                                             %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
*/
int main(argc,argv)
int
X  argc;
X
char
X  *argv[];
{
X  Image
X    *image;
X
X  application_name=argv[0];
X  if (argc < 3)
X    Usage((char *) NULL);
X  image=ReadImage(argv[1]);
X  if (image == (Image *) NULL)
X    exit(1);
X  (void) strcpy(image->filename,argv[2]);
X  WriteGIFImage(image);
X  (void) fprintf(stderr,"%s=> %s  %dx%d\n",argv[1],argv[2],image->columns,
X    image->rows);
X  return(False);
}
SHAR_EOF
chmod 0755 ImageMagick/filters/MIFFtoGIF.c ||
echo 'restore of ImageMagick/filters/MIFFtoGIF.c failed'
Wc_c="`wc -c < 'ImageMagick/filters/MIFFtoGIF.c'`"
test 22524 -eq "$Wc_c" ||
	echo 'ImageMagick/filters/MIFFtoGIF.c: original size 22524, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= ImageMagick/display.c ==============
if test -f 'ImageMagick/display.c' -a X"$1" != X"-c"; then
	echo 'x - skipping ImageMagick/display.c (File already exists)'
	rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting ImageMagick/display.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/display.c' &&
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                             %
%                                                                             %
%                                                                             %
%             DDDD   IIIII  SSSSS  PPPP   L       AAA   Y   Y                 %
%             D   D    I    SS     P   P  L      A   A   Y Y                  %
%             D   D    I     SSS   PPPP   L      AAAAA    Y                   %
%             D   D    I       SS  P      L      A   A    Y                   %
%             DDDD   IIIII  SSSSS  P      LLLLL  A   A    Y                   %
%                                                                             %
%                                                                             %
%          Display Machine Independent File Format Image via X11.             %
%                                                                             %
%                                                                             %
%                                                                             %
%                           Software Design                                   %
%                             John Cristy                                     %
%                            January  1991                                    %
%                                                                             %
%                                                                             %
%  Copyright 1991 E. I. Dupont de Nemours & Company                           %
%                                                                             %
%  Permission to use, copy, modify, distribute, and sell this software and    %
%  its documentation for any purpose is hereby granted without fee,           %
%  provided that the above Copyright notice appear in all copies and that     %
%  both that Copyright notice and this permission notice appear in            %
%  supporting documentation, and that the name of E. I. Dupont de Nemours     %
%  & Company not be used in advertising or publicity pertaining to            %
%  distribution of the software without specific, written prior               %
%  permission.  E. I. Dupont de Nemours & Company makes no representations    %
%  about the suitability of this software for any purpose.  It is provided    %
%  "as is" without express or implied warranty.                               %
%                                                                             %
%  E. I. Dupont de Nemours & Company disclaims all warranties with regard     %
%  to this software, including all implied warranties of merchantability      %
%  and fitness, in no event shall E. I. Dupont de Nemours & Company be        %
%  liable for any special, indirect or consequential damages or any           %
%  damages whatsoever resulting from loss of use, data or profits, whether    %
%  in an action of contract, negligence or other tortious action, arising     %
%  out of or in connection with the use or performance of this software.      %
%                                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Display is a machine architecture independent image processing
%  and display program.  It can display any image in the MIFF format on
%  any workstation display running X.  Display first determines the
%  hardware capabilities of the workstation.  If the number of unique
%  colors in the image is less than or equal to the number the workstation
%  can support, the image is displayed in an X window.  Otherwise the
%  number of colors in the image is first reduced to match the color
%  resolution of the workstation before it is displayed.
%
%  This means that a continuous-tone 24 bits/pixel image can display on a
%  8 bit pseudo-color device or monochrome device.  In most instances the
%  reduced color image closely resembles the original.  Alternatively, a
%  monochrome or pseudo-color image can display on a continuous-tone 24
%  bits/pixels device.
%
%  The Display program command syntax is:
%
%  Usage: display [options ...] file [ [options ...] file ...]
%
%  Where options include:
%    -backdrop           display image centered on a backdrop
%    -clip geometry      preferred size and location of the clipped image
%    -colors value       preferred number of colors in the image
%    -compress type      compress image: RunlengthEncoded or QEncoded
%    -delay seconds      display the next image after pausing
%    -display server     display image to this X server
%    -dither             apply Floyd/Steinberg error diffusion to image
%    -enhance            apply a digital filter to enhance a noisy image
%    -gamma value        level of gamma correction
%    -geometry geometry  preferred size and location of the image window
%    -gray               transform image to gray scale colors
%    -inverse            apply color inversion to image
%    -magnify value      level of image magnification
%    -map type           display image using this Standard Colormap
%    -monochrome         transform image to black and white
%    -noise              reduce noise with a noise peak elimination filter
%    -normalize          tranform image to span the full the range of colors
%    -print file         write image as Postscript to a file
%    -reflect            reverse image scanlines
%    -root               display image on the root window
%    -rotate degrees     apply Paeth rotation to the image
%    -scale geometry     preferred size factors of the image
%    -scene number       image scene number
%    -treedepth value    depth of the color classification tree
%    -verbose            print detailed information about the image
%    -visual type        display image using this visual type
%    -write file         write image to a file
%
%  In addition to those listed above, you can specify these standard X
%  resources as command line options:  -background, -bordercolor,
%  -borderwidth, -font, -foreground, -iconGeometry, -iconic, -name, or
%  -title.
%
%  Change '-' to '+' in any option above to reverse its effect.  For
%  example, specify +compress to store the image as uncompressed.
%
%  Specify 'file' as '-' for standard input or output.
%
%  Buttons
%    Control-1
%         press and drag to pan the image
%    1    press and drag to select a command from a pop-up menu
%    2    press and drag to define a region of the image to clip
SHAR_EOF
true || echo 'restore of ImageMagick/display.c failed'
fi
echo 'End of ImageMagick part 16'
echo 'File ImageMagick/display.c is continued in part 17'
echo 17 > _shar_seq_.tmp
exit 0
--
Dan Heller
O'Reilly && Associates       Z-Code Software    Comp-sources-x:
Senior Writer                President          comp-sources-x at uunet.uu.net
argv at ora.com                 argv at zipcode.com



More information about the Comp.sources.x mailing list