home *** CD-ROM | disk | FTP | other *** search
- /** Revision Header * Header built automatically - do not edit! *************
- *
- * (C) Copyright 1991 by Olaf `Olsen' Barthel, all rights reserved
- *
- * Name .....: ReadILBM.c
- * Created ..: Monday 26-Aug-91 11:20
- * Revision .: 1
- *
- * Date Author Comment
- * ========= ======== ====================
- * 26-Aug-91 Olsen Created this file!
- *
- ***************************************************************************/
-
- /* OpenImageFile(UBYTE *Name):
- *
- * Open an IFF-ILBM file with given name.
- */
-
- struct IFFHandle * __regargs
- OpenImageFile(UBYTE *Name)
- {
- struct IFFHandle *Handle;
-
- if(Handle = AllocIFF())
- {
- if(Handle -> iff_Stream = Open(Name,MODE_OLDFILE))
- {
- InitIFFasDOS(Handle);
-
- if(!OpenIFF(Handle,IFFF_READ))
- return(Handle);
-
- Close(Handle -> iff_Stream);
- }
-
- FreeIFF(Handle);
- }
-
- return(NULL);
- }
-
- /* CloseImageFile(struct IFFHandle *Handle):
- *
- * Close an IFF-ILBM file opened by OpenImageFile().
- */
-
- VOID __regargs
- CloseImageFile(struct IFFHandle *Handle)
- {
- CloseIFF(Handle);
-
- Close(Handle -> iff_Stream);
-
- FreeIFF(Handle);
- }
-
- /* ReadImageBody():
- *
- * Reads the image data contained in a standard 4 bit IFF-ILBM
- * image file.
- */
-
- BYTE __regargs
- ReadImageBody(struct IFFHandle *Handle,struct BitMap *BitMap,struct BitMapHeader *BitMapHeader)
- {
- USHORT i,j,k;
- UBYTE Value,SoFar,Compr,Depth;
- BYTE ChkVal;
- LONG Height,Width;
- PLANEPTR Planes[9];
-
- BYTE *AuxBuff,*AuxBuff2;
-
- struct ContextNode *ContextNode;
-
- if(ContextNode = CurrentChunk(Handle))
- {
- Width = BitMap -> BytesPerRow;
- Height = BitMap -> Rows;
- Depth = BitMapHeader -> nPlanes;
- Compr = BitMapHeader -> compression;
-
- if(Compr > 1 || Depth < 1)
- return(FALSE);
-
- for(i = 0 ; i < Depth ; i++)
- Planes[i] = BitMap -> Planes[i];
-
- for(i = Depth ; i < 9 ; i++)
- Planes[i] = NULL;
-
- if(BitMapHeader -> masking == 1)
- Depth++;
-
- if(AuxBuff = (BYTE *)AllocVec(ContextNode -> cn_Size,MEMF_PUBLIC))
- {
- if(ReadChunkBytes(Handle,AuxBuff,ContextNode -> cn_Size) == ContextNode -> cn_Size)
- {
- AuxBuff2 = AuxBuff;
-
- if(Compr == 0)
- {
- for(k = 0 ; k < Height ; k++)
- {
- for(j = 0 ; j < Depth ; j++)
- {
- if(Planes[j])
- {
- CopyMem(AuxBuff,Planes[j],Width);
- Planes[j] += Width;
- }
-
- AuxBuff += Width;
- }
- }
- }
-
- if(Compr == 1)
- {
- for(k = 0 ; k < Height ; k++)
- {
- for(j = 0 ; j < Depth ; j++)
- {
- for(SoFar = 0 ; SoFar < Width ; )
- {
- ChkVal = *AuxBuff;
- AuxBuff++;
-
- if(ChkVal > 0)
- {
- if(Planes[j])
- {
- CopyMem(AuxBuff,Planes[j],ChkVal + 1);
-
- Planes[j] += ChkVal + 1;
- }
-
- AuxBuff += ChkVal + 1;
-
- SoFar += ChkVal + 1;
- }
- else
- {
- if(ChkVal != (WORD)-128)
- {
- Value = *AuxBuff;
- AuxBuff++;
-
- for(i = 0 ; i <= -ChkVal ; i++)
- {
- if(Planes[j])
- *Planes[j]++ = Value;
-
- SoFar++;
- }
- }
- }
- }
- }
- }
- }
-
- FreeVec(AuxBuff2);
-
- return(TRUE);
- }
-
- FreeVec(AuxBuff);
- }
- }
-
- return(FALSE);
- }
-
- /* ReadImageHeader():
- *
- * Reads the header information, viewmodes and colours contained
- * in an IFF-ILBM file.
- */
-
- BYTE __regargs
- ReadImageHeader(struct IFFHandle *Handle,ULONG *ViewModes,BYTE *NumCols,UWORD *Colours,struct BitMapHeader *BitMapHeader,struct MandelInfo *MandelInfo)
- {
- STATIC ULONG ImageProps[] =
- {
- 'ILBM','BMHD',
- 'ILBM','CMAP',
- 'ILBM','CAMG',
- 'ILBM','MAND'
- };
-
- struct StoredProperty *Prop;
-
- if(!PropChunks(Handle,&ImageProps[0],4))
- {
- if(!StopChunk(Handle,'ILBM','BODY'))
- {
- if(!ParseIFF(Handle,IFFPARSE_SCAN))
- {
- if(Prop = FindProp(Handle,'ILBM','BMHD'))
- {
- CopyMem(Prop -> sp_Data,BitMapHeader,sizeof(struct BitMapHeader));
-
- if(BitMapHeader -> nPlanes > 0 && BitMapHeader -> nPlanes <= 8)
- {
- if(MandelInfo)
- {
- if(Prop = FindProp(Handle,'ILBM','MAND'))
- {
- MandelInfo -> Iterations = 32;
-
- CopyMem(Prop -> sp_Data,MandelInfo,Prop -> sp_Size);
- }
- else
- MandelInfo -> Iterations = 0;
- }
-
- if(ViewModes)
- {
- extern struct GfxBase *GfxBase;
-
- *ViewModes = NULL;
-
- if(BitMapHeader -> pageHeight > ((GfxBase -> DisplayFlags & PAL) ? 256 : 200))
- *ViewModes |= LACE;
-
- if(BitMapHeader -> pageWidth >= 640)
- *ViewModes |= HIRES;
-
- if(BitMapHeader -> nPlanes == 6)
- *ViewModes |= HAM;
-
- if(Prop = FindProp(Handle,'ILBM','CAMG'))
- *ViewModes = *(ULONG *)Prop -> sp_Data;
-
- *ViewModes &= ~(SPRITES | VP_HIDE | GENLOCK_AUDIO | GENLOCK_VIDEO);
-
- if(ModeNotAvailable(*ViewModes))
- *ViewModes &= 0xFFFF;
-
- if(ModeNotAvailable(*ViewModes))
- return(FALSE);
- }
-
- if(NumCols && Colours)
- {
- UBYTE *ColourArray;
- WORD i,R,G,B;
-
- if(!(Prop = FindProp(Handle,'ILBM','CMAP')))
- return(FALSE);
-
- ColourArray = (UBYTE *)Prop -> sp_Data;
-
- *NumCols = Prop -> sp_Size / 3;
-
- for(i = 0 ; i < *NumCols ; i++)
- {
- R = ColourArray[i * 3 + 0] >> 4;
- G = ColourArray[i * 3 + 1] >> 4;
- B = ColourArray[i * 3 + 2] >> 4;
-
- Colours[i] = (R << 8) | (G << 4) | (B);
- }
- }
-
- return(TRUE);
- }
- }
- }
- }
- }
-
- return(FALSE);
- }
-
- /* CreateBitMap(BYTE Depth,UWORD Width,UWORD Height):
- *
- * Creates and initializes a BitMap structure with
- * given dimensions.
- */
-
- struct BitMap * __regargs
- CreateBitMap(BYTE Depth,UWORD Width,UWORD Height)
- {
- struct BitMap *BitMap;
- BYTE i;
-
- if(BitMap = (struct BitMap *)AllocVec(sizeof(struct BitMap),MEMF_PUBLIC|MEMF_CLEAR))
- {
- LONG PlaneSize;
-
- InitBitMap(BitMap,Depth,Width,Height);
-
- PlaneSize = BitMap -> BytesPerRow * BitMap -> Rows;
-
- if(!(BitMap -> Planes[0] = AllocVec(PlaneSize * BitMap -> Depth,MEMF_CHIP|MEMF_PUBLIC|MEMF_CLEAR)))
- {
- FreeVec(BitMap);
-
- return(NULL);
- }
- else
- {
- for(i = 1 ; i < Depth ; i++)
- BitMap -> Planes[i] = &BitMap -> Planes[i - 1][PlaneSize];
- }
- }
-
- return(BitMap);
- }
-
- /* DeleteBitMap(struct BitMap *BitMap):
- *
- * Deallocates any BitMap allocated by CreateBitMap().
- */
-
- VOID __regargs
- DeleteBitMap(struct BitMap *BitMap)
- {
- FreeVec(BitMap -> Planes[0]);
-
- FreeVec(BitMap);
- }
-