home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d1xx
/
d185
/
iff.lha
/
EXAMPLES
/
ScreenSave
/
ScreenSave.c
next >
Wrap
C/C++ Source or Header
|
1988-12-13
|
10KB
|
393 lines
/*
* ScreenSave.c -- v1.06 Carolyn Scheppner CBM
* Saves front screen as ILBM file
* Saves a CAMG chunk for HAM, etc.
* Creates icon for ILBM file
* Original 10/86
* Modified 9/88 - To mask out unwanted ViewMode bits in CAMG
* and use CAMG defs in new ilbm.h
*
* Uses IFF rtns by J.Morrison and S.Shaw of Electronic Arts
*
* (all C code including IFF modules compiled with -v on LC2)
* Linkage information:
* FROM AStartup.obj, ScreenSave.o, iffw.o, ilbmw.o, packer.o
* TO ScreenSave
* LIBRARY Amiga.lib, LC.lib
*
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <graphics/gfxbase.h>
#include <graphics/rastport.h>
#include <graphics/gfx.h>
#include <graphics/view.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <workbench/workbench.h>
#include <workbench/startup.h>
#include "iff/ilbm.h"
/* From AStartup - used to create stdio on WB startup */
extern LONG stdin, stdout, stderr;
/* For masking unwanted Viewmodes bits */
#define BADFLAGS (SPRITES|VP_HIDE|GENLOCK_AUDIO|GENLOCK_VIDEO)
#define FLAGMASK (~BADFLAGS)
#define CAMGMASK (FLAGMASK & 0x0000FFFFL)
/* Other Stuff */
#define bufSize 512
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
ULONG IconBase;
struct Screen *frontScreen;
struct ViewPort *picViewPort;
struct BitMap *picBitMap;
WORD *picColorTable;
ULONG picViewModes;
BOOL fromWB, newStdio;
#define INBUFSZ 40
char sbuf[INBUFSZ];
char nbuf[INBUFSZ];
char conSpec[] = "CON:0/40/639/160/ ScreenSave v1.06 ";
/* Definitions for ILBM Icon */
USHORT ILBMimagedata[] = {
0xFFFF, 0xFFFC,
0xC000, 0x000C,
0xC000, 0x000C,
0xC1E7, 0x9E0C,
0xC1F8, 0x7E0C,
0xC078, 0x780C,
0xC187, 0x860C,
0xC078, 0x780C,
0xC1F8, 0x7E0C,
0xC1E7, 0x9E0C,
0xC000, 0x000C,
0xC000, 0x000C,
0xFFFF, 0xFFFC,
0x0000, 0x0000,
0x0000, 0x0000,
/**/
0xFFFF, 0xFFFC,
0xFFFF, 0xFFFC,
0xF800, 0x007C,
0xF9E0, 0x1E7C,
0xF980, 0x067C,
0xF807, 0x807C,
0xF81F, 0xE07C,
0xF807, 0x807C,
0xF980, 0x067C,
0xF9E0, 0x1E7C,
0xF800, 0x007C,
0xFFFF, 0xFFFC,
0xFFFF, 0xFFFC,
0x0000, 0x0000,
0x0000, 0x0000,
/**/
};
struct Image ILBMimage = {
0,0, /* Leftedge, Topedge */
30,15, /* Width Height */
2, /* Depth */
&ILBMimagedata[0], /* Data for image */
3,0 /* PlanePick, PlaneOnOff */
};
struct DiskObject ILBMobject = {
WB_DISKMAGIC,
WB_DISKVERSION,
/* Gadget Structure */
NULL, /* Ptr to next gadget */
0,0, /* Leftedge, Topedge */
30,15, /* Width, Height */
GADGHBOX|GADGIMAGE, /* Flags */
RELVERIFY|GADGIMMEDIATE, /* Activation */
BOOLGADGET, /* Type */
(APTR)&ILBMimage, /* Render */
NULL, /* Select Render */
NULL, /* Text */
NULL,NULL,NULL,NULL, /* Exclude, Special, ID, UserData */
4, /* WBObject type */
":Display", /* Default tool */
NULL, /* Tool Types */
NO_ICON_POSITION, /* Current X */
NO_ICON_POSITION, /* Current Y */
NULL,NULL,NULL, /* Drawer, ToolWindow, Stack */
};
main(argc, argv)
int argc;
char **argv;
{
LONG file;
IFFP iffp = NO_FILE;
char *filename;
int l;
newStdio = FALSE;
fromWB = (argc==0) ? TRUE : FALSE;
if((fromWB) && (!(newStdio = openStdio(&conSpec[0]))))
{
return(0);
}
if ((IntuitionBase =
(struct IntuitionBase *)OpenLibrary("intuition.library",0))==NULL)
cleanexit("Can't open intuition.library\n");
if ((GfxBase =
(struct GfxBase *)OpenLibrary("graphics.library",0))==NULL)
cleanexit("Can't open graphics.library\n");
if ((IconBase = OpenLibrary("icon.library",0))==NULL )
cleanexit("Can't open icon.library\n");
printf("ScreenSave v 1.06 --- C. Scheppner CBM 9/88\n");
printf(" Saves the front screen as an IFF ILBM file\n");
printf(" A CAMG chunk is saved (for HAM pics, etc.)\n\n");
if(argc>1) /* Passed filename via command line */
{
filename = argv[1];
}
else
{
printf("Enter filename for save: ");
l = gets(&nbuf[0]);
if(l==0) /* No filename - Exit */
{
cleanexit("\nScreen not saved, filename required\n");
}
else
{
filename = &nbuf[0];
}
}
if (!(file = Open(filename, MODE_NEWFILE)))
cleanexit("Can't open output file\n");
Write(file,"x",1); /* 1.1 so Seek to beginning works ? */
printf("Click here and press <RETURN> when ready: ");
gets(&sbuf[0]);
printf("Front screen will be saved in 10 seconds\n");
Delay(500);
Forbid();
frontScreen = IntuitionBase->FirstScreen;
Permit();
picViewPort = &( frontScreen->ViewPort );
picBitMap = (struct BitMap*)picViewPort->RasInfo->BitMap;
picColorTable = (WORD *)picViewPort->ColorMap->ColorTable;
picViewModes = (ULONG)picViewPort->Modes;
printf("\nSaving...\n");
iffp = PutPicture(file, picBitMap, picColorTable, picViewModes);
Close(file);
if (iffp == IFF_OKAY)
{
printf("Screen saved\n");
if(!(PutDiskObject(filename,&ILBMobject)))
{
cleanexit("Error saving icon\n");
}
printf("Icon saved\n");
}
cleanexit("Done\n");
}
cleanexit(s)
char *s;
{
if(*s) printf(s);
if ((fromWB)&&(*s)) /* Wait so user can read messages */
{
printf("\nPRESS RETURN TO EXIT\n");
gets(&sbuf[0]);
}
cleanup();
exit();
}
cleanup()
{
if (newStdio) closeStdio();
if (GfxBase) CloseLibrary(GfxBase);
if (IntuitionBase) CloseLibrary(IntuitionBase);
if (IconBase) CloseLibrary(IconBase);
}
openStdio(conspec)
char *conspec;
{
LONG wfile;
struct Process *proc;
struct FileHandle *handle;
if (!(wfile = Open(conspec,MODE_NEWFILE))) return(0);
stdin = wfile;
stdout = wfile;
stderr = wfile;
handle = (struct FileHandle *)(wfile << 2);
proc = (struct Process *)FindTask(NULL);
proc->pr_ConsoleTask = (APTR)(handle->fh_Type);
proc->pr_CIS = (BPTR)stdin;
proc->pr_COS = (BPTR)stdout;
return(1);
}
closeStdio()
{
struct Process *proc;
struct FileHandle *handle;
if (stdin > 0) Close(stdin);
stdin = -1;
stdout = -1;
stderr = -1;
handle = (struct FileHandle *)(stdin << 2);
proc = (struct Process *)FindTask(NULL);
proc->pr_ConsoleTask = NULL;
proc->pr_CIS = NULL;
proc->pr_COS = NULL;
}
gets(s)
char *s;
{
int l = 0, max = INBUFSZ - 1;
while (((*s = getchar()) !='\n' )&&(l < max)) s++, l++;
*s = NULL;
return(l);
}
/* String Functions */
strlen(s)
char *s;
{
int i = 0;
while(*s++) i++;
return(i);
}
strcpy(to,from)
char *to, *from;
{
do
{
*to++ = *from;
}
while(*from++);
}
/** PutPicture() ***********************************************************
*
* Put a picture into an IFF file.
* This procedure calls PutAnILBM, passing in an <x, y> location of <0, 0>,
* a NULL mask, and a locally-allocated buffer. It also assumes you want to
* write out all the bitplanes in the BitMap.
*
***************************************************************************/
Point2D nullPoint = {0, 0};
IFFP PutPicture(file, bitmap, colorMap, viewmodes)
LONG file; struct BitMap *bitmap;
WORD *colorMap; ULONG viewmodes;
{
BYTE buffer[bufSize];
return( PutAnILBM(file, bitmap, NULL,
colorMap, bitmap->Depth, viewmodes,
&nullPoint, buffer, bufSize) );
}
/** PutAnILBM() ************************************************************
*
* Write an entire BitMap as a FORM ILBM in an IFF file.
* This version works for any display mode (C. Scheppner).
*
* Normal return result is IFF_OKAY.
*
* The utility program IFFCheck would print the following outline of the
* resulting file:
*
* FORM ILBM
* BMHD
* CAMG
* CMAP
* BODY (compressed)
*
***************************************************************************/
#define CkErr(expression) {if (ifferr == IFF_OKAY) ifferr = (expression);}
IFFP PutAnILBM(file, bitmap, mask, colorMap, depth,
viewmodes, xy, buffer, bufsize)
LONG file;
struct BitMap *bitmap;
BYTE *mask; WORD *colorMap; UBYTE depth;
ULONG viewmodes;
Point2D *xy; BYTE *buffer; LONG bufsize;
{
BitMapHeader bmHdr;
CamgChunk camgChunk;
GroupContext fileContext, formContext;
IFFP ifferr;
WORD pageWidth, pageHeight;
pageWidth = (bitmap->BytesPerRow) << 3;
pageHeight = bitmap->Rows;
ifferr = InitBMHdr(&bmHdr, bitmap, mskNone,
cmpByteRun1, 0, pageWidth, pageHeight);
/* You could write an uncompressed image by passing cmpNone instead
* of cmpByteRun1 to InitBMHdr. */
bmHdr.nPlanes = depth; /* This must be <= bitmap->Depth */
if (mask != NULL) bmHdr.masking = mskHasMask;
bmHdr.x = xy->x; bmHdr.y = xy->y;
camgChunk.ViewModes = viewmodes & CAMGMASK; /* Mask out unwanted bits! */
CkErr( OpenWIFF(file, &fileContext, szNotYetKnown) );
CkErr(StartWGroup(&fileContext, FORM, szNotYetKnown, ID_ILBM, &formContext));
CkErr( PutBMHD(&formContext, &bmHdr) );
CkErr( PutCAMG(&formContext, &camgChunk) );
CkErr( PutCMAP(&formContext, colorMap, depth) );
CkErr( PutBODY(&formContext, bitmap, mask, &bmHdr, buffer, bufsize) );
CkErr( EndWGroup(&formContext) );
CkErr( CloseWGroup(&fileContext) );
return( ifferr );
}