高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technote 1161

Extending the Print Record for LaserWriter 8


目次

概要

アプリケーション

ドライバの実装

PrJobMerge

まとめ

ダウンロード

のテクニカルノートでは、LaserWriter 8 の拡張プリントレコードを使用するドライバをサポートするアプリケーションが行うべき必要な変更について説明します。


概要

LaserWriter 8 のリリースのたび、新機能追加の要望があがりましたが、120 バイトのプリントレコードの制約のため、対応できないものもありました。たとえば「文書に X 文字のスティッキーを付けたいのだが」といったものです。プリントレコードには未使用のビットが少なく、この要望へはずっと「いいえ」と答えざるを得ませんでした。ほかにも、特殊用紙サイズを使いたいとか、同じ物理サイズの用紙に複数サイズで印刷したいなどの要望がありましたが、いずれもプリントレコードの制約により実現できませんでした。

ここで述べるプリントレコードの拡張方法は LaserWriter 8 だけが該当します。Carbon でのプリントレコードの拡張については、Carbon Printing API も参照する必要があります。(構造体の分割などの変更が加えられています。) 拡張プリントレコードのサポートには Carbon API を使うのがよい方法です。拡張レコードを使用するドライバは MacOS 7.6 以降提供されていますので、ここで説明する方法は Carbon をサポートしないアプリケーションだけに限定して使ってください。

拡張プリントレコードを使うアプリケーションにはさまざまな利点が考えられます。ひとつは、PrJobMerge が実際に動くようになることです。これは大いにメリットがあります。それぞれ印刷設定の違う複数の文書を、アプリケーションから (たとえば 'pdoc' アップルイベントに応答するなどして)、単純な印刷ダイアログで印刷できるようになるからです。また、拡張プリントレコードを使うと、ドライバの特殊用紙サイズのサポートが向上したり、同じ物理サイズの用紙に異なるページサイズで印刷できるようになります。これはユーザにはたいへん便利です。アプリケーションのなかから社内便箋など特殊用紙サイズの設定を文書といっしょに保存できるようになるからです。


上に戻る

アプリケーション

アプリケーションに必要な変更

既存アプリケーションの多くはプリントレコードのサイズを 120 バイト固定であると考えています。既存アプリケーションとの互換性を保つため、アプリケーションがもっと大きなプリントレコードの取り扱いを指示しないかぎり、プリンタドライバはプリントレコードを拡大しません。アプリケーションのデベロッパは、まずプリントレコードが sizeof(TPrint) ちょうどでなくてもよいことを保証しなければなりません。次に、ドライバに拡張プリントレコードの使用を許可するため、拡張機能と互換性があることを通知しなければなりません。拡張プリントレコードをサポートするドライバは、新しい prGeneral 命令コードの 'kExtendPrintRecOp'(18) を実装しています。アプリケーションは、新しい PrGeneral ルーチンを使ってドライバにプリントレコードに渡すことで、拡張機能の使用を指示します。もしプリンタドライバが新しい PrGeneral ルーチンに対して拡張プリントレコードの未サポートを表すエラー (OpNotImpl) を返してきたら、プリントレコードはちょうど 120 バイトであるものとして処理を進めなくてはなりません。

新しい拡張プリントレコードで動作するようアプリケーションを変更する最も簡単な方法は、PrDefault() を extendPrDefault() に、PrValidate() を extendPrValidate() に変更することです。これらの拡張ルーチンは下記に示しました。これをアプリケーションにリンクしてください。拡張 API を使うためには、アプリケーションは次の条件を満たす必要があります。

  1. プリントレコードのサイズについて何らの前提を持ってはいけません。プリントレコードを文書に保存する際、120 バイトより大きいプリントレコードにも備えが必要です。同様に、保存されたプリントレコードを読み出すときには、たとえ 120 バイトより大きくてもレコード全体を読み出してください。アプリケーション内部では、プリントレコードを扱う際に、kExtendPrintRecOp をサポートしないドライバである場合を除いて、定数 sizeof(TPrint) の使用は避けてください。従来どおり、プリントレコードの最初の 120 バイトのフィールドにもアクセス可能ですが、最初の 120 バイトに置かれていたフィールドがプリントレコードの拡張部分に移行している可能性に留意が必要です。
  2. アプリケーションは、プリンタドライバにプリントレコードの擬似ハンドル (fake handle) を渡してはいけません。拡張されたプリンタドライバはプリントレコードを大きくするのに SetHandleSize() を呼び出します。アプリケーションで擬似ハンドルを使っていると、SetHandleSize() はクラッシュを起こします。
  3. アプリケーションは、PrStlDialog()、PrStlInit()、PrJobDialog()、PrJobInit()、PrOpenDoc()、PrGeneral() にプリントレコードを渡す前に extendPrDefault() か extendPrValidate() を呼び出さなければなりません。先にプリントレコードの検証を済ませておくためです。さらに、PrJobMerge() を呼び出す前に、両方のプリントレコードについて extendPrValidate() を呼び出してください。


アプリケーションの新しい拡張ルーチン


以下にアプリケーションが拡張プリントレコードをサポートするために使用すべき新しいルーチンを示します。

#define kExtendPrintRecordOp 18
                  
/*
'kExtendPrintRecOp' で PrGeneral を呼び出す際にこの構造体を使う。
関数の入り口では、'hPrint' は標準または拡張プリントレコードのハンドル。
'hPrint' が拡張プリントレコードの場合、何もしない。
'hPrint' が標準プリントレコードの場合、拡張される。
*/
                  
typedef struct{
short iOpCode;
short iError;
long lReserved;
TPrintH hPrint;
}TExtendPrintRecord;
                  
TExtendPrintRecord extend;
                  
Boolean extendPrValidate(THPrint hPrint)
/*
現在のプリンタドライバにプリントレコードを拡張するように依頼する。
拡張できない場合は、プリントレコードハンドルのサイズは
標準サイズ (120 バイト) に設定される。
現在のプリンタドライバの PrValidate() ルーチンを呼び出し、
プリントレコードが正常に拡張されたかどうかを検証する。
*/
{
                  
/*
'hPrint' が拡張されたのに、現在のプリンタドライバが拡張プリントレコードを
サポートしない場合、extendPrintRecord() を使ってプリントレコードを切り捨てる。
プリントレコードがすでに標準サイズになっているか、または現在のプリンタドライバが
拡張のプリントレコードをサポートしている場合はプリントレコードは切り捨てない。
*/
extendPrintRecord(hPrint);
                  
/*
正しいサイズのプリントレコードで本物の PrValidate を呼び出す
*/
return PrValidate(hPrint);
}
                  
void extendPrDefault(THPrint hPrint)
{
                  
/*
あらゆるドライバの標準サイズは 120 バイトのレコードなので、これを
デフォルトとして使う。
*/
SetHandleSize((Handle)hPrint, sizeof(TPrint));
PrDefault(hPrint);
                  
/*
プリンタドライバにプリントレコードの拡張を許可する。
*/
extendPrintRecord(hPrint);
                  
}
                  
void extendPrintRecord(THPrint hPrint)
{
TExtendPrintRec extend;
                  
/*
新しい PrGeneral 命令コードを呼び出し、現在のプリンタドライバが
拡張プリントレコードをサポートしているかどうかを調べる。
サポートしている場合は、noErr が返る。
プリントレコードを拡張済みとするか、ここで拡張を行う。
拡張プリントレコードをサポートしていない場合は 'OpNotImpl' が返る。
*/
extend.iOpCode = kExtendPrintRecordOp;
extend.lReserved = 0;
extend.hPrint = hPrint;
PrGeneral(&extend);
                  
/*
ドライバがプリントレコードの拡張できない場合は、
プリントレコードを標準の 120 バイトにする。
*/
if(extend.iError) SetHandleSize((Handle)hPrint, sizeof(TPrint));
}

ドライバの実装

LaserWriter 8 における拡張プリントレコードの実装では、標準の 120 バイトの TPrint 構造体の後に 4 バイトのシグネチャフィールドが続き、その値は 'grow' になります。シグネチャの後には平坦化された Collection が続きます(Inside Macintosh: Collection Manager参照)。


上に戻る

PrJobMerge

LaserWriter 8 シリーズのドライバは、これまでも、印刷ダイアログで、120 バイトのプリントレコードに保存できるより多くのオプションをユーザに提供してきました。拡張プリントレコードの導入により、ユーザの全プリント機能を大きなプリントレコードに保存できるようになりました。拡張プリントレコードを使うアプリケーションは、PrJobMerge を使って、ユーザの機能要求をすべて新しいプリントレコードにコピーできます。つまり、LaserWriter 8.6 から、PrJobMerge はついにすべての印刷ダイアログのオプションで動作するようになりました。


注意:

PrJobMerge が正しく拡張プリントレコードを操作できるよう、コピー元とコピー先の両方のプリントレコードを拡張しなければなりません。


上に戻る

まとめ

ついに 120 バイトを超えるプリントレコードを扱う機構が追加されました。アプリケーションで大きなプリントレコードを活用するには変更が必要ですが、それはごくわずかなものです。さらに大幅な変更を行うことで、印刷方向の向き、レイアウト、エラー処理など、さまざまな印刷設定をきれいに制御できるようになります。LaserWriter 8 の拡張プリントレコードデータについては別の文書で解説する予定です。


参考文献


上に戻る

変更履歴

  • 05/96 - 初版を執筆 - Richard Blanchard
  • 04/99 - テクニカルノートの形式に合わせるとともに、最新情報を取り込んで改訂 - Dave Polaschek
  • 07/99 - サンプルコードの追加 - Dave Polaschek

上に戻る

ダウンロード

ヘッダーファイル (147K)


上に戻る


更新日: 1999 年 4 月 19 日