/*
 *
 *	DISCLAIMER:
 *
 *	This program is provided as a service to the programmer
 *	community to demonstrate one or more features of the Amiga
 *	personal computer.  These code samples may be freely used
 *	for commercial or noncommercial purposes.
 * 
 * 	Commodore Electronics, Ltd ("Commodore") makes no
 *	warranties, either expressed or implied, with respect
 *	to the program described herein, its quality, performance,
 *	merchantability, or fitness for any particular purpose.
 *	This program is provided "as is" and the entire risk
 *	as to its quality and performance is with the user.
 *	Should the program prove defective following its
 *	purchase, the user (and not the creator of the program,
 *	Commodore, their distributors or their retailers)
 *	assumes the entire cost of all necessary damages.  In 
 *	no event will Commodore be liable for direct, indirect,
 *	incidental or consequential damages resulting from any
 *	defect in the program even if it has been advised of the 
 *	possibility of such damages.  Some laws do not allow
 *	the exclusion or limitation of implied warranties or
 *	liabilities for incidental or consequential damages,
 *	so the above limitation or exclusion may not apply.
 *
 */

/* printer.c - program to do a raster dump to whatever printer is specified
 * 		by Preferences, of the Workbench Screen.  
 *
 * Author:  Rob Peck, 12/1/85
 *
 * This code may be freely utilized to develop programs for the Amiga
 */


#include "exec/types.h"
#include "intuition/intuition.h"
#include "devices/printer.h"
#define INTUITION_WONT_OPEN 1000

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

union printerIO *request;	/* a pointer to a request block */
extern int DumpRPort();
extern struct IORequest *CreateExtIO();
extern struct Window *OpenWindow();
extern struct Port *CreatePort();
struct IntuitionBase *IntuitionBase;

struct NewWindow nw = {
        0, 0, 100, 40, 0, 1, 0, 0, NULL, NULL, NULL, NULL, NULL,
        0, 0, 0, 0, WBENCHSCREEN
        };
         
main()
{
        struct Window *w;
        struct Screen *screen;
        struct RastPort *rp;
        struct ViewPort *vp;
        struct ColorMap *cm;
	union printerIO sizeDummy;
        int modes,width,height,error;
        struct Port *printerPort;      /* at which to receive reply */
        IntuitionBase = (struct IntuitionBase *)OpenLibrary(
						"intuition.library", 0);
        if (IntuitionBase == NULL) exit(INTUITION_WONT_OPEN);

        w = OpenWindow(&nw);
        if(w == NULL) goto cleanup1;
        screen = w->WScreen;    /* get screen address from window */
        CloseWindow(w);         /* once have screen address, no
                                 * more need for window, close it.
                                 */
        vp = &screen->ViewPort; /* get screen's ViewPort, from
                                 * which the colormap will be gotten */
        rp = &screen->RastPort; /* get screen's RastPort, which
                                 * is what gets dumped to printer */
        
        cm = vp->ColorMap;      /* retrieve pointer to colormap for
                                 * the printer dump */
        modes = vp->Modes;      /* retrieve the modes variable */
        width = vp->DWidth;     /* retrieve width to print */
        height = vp->DHeight;   /* retrieve height to print */

        printerPort = CreatePort("my.print.port",0);
        request =  (union printerIO *)CreateExtIO(printerPort,
                                        sizeof(sizeDummy));

        error = OpenPrinter(request);
        if(error != 0) goto cleanup2;

	Delay(300);	/* 300/60 = 6 seconds delay before it starts */
        error = DumpRPort(
                        request,/* pointer to initialized request */
                        rp,     /* rastport pointer */
                        cm,     /* color map pointer */
                        modes,  /* low, high res, etc (display modes)*/
                        0, 0,   /* x and y offsets into rastport */
                        width,height, /* source size */
                        width,(height * 2), /* dest rows, columns */
                        SPECIAL_FULLROWS 
			| SPECIAL_FULLCOLS
			| SPECIAL_ASPECT /* io Special value, says print
                                 * as pixels only, direct copy */
                        );
        ClosePrinter(request);
cleanup2:
        DeleteExtIO(request, sizeof(sizeDummy));
        DeletePort(printerPort);
cleanup1:
        CloseLibrary(IntuitionBase);
        
}               /* end of demo screen dump */

