TABLE OF CONTENTS printer.device/--background-- printer.device/CallErrHook printer.device/CMD_FLUSH printer.device/CMD_RESET printer.device/CMD_START printer.device/CMD_STOP printer.device/CMD_WRITE printer.device/PBothReady printer.device/PQuery printer.device/PRD_DUMPRPORT printer.device/PRD_DUMPRPORTTAGS printer.device/PRD_EDITPREFS printer.device/PRD_PRTCOMMAND printer.device/PRD_QUERY printer.device/PRD_RAWWRITE printer.device/PRD_READPREFS printer.device/PRD_SETERRHOOK printer.device/PRD_WRITEPREFS printer.device/PRead printer.device/PWrite printer.device/--background-- printer.device/--background-- The printer.device gots a lot of new features with V44: - It is now possible to print hi- and true-color bitmaps - Planar bitmaps are read faster - Much more stable if wrong parameters for PRD_DUMPRPORT are used - A lot of new features for printer drivers are supported. Creating a driver for printer.device now gets much easier: the driver does not have to scale the bitmap anymore and can use its own algorithms for nearly everything (color conversion, color correction, all dither methods, anti aliasing). The driver is now run in a DOS process instead of a exec task so loading preferences or saving the output to a file is not longer a multithreading task. The driver gives more information for the preferences user interface (names of dither algorithms, names of shading algorithms, information about density interpretation) and for the printing itself (left and top border on paper, more page formats). Drivers can have its own preferences which can be edited and stored from every application. Driver can also have its own preferences editor (like PrinterPS). printer.device/CallErrHook printer.device/CallErrHook NAME CallErrHook -- internal call of error hook SYNOPSIS result = (*PrinterData->pd_CallErrHook)(hook, iorequest, msg); LONG CallErrHook(struct Hook *, struct IORequest *, struct PrtErrMsg *); FUNCTION An application can set an error hook that is called in case of errors to display an formated and localized error message to the user. The driver can set an error hook to format and localize custom error messages and to call the application's error hook. This is done by calling PD->pd_CallErrHook() from the printer.device. CallErrHook will do additional formating like setting a title of the error message if no is set by the driver and then calls the application's error hook. RESULT The return value of the hook is returned from CallErrHook. printer.device/CMD_FLUSH printer.device/CMD_FLUSH NAME CMD_FLUSH -- abort all I/O requests (immediate) FUNCTION CMD_FLUSH aborts all stopped I/O at the unit. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Device preset by the call to OpenDevice io_Command CMD_FLUSH io_Flags IOB_QUICK set if quick I/O is possible printer.device/CMD_RESET printer.device/CMD_RESET NAME CMD_RESET -- reset the printer FUNCTION CMD_RESET resets the printer device without destroying handles to the open device. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Device preset by the call to OpenDevice io_Command CMD_RESET io_Flags IOB_QUICK set if quick I/O is possible printer.device/CMD_START printer.device/CMD_START NAME CMD_START -- restart after stop (immediate) FUNCTION CMD_START restarts the unit after a stop command. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Device preset by the call to OpenDevice io_Command CMD_START io_Flags IOB_QUICK set if quick I/O is possible printer.device/CMD_STOP printer.device/CMD_STOP NAME CMD_STOP -- pause current and queued I/O requests (immediate) FUNCTION CMD_STOP pauses all queued requests for the unit, and tries to pause the current I/O request. The only commands that will be subsequently allowed to be performed are immediate I/O requests, which include those to start, flush, and finish the I/O after the stop command. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Device preset by the call to OpenDevice io_Command CMD_STOP io_Flags IOB_QUICK set if quick I/O is possible printer.device/CMD_WRITE printer.device/CMD_WRITE NAME CMD_WRITE -- send output to the printer FUNCTION This function causes a buffer of characters to be written to the current printer port (usually parallel or serial). The number of characters is specified in io_Length, unless -1 is used, in which case output is sent until a 0x00 is encountered. The Printer device, like the Console device, maps ANSI X3.64 style 7-bit printer control codes to the control code set of the current printer. The ANSI codes supported can be found below. NOTES Not all printers will support all functions. In particular you may not assume that the MARGINS or TABS can be set. Close to half the supported printers don't fully implement one or the other. If you want the features of margins or tabs you will need to fake it internally by sending out spaces. Note that the printer device may have already sent out a "set margins" command to the printer. If you are faking your own margins, be sure to cancel the old ones first. (use the "aCAM" command) Defaults are set up so that if a normal AmigaDOS text file is sent to PRT:, it has the greatest chance of working. (AmigaDOS text files are defined as follows:) tabs - every 8 CR (0x0D) - moves to start of current line LF (0x0A) - moves to start of next line IO REQUEST io_Message mn_ReplyPort set io_Device preset by OpenDevice io_Unit preset by OpenDevice io_Command CMD_WRITE io_Length number of characters to process, or if -1, process until 0x00 encountered io_Data pointer to block of data to process RESULTS io_Error : if CMD_WRITE succeeded, then io_Error will be zero. Otherwise io_Error will be non-zero. SEE ALSO printer.h, parallel.device, serial.device, Preferences ANSI X3.64 style COMMANDS aRIS ESCc hard reset aRIN ESC#1 initialize to defaults aIND ESCD true linefeed (lf) aNEL ESCE return,lf aRI ESCM reverse lf * aSGR0 ESC[0m normal character set aSGR3 ESC[3m italics on aSGR23 ESC[23m italics off aSGR4 ESC[4m underline on aSGR24 ESC[24m underline off aSGR1 ESC[1m boldface on aSGR22 ESC[22m boldface off aSFC SGR30-39 set foreground color aSBC SGR40-49 set background color aSHORP0 ESC[0w normal pitch aSHORP2 ESC[2w elite on aSHORP1 ESC[1w elite off aSHORP4 ESC[4w condensed on aSHORP3 ESC[3w condensed off aSHORP6 ESC[6w enlarged on aSHORP5 ESC[5w enlarged off aDEN6 ESC[6"z shadow print on aDEN5 ESC[5"z shadow print off aDEN4 ESC[4"z doublestrike on aDEN3 ESC[3"z doublestrike off aDEN2 ESC[2"z Near Letter Quality (NLQ) on aDEN1 ESC[1"z NLQ off aSUS2 ESC[2v superscript on aSUS1 ESC[1v superscript off aSUS4 ESC[4v subscript on aSUS3 ESC[3v subscript off aSUS0 ESC[0v normalize the line * aPLU ESCL partial line up * aPLD ESCK partial line down * aFNT0 ESC(B US char set (default) or Font 0 aFNT1 ESC(R French char set or Font 1 aFNT2 ESC(K German char set or Font 2 aFNT3 ESC(A UK char set or Font 3 aFNT4 ESC(E Danish I char set or Font 4 aFNT5 ESC(H Sweden char set or Font 5 aFNT6 ESC(Y Italian char set or Font 6 aFNT7 ESC(Z Spanish char set or Font 7 aFNT8 ESC(J Japanese char set or Font 8 aFNT9 ESC(6 Norweign char set or Font 9 aFNT10 ESC(C Danish II char set or Font 10 aPROP2 ESC[2p proportional on * aPROP1 ESC[1p proportional off * aPROP0 ESC[0p proportional clear * aTSS ESC[n E set proportional offset * aJFY5 ESC[5 F auto left justify * aJFY7 ESC[7 F auto right justify * aJFY6 ESC[6 F auto full justify * aJFY0 ESC[0 F auto justify off * aJFY3 ESC[3 F letter space (justify) * aJFY1 ESC[1 F word fill(auto center) * aVERP0 ESC[0z 1/8" line spacing aVERP1 ESC[1z 1/6" line spacing aSLPP ESC[nt set form length n aPERF ESC[nq set perforation skip to n lines (n>0) aPERF0 ESC[0q perforation skip off aLMS ESC#9 Left margin set * aRMS ESC#0 Right margin set * aTMS ESC#8 Top margin set * aBMS ESC#2 Bottom margin set * aSTBM ESC[Pn1;Pn2r set T&B margins * aSLRM ESC[Pn1;Pn2s set L&R margin * aCAM ESC#3 Clear margins aHTS ESCH Set horiz tab * aVTS ESCJ Set vertical tabs * aTBC0 ESC[0g Clr horiz tab * aTBC3 ESC[3g Clear all h tab * aTBC1 ESC[1g Clr vertical tabs * aTBC4 ESC[4g Clr all v tabs * aTBCALL ESC#4 Clr all h & v tabs * aTBSALL ESC#5 Set default tabs (every 8) aEXTEND ESC[Pn"x Extended commands This is a mechanism for printer drivers to support extra commands which can be called by ANSI control sequences aRAW ESC[Pn"r Next 'Pn' chars are raw (ie. they are not parsed by the printer device, instead they are sent directly to the printer. (*) indicates that sending this command may cause unexpected results on a large number of printers. printer.device/PBothReady printer.device/PBothReady NAME PBothReady - wait until output is finished FUNCTION The function PBothReady should only be called from drivers. It waits until the output to the printer is finished. printer.device/PQuery printer.device/PQuery NAME PQuery - read number of chars in input buffer SYNOPSIS error = (*PrinterData->pd_PQuery)(&length); LONG PQuery(LONG *); FUNCTION PQuery reads the number of data in the input buffer which can be read from the printer port. The variable length points to is set to the number of readable chars. printer.device/PRD_DUMPRPORT printer.device/PRD_DUMPRPORT NAME PRD_DUMPRPORT -- dump the specified RastPort to a graphics printer FUNCTION Print a rendition of the supplied RastPort, using the supplied ColorMap, position and scaling information, as specified in the printer preferences. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible. io_Command PRD_DUMPRPORT. io_Flags IOB_QUICK set if quick I/O is possible. io_RastPort ptr to a RastPort. io_ColorMap ptr to a ColorMap. io_Modes the 'modes' flag from a ViewPort structure, (the upper word is reserved and should be zero). If you are running under version 36, or greater of graphics.library, it is recommended that you fill in "io_Modes" with the ULONG (32-bit) value returned from calling: ULONG ModeID = GetVPModeID(struct ViewPort *); Doing so provides for upwards compatability with the new display modes available under V36 (example: aspect ratio calculations for new display modes). io_SrcX x offset into the RastPort to start printing from. io_SrcY y offset into the RastPort to start printing from. io_SrcWidth width of the RastPort to print (from io_SrcX). io_SrcHeight height of the RastPort to print (from io_SrcY). io_DestCols width of the printout in printer pixels. io_DestRows height of the printout in printer pixels. io_Special flag bits (some of which pertain to DestCols and DestRows). -if SPECIAL_MIL is set, then the associated parameter is specified in thousandths of an inch on the printer. ie. if DestCols = 8000, DestRows = 10500 and SPECIAL_MILROWS and SPECIAL_MILCOLS is set then the printout would be 8.000 x 10.500 inches. -if SPECIAL_FULL is set, then the specific dimension is set to the maximum possible as determined by the printer limits or the configuration limits; whichever is less. -if SPECIAL_FRAC is set, the parameter is taken to be a longword binary fraction of the maximum for that dimension. -if all bits for a dimension are clear, (ie. SPECIAL MIL/FULL/FRAC and ASPECT are NOT set) then the parameter is specified in printer pixels. -if SPECIAL_CENTER is set then the image will be put between the left and right edge of the paper. -if SPECIAL_ASPECT is set, one of the dimensions may be reduced/expanded to preserve the aspect ratio of the print. -SPECIAL_DENSITY(1-7) this allows for a maximum of 7 different print densities. DENSITY1 is the lowest density and the default. -SPECIAL_NOFORMFEED - this allows for the mixing of text and graphics or multiple graphic dumps on page oriented printers (usually laser jet printers). When this flag is set the page will not be ejected after a graphic dump. If you perform another graphic dump without this flag set OR close the printer after printing text after a graphic dump, the page will be ejected. -if SPECIAL_TRUSTME is set then the printer specific driver is instructed to not issue a reset command before and after the dump. If this flag is NOT checked by the printer specific driver then setting this flag has no effect. Since we now recommend that printer driver writers no longer issue a reset command it is probably a safe idea to always set this flag when calling for a dump. -if SPECIAL_NOPRINT is set then the following is done: Compute print size, set 'io_DestCols' and 'io_DestRows' in the calling program's 'IODRPReq' structure and exit, DON'T PRINT. This allows the calling program to see what the final print size would be in printer pixels. Note that it modifies the 'io_DestCols' and 'io_DestRows' fields of your 'IODRPReq' structure. It also sets the print density and updates the 'MaxXDots', 'MaxYDots', 'XDotsInch', and 'YDotsInch' fields of the 'PrinterExtendedData' structure. There following rules for the interpretation of io_DestRows and io_DestCols that may produce unexpected results when they are not greater than zero and io_Special is zero. They have been retained for compatability. The user will not trigger these other rules with well formed usage of io_Special. When io_Special is equal to 0, the following rules (from the V1.1 printer.device, and retained for compatibility reasons) take effect. Remember, these special rules are for io_DestRows and io_DestCols and only take effect if io_Special is 0). a) DestCols>0 & DestRows>0 - use as absolute values. ie. DestCols=320 & DestRows=200 means that the picture will appear on the printer as 320x200 dots. b) DestCols=0 & DestRows>0 - use the printers maximum number of columns and print DestRows lines. ie. if DestCols=0 and DestRows=200 than the picture will appear on the printer as wide as it can be and 200 dots high. c) DestCols=0 & DestRows=0 - same as above except the driver determines the proper number of lines to print based on the aspect ratio of the printer. ie. This results in the largest picture possible that is not distorted or inverted. Note: As of this writing, this is the call made by such program as DeluxePaint, GraphicCraft, and AegisImages. d) DestCols>0 &DestRows=0 - use the specified width and the driver determines the proper number of lines to print based on the aspect ratio of the printer. ie. if you desire a picture that is 500 pixels wide and aspect ratio correct, use DestCols=500 and DestRows=0. e) DestCols<0 or DestRows>0 - the final picture is either a reduction or expansion based on the fraction |DestCols| / DestRows in the proper aspect ratio. Some examples: 1) if DestCols=-2 & DestRows=1 then the printed picture will be 2x the AMIGA picture and in the proper aspect ratio. (2x is derived from |-2| / 1 which gives 2.0) 2) if DestCols=-1 & DestRows=2 then the printed picture will will be 1/2x the AMIGA picture in the proper aspect ratio. (1/2x is derived from |-1| / 2 which gives 0.5) NOTES The printer selected in preferences must have graphics capability to use this command. The error 'PDERR_NOTGRAPHICS' is returned if the printer can not print graphics. Color printers may not be able to print black and white or greyscale pictures -- specifically, the Okimate 20 cannot print these with a color ribbon: you must use a black ribbon instead. If the printer has an input buffer option, use it. If the printer can be uni or bi directional, select uni-directional; this produces a much cleaner picture. Most printer drivers will attempt to set unidirectional printing if it is possible under software control. Please note that the width and height of the printable area on the printer is in terms of pixels and bounded by the following: a) WIDTH = (RIGHT_MARGIN - LEFT_MARGIN + 1) / CHARACTERS_PER_INCH b) HEIGHT = LENGTH / LINES_PER_INCH Margins are set by preferences. For BGR printer support, the YMC values in the printer specific render.c functions equate to BGR respectively, ie. yellow is blue, magenta is green, and cyan is red. For version 2.1 of the Operating System (the Localization release), some of the printer drivers have been modified to support European A size paper (e.g., "A4"). See preferences.h for a list of defined sizes. For most printers, this means the maximum X dots will be calculated based on millimeters minus 1/2 inch (approx 13 mm) - this is consistent with existing driver calculations (e.g., 8.0 inches wide for US_LETTER, and US_LEGAL sizes). Some printers, like the HP_LaserJet, and HP_DeskJet also calculate maximum Y dots. For all modified printer drivers, selecting paper sizes larger than the printer can handle may result in unexpected, or clipped results. This allows for the possibility of using these drivers with future printers which may physically [and internally] support these larger sizes of paper. It is assumed that the user will make reasonable choices when selecting paper size (e.g., not select WIDE TRACTOR for a NARROW TRACTOR printer). Data Structures --------------- The printer specific and non-specific data structures can be read ONCE you have opened the printer device. Here is a code fragment to illustrate how to do just that. #include #include #include #include struct IODRPReq PReq; struct PrinterData *PD; struct PrinterExtendedData *PED; open the printer device / if it opened... if (OpenDevice("printer.device", 0, &PReq, 0) == NULL) { get pointer to printer data PD = (struct PrinterData *)PReq.io_Device; get pointer to printer extended data PED = &PD->pd_SegmentData->ps_PED; let's see what's there printf("PrinterName = '%s', Version=%u, Revision=%u\n", PED->ped_PrinterName, PD->pd_SegmentData->ps_Version, PD->pd_SegmentData->ps_Revision,); printf("PrinterClass=%u, ColorClass=%u\n", PED->ped_PrinterClass, PED->ped_ColorClass); printf("MaxColumns=%u, NumCharSets=%u, NumRows=%u\n", PED->ped_MaxColumns, PED->ped_NumCharSets, PED->ped_NumRows); printf("MaxXDots=%lu, MaxYDots=%lu, XDotsInch=%u, YDotsInch=%u\n", PED->ped_MaxXDots, PED->ped_MaxYDots, PED->ped_XDotsInch, PED->ped_YDotsInch); CloseDevice(&PReq); } Preferences ----------- If you want the user to be able to access the printer preferences items without having to run preferences (like DPAINT II's printer requester), here is what you do. You can look at the printer's copy of preferences by referring to 'PD->pd_Preferences' (the printer device MUST already be opened at this point). After you have this you could put up a requester and allow the user to change whatever parameters they wanted. BEAR IN MIND THAT YOU ARE RESPONSIBLE FOR RANGE CHECKING THESE SELECTIONS! Listed below are the printer preferences items and their valid values. PrintPitch - PICA, ELITE, FINE. PrintQuality - DRAFT, LETTER. PrintSpacing - SIX_LPI, EIGHT_LPI. PrintLeftMargin - 1 to PrintRightMargin. PrintRightMargin - PrintLeftMargin to 999. PaperLength - 1 to 999. PrintImage - IMAGE_POSITIVE, IMAGE_NEGATIVE. PrintAspect - ASPECT_HORIZ, ASPECT_VERT. PrintShade - SHADE_BW, SHADE_GREYSCALE, SHADE_COLOR. PrintThreshold - 1 to 15. PrintFlags - CORRECT_RED, CORRECT_GREEN, CORRECT_BLUE, CENTER_IMAGE, IGNORE_DIMENSIONS, BOUNDED_DIMENSIONS, ABSOLUTE_DIMENSIONS, PIXEL_DIMENSIONS, MULTIPLY_DIMENSIONS, INTEGER_SCALING, ORDERED_DITHERING, HALFTONE_DITHERING. FLOYD_DITHERING, ANTI_ALIAS, GREY_SCALE2 PrintMaxWidth - 0 to 65535. PrintMaxHeight - 0 to 65535. PrintDensity - 1 to 7. PrintXOffset - 0 to 255. Asynchronous I/O ---------------- The recommended way to do asynchronous i/o is... a) To send requests for i/o. struct IORequest *ioreq; struct MsgPort *port; UBYTE signal; port = ioreq->io_Message.mn_ReplyPort; signal = port->mp_SigBit; SendIO(ioreq); send request Wait(signal); wait for completion (go to sleep) while ((Msg = GetMsg(port)) != NULL) { get ALL messages } b) To abort a previous request for i/o. struct IORequest *ioreq; AbortIO(ioreq); abort request WaitIO(ioreq); wait for reply at this point you can re-use 'ioreq'. Note that in the above examples 'ioreq' could be any one of... a) struct IOStdReq a standard i/o request b) struct IODRPReq a dumprport i/o request c) struct IOPrtCmdReq a printer command i/o request It is recommend that you do asynchronous i/o in your programs and give the user a way of aborting all requests. V1.3 Printer Driver Notes ------------------------- In general densities which use more than one pass should only be used for B&W shade dumps. They can be used for Grey-Scale or Color Shade dumps BUT the output may tend to look muddy or dark. Also multiple pass Color dumps tend to dirty or smear the ribbon (ie. yellow will get contaminated with the other colors on the ribbon; you have been warned). CalComp_ColorMaster ------------------- 1. Thermal transfer b&w/color printer (text and graphics). 2. Use Black ribbon for non-color dumps; Color ribbon for color dumps. 3. Linefeeds # of vertical dots printed. 4. Densities supported are 203x200(1) dpi. 5. This is a dual printer driver. Select a PaperSize of 'Narrow Tractor' for use with the ColorMaster; 'Wide Tractor' for use with the ColorView-5912 (which uses 11 x 17 inch paper). CalComp_ColorMaster2 ------------------- 1. Thermal transfer b&w/color printer (text and graphics). 2. Use Black ribbon for non-color dumps; Color ribbon for color dumps. 3. Linefeeds # of vertical dots printed. 4. Densities supported are 203x200(1) dpi. 5. This is a dual printer driver. Select a PaperSize of 'Narrow Tractor' for use with the ColorMaster; 'Wide Tractor' for use with the ColorView-5912 (which uses 11 x 17 inch paper). 6. This driver is the same as the Calcomp_ColorMaster driver EXCEPT it is approximately 2 times faster (during color dumps) and requires LOTS of memory (up to 1,272,003 bytes for a full 8 x 10 inch (1600 x 2000 dot) color dump). Typically full-size (color) dumps are 1600 x 1149 dots and require 730,767 bytes. Memory requirements for the ColorView-5912 are up to 2,572,803 bytes for a full 10 x 16 inch (2048 x 3200 dot) color dump. Typically full-size (color) dumps are 2048 x 2155 dots and require 1,732,623 bytes. The memory requirements are 1/3 when doing a non-color printout (on both the ColorMaster and ColorView). CBM_MPS1000 ----------- 1. Dot matrix b&w printer (text and graphics). 2. Linefeeds # of vertical dots printed (-1/3 dot if PaperType = Single). *2 3. Density XDPI YDPI XYDPI Comments 1 120 72 8640 2 120 144 17280 two pass 3 240 72 17280 *1 4 120 216 25920 three pass 5 240 144 34560 two pass *1 6 240 216 51840 three pass *1 7 same as 6 4. Print width for US_LETTER size paper is 8.0 inches. 5. As of version 35.48, this driver calculates maximum X dots for European A size paper as defined in preferences.h. Some of these sizes are too large for this printer. Diablo_630 ---------- 1. Daisywheel printer (text only). EpsonQ (24-pin Epson compatible) ------ 1. Dot matrix b&w/color printer (text and graphics). 2. Drives all EpsonQ (LQ1500, LQ2500, etc.) compatible printers. 3. Linefeeds # of vertical dots printed. 4. Density XDPI YDPI XYDPI Comments 1 90 180 16200 2 120 180 21600 3 180 180 32400 4 360 180 64800 *1 5,6,7 same as 4 5. A PaperSize of 'Wide Tractor' selects a maximum print width of 13.6 inches (for wide carriage printers). 6. A PaperType of 'Single' uses only 16 of the 24 pins, whereas a PaperType of 'Fanfold' uses all 24 pins. The 'Single' option is useful for those printers which have a weak power supply and cannot drive all 24 pins continuously. If during a single pass of the print head you notice that the top two thirds of the graphics are darker than the bottom one third then you will probably need to drop down to 16 pins. 7. As of version 35.71, this driver calculates maximum X dots for European A size paper as defined in preferences.h. The calculation is based on millimeters minus 1/2 inch (approx 13mm). Maximum paper width is 13.6 inches, so some European A sizes are too large for this printer. EpsonX[CBM_MPS-1250] (8/9-pin Epson compatible) -------------------- 1. Dot matrix b&w/color printer (text and graphics). 2. Drives all EpsonX (EX/FX/JX/LX/MX/RX, etc.) compatible printers. 3. Linefeeds # of vertical dots printed (-1/3 dot if PaperType = Single). *2 4. Density XDPI YDPI XYDPI Comments 1 120 72 8640 2 120 144 17280 two pass 3 240 72 17280 *1 4 120 216 25920 three pass 5 240 144 34560 two pass *1 6 240 216 51840 three pass *1 7 same as 6 5. A PaperSize of 'Wide Tractor' selects a maximum print width of 13.6 inches (for wide carriage printers). 6. Use this driver if you own a CBM_MPS-1250 (as it is EpsonX compatible). 7. As of version 35.42, this driver calculates maximum X dots for European A size paper as defined in preferences.h. The calculation is based on millimeters minus 1/2 inch (approx 13mm). Maximum paper width is 13.6 inches, so some European A sizes are too large for this printer. EpsonXOld (8/9-pin Epson compatible) --------- 1. Dot matrix b&w printer (text and graphics). 2. Drives all very old EpsonX (EX/FX/JX/LX/MX/RX, etc.) compatible printers. 3. Linefeeds # of vertical dots printed. 4. Density XDPI YDPI XYDPI Comments 1 60 72 4320 2 120 72 8640 (double speed) *1 3 120 72 8640 4 240 72 17280 *1 5 120 72 8640 (for use on old Star printers) 6 240 72 17280 (for use on old Star printers) *1 7 240 72 17280 (same as density 4) *1 5. A PaperSize of 'Wide Tractor' selects a maximum print width of 13.6 inches (for wide carriage printers). 6. Use this driver if the EpsonX driver does not work properly in graphics or text mode on your EpsonX compatible printer. Generic ------- 1. Text only printer. Howtek_Pixelmaster ------------------ 1. Plastic ink jet b&w/color printer (text and graphics). 2. Linefeeds # of vertical dots printed. 3. Density XDPI YDPI XYDPI Comments 1 80 80 6400 2 120 120 14400 3 160 160 25600 4 240 240 57600 5,6,7 same as 4 4. Maximum print area is 8.0 x 10.0 inches. HP_PaintJet ----------- 1. Ink jet b&w/color printer (text and graphics). 2. Linefeeds # of vertical dots printed. 3. Densities supported are 180x180(1) dpi. HP_ThinkJet ---------- 1. Ink jet non-color printer (text and graphics). 2. Linefeeds # of vertical dots printed. 3. Density XDPI YDPI XYDPI Comments 1 96 96 9216 2 192 96 18432 3,4,5,6,7 same as 4 4. This printer prints 640 dots X in 96 DPI mode, and 120 dots X in 192 DPI mode. Other sizes are not supported by the printer. Imagewriter II (Imagewriter compatible) -------------- 1. Dot matrix b&w/color printer (text and graphics). 2. Linefeeds # of vertical dots printed. 3. Density XDPI YDPI XYDPI Comments 1 80 72 5760 2 120 72 8640 3 144 72 10368 4 160 72 11520 5 120 144 17280 two pass 6 144 144 20736 two pass 7 160 144 23040 two pass Nec_Pinwriter (24-wire Pinwriter compatible (P5/P6/P7/P9/P2200)) ------------- 1. Dot matrix b&w/color printer (text and graphics). 2. Drives all NEC 24-wire Pinwriter compatible printers. 3. Linefeeds # of vertical dots printed. 4. Density XDPI YDPI XYDPI Comments 1 90 180 16200 2 120 180 21600 3 180 180 32400 4 120 360 43200 two pass 5 180 360 64800 two pass 6 360 180 64800 7 360 360 129600 two pass 5. A PaperSize of 'Wide Tractor' selects a maximum print width of 13.6 inches (for wide carriage printers). 6. As of version 35.17, this driver calculates maximum X dots for European A size paper as defined in preferences.h. The calculation is based on millimeters minus 1/2 inch (approx 13mm). Maximum paper width is 13.6 inches, so some European A sizes are too large for this printer. Okidata_92 ---------- 1. Dot matrix non-color printer (text and graphics). 2. Always linefeeds 7/72 inch (limitation of printer in graphics mode). 3. Densities supported are 72x72 dpi. Okidata_293I ------------ 1. Dot matrix b&w/color printer (text and graphics). 2. Drives 292 or 293 using the IBM interface module. 3. Linefeeds # of vertical dots printed (-1/2 dot if PaperType = Single) *3 4. Density XDPI YDPI XYDPI Comments 1 120 144 17280 2 240 144 34560 3 120 288 34560 two pass 4 240 288 69120 two pass 5,6,7 same as 4 5. A PaperSize of 'Wide Tractor' selects a maximum print width of 13.6 inches (for wide carriage printers). Okimate-20 ---------- 1. Thermal transfer b&w/color printer (text and graphics). 2. Use Black ribbon for non-color dumps; Color ribbon for color dumps. 3. Linefeeds an even # of dots printed. (ie. if 3 printed, 4 advanced). 4. Densities supported are 120x144(1) dpi. Seiko_5300 ---------- 1. Thermal transfer b&w/color printer (graphics only). 2. Use Black ribbon for non-color dumps; Color ribbon for color dumps. 3. Density XDPI YDPI XYDPI Comments 1 152 152 23104 drives CH-5301 printer 2 203 203 41209 drives CH-5312 printer 3 240 240 57600 drives CH-5303 printer 4, 5,6,7 same as 3 You must select the proper density to drive the specific printer that you have. Seiko_5300a ----------- 1. Thermal transfer b&w/color printer (graphics only). 2. Use Black ribbon for non-color dumps; Color ribbon for color dumps. 3. Density XDPI YDPI XYDPI Comments 1 152 152 23104 drives CH-5301 printer 2 203 203 41209 drives CH-5312 printer 3 240 240 57600 drives CH-5303 printer 4, 5,6,7 same as 3 You must select the proper density to drive the specific printer that you have. 4. This driver is the same as the Seiko_5300 driver EXCEPT it is approximately 2 times faster (during color dumps) and requires LOTS of memory (up to 1,564,569 bytes for a full 8 x 10 inch (1927 x 2173 dot) color dump). Typically full-size (color) dumps are 1927 x 1248 dots and require 898,569 bytes. The memory requirements are 1/3 when doing a non-color printout. Tektronix_4693D --------------- 1. Thermal transfer b&w/color printer (graphics only). 2. Densities supported are 300x300(1) dpi 3. Due to the way the printer images a picture none of the printer preferences options affect the printout with the following exceptions: a)Aspect - Horizontal, Vertical b)Shade - B&W, Grey_Scale, Color ...as a result of this only full size pictures can be printed. 4. Keypad menu option 3b COLOR ADJUSTMENT may be set from the keypad. For normal prints this option should be set to "do not adjust". 5. Keypad menu option 3d VIDEO COLOR CORRECTION may be set from the keypad. For normal prints this option should be set to "do not adjust". 6. Keypad menu option 5 BACKGROUND COLOR EXCHANGE may be set from the keypad. For normal prints this option should be set to "print colors as received". 7. Once a picture has been printed additional copies may be printed without resending by using the printers keypad. Tektronix_4696 -------------- 1. Ink jet b&w/color printer (text and graphics). 2. Always linefeeds 4 dots (limitation of printer). 3. Densities supported are 121x120(1), 242x120(black)(2) and 242x120(color)(3). Selecting a density of 2 or higher really doesn't give you true 242 dpi resolution since the printer only has 121 x dots per inch. Instead this mode tells the printer to go into it's double pass mode. Here, it outputs a line of dots at 121 dpi; and outputs the line again (shifted to the right by 1/242 of an inch). This produces much more vibrate colors and gives the illusion of more resolution. One drawback is that large areas of solid colors (red, green, and blue specifically) tend to over-saturate the paper with ink. Density1 outputs all colors in one pass. Density 2 does a double pass on black. Density 3 does a double pass on all colors. Density 1 to 3 correspond to the printer's graphics printing modes 1 to 3 (respectively). 4. A PaperSize of 'Wide Tractor' selects a maximum print width of 9.0 inches (for wide roll paper). Toshiba_P351C (24-pin Toshiba compatible) ------------- 1. Dot matrix b&w/color printer (text and graphics). 2. Drives all Toshiba_P351C compatible printers. 3. Linefeeds # of vertical dots printed. 4. Density XDPI YDPI XYDPI Comments 1 180 180 32400 2 360 180 64800 3,4,5,6,7 same as 2 5. A PaperSize of 'Wide Tractor' selects a maximum print width of 13.5 inches (for wide carriage printers). Toshiba_P351SX (24-pin Toshiba compatible) -------------- 1. Dot matrix b&w/color printer (text and graphics). 2. Drives all Toshiba_P351SX (321SL, 321SLC, 341SL) compatible printers. 3. Linefeeds # of vertical dots printed. 4. Density XDPI YDPI XYDPI Comments 1 180 180 32400 2 360 180 64800 3 180 360 64800 two pass 4 360 360 129600 two pass 5,6,7 same as 4 5. A PaperSize of 'Wide Tractor' selects a maximum print width of 13.5 inches (for wide carriage printers). Xerox_4020 ---------- 1. Ink jet b&w/color printer (text and graphics). 2. Always linefeeds 4 dots (limitation of printer). 3. This driver is IDENTICAL to the Diablo_C-150 driver EXCEPT it outputs all black dots TWICE. This is a special feature of this printer and produces much more solid, darker black shades. Please note that some printing time overhead results from this feature; if you don't want it use the Diablo_C-150 driver (Extras 1.3 disk). 4. Densities supported are 121x120(1) and 242x240(2) dpi. Selecting a density of 2 or higher really doesn't give you true 240 dpi resolution since the Xerox_4020 only has 121 x dots per inch. Instead this mode tells the printer to go into it's pseudo 240 dpi mode. Here, it outputs a line of dots at 121 dpi; moves the paper up 1/240 of an inch and outputs the line again (shifted to the right by 1/240 of an inch). This produces much more vibrate colors and gives the illusion of more resolution. One drawback is that large areas of solid colors (red, green, and blue specifically) tend to over-saturate the paper with ink. 5. A PaperSize of 'Wide Tractor' selects a maximum print width of 9.0 inches (for wide roll paper). Notes ----- *0 - on most printers friction fed paper tends to produce better looking (ie. less horizontal banding) graphic dumps than tractor fed paper. *1 - in this mode the printer cannot print two consecutive dots in a row. It is recommended that you only use this density for B&W Shade dumps. *2 - only when 72 YDPI is selected. This option is useful if you notice tiny white horizontal strips in your printout. *3 - only when 144 YDPI is selected. This option is useful if you notice tiny white horizontal strips in your printout. V1.3 Obsolete Printer Driver Notes ---------------------------------- The following notes describe printer drivers which were no longer distributed with Workbench 2.0 or higher: Alphacom_AlphaPro_101 --------------------- 1. Daisywheel printer (text only). Brother_HR-15XL --------------- 1. Daisywheel printer (text only). Canon_PJ-1080A -------------- 1. Ink jet b&w/color printer (text and graphics). 2. Linefeeds # of vertical dots printed. 3. Densities supported are 83x84(1) dpi. Diablo_Advantage_D25 -------------------- 1. Daisywheel printer (text only). Diablo_C-150 ------------ 1. Ink jet b&w/color printer (text and graphics). 2. Always linefeeds 4 dots (limitation of printer). 3. A PaperSize of 'Wide Tractor' selects a maximum print width of 8.5 inches (for wide roll paper). 5. Densities supported are 120x120(1) dpi. Quadram_QuadJet --------------- 1. Ink jet b&w/color printer (text and graphics). 2. Linefeeds # of vertical dots printed. 3. Densities supported are 83x84(1) dpi. Qume_LetterPro_20 ----------------- 1. Daisywheel printer (text only). The following notes describe 1.3 printer drivers which were updated later: HP_DeskJet ---------- 1. Ink jet non-color printer (text and graphics). 2. Linefeeds # of vertical dots printed. 3. Density XDPI YDPI XYDPI Comments 1 75 75 5625 2 100 100 10000 3 150 150 22500 4 300 300 90000 5,6,7 same as 4 4. Maximum print area is 8.0 x 10.0 inches US_LEGAL, and 8.0 x 13.0 inches US_LETTER. 5. As of version 35.29, the driver will calculate maximum area size for European A size paper as defined in preferences.h. The driver calculates the maximum X, and Y dots based on millimeters, minus 1/2 inch from the width, and minus 1" from the height (approx 13mm, and 26mm respectively). Therefore the margin area is consistent with US paper sizes. 6. Some European A sizes are too large for this printer. HP_LaserJet (LaserJet+/LaserJetII compatible) ----------- 1. Laser engine non-color printer (text and graphics). 2. Linefeeds # of vertical dots printed. 3. Density XDPI YDPI XYDPI Comments 1 75 75 5625 2 100 100 10000 3 150 150 22500 4 300 300 90000 5,6,7 same as 4 4. Maximum print area is 8.0 x 10.0 inches US_LEGAL, and 8.0 x 13.0 inches US_LETTER. 5. As of version 35.59, the driver will calculate maximum area size for European A size paper as defined in preferences.h. The driver calculates the maximum X, and Y dots based on millimeters, minus 1/2 inch from the width, and minus 1" from the height (approx 13 mm, and 26 mm respectively). Therefore the margin area is consistent with US paper sizes. 6. Some European A sizes are too large for this printer. printer.device/PRD_DUMPRPORTTAGS printer.device/PRD_DUMPRPORTTAGS NAME PRD_DUMPRPORTTAGS -- dump the specified RastPort to a printer (V44) FUNCTION Print a rendition of the supplied RastPort, using the supplied ColorMap, position and scaling information, as specified in the printer preferences. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible. io_Command PRD_DUMPRPORT. io_Flags IOB_QUICK set if quick I/O is possible. io_RastPort ptr to a RastPort. io_ColorMap ptr to a ColorMap. io_Modes the 'modes' flag from a ViewPort structure, (the upper word is reserved and should be zero). If you are running under version 36, or greater of graphics.library, it is recommended that you fill in "io_Modes" with the ULONG (32-bit) value returned from calling: ULONG ModeID = GetVPModeID(struct ViewPort *); Doing so provides for upwards compatability with the new display modes available under V36 (example: aspect ratio calculations for new display modes). io_SrcX x offset into the RastPort to start printing from. io_SrcY y offset into the RastPort to start printing from. io_SrcWidth width of the RastPort to print (from io_SrcX). io_SrcHeight height of the RastPort to print (from io_SrcY). io_DestCols width of the printout in printer pixels. io_DestRows height of the printout in printer pixels. io_Special flag bits io_TagList a list of tags to specify more parameters for the dump. TAGS DRPA_SourceHook a pointer to struct Hook which is called to read the source data. io_RastPort and io_ColorMap are ignored and should be NULL. The hook is called with object == NULL and message is a pointer to struct DRPSourceMsg. It must read an array of source data. Each pixel of the array is an ULONG of form 0x00RRGGBB. Some printer drivers have set PPCB_NOSTRIPE which means they cannot print in stripes. Using DRPA_SourceHook is the best way for printing for such printers because you can still prepare the printer source data in stripes then. The Source Hook is always called in the context of the printer driver DOS process. DRPA_AspectX the X aspect ratio. DRPA_AspectY the Y aspect ratio. This values overwrites the aspect ratio from GfxBase or io_Modes and is used for scaling. printer.device/PRD_EDITPREFS printer.device/PRD_EDITPREFS NAME PRD_EDITPREFS - open the driver preferences window (V44) FUNCTION New drivers can have own preferences. This commands ask the driver to open a window to allow the user to change the prefs. Typically this is done with an DoIO() call. Every application should have a button "Driver Options..." (that calls PRD_EDITPREFS) in its printer dialog. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible. io_Command PRD_EDITPREFS io_Flags IOB_QUICK set if quick I/O is possible. io_TagList a list of tags to specify more parameters The following tags are currently defined: PPRA_Window (struct Window *) a pointer to a window. This prefs window will open on the same screen and lock the window from user input. PPRA_Screen (struct Screen *) a pointer to a screen. That can be used if no window is open. PPRA_PubScreen (STRPTR) a name of a public screen that will be used to open the window. This can be NULL to use the default public screen. printer.device/PRD_PRTCOMMAND printer.device/PRD_PRTCOMMAND NAME PRD_PRTCOMMAND -- send a command to the printer FUNCTION This function sends a command to either the parallel or serial device. The printer device maps this command to the control code set of the current printer. The commands supported can be found with the printer.device/Write command. All printers may not support all functions. IO REQUEST IOPrtCmdReq io_Message mn_ReplyPort set io_Device preset by OpenDevice io_Unit preset by OpenDevice io_Command PRD_PRTCOMMAND io_PrtCommand the actual command number io_Parm0 parameter for the command io_Parm1 parameter for the command io_Parm2 parameter for the command io_Parm3 parameter for the command RESULTS Errors: if the PRD_PRTCOMMAND succeeded, then io_Error will be zero. Otherwise io_Error will be non-zero. An error of -1 indicates that the command is not supported by the current printer driver. This could be used to check if the connected printer supports a particular command (italics for example). SEE ALSO printer.device/PWrite() printer.h, parallel.device, Preferences printer.device/PRD_QUERY printer.device/PRD_QUERY NAME PRD_QUERY -- query printer port/line status FUNCTION This command returns the status of the printer port's lines and registers. Since the printer port uses either the serial or parallel port for i/o, the actual status returned is either the serial or parallel port's status. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Device preset by the call to OpenDevice io_Command PRD_QUERY io_Data ptr to 2 UBYTES where result will be stored. RESULTS io_Data BIT ACTIVE FUNCTION (SERIAL DEVICE) LSB 0 low reserved 1 low reserved 2 low reserved 3 low Data Set Ready 4 low Clear To Send 5 low Carrier Detect 6 low Ready To Send 7 low Data Terminal Ready MSB 8 high read buffer overflow 9 high break sent (most recent output) 10 high break received (as latest input) 11 high transmit x-OFFed 12 high receive x-OFFed 13-15 reserved io_Data BIT ACTIVE FUNCTION (PARALLEL DEVICE) 0 hi printer busy (offline) 1 hi paper out 2 hi printer selected (WARNING: the bit 2 line is also connected to the serial port's ring indicator pin on the A500 and A2000) 3-7 reserved io_Actual 0-none, 1-parallel, 2-serial NOTES io_Actual is 0 and io_Error is IOERR_OPENFAIL when no printer port device is used which can e.g. happen with printer drivers that have the PRTA_NoIO tag set to TRUE. printer.device/PRD_RAWWRITE printer.device/PRD_RAWWRITE NAME PRD_RAWWRITE -- transparent write command FUNCTION This is a non standard write command that performs no processing on the data passed to it. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Command PRD_RAWWRITE io_Flags IOB_QUICK set if quick I/O is possible io_Length the number of bytes in io_Data io_Data the raw bytes to write to the printer printer.device/PRD_READPREFS printer.device/PRD_READPREFS NAME PRD_READPREFS - read the current driver preferences in a buffer (V44) FUNCTION This is a non standard read command that reads the driver preferences. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Command PRD_READPREFS io_Flags IOB_QUICK set if quick I/O is possible io_Length the size of the buffer in io_Data io_Data a buffer io_Actual the number of bytes copied to the buffer. If the read fails because the buffer is too small you should double the size of the buffer and try it again. Never interpret the contents of the buffer. You are allowed to save it to file (as one block of data) and of course to write it back to the driver (PRD_WRITEPREFS). If you close the printer device between PRD_EDITPREFS and the actual printing (CMD_WRITE or PRD_DUMPRPORTTAGS) you must read the prefs after PRD_EDITPREFS and write it back before printing or the driver may forget the user changes. printer.device/PRD_SETERRHOOK printer.device/PRD_SETERRHOOK NAME PRD_SETERRHOOK -- set a hook for error messages (V44) FUNCTION This command sets a hook that will be called if the printer.device returns with an error from any other I/O command. This allows printer drivers to use private error messages. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Device preset by the call to OpenDevice io_Command PRD_SETERRORHOOK io_Hook a pointer to a hook that will be called Two standard hook values a defined: PDHOOK_NONE no error hook is to be used PDHOOK_STD EasyRequest() is used to display the error message The hook gets a pointer to the IORequest that caused the error as the object and a pointer to the following structure as message: struct PrtErrMsg { ULONG pe_Version; ULONG pe_ErrorLevel; struct Window *pe_Window; /* window for EasyRequest() */ struct EasyStruct *pe_ES; ULONG *pe_IDCMP; APTR pe_ArgList; }; pe_Version the message version number PDHOOK_VERSION pe_ErrorLevel one of RETURN_WARN, RETURN_ERROR, RETURN_FAIL pe_Window a window pointer (for EasyRequest()) or NULL pe_ES a pointer to the error message structure pe_IDCMP a pointer to IDCMP Flags for EasyRequest() pe_ArgList a pointer to an array of arguments The simplest case is to use that structure to call EasyRequest() or to printf() a message to a console (use the error message from pe_ES and the pe_ArgList). printer.device/PRD_WRITEPREFS printer.device/PRD_WRITEPREFS NAME PRD_WRITEPREFS - write the current driver prefs from a buffer (V44) FUNCTION This is a non standard write command that writes the driver preferences. IO REQUEST io_Message mn_ReplyPort set if quick I/O is not possible io_Command PRD_WRITEPREFS io_Flags IOB_QUICK set if quick I/O is possible io_Length the length of the buffer io_Data a buffer io_Actual the number of bytes copied to the driver prefs. The printer driver checks the buffer before copying it to its preferences. So you don't have to worry about changing the printer driver between PRD_READPREFS and PRD_WRITEPREFS. printer.device/PRead printer.device/PRead NAME PRead - internal read from printer port SYNOPSIS error = (*PrinterData->pd_PRead)(buffer, length, tv); LONG PRead(UBYTE *, ULONG *, struct TimeVal *); FUNCTION PRead reads a buffer of data from the printer port. The variable length points to the number of bytes to read when calling the function and the variable where it points to is set to the actual number of read bytes when it returns. tv points to a struct TimeVal or is NULL in which case the default time is PrinterExtendedData.ped_TimeoutSecs. If the time of tv ellapes before the CMD_READ at the printer port is done two different things may happen: If at least one char is read PRead() returns. If no char is read but PQuery returns a value larger 0 the read is repeated with the minimum of that length and the length passed in to read the outstanding data. printer.device/PWrite printer.device/PWrite NAME PWrite -- internal write to printer port SYNOPSIS error = (*PrinterData->pd_PWrite)(buffer, length); LONG PWrite(UBYTE *, ULONG); FUNCTION PWrite writes 'length' bytes directly to the printer. This function is generally called by printer drivers to send their buffer(s) to the printer. This function is accessed by referencing off the PrinterData (PD) structure. Below is a code fragment to show how to do get access to a pointer to the PrinterData (PD) structure. #include #include #include struct IODRPReq PReq; struct PrinterData *PD; struct PrinterExtendedData *PED; /* open the printer device (any version); if it opened... */ if (OpenDevice("printer.device", 0, &PReq, 0) == NULL) { /* get pointer to printer data structure */ PD = (struct PrinterData *)PReq.io_Device; /* write something directly to the printer */ (*PD->pd_PWrite)("Hello world\n", 12); CloseDevice(&PReq); /* close the printer device */ }