home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Carousel Volume 2 #1
/
carousel.iso
/
mactosh
/
tech
/
print_dr.txt
< prev
next >
Wrap
Internet Message Format
|
1985-09-17
|
7KB
Return-Path: <oster%ucblapis.CC@Berkeley>
Received: from UCB-VAX.ARPA by SUMEX-AIM.ARPA with TCP; Mon 16 Sep 85 08:47:46-PDT
Received: from ucbjade.Berkeley.Edu (ucbjade.ARPA) by UCB-VAX.ARPA (4.24/5.3) id AA24163; Sat, 14 Sep 85 15:41:19 pdt
Received: from ucblapis.Berkeley.Edu (ucblapis.ARPA) by ucbjade.Berkeley.Edu (4.19/4.38.2) id AA03229; Sat, 14 Sep 85 15:44:36 pdt
Received: by ucblapis.Berkeley.Edu (4.19/4.38.1) id AA01944; Sat, 14 Sep 85 15:44:43 pdt
Date: Sat, 14 Sep 85 15:44:43 pdt
From: oster%ucblapis.CC@Berkeley
Message-Id: <8509142244.AA01944@ucblapis.Berkeley.Edu>
To: info-mac@sumex-aim.ARPA
Subject: Writing Print Managaers on the Macintosh
Creating a Macintosh Printer Manager
(All of this information was in Inside Mac, but much of it is omitted in
the current version, and unless you've written print managers, the info is
difficult to understand. Here it is in condensed form.)
A Macintosh Print Manager is a file containing 68000 machine language
procedures that are called by application programs. These procedures are
expected to:
1.) modify fields in a 120 byte print record that the application looks in
to find the resolution of the printer, the size of the paper, the number of
copies, and the page range to print.
2. Provide a grafPort for the application to do its drawing on. This
grafPort has special procedures in its QDProcs field that customize
quickdraw appropriately for the printer.
A Macintosh Printer Driver may print bitmaps and/or it may print characters
and do carriage returns and line feeds. Access to the printer driver is
controlled by the Print Manager, so you can provide what ever capabilities
you want and still use existing application programs.
Applications print by
a.) Setup the page by calling PrintDefault or PrStylDialog.
b.) define the job (quality, page range, and no. of copies) by calling
PrJobDialog
c.) call PrOpenDoc
d.) for each page, "i"
e.) call PrOpenPage
f.) do their own code to draw page(i)
g.) call PrClosePage
h.) call PrCloseDoc
i.) if the print manager has told it to, the application calls PrPicFile to
playback any printer spool file to the printer.
Your Print Manager gets control on every one of those Pr... calls. It can
tell the user (by the dialogs) what capabilities are available, and it can
pick and choose which quickdraw calls to interpret and which not.
Examples: When the Imagewriter is spooling, it just uses the Picture
mechanism of QuickDraw to buffer up a page of QuickDraw calls into a
picture structure that it writes to disk. When the application is done
drawing data it calls PrPicFile, which as defined in the file ImageWriter,
allocates a bitmap representing a band of the page and calls DrawPicture.
It sends the bitmap to the Printer Driver. Then it reallocates the bitmap
to represent the next band of the page and calls drawPicture again. It
repeats this until it has drawn the entire page.
When it is not spooling, i.e. when it is in draft mode, the ImageWriter
printer manager overrides most of the QDprocs, and interprets attempts to
draw text by telling the printer driver to move to a particular spot on the
paper and draw the characters in one of the printer's built in fonts.
The print manager is where all the work happens. Very few things call the
print driver directly. The shift-command-4 screen printing is all I can
think of.
Now, writing your own printer manager:
The Choose Printer desk accessory looks for files on the startup Disk whose
type is 'PRES', so you should create 'PRES' file to hold your printer code.
Create a file whose type is 'PRES' and whose creator field is some 4
characters of your own, but for compatability with the rest of the
universe, should be a mix of upper and lower case, not contflicting with
anyone else's: 'Dave' for example. (all entirely lower case names and
many upper case names are alreay in use or reserved by apple)
Summary: A printer manager is a file with:
Type: 'PRES'
Creator: up to you: ('Dave' for example)
containing resources:
type id
'BNDL' 128 - so you manager will have an icon on the desktop
'ICN#' - so you manager will have an icon on the desktop
'FREF' - so you manager will have an icon on the desktop
'Dave' - (for example) ditto
'DRVR' $E000 - device manager for this printer
'PREC' $E000 - (optional) private storage for this printer
'PREC' $0000 - 120 byte default print record for this printer
'STR ' $E001 - default spool file name (like "Print File")
'DLOG' $E000 - Page Setup Dialog
'DITL' $E000 - Page Setup Dialog Item List
'DLOG' $E001 - Job Dialog
'DITL' $E001 - Job Dialog Item List
Lastly, you will need 6 resources whose contents contain pure 68000 machine
language. These are:
'PDEF' $0000 - Called to do draft printing
'PDEF' $0001 - Called to do spool printing (high and standard quality)
'PDEF' $0002 - (Optional) print method A
'PDEF' $0003 - (Optional) print method B
Each of these 4 resources starts with the following code:
BRA.W MyPrOpenDocProc
BRA.W MyPrCloseDocProc
BRA.W MyPrOpenPageProc
BRA.W MyPrClosePagePrc
... the actual code
This code is used as a jump table to actually dispatch to a particular
procedure.
'PDEF' $0004 - The dialogs
This resource starts with the following code:
BRA.W MyPrintDefaultProc
BRA.W MyPrStlDialogProc
BRA.W MyPrJobDialogProc
BRA.W MyPrStlInitProc
BRA.W MyPrJobInitProc
BRA.W MyPrDlgMainProc
BRA.W MyPrValidateProc
BRA.W MyPrJobMergeProc
'PDEF' $0005 - The printer spool file interpreter
This resource starts with the code to do MyPrPicFileProc.
All of the code obeys the pascal calling conventions:
Registers A2-A6, D1-D7 must be preserved, parameters are on the stack,
first parameter farthest from the top of stack, and the called routine must
pop the parameters before it returns.
The individual calling sequences of the Pr...procs are given in IM, so I
won't repeat them here.
Macintosh applications call the correct one of 'PDEF's 0-3 by looking in
the .bjDocLoop field of the print record. The print record is set by the
procedures MyPrStlDialog and MyPrJobDialog which the application calls to
present the pageSetup and Printing dialogs, respectively, to the user, So
the writer of the print manager has a lot of flexibility.
I hope this inspires somebody to write some new print managers I would like
to see one for the standard imagewriter that calls the standard manager to
do most of the work, but gives me control over the margins. It would also
be possible to write one manager that drove many different kinds of
plotters and dot matrix printers.
-- David Oster