home *** CD-ROM | disk | FTP | other *** search
- /** putpict.c ***************************************************/
- /* PutPict(). Given a BitMap and a color map in RAM on the */
- /* Amiga, outputs as an ILBM. See /iff/ilbm.h & /iff/ilbmw.c. */
- /* 23-Jan-86 */
- /* */
- /* By Jerry Morrison and Steve Shaw, Electronic Arts. */
- /* This software is in the public domain. */
- /* */
- /* This version for the Commodore-Amiga computer. */
- /* */
- /****************************************************************/
- #include "iff/intuall.h"
- #include "iff/gio.h"
- #include "iff/ilbm.h"
- #include "iff/putpict.h"
-
- #define MaxDepth 5
- static IFFP ifferror = 0;
-
- #define CkErr(expression) {if (ifferror == IFF_OKAY) ifferror = (expression);}
-
- /*****************************************************************************/
- /* IffErr */
- /* */
- /* Returns the iff error code and resets it to zero */
- /* */
- /*****************************************************************************/
- IFFP IffErr()
- {
- IFFP i;
- i = ifferror;
- ifferror = 0;
- return(i);
- }
-
- /*****************************************************************************/
- /* PutPict() */
- /* */
- /* Put a picture into an IFF file */
- /* Pass in mask == NULL for no mask. */
- /* */
- /* Buffer should be big enough for one packed scan line */
- /* Buffer used as temporary storage to speed-up writing. */
- /* A large buffer, say 8KB, is useful for minimizing Write and Seek calls. */
- /* (See /iff/gio.h & /iff/gio.c). */
- /*****************************************************************************/
-
- BOOL PutPict(file, bm, pageW, pageH, colorMap, buffer, bufsize)
- LONG file; struct BitMap *bm;
- WORD pageW,pageH;
- WORD *colorMap;
- BYTE *buffer; LONG bufsize;
- {
- BitMapHeader bmHdr;
- GroupContext fileContext, formContext;
-
- ifferror = InitBMHdr(&bmHdr,
- bm,
- mskNone,
- cmpByteRun1,
- 0,
- pageW,
- pageH );
-
- /* use buffered write for speedup, if it is big-enough for both
- * PutBODY's buffer and a gio buffer.*/
- #define BODY_BUFSIZE 512
- if (ifferror == IFF_OKAY && bufsize > 2*BODY_BUFSIZE) {
- if (GWriteDeclare(file, buffer+BODY_BUFSIZE, bufsize-BODY_BUFSIZE) < 0)
- ifferror = DOS_ERROR;
- bufsize = BODY_BUFSIZE;
- }
-
- CkErr(OpenWIFF(file, &fileContext, szNotYetKnown) );
- CkErr(StartWGroup(&fileContext, FORM, szNotYetKnown, ID_ILBM, &formContext) );
-
- CkErr(PutCk(&formContext, ID_BMHD, sizeof(BitMapHeader), (BYTE *)&bmHdr));
-
- if (colorMap!=NULL)
- CkErr( PutCMAP(&formContext, colorMap, (UBYTE)bm->Depth) );
- CkErr( PutBODY(&formContext, bm, NULL, &bmHdr, buffer, bufsize) );
-
- CkErr( EndWGroup(&formContext) );
- CkErr( CloseWGroup(&fileContext) );
- if (GWriteUndeclare(file) < 0 && ifferror == IFF_OKAY)
- ifferror = DOS_ERROR;
- return( (BOOL)(ifferror != IFF_OKAY) );
- }
-
-