[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

                        IFFP Modules - July 1991
                             version 37.5

These iffparse.library code modules and examples are designed as
replacements for the original EA IFF code.  In some modules, it has been
possible to retain much of the original code.  However, most structures
and most higher level function interfaces have changed.

On the plus side, these new modules contain many new high-level
easy-to-use functions for querying, loading, displaying, and saving ILBMs.
During their development, modules similar to these have been used inhouse
at Commodore for the 2.0 Display program and several other ILBM
applications.  The screen.c module provides powerful display-opening
functions which are 1.3-compatible yet provide a host of new options under
2.0 such as centered overscan screens, full-video display clips, border
transparency control, and autoscroll.  New modules have been added for
printing (screendump) and for preserving/adding chunks (copychunks). And
the 8SVX example now actually plays samples and instruments. In addition,
clipboard support is automatic for all applications that use the IFFP
modules because parse.c's openifile() interprets the filename -c[n] (ie.
"-c", "-c1", "-c2", etc.) as clipboard unit n.

All of the applications presented here require iffparse.library which is
distributed on Workbench 2.0.  Please note that iffparse.library is a
1.3-compatible library, and that all of these modules and examples have
been designed to take advantage of 2.0, but also work under 1.3.
Developers who wish to distribute iffparse.library on their commercial
products may execute a 2.0 Workbench license, or may get an addendum to
their 1.3 Workbench license to allow distribution of iffparse.library.

It was not necessary to port the gio IO speedup code since iffparse can
use your compiler's own buffered IO routines through the callback
stdio_stream() in parse.c.  Depending on your application, you may want to
add your own additional buffering to this stdio_stream() code.

Most of the high-level function pairs provided in these modules have been
designed to provide safe cleanup for themselves.  For example, a
loadbrush() that succeeds or fails at any point can be cleaned up via
unloadbrush.  The cleanup routines null out the appropriate pointers so
that allocations will not be freed twice.

All applications are built upon the parse.c module.  The basic concept of
using the parse.c module are:

        - Define tag-like arrays of your desired chunks (readers only)
        - Allocates one or more [form]Info structures as defined in
            iffp/[form]app.h (for example an ILBMInfo defined in
            iffp/ilbmapp.h).
        - Initialize the ParseInfo part of these structures to the desired
            chunk arrays, and to an IFFHandle allocated via iffparse
            AllocIFF().
        - Use the provided high level load/save functions, or use the
            lower level parse.c openifile(), reader-only parseifile()/
            getcontext()/nextcontext(), and closeifile().  The filename
            -c[n] may be used to read/write clipboard unit n.
        - Clean up, FreeIFF(), and deallocate [form]Info's.


IMPORTANT NOTES - Most of the higher-level load functions keep the
        IFFHandle (file or clipboard) open.  While the handle is
        open, you may use parse.c functions (such as findpropdata)
        OR direct iffparse functions (FindProp(), FindCollection())
        for accessing the gathered chunks.  However, it is not a good
        idea to keep a filehandle OR the clipboard open.  While
        a clipboard unit is open, no other applications can clip
        to the unit.  And while a file is open, you can't write the
        file back out.  So, instead of keeping the file or unit
        open, you can use copychunks (in copychunks.c) to create
        a copy of your gathered chunks, and do an early closeifile()
        (parse.c).  Then access and later write back out (if you wish)
        and deallocate your copied chunks via the routines in the
        copychunks module (findchunk, writechunklist, freechunklist).

WARNING REGARDING COMPLEX FORMS
        Regarding Complex FORMs - The parse.c module will enter complex
        formats such as CATSs, LISTs, and nested FORMs to find the FORM
        that you are interested in.  This is great.  However, if you are
        a read-modify-write program, you should warn your user when this
        occurs unless YOU are capable of recreating the complex format.
        Otherwise, your user may unknowingly destroy his complex file
        by writing over it with your program.  Example - a paint
        program could read an ILBM out of a complex LIST containing
        pictures and music, and then save it back out as a simple ILBM,
        causing the user to lose his music and other pictures.
        To determine if a complex form was entered after a load,
        check the (form)Info.ParseInfo.hunt field.  If TRUE (non-zero),
        then your file was found inside a complex format.

COMPILATION NOTES
        These modules and examples have been compiled using SAS C 5.10a
        and Manx C 5.0d, with 2.0 (37.1) include files and 2.0 amiga.lib.
        You must have at least 37.1 alib_protos.h (older versions of
        this include file contained the amiga.lib stdio protos also
        which conflict with both SAS and Manx stdio).  For Manx, I
        also had to comment out the conditional definition of abs() in
        libraries/mathffp.h.  These modules do not use mathffp, but
        the mathffp include file is pulled in by alib_protos.h.
        When compiling with Manx, a warning seems to be generated for
        each string constant assigned to a UBYTE * field, and also
        by some references to ilbm->colortable.



                LIST OF IFFP MODULES AND APPLICATIONS
                -------------------------------------
        NOTE - Some useful functions are listed with each module
           See module source code for docs on each function.


APPLICATIONS (these require linkage with modules - see Makefiles)
------------
ILBMDemo        Displays an ILBM, loads a brush, saves an ILBM, opt. print
ILBMLoad        Queries an ILBM and loads it into an existing screen
ILBMtoC         Outputs an ILBM as C source code
ILBMtoRaw       Converts an ILBM to raw plane/color file
RawtoILBM       Converts raw plane/color file (from ILBMtoRaw) to an ILBM
24bitDemo       Saves a simple 24-bit ILBM and then shows it 4 planes at
                a time (if given filename, just does the show part)
Play8SVX        Reads and plays an 8SVX sound effect or instrument
                  - LoadSample, UnloadSample, PlaySample, OpenAudio,
                    CloseAudio, and body load/unpack functions
ScreenSave      Save the front screen as an ILBM, with an icon


OTHER EXAMPLES (use iffparse.library directly and require no modules)
--------------
Sift            Checks and prints outline of any IFF file (uses RAWSTEP)
ILBMScan        Prints out useful info about any ILBM
ClipFTXT        Demonstrates simply clipping of FTXT to/from clipboard
cycvb.c         Dan Silva's routine for interrupt based color cycling
apack.asm       Dr. Gerald Hull's assembler replacement for packer.c


GENERAL IFFPARSE SUPPORT MODULE
-------------------------------
parse.c         File/clipboard IO and general parsing
                  - openifile, closeifile, parseifile, getcontext,
                    nextcontext, contextis, currentchunkis, PutCk chunk
                    writing function, and IFFerr text error routine


ILBM READ MODULES
-----------------
loadilbm.c      High level ILBM load routines which are passed filenames
                (calls getbitmap)
                  - loadbrush/unloadbrush,loadilbm/unloadilbm,and queryilbm
getbitmap.c     brush/bitmap loading (non-display, calls ilbmr.c)
                  - createbrush/deletebrush, getbitmap/freebitmap
getdisplay.c    bitmap load/display (calls screen.c, ilbmr.c)
                  - showilbm/unshowilbm, createdisplay/deletedisplay
screen.c        1.3/2.0 ECS/non-ECS compatible screen/window module
                  - opendisplay, openidscreen, modefallback, clipit
ilbmr.c         Lower level ILBM body/color load routines(calls unpacker.c)
                  - loadbody, loadcmap, getcolors/freecolors,
                    alloccolortable, getcamg (gets or creates modeid)
unpacker.c      BODY unpacker


ILBM WRITE MODULES
------------------
saveilbm.c      High level ILBM saving routines which are passed filenames
                (calls ilbmw.c)
                  - screensave and saveilbm
ilbmw.c         Lower level ILBM body/color save routines (calls packer.c)
                  - InitBMHD, PutCMAP, PutBODY
packer.c        BODY packer


EXTRA MODULES
-------------
copychunks.c    Chunk cloning and chunk list writing routines
                  - copychunks, findchunk, writechunklist, freechunklist
screendump.c    Screen printing module (iffparse not required)
bmprintc.c      Module to output ILBM as C code


INCLUDE FILES
-------------
iffp/#?.h       This subdirectory may be kept in your current directory
                or in your main include directory.


Thanks to Steve Walton for his code changes for Manx/SAS compatibility,
and to Bill Barton and John Bittner for their comments and suggestions.