IMAGEFILE(2)                                         IMAGEFILE(2)

     NAME
          imagefile: readgif, readjpg, readpicfile, readpng,
          readxbitmap, remap - processing external image file formats

     SYNOPSIS
          include "imagefile.m";

          gifreader  := load RImagefile RImagefile->READGIFPATH;
          jpgreader  := load RImagefile RImagefile->READJPGPATH;
          xbmreader  := load RImagefile RImagefile->READXBMPATH;
          picreader  := load RImagefile RImagefile->READPICPATH;
          pngreader := load RImagefile RImagefile->READPNGPATH;

          imageremap := load Imageremap Imageremap->PATH;

          Rawimage: adt
          {
              r:         Draw->Rect;
              cmap:      array of byte;
              nchans:    int;
              chans:     array of array of byte;
              chandesc:  int;

              init:      fn(bufio: Bufio);
              read:      fn(fd: ref Bufio->Iobuf): (ref Rawimage, string);
              readmulti: fn(fd: ref Bufio->Iobuf):
                          (array of ref Rawimage, string);
          };

          init:          fn(bufio: Bufio);
          writeimage:    fn(fd: ref Bufio->Iobuf, image: ref Draw->Image)
                                          : string;

          remap:         fn(i: ref RImagefile->Rawimage, d: ref Draw->Display,
                          errdiff: int): (ref Draw->Image, string);

     DESCRIPTION
          The Rawimage adt of module RImagefile defines an internal
          representation and routines for reading images such as GIF
          and JPEG files.  To read a set of files of a given format,
          load the appropriate module, pass its init function an
          implementation of the Bufio module, and pass read an
          Bufio->Iobuf for each file.  Read returns a tuple: a ref
          Rawimage that holds the image and an error string.  If the
          Rawimage is nil, the error string will report the reason.
          Files (particularly GIF files) are often incorrectly encoded
          but yield usable pictures, so even if a Rawimage is
          returned, the error string may still report problems.

          Some image file types (eg, GIF) support having several

     Page 1                       Plan 9            (printed 12/22/24)

     IMAGEFILE(2)                                         IMAGEFILE(2)

          images in a single file.  They can be read in all at once
          using readmulti, which returns a tuple with the array of
          images, and an error string as above.

          The Rawimage is always defined as one or more bytes per
          pixel, with nchans channels of data stored in the array
          chans.  The chandesc field, described below, specifies the
          contents of chans.  The rectangle r describes the shape of
          the picture.

          The Rawimage type can be converted to a regular Image (see
          draw-image(2)) by calling module Imageremap's function
          remap. Remap is passed the Rawimage, a Display on which to
          create the image, and a flag that specifies whether to apply
          Floyd-Steinberg error diffusion code to the result, for
          smoother rendering of colours at the cost of some noise in
          the image.

          How to remap is defined by the RImagefile itself: the field
          chandesc specifies the type of the various chans of data:
          RImagefile->CRGB specifies a 3-colour RGB image with no
          colour map; RImagefile->CY a monotone (luminance-only,
          grey-scale) image with no colour map; and RImagefile->CRGB1
          a single-channel image with RGB colour map in cmap.  The
          file readers set chandesc as appropriate for the format of
          the file.

          The writing of image files is defined by the module
          WImagefile.  To initialize the module, call its init func-
          tion with an instance of the Bufio module and pass its
          writeimage function a Bufio->Iobuf representing the output
          stream and an image of type Draw->Image.

          These functions are split into separate modules to give
          applications control over the memory they need to process
          images.

     SOURCE
          /appl/lib/readgif.b
          /appl/lib/readjpg.b
          /appl/lib/readxbitmap.b
          /appl/lib/readpicfile.b
          /appl/lib/readpng.b

     NOTES
          The JPEG reader handles only the Baseline sequential format
          as defined by the JFIF 1.02 file exchange format.

          Functions to write these formats are as yet unimplemented.

     Page 2                       Plan 9            (printed 12/22/24)