home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
609b.lha
/
MandelSquare_v1.3
/
Source.LZH
/
Source
/
ReadILBM.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-01-05
|
6KB
|
326 lines
/** 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);
}