/*
HP_LaserJet driver.
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/memory.h>
#include <devices/prtbase.h>
#include <devices/printer.h>
#define NUMSTARTCMD 7 /* # of cmd bytes before binary data */
#define NUMENDCMD 0 /* # of cmd bytes after binary data */
#define NUMTOTALCMD (NUMSTARTCMD + NUMENDCMD) /* total of above */
extern SetDensity();
/*
00-04 \033&l0L perf skip mode off
05-11 \033*t075R set raster graphics resolution (dpi)
12-16 \033*r0A start raster graphics
*/
char StartCmd[18] = "\033&l0L\033*t075R\033*r0A";
Render(ct, x, y, status)
long ct, x, y, status;
{
extern void *AllocMem(), FreeMem();
extern struct PrinterData *PD;
extern struct PrinterExtendedData *PED;
static UWORD RowSize, BufSize, TotalBufSize, dataoffset;
static UWORD huns, tens, ones; /* used to program buffer size */
UBYTE *ptr, *ptrstart;
int i, err;
err=PDERR_NOERR;
switch(status) {
case 0 : /* Master Initialization */
/*
ct - pointer to IODRPReq structure.
x - width of printed picture in pixels.
y - height of printed picture in pixels.
*/
RowSize = (x + 7) / 8;
BufSize = RowSize + NUMTOTALCMD;
TotalBufSize = BufSize * 2;
PD->pd_PrintBuf = AllocMem(TotalBufSize, MEMF_PUBLIC);
if (PD->pd_PrintBuf == NULL) {
err = PDERR_BUFFERMEMORY; /* no mem */
}
else {
ptr = PD->pd_PrintBuf;
*ptr++ = 27;
*ptr++ = '*';
*ptr++ = 'b'; /* transfer raster graphics */
*ptr++ = huns | '0';
*ptr++ = tens | '0';
*ptr++ = ones | '0'; /* printout width */
*ptr = 'W'; /* terminator */
ptr = &PD->pd_PrintBuf[BufSize];
*ptr++ = 27;
*ptr++ = '*';
*ptr++ = 'b'; /* transfer raster graphics */
*ptr++ = huns | '0';
*ptr++ = tens | '0';
*ptr++ = ones | '0'; /* printout width */
*ptr = 'W'; /* terminator */
dataoffset = NUMSTARTCMD;
/* perf skip mode off, set dpi, start raster gfx */
err = (*(PD->pd_PWrite))(StartCmd, 17);
}
break;
case 1 : /* Scale, Dither and Render */
/*
ct - pointer to PrtInfo structure.
x - 0.
y - row # (0 to Height - 1).
*/
Transfer(ct, y, &PD->pd_PrintBuf[dataoffset]);
err = PDERR_NOERR; /* all ok */
break;
case 2 : /* Dump Buffer to Printer */
/*
ct - 0.
x - 0.
y - # of rows sent (1 to NumRows).
White-space strip.
*/
i = RowSize;
ptrstart = &PD->pd_PrintBuf[dataoffset - NUMSTARTCMD];
ptr = ptrstart + NUMSTARTCMD + i - 1;
while (i > 0 && *ptr == 0) {
i--;
ptr--;
}
ptr = ptrstart + 3; /* get ptr to density info */
*ptr++ = (huns = i / 100) | '0';
*ptr++ = (i - huns * 100) / 10 | '0';
*ptr = i % 10 | '0'; /* set printout width */
err = (*(PD->pd_PWrite))(ptrstart, i + NUMTOTALCMD);
if (err == PDERR_NOERR) {
dataoffset = (dataoffset == NUMSTARTCMD ?
BufSize : 0) + NUMSTARTCMD;
}
break;
case 3 : /* Clear and Init Buffer */
/*
ct - 0.
x - 0.
y - 0.
*/
ptr = &PD->pd_PrintBuf[dataoffset];
i = RowSize;
do {
*ptr++ = 0;
} while (--i);
break;
case 4 : /* Close Down */
/*
ct - error code.
x - io_Special flag from IODRPReq struct
y - 0.
*/
err = PDERR_NOERR; /* assume all ok */
/* if user did not cancel the print */
if (ct != PDERR_CANCEL) {
/* end raster graphics, perf skip mode on */
if ((err = (*(PD->pd_PWrite))
("\033*rB\033&l1L", 9)) == PDERR_NOERR) {
/* if want to unload paper */
if (!(x & SPECIAL_NOFORMFEED)) {
/* eject paper */
err = (*(PD->pd_PWrite))
("\014", 1);
}
}
}
/*
flag that there is no alpha data waiting that
needs a formfeed (since we just did one)
*/
PED->ped_PrintMode = 0;
/* wait for both buffers to empty */
(*(PD->pd_PBothReady))();
if (PD->pd_PrintBuf != NULL) {
FreeMem(PD->pd_PrintBuf, TotalBufSize);
}
break;
case 5 : /* Pre-Master Initialization */
/*
ct - 0 or pointer to IODRPReq structure.
x - io_Special flag from IODRPReq struct
y - 0.
*/
/* select density */
SetDensity(x & SPECIAL_DENSITYMASK);
break;
}
return(err);
}