PGC Portfolio Graphics Compressed File Specification
   ----------------------------------------------------
   by Don Messerli, Software Vineyard
   Revision 01      1/4/91

   Introduction
   ------------

   The PGC spec allows graphic files on the Portfolio (formerly called
   PGF files) to be compressed to save disk (RAM Card) space. We
   all know how much RAM cards cost!

   A little background
   -------------------

   The Portfolio's screen is 240 x 64 pixels when in graphics mode.
   Being monochome, it only takes 1 bit to represent a single pixel.
   Therefore, 8 pixels per byte.  A PGF ends up being 64 rows of
   30 bytes each for a total of 1920 bytes.  PGF files could simply
   be copied from video ram to disk and vice-versa.

   This was pretty simple.  All PGF files were 1920 bytes no matter
   how complex the picture.  A real space waster in most cases.
   Compression became a logical next step.

   What will compression do?
   -------------------------

   Compression can save quite a bit of space.  Typically from 20
   to 80% depending on the file.  However, because of the compression
   algorithm I have chosen, it is also possible for a file to become
   larger.  This happens with files that have a lot of random dots
   on the screen with little repetition.  Digitized photos are the
   culprits.  Fortunately, because of the small size of the Portfolio
   screen, we probably won't be seeing too many of them.

   PGC File Format
   ---------------

   Header -   The first 3 bytes of the file are the PGC header.  This
            is the only way to tell if the file is a PGC file or
            not.  This should always be checked when reading PGC
            files.  Your decoder routines could take a quick trip
            into never-never land if you try to decode a spreadsheet
            file.

            The three bytes that make up the header are the ASCII
            codes for 'P' and 'G' followed by the revision number
            in hex.  These three bytes should be:

                     "\x50\x47\x01" 
                        P    G   01

   Data -   The picture data is made up of repeating sets of single
            index bytes followed by data bytes.  The index byte
            tells the decoder how to handle the data that follows.
            The key is whether the high bit (\x80) is set or not.
            The maximum number of data bytes following an index
            byte is 127.

            High Bit Set
            ------------
            If the high bit is set, it indicates that the data is
            a string of identical bytes.  The low 7 bits indicate
            how many times to repeat the following byte (maximum is
            127).

            Example:  86     FF
                      index  data byte

               High bit of index byte is set, low 7 bits = 6.
               Repeat data byte (FF) 6 times.
                     
            High Bit Not Set
            ----------------
            If the high bit is NOT set, it indicates that the data
            following is a string of unique bytes and should be copied
            as is.  The low 7 bits indicate how many bytes to copy (max
            is 127).

            Example:  0A     FF 01 10 09 1A BB CE D0 FF 1A
                      index  data bytes

               High bit of index byte is NOT set, low 7 bits = 10.
               Copy next 10 bytes as is.

   
   Where do we go from here?
   -------------------------

   Writing a decoder is fairly straightforward.  The following is
   the general algorithm:

   do {
      get a byte from PGC image
      if high bit is set
         index = byte - 128
         get data byte
         write data byte, index times
      else
         index = byte
         copy next index # of bytes
   } while less than 1920 bytes written
   
   Writing an efficient compressor is a little more difficult.  I
   plan to upload a library of functions in the near future.  If
   you encounter difficulty writing a compressor, please contact
   me via electronic mail.


   What are these other files?
   ---------------------------         
   I have included a few PGF files to give your compressors and
   decoders a real workout.  

   BEST.PGF - This is a pure black image.  It should compress down
               to 35 bytes.

   WORST.PGF - This image is made up of runs of 2 identical bytes
               alternated with single unique bytes.  It should end
               up being larger as a PGC file (2524 bytes) than as
               a PGF file (1920 bytes). All decoders should be able
               to handle this file.
               
            
   In Closing
   ----------

   I hope this information is helpful for those writing graphics
   applications for the Portfolio.  It is my sincere wish that the
   PGC format is widely supported in the Portfolio arena and that
   it promotes compatibility between graphics applications on the
   Portfolio.  My sincere thanks to BJ Gleason for including PGC
   support in PBASIC.  That is a major step in making my wish come
   true.

   Please support the PGC format whenever possible.  If your application
   must output PGF files, because you're trying to write the world's
   smallest TSR (or something) and you can't commit to the overhead
   required by a compressor, that is unavoidable.  The PGF files can
   later be compressed with PGCOMP (my compressor).  It is still preferable
   to store files that end up larger as PGC files as PGC files anyway.
   This means software only has to worry about reading the PGC
   format.

   Versions of PGEDIT greater than 1.10 will read either PGF or PGC files.
   However, they will only save in PGC format.  BJ Gleason has indicated
   that PBASIC 3.1 will only read and write PGC files.

   If you have any questions, comments, or kind words, please send
   me electronic mail:

   Don Messerli
   Compuserve    72500,1671
   GEnie         DMESS