プリンタイメージドライバは、プリンタ機種に依存した以下の機能を持つ。
通常のデバイスドライバとは異なり、 対象デバイスを持たず、 必要に応じて一般プロセスとして生成され、 要求に対応した処理を行う。
なし
通常のデバイスドライバとは異なり、ランデプポート経由ではなく、 プロセスメッセージ通信、および共有メモリによるインタフェースとする。
要求プロセスは、プリンタイメージドライバの親プロセスに限定される。
要求プロセス → プリンタイメージドライバへのメッセージ
プリンタイメージドライバ → 要求プロセスへのメッセージ
#define MS_PRREQ MS_MNG5 /* 要求メッセージ */ #define MS_PROUT MS_MNG4 /* 出力メッセージ */
typedef struct { W type; /* = MS_PRREQ/MS_PROUT */ W size; /* = PrntMsgSz */ W cmd; /* コマンド */ W status; /* 応答状態 */ W dlen; /* データサイズ */ VP memptr; /* (共有)メモリポインタ */ } PrntMsg; #define PrntMsgSz (sizeof(PrntMsg) - sizeof(W) * 2)
status
は未使用
dlen, memptr
は未使用cmd
は対応コマンド + PRNT_RESP
#define PPNT_RESP 0x100
#define EP_OK (0) /* 正常 */ #define EP_CMND (-1) /* コマンド形式が不正 */ #define EP_PAR (-2) /* パラメータが不正 */ #define EP_NOSPT (-3) /* 未サポート */ #define EP_PAPER (-4) /* 用紙サイズが不正 */ #define EP_SPEC (-5) /* 印刷仕様が不正 */ #define EP_NOSPC (-6) /* 資源が不足した */ #define EP_OUTBUF (-7) /* 出力バッファが未設定 */ #define EP_ABORT (-8) /* 中断された */
#define PRNT_FINISH 0x00 /* 処理終了 */ #define PRNT_SETKIND 0x01 /* プリンタ機種設定 */ #define PRNT_SETPAR 0x02 /* 固有パラメータ設定 */ #define PRNT_GETPAR 0x03 /* 固有パラメータ1取り出し*/ #define PRNT_SETINFO 0x04 /* プリンタ情報設定 */ #define PRNT_GETINFO 0x05 /* プリンタ情報取り出し */ #define PRNT_SETBUF 0x06 /* 出力バッファ設定 */ #deifne PRNT_SETIMAGE 0x07 /* 印刷イメージ設定 */ #define PRNT_FEEDFORM 0x08 /* 改ページ */ #define PRNT_GETPAR2 0x09 /* 固有パラメータ2取り出し*/ #define PRNT_OUTDATA 0x10 /* プリンタ出力データ */
dlen: 0 memptr: NULL
プリンタイメージドライバは正常応答を戻した後、 自プロセスを終了する。
status: EP_OK (エラーを戻してはいけない)
dlen: sizeof(TC) * L_PRNM memptr: typedef struct { W spec; /* プリンタ仕様 */ SIZE papermin; /* 最小用紙サイズ(mm) */ SIZE papermax; /* 最大用紙サイズ(mm) */ } PrntSpec; TC hwname[L_PRNM]; /* 要求: 機種名 */ PrntSpec spec; /* 応答: プリンタ仕様 */
指定されたプリンタ機種に設定し、そのプリンタの仕様を戻す。
ただし、機種名が指定されなかった場合
( hwname[0] = TNULL
) は機種設定を行わず、
現在設定されている機種に関するプリンタ仕様を戻す。
プリンタ仕様の spec
は以下のビット対応で示す。
#define PR_DRAFT 0x0001 /* ドラフト印刷 */ #define PR_FINE 0x0002 /* 高密度印刷 */ #define PR_COLOR 0x0010 /* カラー印刷 */ #define PR_ROTATE 0x0100 /* 縦横逆転サポート */ #define PR_HWPAR 0x0200 /* 固有パラメータ1有 */ #define PR_SETHWPAR 0x0400 /* 固有パラメータ1要設定 */ #define PR_HWPAR2 0x0800 /* 固有パラメータ2有 */
PR_DRAFT
は基本的にサポートしなくてはいけない。
PR_HWPAR
は PRNT_SETPAR, PRNT_GETPAR
をサポートしていることを示し、
PR_SETHWPAR
は PRNT_GETPAR
を必ず実行する必要があることを示す。
PR_HWPAR2
は PRNT_GETPAR2
をサポートしていることを示す。
なお、固有パラメータ2の設定・変更によりプリンタ仕様が変化する場合がある。
status: > EP_OK プリンタ仕様 EP_NOSPT サポートしていない機種
dlen L_HWPAR memptr VB hwpar[L_HWPAR]; /* 固有パラメータ */
プリンタ固有パラメータを設定する。
status: EP_OK 正常 EP_NOSPT 固有パラメータはサポートしていない。
dlen L_HWPAR memptr VB hwpar[L_HWPAR]; /* 固有パラメータ */
指定されたプリンタ固有パラメータを初期値として、 プリンタ固有パラメータ設定パネルにより、 パラメータの設定/変更を行い、結果を戻す。
固有パラメータ hwpar
は、
PRNT_GETPAR, PRNT_GETPAR2
で共通である。
hwpar
内のどの部分を固有パラメータ1および1として扱うかは、
プリンタイメージドライバが任意に決める。
要求プロセス側は、hwpar
の内容に関しては関知しない。
PRNT_GETPAR
は印刷直前の設定のために呼び出す。
主に色補正などの設定に使用する。
PRNT_GETPAR2
はプリンタ機種選択時の設定のために呼び出す。
主にプリンタのハードウエアの詳細設定などに使用する。
status: EP_OK 正常 EP_NOSPT 固有パラメータはサポートしていない。
dlen: sizeof(PrntSet) memptr: typedef struct { SIZE paper; /* 用紙サイズ (mm) */ W spec; /* 印刷仕様 */ } PrntSet; paper: 印刷する用紙のサイズ (mm) spec: 印刷する仕様 印刷仕様は下記の組み合わせ。ただし、PR_DRAFT と PR_FINE は 同時に指定できない。 PR_DRAFT, PR_FINE とも指定がなければ通常印刷。 #define PR_DRAFT 0x0001 /* ドラフト印刷 */ #define PR_FINE 0x0002 /* 高密度印刷 */ #define PR_COLOR 0x0010 /* カラー印刷 */
用紙サイズ、印刷仕様を設定する。
設定されるまでは、デフォールト設定となっている。
status: EP_OK 正常 EP_PAPER 用紙サイズが不正/未サポート EP_SPEC 印刷仕様が不正/未サポート
dlen: 出力バッファのバイトサイズ memptr: 出力バッファの先頭アドレス
生成したプリンタへの出力データを格納するための出力バッファを設定する。 設定した出力バッファは、PRNT_SETBUF で再設定されるまでは、 その存在が保証される。
status: EP_OK 正常 EP_PAR パラメータが不正
dlen: sizeof(PrntInfo) memtr: typedef struct { SIZE paper; /* 用紙サイズ (mm) */ W spec; /* 印刷仕様 */ SIZE res; /* 有効解像度 */ SIZE unit; /* 移動単位(ドット) */ RECT margin; /* 物理マージン(mm) */ UH headsz; /* 印字ヘッド縦ドット数 */ UH pixbits; /* ピクセルビット数 */ CSPEC cspec; /* カラー仕様 */ COLOR colmap[MAX_CMAPENT]; /* カラーマップ */ } PrntInfo; #define MAX_CMAPENT 256 paper, spec: 用紙サイズ、印刷仕様 PRNT_SETINFO で設定された、またはデフォールト設定情報 res: プリンタの横/縦の有効解像度 < 0 の時: 1 インチ当たりのドット数の負数 > 0 の時: 1 cm 当たりのドット数 指定した quality に依存する。 headsz: 印字ヘッドの縦のドット数 (>= 1) 縦方向には、このドット単位で印刷することが望ましいこと を示す。この値は、unit.v の倍数でなくてはいけない。 unit: 横/縦方向の移動単位 (ドット) このドット数の倍数でのみ横 / 縦方向の位置の移動が可能 となる。 margin: 指定した用紙における左、上、右、下の物理マージン(mm) pixbits:イメージ作成用ビットマップのピクセルビット数 (プレーン数は 1 に固定) cpsec: イメージ作成用ビットマップのカラー仕様 cspec.colmap の値は意味を持たない。 cspec.attr は以下のいずれかでなくてはいけない。 DA_COLOR_RGB │ DA_HAVECMAP DA_COLOR_RGB DA_COLOR_MONO colmap: イメージビットマップのカラーマップ cspec.attr & DA_HAVECMAP のときのみ有効で、 cspec.inf[0] が実際のエントリ数を示す。
現在の設定における情報を取り出す。
status: EP_OK 正常
dlen: sizeof(PrntImage) memptr: typedef struct { PNT offset; /* 印刷オフセット */ RECT area; /* 印刷領域 */ BMP bmp; /* 印刷イメージ */ } PrntImage; offset: 印刷を開始するオフセットドット数 開始 Y 位置: 現在の Y 位置 + offset.y 開始 X 位置: offset.x 実際のオフセットドット数は、移動単位の倍数となる。 >= 0 でなくてはいけない。 area: 印刷イメージビットマップ上で実際に印刷する領域 有効印刷領域からはみ出た領域は印刷されない。 実際に印刷される領域は、移動単位の倍数となる。 空の時は、offset.y のフィード動作のみとなる。 bmp: 印刷対象のビットマップ PR_GETINFO で取り出されたビットマップ形式でなくては いけない。 ビットマップの baseaddr[0] で示される領域は、共有メモリ 領域であり、かつ、応答が戻るまで内容を変更してはいけ ない。
印刷開始位置を offset
で指定された分だけ進め、
area
で指定された領域のイメージを印刷するためのプリンタへの出力データを生成して、
出力メッセージを送信する。
出力メッセージの応答として、エラー応答を受け取った場合は、 即座に、エラー応答を戻す。
PRNT_SETBUF
により出力バッファが設定されていないときは、
エラーとなる。
処理後は以下の Y 位置となる。
開始 Y 位置 + 実際に出力された領域の高さ
status: EP_OK 正常 EP_PAR パラメータが不正 EP_NOSPC 資源が不足した EP_OUTBUF 出力バッファが未設定 EP_ABORT 中断した
dlen: 0 memptr: NULL
改ページを行うためのプリンタへの出力データを生成して、 出力メッセージを送信する。
出力メッセージの応答として、エラー応答を受け取った場合は、 即座に、エラー応答を戻す。
PRNT_SETBUF
により出力バッファが設定されていないときは、
エラーとなる。
status: EP_OK 正常 EP_NOSPC 資源が不足した EP_OUTBUF 出力バッファが未設定 EP_ABORT 中断した
dlen: nbytes memptr: UB dat[nbytes] /* 変換バイト列 */
memptr
は PR_SETBUF
により設定された出力バッファである(先頭である必要はない)。
生成したプリンタへの出力データを出力する。
dlen
に 0 を指定した場合は、プリンタへの出力をフラッシュする。
応答として、エラー応答 (EP_ABORT
) を受け取った場合は、
即座に、出力処理を中断して、
元になった要求コマンドに対応するエラー応答を戻す。
status: EP_OK 正常 EP_ABORT 何らかの理由により処理を中断した。
プリンタイメージドライバは /SYS/$$PRINTER.BOX/*
に置く必要がある。
プリンタイメージドライバの数は任意であり、
通常は 1 つのプリンタイメージドライバは、
同一メーカー 1 個以上の機種をサポートする。
ドライバファイル名は一意的でなくはいけない。
プリンタイメージドライバは、 第 2 レコード以降に以下の機種名レコードを持っていなくてはいけない。
レコードタイプ: 15 サブタイプ: 0 (任意) 内容: サポートしている機種名の TC 文字列リスト <プリンタ機種-1> <TNULL> <プリンタ機種-2> <TNULL> .... <プリンタ機種-N> <TNULL>
/SYS/$$PRINTER.BOX
には、
プリンタ情報レコードも含まれる
(BTRON3仕様書「3.11 印刷マネージャ」を参照のこと)。