/***********************************
 * C-Source
 * Dimostrazione di stampa di una
 * immagine bitmap a 24bit con
 * TurboPrint Professionale 3.x/4.x
 * Dicembre 1995
 ***********************************
 * Copyright 1995 by IrseeSoft
 * Copyright 1997 versione italiana
 * a cura della FRACTAL MINDS
 * Via Principe Eugenio 23 - 00185 Roma
 * Tel/Fax  (06) 4457035
 * Email: m.kohler@agora.stm.it
 ***********************************/

#include <exec/types.h>
#include <exec/ports.h>
#include <exec/devices.h>
#include <devices/printer.h>
#include <devices/prtbase.h>
#include <dos/dos.h>

#include <libraries/cybergraphics.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>

// some new Includes
#include <turboprint.h>


#define Width 256
#define Height 256

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;


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



// questo breve programma demo, apre una RastPort invisibile a 24bit
// e la scarica attraverso TurboPrint sino alla stampante
// Lavora quasi come uno scarico di immagine normale.

VOID main()
{
struct MsgPort *PrinterMP;
union printerIO *PIO;
struct PrinterData *PD;
struct TPExtIODRP ExtIoDrp;

struct RastPort MyRastPort;
struct BitMap MyBitMap;
UWORD x,y;
UBYTE *MemPoint;
BOOL TP_Installed;

UWORD TPVersion;
char* TPIdString;

if (IntuitionBase = (struct IntuitionBase*)OpenLibrary((STRPTR)"intuition.library",37))
if (GfxBase = (struct GfxBase*)OpenLibrary((STRPTR)"graphics.library",37))
	{

// create a RastPort Width * Height 24-Bit

	InitRastPort(&MyRastPort);
	MyRastPort.BitMap = &MyBitMap;
		// basta solo 1 BitPlane, perchè è un formato chunky
	InitBitMap(&MyBitMap,1,Width,Height);

	// ora impostiamo il giusto BytesPerRow
	// dovreste impostarlo come 3*Width in InitBitMap ma
	// InitBitMap talvolta calcola BytesPerRow errati
	// quindi lo faremo per conto nostro

	MyBitMap.BytesPerRow = 3*Width;


	// alloca una demo bitmap

	if (MyBitMap.Planes[0]= (APTR)AllocMem(3*Width*Height,0))
		{
		MemPoint = (UBYTE*)MyBitMap.Planes[0];

	// e la riempie con qualcosa di colorato

		for (y=0;y<256;y++)
			for (x=0;x<256;x++)
			{
				// la riempie con dei piacevoli colori
				*MemPoint++ = 255-((x+y)>>1);		// rosso
				*MemPoint++ = (x>127)? 2*(x-128):255-2*x;	// verde
				*MemPoint++ = (y>127)? ((x<127)? 255-((x+y)>>1):2*(y-127)):0;	// blu
			}				


	// crea una MessagePort e apre il printer.device come al solito

		if (PrinterMP = (struct MsgPort*)CreateMsgPort())
			{
			if (PIO = (union printerIO *)CreateExtIO(PrinterMP,sizeof(union printerIO)))
				{
				// apre il printer.device, se TurboPrint è installato, automaticamente si accede al
				// turboprint printer.device
				if (!(OpenDevice((STRPTR)"printer.device",0,(struct IORequest *)PIO,0)))
					{

					// prima di stampare bisogna sapere se TurboPrint è installato
					// quindi controllate la MatchWord nella struttura "PrinterData"
					// element "pd_OldStack"

					PD = (struct PrinterData *)PIO->iodrp.io_Device;
					TP_Installed = ( ((ULONG *)(PD->pd_OldStk))[2] == TPMATCHWORD);

					TPVersion = PIO->iodrp.io_Device->dd_Library.lib_Version;

					TPIdString = (char*)(PIO->iodrp.io_Device->dd_Library.lib_IdString);

					// dovreste ora testare i caratteri 25-27 per la versione e la revisione
					// ad es. printf("Device-Version:%d\nTPIdString:%s\n",TPVersion,&TPIdString[1]);


					if (TP_Installed && TPVersion >= 39)
						{					
					// riempite il IORequest come al solito
						PIO->iodrp.io_Command = PRD_TPEXTDUMPRPORT;
						PIO->iodrp.io_RastPort = &MyRastPort; 
						PIO->iodrp.io_ColorMap = 0;
						PIO->iodrp.io_SrcX = 0;
						PIO->iodrp.io_SrcY = 0;
						PIO->iodrp.io_SrcWidth = Width;
						PIO->iodrp.io_SrcHeight = Height;
						// tutti i Flag Speciali sono possibili, qui non ne serve alcuno
						PIO->iodrp.io_Special = 0;


						// nuovo: io.Modes deve puntare a una nuova Struttura (ExtIoDrp)
						PIO->iodrp.io_Modes = (ULONG)&ExtIoDrp;
					
					// riempite la nuova struttura
						ExtIoDrp.PixAspX = 1;	// per il corretto rapporto di aspetto
						ExtIoDrp.PixAspY = 1;   // normalmente questi valori dipendono dalla struttura del monitor
														// TicksX and TicksY
					// il nostro bitmap ha il formato RGB a 3 byte (24 bit)
						ExtIoDrp.Mode = TPFMT_RGB24;

					// manda un IORequest al printer.device
					// Turboprint funziona esattamente come il vecchio printer.device
					// quindi è anche possibile fare le SendIO etc.					
						DoIO((struct IORequest *)PIO);
						}
					// se TurboPrint non è installato: Error-Message
					// anche possibile: carica TurboPrint:TurboPrefs ha il flag -q, quindi 
					// potete installarlo da voi
						else printf("Errore: TurboPrint Pro 3 (o superiori) non è installato\n");	

					CloseDevice((struct IORequest *)PIO);
					}
				DeleteExtIO((struct IORequest *)PIO);
				}
			DeleteMsgPort(PrinterMP);
			}
		FreeMem(MyBitMap.Planes[0],MyBitMap.BytesPerRow*MyBitMap.Rows);
		}
	}	
if (GfxBase) CloseLibrary((struct Library*)GfxBase);
if (IntuitionBase) CloseLibrary((struct Library*)IntuitionBase);
}
