Important for all Apple Printing and Graphics Developers:
The information in this Technical Q & A is still relevant up to and including
Mac OS 7.6
with QuickDraw GX 1.1.5. Beginning with the release of Mac OS 8.0,
however, Apple plans to deliver a system which incorporates QuickDraw GX
graphics and typography only. QuickDraw GX printer drivers and GX printing
extensions will not be supported in Mac OS 8.0 or in future Mac OS releases. Apple's
goal is to simplify the user experience of printing by unifying the Macintosh
graphic and printing architectures and standardizing on the classic Printing
Manager.
For details on Apple's official announcement, refer to
</dev/technotes/gxchange.html>
|
Q: I needed to add some PostScript comments to the beginning of the
PostScript files generated by the LaserWriter GX driver. I wrote a GX printing
extension to accomplish this, assuming that all I had to do was to override the
GXPostScriptDoDocumentHeader message and buffer the desired data using
Send_GXBufferData . Here is an example of my code:
OSErr NewPostScriptDoDocumentHeader(gxPostScriptImageDataHdl hImageData) {
OSErr theStatus=noErr;
chardataBuffer[256];
longbufferLen;
strcpy(dataBuffer, "%%DAVE'S TEST DATA");
bufferLen = strlen(dataBuffer);
theStatus = Send_GXBufferData((Ptr) dataBuffer, bufferLen,gxNoBufferOptions)
if (theStatus != noErr)
return(theStatus);
theStatus = Forward_GXPostScriptDoDocumentHeader(hImageData);
return(theStatus);
} // NewPostScriptDoDocumentHeader
|
Unfortunately,this causes a bus error when Send_GXBufferData is called, even if I put
Send_GXBufferData after the call to Forward_GXPostScriptDoDocumentHeader . My
workaround for this problem was to buffer the data from within an override of
GXOpenConnection .
On page 4-119 of the QuickDraw GX documentation (Inside Macintosh: QuickDraw
GX Printing Extensions and Drivers), it says, You can override this message
[GXPostScriptDoDocumentHeader ] to build your own document header or to add
comments to a PostScript header. Why doesn't this work?
A: The override in your extension is basically correct, but the order of your code
needs to be slightly different:
// note that the string is terminated with a <cr>
#define kTestStr "%% Dave's test data\n"
OSErr NewPostScriptDoDocumentHeader(gxPostScriptImageDataHdl hImageData) {
OSErr theStatus=noErr ;
char dataBuffer[256] ;
long bufferLen ;
theStatus = Forward_GXPostScriptDoDocumentHeader(hImageData);
if (theStatus != noErr)
return(theStatus);
// Note that we do (sizeof(...) -1) below to strip off
// the C string null terminator for the string defined
theStatus = Send_GXBufferData( kTestStr,
(sizeof( kTestStr) - 1,
0) ;
return(theStatus);
} // NewPostScriptDoDocumentHeader
|
Make sure that the string is terminated with a carriage return. If you're using a
#define to allocate static space for the string (this is not recommended),
remember that it allocates the string, plus a null terminator. Sizeof then
returns the size of the string, so you need to subtract 1 from the total. This
string should come from a resource or a data/prefs file.
If you want to add to the header from an application (to avoid writing the
extension), you can add an item to the job collection of type 'post' , using the
tag gxPrintingTagID . If the first character of this item is a '%' character, it
will appear in the job header.
|