Received: from FINHUTC.HUT.FI by FINTUVM.BITNET (Mailer X1.25) with BSMTP id
 9385; Thu, 05 May 88 14:12:39 EET
Received: by FINHUTC (Mailer X1.25) id 9782; Thu, 05 May 88 14:05:18 EET
Date:         Tue, 3 May 88 21:37:56 -0900
Reply-To:     TSMJM@ALASKA
Sender:       Info-Amiga List <I-AMIGA@FINHUTC>
From:         TSMJM@ALASKA
Subject:      Hope this helps out, it's a bare bones IFF reader.
To:           "MATTI E. AARNIO" <FYS-MA@FINTUVM>
 
/*****************************************************************/
/*                      Show                                     */
/*                 Carter Brock 71435,257                        */
/*                 Usage Show file                               */
/*                                                               */
/*  This program is in the public domain and can be used for any */
/*  non-commercial purpose.                                      */
/*****************************************************************/
 
 
 
 
 
#include "df1:include/exec/types.h"
#include "df1:include/exec/memory.h"
#include "df1:include/intuition/intuition.h"
#include "df1:include/graphics/gfx.h"
#include "df1:include/graphics/view.h"
#include "df1:include/lattice/fcntl.h"
#include "df1:include/lattice/stdio.h"
#define UBYTE unsigned char
#define WORD short
#define UWORD unsigned short
#define mskNone 0
#define mskHasMask 1
#define mskHasTransparentColor 2
#define mskLasso 3
#define cmpNone 0
#define cmpByteRun1 1
#define MakeID(a,b,c,d) ( (a)<<24 | (b)<<16 | (c)<<8 | (d) )
#define FORM MakeID('F','O','R','M')
#define LIST MakeID('L','I','S','T')
#define BODY MakeID('B','O','D','Y')
#define BMHD MakeID('B','M','H','D')
#define CMAP MakeID('C','M','A','P')
struct GfxBase *GfxBase;
struct Window *Window;
struct Screen *Screen;
struct Image *Image;
struct ViewPort *vp;
struct Image tree;
struct IntuitionBase *IntuitionBase;
#define INTUITION_REV 29
#define GRAPHICS_REV 29
#define MILLION 1000000
 
  struct IntuiMessage *Message;
  struct NewWindow NewWindow;
  ULONG class;
  UBYTE *buffer,*tempbuffer,**psource,**pdest;
  UBYTE  *filebuffer,*tempfilebuffer,*savebuffer;
  UWORD BytePerPlane,TotalBytes,plane,BytePerRow;
  int  MouseMoved,SelectDown,ActiveWindow,SelectUp,status,fd,i;
 
typedef unsigned long ID;
 struct Chunk
{
ID      ckID ;
long    ckSize ;
}  ;
struct Chunk chk;
 
open_screen()
{
struct NewScreen NewScreen;
 
NewScreen.LeftEdge=0;
NewScreen.TopEdge=0;
NewScreen.Width=320;
NewScreen.Height=200;
NewScreen.Depth=5;
NewScreen.DetailPen=0;
NewScreen.BlockPen=1;
NewScreen.ViewModes=NULL ;
NewScreen.Type=CUSTOMSCREEN;
NewScreen.Font=NULL;
NewScreen.DefaultTitle="MyScreen";
NewScreen.Gadgets=NULL;
NewScreen.CustomBitMap=NULL;
 
 
if ((Screen=(struct Screen *)OpenScreen(&NewScreen))==NULL)
  exit(FALSE);
}
 
 
open_library()
{
  IntuitionBase=(struct IntuitionBase *)
       OpenLibrary("intuition.library",INTUITION_REV);
  if (IntuitionBase==NULL) exit(FALSE);
 
  GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",GRAPHICS_REV);
}
 
 
open_window()
{
  NewWindow.LeftEdge=0;
  NewWindow.TopEdge=0;
  NewWindow.Width=320;
  NewWindow.Height=200;
  NewWindow.DetailPen=0;
  NewWindow.BlockPen=1;
  NewWindow.Title="iff";
  NewWindow.Flags=NOCAREREFRESH  | ACTIVATE | WINDOWCLOSE | REPORTMOUSE | BORDER
LESS;
  NewWindow.IDCMPFlags=CLOSEWINDOW | MOUSEBUTTONS | MOUSEMOVE | ACTIVEWINDOW | I
NACTIVEWINDOW;
  NewWindow.Type=CUSTOMSCREEN;
  NewWindow.FirstGadget=NULL;
  NewWindow.CheckMark=NULL;
  NewWindow.Screen=Screen;
  NewWindow.BitMap=NULL;
  NewWindow.MinWidth=100;
  NewWindow.MinHeight=25;
  NewWindow.MaxHeight=200;
  NewWindow.MaxWidth=320;
 
  if((Window=(struct Window *)OpenWindow(&NewWindow))==NULL)
   exit (FALSE);
 }
 
get_message()
 {
 int ret;
 Wait(1<<Window->UserPort->mp_SigBit);
 while (Message=(struct IntuiMessage *)GetMsg(Window->UserPort))
   {
    class=Message->Class;
    ReplyMsg(Message);
    if(class==ACTIVEWINDOW) ActiveWindow=TRUE;
    if(class==INACTIVEWINDOW) ActiveWindow=FALSE;
    if (class==CLOSEWINDOW)
     {
      status=close(fd);
      CloseWindow(Window);
      CloseScreen(Screen);
      CloseLibrary(IntuitionBase);
      if(ret=free((char *)savebuffer)!=0)
      {
         printf("buffer dealocation failed\n");
      }
      if(ret=free((char *)filebuffer)!=0)
      {
         printf("filebuffer dealocation failed\n");
      }
      exit(TRUE);
     }
   }
 }
 
#define UGetByte() (*source++)
#define UPutByte(c) (*dest++ = (c))
GetBits(psource,pdest,dstBytes0)
BYTE **psource, **pdest; WORD dstBytes0;
{
   register BYTE *source= *psource;
   register BYTE *dest= *pdest;
   register WORD dstBytes= dstBytes0;
   while(dstBytes>0)
   {
      UPutByte(UGetByte());
      dstBytes-=1;
   }
   *psource=source; *pdest=dest;
}
UnPackBits(psource,pdest,dstBytes0)
BYTE **psource, **pdest; WORD dstBytes0;
{
   register BYTE *source= *psource;
   register BYTE *dest  = *pdest;
   register BYTE n;
   register BYTE c;
   register WORD dstBytes = dstBytes0;
   WORD minus128= -128;
   while(dstBytes > 0)
   {
      n=UGetByte();
      if(n>=0)
      {
         n+=1;
         dstBytes -= n;
         do { UPutByte(UGetByte()); } while (--n>0);
      }
      else if (n != minus128)
      {
         n= -n + 1;
         dstBytes -=n;
         c=UGetByte();
         do { UPutByte(c); } while (--n >0);
      }
   }
*psource=source; *pdest=dest;
}
 
 
main(argc,argv)
int argc;
char *argv[];
{
typedef UBYTE Masking;
typedef UBYTE Compression;
int numcolors;
USHORT tred,tgreen,tblue;
struct BitMapHeader
{
   UWORD w, h;
   WORD  x, y;
   UBYTE nPlanes;
   Masking   masking;
   Compression compression;
   UBYTE pad1;
   UWORD transparentColor;
   UBYTE xAspect, yAspect;
   WORD pageWidth, pageHeight;
} ;
 
struct BitMapHeader bmhd;
 
struct ColorRegister
   {
      UBYTE red, green, blue;
   } ;
   struct ColorRegister  ColorMap[32];
 
 
long pos;
if (argc < 2)
   {
      puts("Show by Carter Brock 71435,257\n");
      puts("Usage: Show <filename>\n");
      exit(0);
   }
 
 
   fd=open(argv[1],O_RDONLY);            /* open file */
   if (fd==-1)
   {
      printf("file open failed\n");
      exit(0);
   }
 
   status=read(fd,&chk,sizeof(chk));   /* check to see if FORM type */
 
   if (status==-1)
   {
      printf("read failed\n");
      status=close(fd);
      exit(0);
   }
 
   if (chk.ckID!=FORM)
   {
      printf("not a picture file\n");
      status=close(fd);
      exit(0);
   }
 
 
   pos=lseek(fd,4,1);              /* get bit map header */
   if (pos==-1)
   {
      printf("seek failed\n");
      status=close(fd);
      exit(0);
   }
 
 
   status=read(fd,&chk,sizeof(chk));
   if (chk.ckID!=BMHD)
   {
      printf("could not find bit map header\n");
      status=close(fd);
      exit(0);
   }
 
 
   status=read(fd,&bmhd,sizeof(bmhd));  /* get bmhd info */
   if (status==-1)
   {
      printf("read failed\n");
      status=close(fd);
      exit(0);
   }
 
   status=read(fd,&chk,sizeof(chk));
   if (chk.ckID!=CMAP)
   {
      printf("color map not found\n");
      status=close(fd);
      exit(0);
   }
 
 
   status=read(fd,&ColorMap[0],chk.ckSize);
   numcolors=chk.ckSize/3;
 
/* skip over everything else until body is found */
 
 status=read(fd,&chk,sizeof(chk));
 while(chk.ckID!=BODY)
 {
   pos=lseek(fd,chk.ckSize,1);
   if (pos==-1)
   {
      printf("seek failed\n");
      exit(0);
   }
   status=read(fd,&chk,sizeof(chk));
 }
 
/* we have got the body!! */
 
BytePerRow=(((bmhd.w+15) >> 4) << 1);
BytePerPlane=BytePerRow*bmhd.h;
TotalBytes=BytePerPlane*(UWORD)bmhd.nPlanes;
buffer=(UBYTE *)malloc(TotalBytes);
 
if (buffer==NULL)
   {
   printf("no memory for buffer\n");
   exit(0);
   }
filebuffer=(UBYTE *)malloc(chk.ckSize);
 
if(filebuffer==NULL)
   {
      printf("no memory for file buffer\n");
      exit(0);
   }
savebuffer=buffer;
tempfilebuffer=filebuffer;
status=read(fd,filebuffer,chk.ckSize);
pdest=&tempbuffer;
psource=&tempfilebuffer;
 
   for(i=0;i<bmhd.h;i++)
   {
      for(plane=0;plane<bmhd.nPlanes;plane++)
      {
         tempbuffer=buffer+(BytePerRow*i)+(BytePerPlane*plane);
        if(bmhd.compression==cmpByteRun1)
        {
            UnPackBits(psource,pdest,BytePerRow);
        }
        else
        {
            GetBits(psource,pdest,BytePerRow);
        }
      }
   }
 
open_library();
open_screen();
open_window();
 
/* we have the colors now lets use them */
vp=(struct ViewPort *)ViewPortAddress(Window);
   for(i=0;i<numcolors;i++)
   {
      tred=(ColorMap[i].red);
      tgreen=(ColorMap[i].green);
      tblue=(ColorMap[i].blue);
      tred >>= 4;
      tgreen >>= 4;
      tblue  >>= 4;
      SetRGB4(vp,i,tred,tgreen,tblue);
 
   }
tree.LeftEdge=0;
tree.TopEdge=0;
tree.Width=bmhd.w;
tree.Height=bmhd.h;
tree.Depth=bmhd.nPlanes;
tree.ImageData=(SHORT *)buffer;
tree.PlanePick=31;
tree.PlaneOnOff=0;
tree.NextImage=NULL;
Image=&tree;
DrawImage(Window->RPort,Image,0,0);
 
FOREVER
{
   get_message();
}
 
}
ý I-AMIGA FINHUTC.  5/05/88
þ TSMJM@ALASKA        MATTI E. AARNIO      5/03/88 Hope this helps out, it's a b
