Apple II Technical Notes _____________________________________________________________________________ Developer Technical Support Apple IIgs #93: Compatible Printing Written by: Matt Deatherage September 1990 This Technical Note discusses printing on the Apple IIgs and how you can make your printing code more compatible. _____________________________________________________________________________ How Does Printing Work Anyway? There are, in general, two types of printing done on the Apple IIgs. The first kind is "desktop" printing, which uses the Apple IIgs Print Manager to render images created by QuickDraw II onto an output device. The other kind of printing is "text" printing, which is similar to the way classic Apple II applications print--you send ASCII text somewhere and a printer prints it as ASCII text. This printing normally involves no graphics and is very quick. This Note covers both types of printing, and by understanding the internals and the methods used to print, you can avoid compatibility headaches in the future. Desktop Printing Desktop printing uses the Apple IIgsÊPrint Manager. The process is described in detail in the Print Manager chapter of the Apple IIgs Toolbox Reference, and usually consists of a simple print loop: Open a document (PrOpenDoc) Open a page (PrOpenPage) Draw or Image the page in your favorite way Close the page (PrClosePage) Repeat for each page Close the document (PrCloseDoc) Print the document if it's spooled (PrPicFile) Note that you should always call PrPicFile at the end of your print loop. It completes the printing process, even for immediate or draft printing. There's one real secret about the Print Manager that can cloud your understanding of printing--the Print Manager doesn't actually do anything. It loads, unloads, and keeps track of printer drivers and port drivers and performs some necessary housekeeping, but that's about it. Many people believe that the Print Manager is responsible for all imaging, managing documents, managing a printing grafPort and such, but it's not. (The myth is perpetuated by the Toolbox Reference which refers to these functions as handled by the Print Manager.) In fact, these functions are handled by printer drivers. You actually call the printer driver for all of the routines in the print loop; all the Print Manager does is make sure the driver is loaded and dispatch to it. Therefore, most of the compatibility issues you have with printing are not with the Print Manager, but with printer drivers. Dealing With the Print Record It's the printer driver's job to get information about a printing job from the user (it's the printer driver that handles the style and job dialog boxes, since the Print Manager cannot generically know what style and job options any printer can support), keep track of it, and print the document using those settings. Those settings are kept in a data structure associated with a document known as a print record. Apple had only released two printer drivers at the time the first volume of the Toolbox Reference was published, and therefore the descriptions of the print record in that volume tend to be absolute. For example, the iDev field is documented as "one for an ImageWriter and three for a LaserWriter." In fact, the iDev field is the only method of print record interpretation available and there are several values for it: $0001 = ImageWriter $0002 = ImageWriter LQ $0003 = LaserWriter $0004 = Epson $8001 = Generic dot-matrix (interprets the style subrecord like the ImageWriter driver) $8003 = Generic laser printer (interprets the style subrecord like the LaserWriter driver) If you have checks in your code like "If it's not $0001, it must be a LaserWriter," you have problems with most of the other printer types. The $8000 and greater iDev values are defined for third-party printer drivers. The printer driver has no way other than the print record to keep track of values for a given print job, so it has to store all such information in the print record. If all third-party drivers use proprietary style subrecord formats, no applications can read or set any of those values. Those drivers which can use the compatible $8000 and greater iDev values indicate to applications that the definitions in Toolbox Reference for the ImageWriter and LaserWriter drivers apply to these drivers as well. iDev values of $0002 or $0004 also interpret the style subrecord as the ImageWriter driver does. Print Record Rules Remember: the print record is the only way the printer driver has to maintain information about a particular job. The print record belongs to the user, the document, and the printer driver--not the application. Here are some rules for staying out of print record trouble. o Always call PrValidate when changing fields in the print record. Even if a driver interprets the style subrecord like the ImageWriter driver, it may not support all the ImageWriter's style features (e.g., color printing). Calling PrValidate every time you change something in the print record gives the printer driver a chance to look at the havoc you've wreaked and correct it if necessary. You do not always get a feature you want. If a printer does not support color printing, you can set the "color" bit all day long and PrValidate clears it every time. You should be prepared for a new printer driver that does not support the features you want, and inform the user that the feature is not supported by this printer. o Do not patch PrValidate to make it ignore bogus values in the print record unless instructed to do so by the printer driver author. o Never, never tread on reserved fields in the print record. If you find a particular driver storing useful values some place, forget it. This is the only place a driver has to store information about a print job and some of it is not going to be supported. In particular, never try to interpret any values you may find in the printX subrecord of the print record. This subrecord is for the private use of printer drivers. Although printX is currently the worst compatibility risk, you must not tamper with other reserved fields. o If you want to learn more about printing, learn how printer drivers work. The specifications are in Apple IIgs Technical Note #35, appropriately entitled "Printer Driver Specifications." An understanding of how printer drivers do their work is an understanding of how printing works. Text Printing Text printing generally uses the built-in ASCII mode of most dot-matrix printers to print text quickly and efficiently. Desktop printer drivers often have a "draft" mode, where they print text immediately instead of imaging it in the appropriate font and style. This is accomplished by intercepting low-level QuickDraw II routines called bottleneck procedures. When QuickDraw is called to draw text, the printer driver gets control instead and sends the text to the printer. Although this is useful to users of desktop printer drivers, it is not a required feature of any printer driver, and those that do implement it each do so in their individual way. For example, the LaserWriter driver doesn't support this model of "draft" printing because the LaserWriter is normally a PostScript(R) device--sending straight ASCII to it doesn't necessarily work. To imitate the way classic Apple II applications print, your application prompts the user for some device through which to print, and ASCII characters are sent through that device. There are a few ways to do this. Using the Print Manager You can still use the Print Manager to print in ASCII mode by bypassing the printer driver. Simply use the Port Driver to send ASCII characters to the given target device with the PrDevWrite call. The specifications for Port Driver calls are in Apple IIgsÊTechnical Note #36, also appropriately entitled "Port Driver Specifications." You make port driver calls as if they were Print Manager calls. Although this method has been used, Apple does not recommend it. If the selected port driver is a network driver, this method is troublesome. Using the Text Tools By using the Apple IIgs Text Tools, you can ask the user what slot to print through and send ASCII characters to that slot or port. Although this is better than using the Port Driver, it still has problems. The Text Tools cannot be fully GS/OS Slot Arbiter compatible; therefore, there might be GS/OS devices accessible to the user to which your application does not let him print. Also, it's difficult to detect which slots really have Text Tools' devices without knowing about Apple II firmware, and prompting the user for a slot number invites trying to print to the disk firwmare, which usually justs reboot the machine (unceremoniously). Using GS/OS GS/OS supports character drivers, such as printer interfaces, and using them is the best way to handle ASCII printing. GS/OS supports loaded drivers for character devices if you have them, and generates drivers for character devices it can recognize. In addition, GS/OS drivers have identification words so you can prompt with real messages instead of cryptic slot numbers. You can use the GS/OS call DInfo to loop through all drivers and prepare a list of character drivers. You can then change their device IDs into text phrases, place them in a list, and prompt the user to select one. This call usually results in a list such as "Printer port, Modem port, Remote Print Manager, Printer interface, Text screen [the Console driver]." You may wish to change the names of the devices slightly to make the choice easier (e.g., "network printer" instead of "Remote Print Manager"). Apple strongly recommends using GS/OS for ASCII printing from 16-bit applications. Note: The Remote Print Manager (.RPM) device driver in System Software 5.0 to 5.0.2 has a bug which causes character loss. System Software 5.0.3 fixes this bug. Further Reference _____________________________________________________________________________ o Apple IIgs Toolbox Reference o GS/OS Reference o Apple IIgs Technical Note #34, Low-level QuickDraw II Routines o Apple IIgs Technical Note #35, Printer Driver Specifications o Apple IIgs Technical Note #36, Port Driver Specifications o Apple IIgs Technical Note #69, The Ins and Outs of Slot Arbitration o Apple IIgs Technical Note #75, BeginUpdate Anomaly PostScript is a registered trademark of Adobe Systems Incorporated.