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

/*--------------------------------------------------------------*/
/*                                                              */
/* ILBMtoRaw: reads in ILBM, writes out raw file (raw planes,   */
/*  followed by colormap)                                       */
/*                                                              */
/* Based on ILBMRaw.c by Jerry Morrison and Steve Shaw,         */
/* Electronic Arts.                                             */
/* Jan 31, 1986                                                 */
/*                                                              */
/* This software is in the public domain.                       */
/* This version for the Amiga computer.                         */
/*                                                              */
/*  Callable from CLI ONLY                                      */
/*  modified 05-91 for use wuth iffparse modules                */
/*  Requires linkage with several other modules - see Makefile  */
/*--------------------------------------------------------------*/

#include "iffp/ilbmapp.h"

#ifdef LATTICE
int CXBRK(void) { return(0); }  /* Disable Lattice CTRL/C handling */
int chkabort(void) { return(0); }  /* really */
#endif

char *vers = "\0$VER: ILBMtoRaw 37.5";
char *Copyright = "ILBMtoRaw v37.5 (Freely Redistributable)";

void bye(UBYTE *s, int e);
void cleanup(void);

LONG SaveBitMap(UBYTE *name, struct BitMap *bm, SHORT *cols, int ncols);

struct Library *IFFParseBase = NULL;
struct Library *GfxBase = NULL;

/* ILBM frame */
struct ILBMInfo ilbm = {0};


/* ILBM Property chunks to be grabbed - BMHD and CMAP needed for this app
 */
LONG    ilbmprops[] = {
                ID_ILBM, ID_BMHD,
                ID_ILBM, ID_CMAP,
                TAG_DONE
                };

/* ILBM Collection chunks (more than one in file) to be gathered */
LONG    *ilbmcollects = NULL;   /* none needed for this app */

/* ILBM Chunk to stop on */
LONG    ilbmstops[] = {
                ID_ILBM, ID_BODY,
                TAG_DONE
                };


/** main() ******************************************************************/

void main(int argc, char **argv)
    {
    LONG error=NULL;
    UBYTE *ilbmname, fname[80], buf[24];

    if ((argc < 2)||(argv[argc-1][0]=='?'))
        bye("Usage from CLI: 'ILBMtoRaw filename'\n",RETURN_OK);

    if(!(GfxBase = OpenLibrary("graphics.library",0)))
        bye("Can't open graphics.library",RETURN_FAIL);

    if(!(IFFParseBase = OpenLibrary("iffparse.library",0)))
        bye("Can't open iffparse.library",RETURN_FAIL);

/*
 * Here we set up default ILBMInfo fields for our
 * application's frames.
 * Above we have defined the propery and collection chunks
 * we are interested in (some required like BMHD)
 */
    ilbm.ParseInfo.propchks      = ilbmprops;
    ilbm.ParseInfo.collectchks   = ilbmcollects;
    ilbm.ParseInfo.stopchks      = ilbmstops;
    if(!(ilbm.ParseInfo.iff = AllocIFF()))
        bye(IFFerr(IFFERR_NOMEM),RETURN_FAIL);  /* Alloc an IFFHandle */

    ilbmname = argv[1];

    /* Load as a brush since we don't need to display it */
    if (error = loadbrush(&ilbm,ilbmname))
        {
        printf("Can't load ilbm \"%s\", ifferr=%s\n",ilbmname,IFFerr(error));
        bye("",RETURN_WARN);
        }
    else /* Successfully loaded ILBM */
        {
        strcpy(fname,argv[1]);

        if(ilbm.camg & HAM)        strcat(fname, ".ham");
        if(ilbm.camg & EXTRA_HALFBRITE)    strcat(fname, ".ehb");

        if(ilbm.camg & HIRES)      strcat(fname, ".hi");
        else strcat(fname, ".lo");

        if(ilbm.camg & LACE)       strcat(fname, ".lace");

        strcat(fname,".");
        sprintf(buf,"%d",ilbm.Bmhd.w);
        strcat(fname,buf);
        strcat(fname,"x");
        sprintf(buf,"%d",ilbm.Bmhd.h);
        strcat(fname,buf);
        strcat(fname,"x");
        sprintf(buf,"%d",ilbm.brbitmap->Depth);
        strcat(fname, buf);
        printf(" Creating file %s \n", fname);
        error=SaveBitMap(fname, ilbm.brbitmap, ilbm.colortable, ilbm.ncolors);

        unloadbrush(&ilbm);
        }

    if(error)   bye(IFFerr(error),RETURN_WARN);
    else        bye("",RETURN_OK);
    }


/* SaveBitMap (as raw planes and colortable)
 *
 * Given filename, bitmap structure, and colortable pointer,
 * writes out raw bitplanes and colortable (not an ILBM)
 * Returns 0 for success
 */


LONG SaveBitMap(UBYTE *name, struct BitMap *bm, SHORT *cols, int ncols)
    {
    SHORT i;
    LONG nb,plsize;

    LONG file = Open( name, MODE_NEWFILE);
    if( file == 0 )
        {
        printf(" couldn't open %s \n",name);
        return(CLIENT_ERROR);   /* couldnt open a load-file */
        }
    plsize = bm->BytesPerRow*bm->Rows;
    for (i=0; i<bm->Depth; i++)
        {
        nb =  Write(file, bm->Planes[i], plsize);
        if (nb<plsize) break;
        }
    if(nb>0)       nb=Write(file, cols, (1<<bm->Depth)*2);  /* save color map */
    Close(file);
    return(nb >= 0 ? 0L : IFFERR_WRITE);
    }

void bye(UBYTE *s, int e)
    {
    if(s&&(*s))       printf("%s\n",s);
    cleanup();
    exit(e);
    }

void cleanup()
    {
    if(ilbm.ParseInfo.iff)              FreeIFF(ilbm.ParseInfo.iff);

    if(IFFParseBase)    CloseLibrary(IFFParseBase);
    if(GfxBase)         CloseLibrary(GfxBase);
    }