プリンタイメージドライバは、プリンタ機種に依存した以下の機能を持つ。
通常のデバイスドライバとは異なり、 対象デバイスを持たず、 必要に応じて一般プロセスとして生成され、 要求に対応した処理を行う。
なし
通常のデバイスドライバとは異なり、ランデプポート経由ではなく、 プロセスメッセージ通信、および共有メモリによるインタフェースとする。
要求プロセスは、プリンタイメージドライバの親プロセスに限定される。

要求プロセス → プリンタイメージドライバへのメッセージ
プリンタイメージドライバ → 要求プロセスへのメッセージ
    #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 印刷マネージャ」を参照のこと)。
