🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: mod.amiga.sources
1 messages
1 total messages Started by doc Tue, 12 Aug 1986 02:43
ScreenDump.c
#19
Author: doc
Date: Tue, 12 Aug 1986 02:43
545 lines
13625 bytes
Reply-To: ihnp4!cbmvax!carolyn (Carolyn Scheppner)

/**************************************************************************
*  ScreenDump.c --  Dump RastPort of highest screen/window to printer
*                    by Carolyn Scheppner  CBM  02/86
*
* Linkage information:
* FROM     LStartup.obj, ScreenDump.o
* TO       ScreenDump
* LIBRARY  LC.lib, Amiga.lib
***************************************************************************/

#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.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 <devices/printer.h>
#include <lattice/stdio.h>

struct IntuitionBase *IntuitionBase;
struct GfxBase       *GfxBase;

struct Window   *firstWindow, *nextWindow, *highWindow;
struct Screen   *firstScreen, *nextScreen, *highScreen;

struct ViewPort *viewPort;
struct RastPort *rastPort;
struct ColorMap *colorMap;

SHORT  topEdge;

BOOL   Borderless, WindowPrint, Relative, pOpened;
int    dLeft, dRight, dTop, dBottom;   /* default border adjustments */
int    bLeft, bRight, bTop, bBottom;   /* current border adjustments */
int    srcX, srcY, srcWidth, srcHeight;
int    destCols, destRows, special;
int    openError, dumpError, multiplier, i;
char   sbuf[80], ch;

struct MsgPort   *printerPort;

union  printerIO {
	struct IOStdReq    ios;
	struct IODRPReq    iodrp;
	struct IOPrtCmdReq iopc;
};

union printerIO  *request;


/* main */

main()
{
	if ((IntuitionBase =
	    (struct IntuitionBase *)OpenLibrary("intuition.library",0))==NULL)
		cleanexit("Can't open Intuition.\n");

	if ((GfxBase =
	    (struct GfxBase *)OpenLibrary("graphics.library",0))==NULL)
		cleanexit("Can't open Graphics.\nn");


	/* Printer stuff */
	pOpened = FALSE;
	printerPort = (struct MsgPort *)CreatePort("myPrtPort",0);
	if(printerPort == NULL)  cleanexit("Can't open printer port.\n");

	request = (union printerIO *)CreateExtIO(printerPort,
	sizeof(union printerIO));
	if(request == NULL)  cleanexit("Can't allocate ExtIO.\n");

	openError = OpenPrinter(request);
	if(openError)  cleanexit("Can't open printer.\n");
	pOpened = TRUE;
	/* */

	printf("\n>> SCREENDUMP <<       C. Scheppner     CBM  02/86\n");
	printf("\nDefault settings: Full Image, Relative Size Output\n");

	WindowPrint = FALSE;
	Borderless  = FALSE;
	Relative   = TRUE;
	dLeft   = 2;                  /* defaults for Borderless option */
	dRight  = 2;
	dTop    = 10;
	dBottom = 10;
	multiplier = 125;             /* default for Relative calculation */

	newImage();        /* get pointers to rastport, etc */

	do {
		printf("\nSELECT: <P>rint, <I>mageOpts, <O>utputOpts,");
		printf(" <N>ewImage or <Q>uit ? ");
		getLch();
		if (ch =='p')       doPrint();
		else if (ch =='i')  doImOpts();
		else if (ch =='o')  doOutOpts();
		else if (ch =='n')  newImage();
	}
	while (ch != 'q');

	cleanup();
}

/*--------------------------------------------------------------------*/

newImage()
{
	printf("\nNEW IMAGE: <W>indow or <S>creen ? ");
	getLch();
	if (ch =='w')
	{
		WindowPrint = TRUE;
		printf("\nMove Screens so Windows's Screen is highest.\n");
		printf("Move Windows so Window to print is highest.\n");
	}
	else if (ch =='s')
	{
		WindowPrint = FALSE;
		printf("\nMove Screens so Screen to print is highest.\n");
	}
	ch = NULL;

	printf("\nClick here and press <RET> when ready: ");
	getLch();

	getPointers();
}


getPointers()
{
	Forbid();
	firstScreen  = IntuitionBase->FirstScreen;
	topEdge = 400;
	nextScreen = highScreen = firstScreen;
	while( nextScreen != NULL )
	{
		if(nextScreen->TopEdge < topEdge)
		{
			topEdge = nextScreen->TopEdge;
			highScreen = nextScreen;
		}
		nextScreen = nextScreen->NextScreen;
	}

	if(WindowPrint)
	{
		firstWindow = highScreen->FirstWindow;
		topEdge = 400;
		nextWindow = highWindow = firstWindow;
		while( nextWindow != NULL )
		{
			if(nextWindow->TopEdge < topEdge)
			{
				topEdge = nextWindow->TopEdge;
				highWindow = nextWindow;
			}
			nextWindow = nextWindow->NextWindow;
		}
	}
	Permit();

	viewPort = &(highScreen->ViewPort);
	colorMap = viewPort->ColorMap;
	rastPort = &(highScreen->RastPort);

	getCoords();
}


getCoords()
{
	if(WindowPrint)   /* if Borderless == FALSE, b variables = 0 */
	{
		srcX = highWindow->LeftEdge + bLeft;
		srcY = highWindow->TopEdge + bTop;
		srcWidth  = highWindow->Width -bLeft - bRight;
		srcHeight = highWindow->Height -bTop - bBottom;
	}
	else      /* screen print */
	{
		srcX = bLeft;
		srcY = bTop;
		srcWidth  = viewPort->DWidth -bLeft - bRight;
		srcHeight = viewPort->DHeight - bTop - bBottom;
	}
	if (Relative == TRUE)
	{
		doRelativeSize();
	}
}


doImOpts()
{
	printf("\nIMAGE OPTS: <F>ull, <B>orderless, or <O>ther ? ");
	getLch();
	if (ch == 'f')
	{
		Borderless = FALSE;
		bLeft = bRight = bTop = bBottom = 0;
		getCoords();
	}
	else if (ch == 'b')
	{
		Borderless = TRUE;

		printf("\nBORDERS: Change default borders <Y> or <N> ? ");
		getLch();
		if (ch == 'y')
		{
			printf("\nBORDER ADJUSTMENTS: Enter new value or press <RET>\n");
			dLeft   = promptInt("Left",dLeft);
			dRight  = promptInt("Right",dRight);
			dTop    = promptInt("Top",dTop);
			dBottom = promptInt("Bottom",dBottom);
		}
		bLeft   = dLeft;
		bRight  = dRight;
		bTop    = dTop;
		bBottom = dBottom;
		getCoords();
		ch = NULL;
	}
	else if (ch == 'o')
	{
		otherImOpts();
	}
	ch = NULL;
}   


otherImOpts()
{
	printf("\nOTHER IMAGE OPTIONS:\n");
	printf(" CURRENT OPTIONS: ");
	if (!Borderless) printf("Full ");
	else printf("Borderless ");
	if (!WindowPrint) printf("Screen\n");
	else printf("Window\n");

	printf("\nCURRENT VALUES: Enter new value or press <RET>\n");
	srcX = promptInt("SrcX",srcX);
	srcY = promptInt("SrcY",srcY);
	srcWidth  = promptInt("SrcWidth",srcWidth);
	srcHeight = promptInt("SrcHeight",srcHeight);
}


doOutOpts()
{
	printf("\nOUTPUT OPTS: <S>mall, <M>edium, <L>arge,");
	printf(" <R>elative or <O>ther ? ");
	getLch();

	if (ch == 's')
	{
		Relative = FALSE;
		special  = SPECIAL_FRACCOLS|SPECIAL_ASPECT;
		destCols = 0x55555555;    /* 1/3 size */
		destRows = 0;
	}
	else if (ch == 'm')
	{
		Relative = FALSE;
		special  = SPECIAL_FRACCOLS|SPECIAL_ASPECT;
		destCols = 0xaaaaaaaa;    /* 2/3 size */
		destRows = 0;
	}
	else if (ch == 'l')
	{
		Relative = FALSE;
		special  = SPECIAL_FULLCOLS|SPECIAL_ASPECT;
		destCols = 0;
		destRows = 0;
	}
	else if (ch == 'r')
	{
		askMultiplier();
		doRelativeSize();
	}
	else if (ch == 'o')
	{
		otherOutOpts();
	}
	ch = NULL;
}   


askMultiplier()
{
	printf("\nRELATIVE: Change default multiplier <Y> or <N> ? ");
	getLch();
	if (ch == 'y')
	{
		printf("\nMULTIPLIER: Enter new value or press <RET>\n");
		multiplier = promptInt("Multiplier",multiplier);
	}
	ch = NULL;
}


doRelativeSize()
{
	Relative = TRUE;
	special  = SPECIAL_ASPECT|SPECIAL_MILCOLS;
	destCols = (int) srcWidth * multiplier / 10;
	if ((viewPort->Modes & HIRES) == NULL) destCols = destCols * 2;
	destRows = 0;
}


otherOutOpts()
{
	printf("\nSpecial Flags Available:\n");
	printf(" MILCOLS   0x001   DestCols specified in 1/1000 inch\n");
	printf(" MILROWS   0x002   DestRows specified in 1/1000 inch\n");
	printf(" FULLCOLS  0x004   Make DestCols maximum possible\n");
	printf(" FULLROWS  0x008   Make DestRows maximum possible\n");
	printf(" FRACCOLS  0x010   DestCols is fraction of FULLCOLS\n");
	printf(" FRACROWS  0x020   DestRows is fraction of FULLROWS\n");
	printf(" ASPECT    0x080   Ensure correct aspect ratio\n");
	printf(" DENSITY1  0x100   Lowest Res\n");
	printf(" DENSITY2  0x200   Next Res\n");
	printf(" DENSITY3  0x400   Next Res\n");
	printf(" DENSITY4  0x800   Highest Res\n");
	printf(" MASK      0xF00   Mask out density bits\n");

	printf("\nCURRENT VALUES: Enter new value or press <RET>\n");
	destCols = promptInt("DestCols",destCols);
	destRows = promptInt("DestRows",destRows);
	special  = promptInt("Special",special);
}


promptInt(stp,value)   /* Prompt for and input new value */
char   *stp;
int    value;
{
	printf(" %s = %ld  [ Hex 0x%lx ]   New value ? ",stp,value,value);
	value = getInt(value);
	return(value);
}

getLch()     /* ch = input char converted to lower case or NULL */
{
	gets(&sbuf[0]);
	if ((ch=(sbuf[0])) != NULL)  ch = ch|0x20;
}

getInt(value)         /* Get decimal or hex (0xnnnn) value */
int value;            /* If none entered, return previous  */
{
	int count;

	gets(&sbuf[0]);
	if (sbuf[0] != NULL)
	{
		if ((sbuf[1]|0x20) =='x') count = stch_i(&sbuf[2],&value);
		else count = stcd_i(&sbuf[0],&value);
	}
	return(value);
}



doPrint()
{
	printf("\nPrinting will start in 10 seconds.\n");
	printf(" ( Time to hide this window, etc. )\n\n");
	for(i=0;i<10*60;i++) WaitTOF();  /* 10 second delay */

	/* Printer stuff */
	dumpError = DumpRPort( request,
	rastPort,
	colorMap,
	viewPort->Modes,
	srcX,                       /* RastPort offsets */
	srcY,
	srcWidth,                   /* origin sizes  */
	srcHeight,
	destCols,                   /* printed sizes */
	destRows,
	special );                  /* io_Special */

	if (dumpError)  printf("\n Can't Dump. PDERR = %ld\n",dumpError);
}


cleanexit(errMsg)
char *errMsg;
{
	printf(errMsg);
	cleanup();
	exit(-1);
}

cleanup()
{
	pcleanup();
	if (IntuitionBase)     CloseLibrary(IntuitionBase);
	if (GfxBase)           CloseLibrary(GfxBase);
}

pcleanup()
{
	if (pOpened)           ClosePrinter(request);
	if (printerPort)       DeletePort(printerPort);
	if (request)           DeleteExtIO(request);
}


/************************************************************************/
/* printersupport.c rtns  for example page 3-202  1.1 Rom Kernel manual */
/************************************************************************/

#include        "exec/types.h"
#include        "exec/nodes.h"
#include        "exec/lists.h"
#include        "exec/ports.h"
#include        "exec/tasks.h"
#include        "exec/io.h"
#include        "devices/printer.h"


/*  This union is defined above in my main
    If you are compiling these rtns separately,
     uncomment this union definition

union printerIO {
       struct IOStdReq ios;
       struct IODRPReq iodrp;
       struct IOPrtCmdReq iopc;
       };
*/


/* OPEN THE PRINTER */
int
OpenPrinter(request)
union printerIO *request;
{
	return(OpenDevice("printer.device",0,request,0));
}


/* CLOSE THE PRINTER */
int
ClosePrinter(request)
union printerIO *request;
{
	CloseDevice(request);
	return(0);
}


/* Send a NULL terminated string to the printer
 * Assumes printer device is open and printerMsg
 * is correctly initialized.  Watches for embedded
 * "escape-sequences" and handles them as defined.
 */

int
PrintString(request,string)
union printerIO *request;
char *string;
{
	request->ios.io_Command = CMD_WRITE;
	request->ios.io_Data = (APTR)string;
	request->ios.io_Length = -1;
	/* if -1, the printer assumes it has been given
	    * a null terminated string.
	    */
	return(DoIO(request));
}


/* Send RAW character stream to the printer directly,
 * avoid "escape-sequence" parsing by the device.
 */
int
PrintRaw(request,buffer,count)
union printerIO *request;  /* a properly initialized request block */
char *buffer;              /* where is the output stream of characters */
int count;                 /* how many characters to output */
{
	/* queue a printer raw write */
	request->ios.io_Command = PRD_RAWWRITE;
	request->ios.io_Data = (APTR)buffer;
	request->ios.io_Length = count;

	return(DoIO(request));
}


/* Send Printer Command */
int
PrintCommand(request,command, p0, p1, p2, p3)
union printerIO *request;
int command, p0, p1, p2, p3;    /* command and its parameters */
{
	/* queue a printer command */
	request->iopc.io_Command = PRD_PRTCOMMAND;
	request->iopc.io_PrtCommand = command;
	request->iopc.io_Parm0 = p0;
	request->iopc.io_Parm1 = p1;
	request->iopc.io_Parm2 = p2;
	request->iopc.io_Parm3 = p3;
	return(DoIO(request));
}


/* Dump RastPort */
int
DumpRPort(request,rastPort, colorMap, modes, sx,sy, sw,sh, dc,dr, s)
union printerIO *request;
struct RastPort *rastPort;
struct ColorMap *colorMap;
ULONG modes;
UWORD sx, sy, sw, sh;
LONG dc, dr;
UWORD s;
{
	request->iodrp.io_Command = PRD_DUMPRPORT;
	request->iodrp.io_RastPort = rastPort;
	request->iodrp.io_ColorMap = colorMap;
	request->iodrp.io_Modes = modes;
	request->iodrp.io_SrcX = sx;
	request->iodrp.io_SrcY = sy;
	request->iodrp.io_SrcWidth = sw;
	request->iodrp.io_SrcHeight = sh;
	request->iodrp.io_DestCols = dc;
	request->iodrp.io_DestRows = dr;
	request->iodrp.io_Special = s;
	return(DoIO(request));
}
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads