/* DoSpecial for HP_LaserJet driver. */ #include "exec/types.h" #include "devices/printer.h" #include "devices/prtbase.h" #define LPI 7 #define CPI 15 #define QUALITY 17 #define INIT_LEN 30 #define LPP 7 #define FORM_LEN 11 #define LEFT_MARG 3 #define RIGHT_MARG 7 #define MARG_LEN 12 DoSpecial(command, outputBuffer, vline, currentVMI, crlfFlag, Parms) char outputBuffer[]; UWORD *command; BYTE *vline; BYTE *currentVMI; BYTE *crlfFlag; UBYTE Parms[]; { extern struct PrinterData *PD; extern struct PrinterExtendedData *PED; static UWORD textlength, topmargin; int x, y, j; static char initThisPrinter[INIT_LEN] = "\033&d@\033&l6D\033(s0b10h1q0p0s3t0u12V"; static char initForm[FORM_LEN] = "\033&l002e000F"; static char initMarg[MARG_LEN] = "\033&a000l000M\015"; static char initTMarg[] = "\033&l000e000F"; x = y = j = 0; if (*command == aRIN) { while(x < INIT_LEN) { outputBuffer[x] = initThisPrinter[x]; x++; } outputBuffer[x++] = '\015'; if (PD->pd_Preferences.PrintSpacing == EIGHT_LPI) { outputBuffer[LPI] = '8'; } if (PD->pd_Preferences.PrintPitch == ELITE) { outputBuffer[CPI] = '2'; } else if (PD->pd_Preferences.PrintPitch == FINE) { outputBuffer[CPI] = '5'; } if (PD->pd_Preferences.PrintQuality == LETTER) { outputBuffer[QUALITY] = '2'; } j = x; /* set the formlength = textlength, top margin = 2 */ textlength = PD->pd_Preferences.PaperLength; topmargin = 2; while (y < FORM_LEN) { outputBuffer[x++] = initForm[y++]; } numberString(textlength, j + LPP, outputBuffer); Parms[0] = PD->pd_Preferences.PrintLeftMargin; Parms[1] = PD->pd_Preferences.PrintRightMargin; *command = aSLRM; } if (*command == aSLRM) { j = x; y = 0; while(y < MARG_LEN) { outputBuffer[x++] = initMarg[y++]; } numberString(Parms[0] - 1, j + LEFT_MARG, outputBuffer); numberString(Parms[1] - 1, j + RIGHT_MARG, outputBuffer); return(x); } if ((*command == aSUS2) && (*vline == 0)) { *command = aPLU; *vline = 1; return(0); } if ((*command == aSUS2) && (*vline < 0)) { *command = aRI; *vline = 1; return(0); } if ((*command == aSUS1) && (*vline > 0)) { *command = aPLD; *vline = 0; return(0); } if ((*command == aSUS4) && (*vline == 0)) { *command = aPLD; *vline = -1; return(0); } if ((*command == aSUS4) && (*vline > 0)) { *command = aIND; *vline = -1; return(0); } if ((*command == aSUS3) && (*vline < 0)) { *command = aPLU; *vline = 0; return(0); } if(*command == aSUS0) { if (*vline > 0) { *command = aPLD; } if (*vline < 0) { *command = aPLU; } *vline = 0; return(0); } if (*command == aPLU) { (*vline)++; return(0); } if (*command == aPLD){ (*vline)--; return(0); } if (*command == aSTBM) { if (Parms[0] == 0) { Parms[0] = topmargin; } else { topmargin = --Parms[0]; } if (Parms[1] == 0) { Parms[1] = textlength; } else { textlength=Parms[1]; } while (x < 11) { outputBuffer[x] = initTMarg[x]; x++; } numberString(Parms[0], 3, outputBuffer); numberString(Parms[1] - Parms[0], 7, outputBuffer); return(x); } if (*command == aSLPP) { while(x < 11) { outputBuffer[x] = initForm[x]; x++; } /*restore textlength, margin*/ numberString(topmargin, 3, outputBuffer); numberString(textlength, 7, outputBuffer); return(x); } if (*command == aRIS) { PD->pd_PWaitEnabled = 253; } return(0); } numberString(Param, x, outputBuffer) UBYTE Param; int x; char outputBuffer[]; { if (Param > 199) { outputBuffer[x++] = '2'; Param -= 200; } else if (Param > 99) { outputBuffer[x++] = '1'; Param -= 100; } else { outputBuffer[x++] = '0'; /* always return 3 digits */ } if (Param > 9) { outputBuffer[x++] = Param / 10 + '0'; } else { outputBuffer[x++] = '0'; } outputBuffer[x++] = Param % 10 + '0'; } ConvFunc(buf, c, flag) char *buf, c; int flag; /* expand lf into lf/cr flag (0-yes, else no ) */ { if (c == '\014') { /* if formfeed (page eject) */ PED->ped_PrintMode = 0; /* no data to print */ } return(-1); /* pass all chars back to the printer device */ } Close(ior) struct printerIO *ior; { if (PED->ped_PrintMode) { /* if data has been printed */ (*(PD->pd_PWrite))("\014",1); /* eject page */ (*(PD->pd_PBothReady))(); /* wait for it to finish */ PED->ped_PrintMode = 0; /* no data to print */ } return(0); }