![[Contents]](../images/toc_d.gif) 
 ![[Index]](../images/index_d.gif) 
 ![[Help]](../images/help_d.gif) 
 ![[Retrace]](../images/retrace_d.gif) 
 ![[Browse <]](../images/prev.gif) 
 ![[Browse >]](../images/next.gif) 
/* RawtoILBM
 * Converts raw file (from ILBMtoRaw) into an ILBM
 * Requires linkage with several iffparse modiules - See Makefile
 */
#include "iffp/ilbmapp.h"
#include <intuition/intuitionbase.h>
#include <workbench/workbench.h>
#ifdef LATTICE
int CXBRK(void) { return(0); }  /* Disable Lattice CTRL/C handling */
int chkabort(void) { return(0); }  /* really */
#endif
char *vers = "\0$VER: RawtoILBM 37.5";
char *Copyright =
  "RawtoILBM v37.5 - converts raw file to ILBM - Freely Redistributable";
#define MINARGS 6
char *usage = "Usage: RawtoILBM rawname ilbmname width height depth\n";
void bye(UBYTE *s,int e);
void cleanup(void);
struct Library  *IntuitionBase = NULL;
struct Library  *GfxBase = NULL;
struct Library  *IFFParseBase = NULL;
struct ILBMInfo ilbm = {0};
USHORT  colortable[MAXAMCOLORREG];
BOOL fromWB;
void main(int argc, char **argv)
    {
    LONG        error = 0L, rawfile, rlen;
    USHORT      width, height, depth, pwidth, pheight, pmode, extra;
    ULONG       plsize;
    char        *rawname,*ilbmname;
    int         k;
    fromWB = (argc==0) ? TRUE : FALSE;
    if(!(IntuitionBase = OpenLibrary("intuition.library", 0)))
      bye("Can't open intuition library.\n",RETURN_WARN);
    if(!(GfxBase = OpenLibrary("graphics.library",0)))
      bye("Can't open graphics library.\n",RETURN_WARN);
    if(!(IFFParseBase = OpenLibrary("iffparse.library",0)))
      bye("Can't open iffparse library.\n",RETURN_WARN);
    if(!(ilbm.ParseInfo.iff = AllocIFF()))
      bye(IFFerr(IFFERR_NOMEM),RETURN_WARN);
    if(argc==MINARGS)                 /* Passed filenames via command line  */
        {
        rawname  = argv[1];
        ilbmname = argv[2];
        width  = atoi(argv[3]);
        height = atoi(argv[4]);
        depth  = atoi(argv[5]);
        /* Page width, height, and mode for saved ILBM */
        pwidth  = width  < 320 ? 320 : width;
        pheight = height < 200 ? 200 : height;
        pmode   = pwidth >= 640  ? HIRES : 0L;
        pmode  |= pheight >= 400 ? LACE  : 0L;
        plsize = RASSIZE(width,height);
        }
    else
        {
        printf("%s\n%s\n",Copyright,usage);
        bye("\n",RETURN_OK);
        }
    if(!(rawfile = Open(rawname,MODE_OLDFILE)))
        {
        printf("Can't open raw file '%s'\n",rawname);
        bye(" ",RETURN_WARN);
        }
    /*
     * Allocate Bitmap and planes
     */
     extra = depth > 8 ? depth - 8 : 0;
     if(ilbm.brbitmap = AllocMem(sizeof(struct BitMap) + (extra<<2),
                                MEMF_CLEAR))
        {
        InitBitMap(ilbm.brbitmap,depth,width,height);
        for(k=0, error=0, rlen=1; k<depth && (!error) && (rlen >0); k++)
            {
            if(!(ilbm.brbitmap->Planes[k] = AllocRaster(width,height)))
                        error = IFFERR_NOMEM;
            if(! error)
                {
                BltClear(ilbm.brbitmap->Planes[k], RASSIZE(width,height),0);
                /* Read a plane */
                rlen = Read(rawfile,ilbm.brbitmap->Planes[k],plsize);
                }
            }
        /* get colortable */
        if((!error)&&(rlen > 0))
                rlen=Read(rawfile,colortable,(MIN(1<<depth,MAXAMCOLORREG)<<1));
        if((error)||(rlen<=0))
            {
            if(rlen <= 0)          printf("Error loading raw file - check dimensions\n");
            else                printf("Error allocating planes\n");
            }
        else
            {
            error = saveilbm(&ilbm, ilbm.brbitmap, pmode,
                width,  height, pwidth, pheight,
                colortable, MIN(1<<depth,MAXAMCOLORREG), 4,    /* colors */
                mskNone, 0,             /* masking. transColor */
                NULL, NULL,             /* additional chunk lists */
                ilbmname);
            }
        for(k=0; k<depth; k++)
            {
            if(ilbm.brbitmap->Planes[k])
                        FreeRaster(ilbm.brbitmap->Planes[k],width,height);
            }
        FreeMem(ilbm.brbitmap, sizeof(struct BitMap) + (extra << 2));
        }
    Close(rawfile);
    if(error)
        {
        printf("%s\n",IFFerr(error));
        bye(" ", RETURN_FAIL);
        }
    else bye("",RETURN_OK);
    }
void bye(UBYTE *s,int e)
    {
    if(s&&(*s)) printf("%s\n",s);
    if ((fromWB)&&(*s))    /* Wait so user can read messages */
        {
        printf("\nPRESS RETURN TO EXIT\n");
        while(getchar() != '\n');
        }
    cleanup();
    exit(e);
    }
void cleanup()
    {
    if(ilbm.ParseInfo.iff)      FreeIFF(ilbm.ParseInfo.iff);
    if(GfxBase)         CloseLibrary(GfxBase);
    if(IntuitionBase)   CloseLibrary(IntuitionBase);
    if(IFFParseBase)    CloseLibrary(IFFParseBase);
    }