以下、図面を参照して本発明の一実施形態を説明する。なお、以下の説明では、画像が印刷されるメディアを便宜上「用紙」と称するが、「用紙」は、紙に限らず、他種の印刷メディア、例えば、CD(Compact Disk)やOHPフィルム等であってもよい。
図1は、本発明の一実施形態に係るプリントシステムの構成例を示す。
ホスト装置(例えばパーソナルコンピュータ)1のインタフェース回路(以下、「I/F」と略記)3と、プリンタ15のI/F13とがケーブル8を介して接続されている。I/F3及びI/F13は、例えば、USBプロトコルに従う通信を行うインタフェース回路、又は、パラレル通信を行うインタフェース回路である。
ホスト装置1は、入力装置5(例えば複数の入力キーやポインティングデバイス)と、ディスプレイ画面7と、ホスト記憶域19と、プロセッサ(例えばCPU)17とを備える。入力装置5とディスプレイ画面7は、例えばタッチ式パネルのように、一体になっていてもよい。
ホスト記憶域19は、例えば、メモリ及びハードディスクのうちの少なくとも一方が有する記憶領域である。ホスト記憶域19には、例えば、画像データを出力するアプリケーションソフト22と、アプリケーションソフト22から出力されたRGB表色系の画像データを必要に応じて処理しプリンタ15に転送するプリンタドライバ21とが記憶される。アプリケーションソフト22やプリンタドライバ21は、プロセッサ17に読み込まれることにより、動作する。プロセッサ17に読み込まれたプリンタドライバ21が行う処理については、後に詳述する。
プリンタ15は、どのような種類のプリンタであってもよい(例えばレーザプリンタであっても、インクジェットプリンタ等のようなシリアルプリンタであってもよい)。プリンタ15は、画像や文字等のオブジェクトを印刷する印刷エンジン43と、ホスト装置1からのコマンドに基づいて印刷データを生成する印刷コントローラ31と、印刷コントローラ31により生成された印刷データに基づいて印刷エンジン43を制御するエンジンコントローラ41とを備える。また、プリンタ15は、I/F13の他に、別のI/F73を備えることができる(これについては、後述する)。
印刷コントローラ31は、プリンタ記憶域33とプロセッサ(例えばCPU)35とを備える。
プリンタ記憶域33は、一又は複数の記憶装置(例えば、揮発性のメモリと不揮発性のメモリとのうちの少なくとも一方)により提供される記憶領域である。プリンタ記憶域33には、例えば、ソフトウェア群37と、レイアウト管理テーブル61と、印刷方法管理テーブル63とが記憶される。
ソフトウェア群37は、プロセッサ35に読み込まれることにより動作する複数のコンピュータプログラムを含んでいる。例えば、ソフトウェア群37は、ホスト装置1からRGB表色系の画像データを受け、その画像データを別の表色系(例えばCMY表色系)の画像データに変換する色変換処理を行い、更に、ハーフトーニング処理(例えば二値化処理)を行うことができる。
レイアウト管理テーブル61には、どんな用紙サイズではどんな用紙種類がありどんなレイアウトが可能かが記録されている。例えば、図2に例示するように、レイアウト管理テーブル61には、複数の用紙種類の各々について、用紙種類を表す用紙種類パラメータと、その用紙種類をサポートしている各用紙サイズを表す各用紙サイズパラメータと、その用紙サイズで可能なレイアウトを表すレイアウトパラメータとが記録されている。図2によれば、例えば、このプリンタ15では、用紙サイズ「A4」が指定された場合には、プロセッサ35は、レイアウト管理テーブル61を参照することにより、用紙サイズ[A4]に対応した用紙種類が「写真用紙」、「光沢紙」、「フォトマット紙」及び「普通紙」であることと、いわゆる縁なし印刷と縁有り印刷とのうちのどちらも行うことができることとを特定することができる。
なお、パラメータは、例えば、人間が理解できる言葉をテキスト形式で表したものであっても良いし、人間は理解できないがコンピュータプログラムが理解できるコードであっても良い。後者の場合、例えば、プリンタドライバ21は、パラメータを人間が理解できる言葉で表示することができる。
印刷方法管理テーブル63には、どんな用紙種類でどんな印刷品質の場合にどのような印刷処理を行うかが記録されている。例えば、図3に例示するように、印刷方法管理テーブル63には、どんな用紙種類パラメータでどんな印刷品質パラメータの場合に、出力解像度(換言すれば、印刷された画像の解像度)をどんな値にし、双方向印刷と単方向印刷のどちらを採用し、ドットサイズのバージョンとしてどれを採用するかが記録されている。図3によれば、例えば、用紙種類パラメータ「写真用紙」で印刷品質パラメータ「High」が指定された場合には、プロセッサ35は、印刷方法管理テーブル63を参照することにより、単方向印刷且つドットサイズバージョン「VSD3」で、出力解像度「横2880dpi×横720dpi」の画像を印刷すべきであることを特定することができる。
なお、図3を参照すればわかるように、この実施形態では、印刷品質パラメータとして、「High」、「Normal」及び「Draft」の3つが採用される(これらの3種類に限定する必要は無い)。「High」は、画質が最も良いことを意味し、「Normal」は、画質は「High」程ではないが印刷速度は「High」よりも速いことを意味し、「Draft」は、画質は「Normal」程ではないが印刷速度は「Normal」よりも早いことを意味する。
また、この実施形態において、「双方向印刷」とは、主操作方向に往復移動する印刷ヘッドが往路でも復路でもドットを打つことを意味し、それに対し、「単方向印刷」とは、印刷ヘッドが往路又は復路のどちらか一方ではドットを打つが他方ではドットを打たないことを意味する。つまり、図3のテーブル63は、プリンタ15がシリアルプリンタの場合の一例である。図3のテーブル63では、「双方向印刷ON」が双方向印刷を行うことを意味し、「双方向印刷OFF」が双方向印刷を行わないことを意味する。また、図3のテーブル63において、「ON/OFF」の表記があるが、これは、双方向印刷と単方向印刷のどちらでも可能であることを意味する。双方向印刷よりも単方向印刷の方が高品質の印刷結果が得られやすい。
また、この実施形態において、「ドットサイズバージョン」とは、印刷ヘッドから吐出するインク滴の量を表す。この実施形態では、「VSD」の後に続く数値が大きいほど、インク滴の量が少なく、それゆえ、高精細の印刷結果が得られやすい。
図4は、本実施形態に係るプリントシステムにおいて行われる通信を処理するプロトコル層の構成例を示す。
この実施形態では、最下層に物理層があり、その上に、IEEE1284.4のプロトコル層(以下、IEEE1284.4を便宜上「D4」と称する)があり、更にその上に、アプリケーション層(以下、「AP層」と略記)がある。ホスト装置1では、プリンタドライバ21もアプリケーションソフト22も、AP層での通信を行う。
なお、D4プロトコル層は、必ずしも、ホスト装置1とプリンタ15との両方に存在するものではなく、例えば、いずれか片方にしか存在しない場合や、両方に存在しない場合もあり得る。
さて、以下、本実施形態についてより詳細に説明する。
図5は、ソフトウェア群に含まれる複数のコンピュータプログラムと、複数のコンピュータプログラムにより構成される印刷パスを示す。
ソフトウェア群37には、例えば、ハードウェアインタフェースドライバ(以下、「IFD」と略記)101と、データ取得モジュール103と、レガシー言語処理モジュール105と、印刷エンジンドライバ(以下、「PED」と略記)107と、特定言語処理モジュール113と、色変換/ハーフトーニング処理モジュール115と、インタフェース処理モジュール117と、印刷処理モジュール119と、データ処理パスコントローラ(以下、DPC)131とが含まれている。
IFD101は、所定のハードウェア(例えばI/F3)の動作を制御するコンピュータプログラムとして存在し、PED107は、エンジンコントローラ41の動作を制御するコンピュータプログラムとして存在する。そして、モジュール103、105、113、115、117及び119は、データ処理パスを管理するDPC131からの指示により、動的に起動又は終了することができる。
例えば、プリンタ15には、DPC131からの指示により、データ取得モジュール103及びレガシー言語処理モードモジュール105が起動することで、それらのモジュール103及び105を構成要素として備えるレガシーパスが構築される。レガシーパスとは、例えば、従前から存在する種類の言語(以下、「レガシー言語」と言う)で書かれたコマンドが流れるデータ処理パス(このパスはプリンタにおけるパスなので、以下、「印刷パス」と称することがある)であり、より具体的には、例えば、RGBからCMYへの色変換やハーフトーニング処理が施された印刷画像データが流れる印刷パスである。印刷画像データは、例えば、プリンタ15のインク構成(例えば、インクの色、色数、又は種類)やインク滴の構成(例えば、大中小の三段階)、更には印字ヘッド(図示せず)のノズル数やノズルピッチに対応している。
また、プリンタ15は、印刷画像データだけでなく、RGB表色系の画像データ(以下、RGB画像データ)を入力し、そのRGB画像データに基づいて印刷画像データを生成し、生成した印刷画像データを用いて印刷を行うことができるようになっている。具体的には、例えば、プリンタ15は、別のIFD111の制御により、別のI/F71を介して、ホスト装置1とは別のデバイス73(例えば、メモリカード或いはデジタルカメラ)からRGB画像データを受信し、そのRGB画像データの印刷画像データを生成して印刷を行うことができる。以下の説明では、印刷画像データ(つまり、RGBからCMYへの色変換処理が施されたデータ)が流れる印刷パスを「レガシーパス」と称するのに対し、RGB画像データが流れる印刷パスを「RGB印刷パス」と称する。DPC131によって、特定言語処理モジュール113、色変換/ハーフトーニング処理モジュール115、インターレース処理モジュール117及び印刷処理モジュール119が起動されることにより、それらのモジュール113、115、117及び119を構成要素とするRGB印刷パスが構築される。
この実施形態では、例えば、プリンタ15と、プリンタ15の通信相手デバイスとの間で、これから入力されるデータの種別が特定される所定のネゴシエーションが行われた場合には、RGB印刷パスが構築され(例えば、レガシーパスを構築することなくRGB印刷パスが構築され)、レガシーパスを介することなく、別のIFD111を介して、RGB画像データがRGB印刷パスに入力される。換言すれば、上記所定のネゴシエーションによりこれからRGB画像データが入力されることが特定された場合には、別のIFD11が、RGB画像データの入口として採用され、RGB印刷パスが構築される。
一方、この実施形態では、例えば、プリンタ15と、プリンタ15の通信相手デバイスとの間で、これから入力されるデータの種別が特定される所定のネゴシエーションが行われなかった場合には、レガシーパスが構築され、レガシーパスにデータが入力される。換言すれば、例えば、上記所定のネゴシエーションが行われなかった場合には、IFD101が、入力されるデータの入口として採用され、レガシーパスが構築される。その後、レガシーパスにデータが入力され、そのデータが実はRGB画像データであることが判明した場合には、プリンタ15では、レガシーパスが有効になったままRGB印刷パスが構築され、RGB画像データが、レガシーパスを介してRGB印刷パスに入力される。
このように、プリンタ15には、ホスト装置1から受信した印刷画像データが流れるレガシーパスと、ホスト装置1とは別のデバイス73から受信したRGB画像データが流れるRGB印刷パスとを構築することができる。プリンタ15は、ホスト装置1からのデータやコマンドが流れる印刷パスを、レガシーパスからRGB印刷パスに切り替えることができる。
具体的には、例えば、ホスト装置1からのデータやコマンドは、I/F3で受信される。IFD101は、ホスト装置1からのデータやコマンドを、例えば、プリンタ記憶域33(又は、I/F13のメモリ(図示せず))上に設けられたデータバッファ133に蓄積する。データバッファ133に蓄積されたデータやコマンドは、データ取得モジュール103により、読み出され(例えば所定サイズ毎に読み出され)、レガシー言語処理モジュール105に渡される。レガシー言語処理モジュール105は、渡されたコマンドの記述言語を判別し、レガシー言語で書かれていると判別した場合、そのコマンドを解釈し、それの解釈結果に基づいて、PED107を制御するためのコマンドをPED107に出力する。つまり、レガシー言語処理モジュール105は、渡されたコマンドの記述言語がレガシー言語であれば、レガシー言語処理モードを実行する。PED107は、レガシー言語処理モジュール105からのコマンドに基づいて、エンジンコントローラ41を制御することにより、印刷エンジン43を制御する。
一方、レガシー言語処理モジュール105は、渡されたコマンドの記述言語が特定言語であると判別した場合には、そのコマンドを、特定言語処理モジュール113に渡し、それ以降、特定言語処理モードの終了命令(又は、別の言語処理モードへの移行命令)を受信するまで、取得されるコマンドやデータを格別解釈することなく特定言語処理モジュール113へ転送する。
特定言語処理モジュール113は、特定言語処理モードを実行する。特定言語処理モードとは、従前から存在する種類の言語に加えて新規に設けられた種類の言語(以下、「特定言語」と言う)を処理するモードである。特定言語とは、例えば、ホスト装置1から入力されるコマンドが、RGB表色系の画像データを印刷するためのコマンドであることを表す言語である。特定言語処理モジュール113は、例えば、レガシー言語処理モジュール105から渡されるコマンドを解釈し、その解釈結果に基づく処理を実行したり、渡されるRGB画像データを色変換/ハーフトーニング処理モジュール115に渡したりする。色変換/ハーフトーニング処理モジュール115は、渡されたRGB画像データをCMY画像データに変換し、且つ、変換後のCMY画像データに対してハーフトーニング処理を施し、ハーフトーニング処理が施されたCMY画像データをインターレース処理モジュール117に出力する。インターレース処理モジュール117は、必要に応じて(例えばプリンタドライバ21からの指示に応じて)、インターレース印刷が行われるための処理を、上記出力されたCMY画像データに施し、そのCMY画像データをイメージバッファ(図示せず)に出力する。イメージバッファは、例えば、プリンタ記憶域33に設けられており、印刷ヘッドのノズル構成などに基づく構成となっている。印刷処理モジュール119は、そのイメージバッファに出力されたCMY画像データに基づいて、PED107を制御するためのコマンドを生成し、そのコマンドをPED107に出力する。PED107は、印刷処理モジュール119からのコマンドに基づいて、エンジンコントローラ41を制御することにより、印刷エンジン43を制御する。
以上が、プリンタ15において行われる印刷処理の概要である。なお、本実施形態において、例えば、特定言語処理モジュール113は、レガシー言語処理モジュール105を介してではなく、データバッファ133からデータやコマンドを取得してもよい。また、レガシー言語は、例えば、ESC/P(Epson Standard Code for Printer)とすることができる。それに対し、特定言語は、例えば、RGB画像データを送信するということから、「ESC/P−R」と称することができる。
図6は、プリンタ15に存在する複数の言語処理モードと言語処理モードの遷移の様子とを示す。
プリンタ15には、前述したレガシー言語処理モード及び特定言語処理モードの他に、リモートモードと他の言語処理モード(例えば、PostScriptを処理するモード)とがある(リモートモードの存在意義については後述する)。プリンタ15では、ホスト装置1からの指示により、レガシー言語処理モードを基点に、モード遷移が行われる。例えば、プリンタ15は、特定言語処理モードから一旦レガシー言語処理モードに遷移してから、リモートモードに遷移することができるようになっており、特定言語処理モードから直接リモートモードへ遷移することができるようにはなっていない。逆の場合も同様で、プリンタ15は、リモートモードから特定言語処理モードへの遷移を行うためには、リモートモードからレガシー言語処理モードを介して特定言語処理モードへ遷移するようになっている。特定言語処理モードは、プリンタ15に新たに搭載された言語処理モードのため、従前から用意されているレガシー言語処理モードとの間でのみ遷移する方が、エラーの発生頻度の少ない安定性の高いプリンタ15を作成する観点から好ましいと考えられる。
言語処理モードの遷移の制御は、例えば、レガシー言語処理モジュール105が実行することができる。レガシー言語処理モジュール105は、例えば、レガシー言語処理モード中に、特定言語処理モードへの移行コマンドを受信した場合には、それ以降に受信するコマンドを、特定言語で記述されたコマンドとして認識する。レガシー言語処理モジュール105は、特定言語処理モード中に、特定言語処理モードへの移行コマンド(及び/又は、リモートモードや他の言語処理モードへの移行コマンド)を受けた場合には、それを無視する(例えば読み捨てる)。
また、例えば、レガシー言語処理モジュール105は、特定言語処理モード中に、レガシー言語処理モードへの移行コマンドを受信した場合には、それ以降に受信するコマンドを、レガシー言語で記述されたコマンドとして認識する。レガシー言語処理モジュール105は、レガシー言語処理モード中に、レガシー言語処理モードへの移行コマンドを受信した場合には、それを無視する(例えば読み捨てる)。
また、例えば、レガシー言語処理モジュール105は、特定言語処理モードへ移行する以前に、レガシー言語処理モードやリモートモードにおいて少なくとも一種類の項目が設定された場合、以下の(1)〜(4)の項目
(1)給紙パスに関する設定(例えば、どの給紙トレーから用紙を取り込むか、どの排紙ビンに用紙を排出するか)、
(2)用紙サイズや印刷領域(例えば、縁有りと縁無しのどちらか)に関する設定、
(3)印刷モード(例えば、印刷品質及び用紙種類)に関する設定、
(4)メカ制御に関する設定(例えば給紙シーケンス)、
のうちの少なくとも一つの項目については、設定を初期値に戻し、特定言語処理モード中に受信した設定(特定言語で書かれた設定)を採用する。
以下、本実施形態に係るプリントシステムで行われる処理流れの概要を説明し、その後で、その処理流れにおける各ステップで行われる処理の詳細について説明する。なお、以下の説明では、レガシー言語処理モードを「レガシーモード」と略記し、特定言語処理モードを「特定モード」と略記する場合がある。
図7及び図8は、本実施形態に係るプリントシステムで行われる処理流れの概要を示す。
ホスト装置1のI/F3がプリンタ15のI/F13に通信可能に接続される(ステップS1)。この場合、ホスト装置1が、プリンタ15が単方向通信と双方向通信のどちらを行うかを判別する(S2)。例えば、ホスト装置1とプリンタ15との通信がUSBにより行われる場合には、ホスト装置1は、デバイスディスクリプタをプリンタ15から受信し、そのデバイスディスクリプタを解析することにより、プリンタ15が単方向通信と双方向通信のどちらを行うかを判別することができる。また、例えば、ホスト装置1がプリンタ15にパラレルでデータを送信するようになっている場合、ホスト装置1は、所定の信号線(例えばリバースの信号線)のレベルが変化したか否かにより、プリンタ15が単方向通信と双方向通信のどちらを行うかを判別することができる。
ホスト装置1は、デバイスID(デバイスを識別するためのID)をプリンタ15に問い合わせる(S3)。プリンタ15は、その問合せに応答して、デバイスIDをホスト装置1に送信する(S4)。なお、プリンタ15は、自分が特定モードを実行できる場合には、その旨を表す情報(以下、「特定言語サポート情報」と言う)を、デバイスIDのCMDフィールドにセットし、特定言語サポート情報がセットされたデバイスIDを、ホスト装置1に送信する。デバイスIDには、例えば、図9Aに例示するように、データ長フィールドや、MFGフィールドや、CMDフィールドがある。プリンタ15は、データ長フィールドに、デバイスIDのデータ長(例えば何バイトであるか)をセットし、MFGフィールドに、プリンタ15のメーカID(例えばメーカ名)をセットし、CMDフィールドに、特定言語サポート情報をセットすることができる。もし、プリンタ15が、特定モードを実行することができないプリンタである場合には、CMDフィールドには別の情報をセットする(何もセットせず空きフィールドになっていてもよい)。また、特定モードに複数種類のレベルが存在する場合には、プリンタ15は、自分がサポートしている特定モードのレベルをCMDにセットしても良い。例えば、プリンタドライバ21は、特定モードのレベルとして「1」がセットされていれば、プリンタ15には特定モードの処理のために必要最低限の機能が搭載されていると判断し、レベルが「2」以降がセットされていれば、その必要最低限の機能よりも多くの機能としてどんな機能がプリンタ15に搭載されているかを判別することができる。なお、レベル「2」以降では、例えば、後述するクラスの追加、コマンドの追加、パラメータユニットの追加及びパラメータの追加のうちの少なくとも一つを行うことができる。パラメータユニットが追加される場合には、新たにコマンドが追加されてもよい。パラメータの追加は、同一コマンドでの追加が許可されてもよい。プリンタ15は、コマンドサポートレベルと合わないパラメータを受けた場合には、そのパラメータを無視してもよい。
図7に示すように、ホスト装置1は、プリンタ15からプリンタIDを受信する(S5)。以上のS1〜S5の処理は、物理層で行われる。そして、それ以降のS6〜S15の処理は、AP層で行うことができ、場合によっては、D4プロトコル層がAP層での処理をサポートすることができる。なお、「場合によっては」と記載したのは、ホスト装置1及びプリンタ15の少なくとも一方がD4プロトコル層を備えていない場合や、D4プロトコル層を備えていてもその層が利用されない場合があるからである。
さて、ホスト装置1のプリンタドライバ21は、受信したプリンタIDのCMDフィールドを解析する(S6)。プリンタドライバ21は、それにより、プリンタ15が特定モードをサポートしているか否かを判別することができる(例えば、特定言語サポート情報を検出した場合には、プリンタ15では特定言語がサポートされていると判断できる)。また、S2において、プリンタ15が単方向通信を行うか双方向通信を行うかが判別されており、例えば、その判別結果が記録された記憶領域を参照する等の方法により、プリンタドライバ21は、S2での判別結果を取得することができる。従って、プリンタドライバ21は、プリンタ15が、以下の(a)〜(c)、
(a)単方向通信を行い、且つ、特定モードに対応していること、
(b)双方向通信を行い、且つ、特定モードに対応していること、
(c)単方向通信を行うか双方向通信を行うかに関わらず特定モードをサポートしていないこと、
のいずれに該当するかを、判断することができる(S7)。
S7において、プリンタ15が(c)に該当すると判断された場合、プリンタドライバ21は、レガシーモードに対応した印刷制御処理を実行する(S8)。例えば、プリンタドライバ21は、アプリケーションソフト22から出力されたRGB画像データをCMY画像データの印刷画像データに変換し、その印刷画像データを印刷するためのコマンドをレガシー言語で記述し、レガシー言語で記述されたコマンドをプリンタ15に送信する。
S7において、プリンタ15が(a)に該当すると判断された場合、プリンタドライバ21は、図8に示すように、プリンタ15の仕様の問合せを行なうことなく、後述するS12以降の処理を行う。なぜなら、プリンタ15の仕様を問い合わせても、プリンタ15は双方向通信を行わないので、プリンタ15から、プリンタ15の仕様に関する仕様情報を受信することがないからである。
S7において、プリンタ15が(b)に該当すると判断された場合、プリンタドライバ21は、図8に示すように、プリンタの仕様の問合せを行う(S9)。例えば、プリンタドライバ21は、プリンタの仕様に関する仕様情報を取得するためのコマンド(以下、仕様情報取得コマンド)をプリンタ15に送信する。ここでは、例えば、プリンタドライバ21は、D4プロトコルに従う形式の仕様情報取得コマンドを送信する。すなわち、ここでは、ホスト装置1とプリンタ15との間では、D4プロトコル層での通信が行われる。
プリンタ15は、仕様の問合せに応答して、所定構造にした仕様情報をホスト装置1に送信する(S10)。具体的には、例えば、プリンタ15は、仕様情報取得コマンドに応答して、プリンタ記憶域33に記憶されているレイアウト管理テーブル61や印刷方法管理テーブル63を参照し、それにより、どんな用紙サイズではどんな用紙種類がサポートされており且つどんなレイアウトで印刷が可能かや、どの用紙種類ではどんな印刷品質がサポートされているかを特定し、特定された結果に基づいて所定構造の仕様情報を生成し、その仕様情報をホスト装置1に送信する。ホスト装置1に送信される仕様情報は、例えば、図9B及び図9Cに示すように、プリンタ15によって入れ子構造にされる。図9Bは、ホスト装置1に送信される仕様情報の構造の概念を表し、図9Cは、ホスト装置1に送信される仕様情報の具体例を示す。なお、図9Cにおいて、””で囲まれた部分は、所定の文字データ(例えばASCII文字データ)を示し、<>で囲まれた部分は、バイナリデータを示す。
例えば、用紙サイズを表す情報が先頭になる。用紙サイズの先頭タグ(例えば図9Cの参照番号211で表される部分)は、所定コード(例えば「S」)で表され、終端タグ(例えば図9Cの参照番号212で表される部分)は、別の所定コード(例えば「/」)で表される。また、用紙サイズの先頭タグの後に続くパラメータ1(例えば図9Cの参照番号213で表される部分)は、用紙サイズのID(例えば1バイトのバイナリで表される)である。
用紙サイズの先頭タグと、用紙サイズの終端タグとの間には、その用紙サイズについてサポートされている用紙種類と、その用紙種類でサポートされている印刷品質と、その用紙サイズでサポートされているレイアウトの情報とが入れ込まれる。より具体的には、例えば、用紙種類の先頭タグ(例えば図9Cの参照番号214で表される部分)は、所定コード(例えば「T」)で表され、終端タグ(例えば図9Cの参照番号219で表される部分)は、別の所定コード(例えば「/」)で表される。また、用紙サイズの先頭タグと終端タグとの間に存在するパラメータ1(例えば図9Cの参照番号215で表される部分)は、用紙種類のID(例えば1バイトのバイナリで表される)である。そして、そのパラメータ1の後に続くパラメータ2は、印刷モード(印刷品質とレイアウト)を表すID(例えば1バイとのバイナリ)である。パラメータ2では、例えば、最初の所定数ビット(例えば3ビット)で印刷品質が表され、最後の所定数ビット(例えば1ビット)で縁無し印刷可能か否かが表される。具体的には、例えば、パラメータ2において、そのパラメータ2に関わる用紙種類で「Draft」がサポートされていればn(例えば0)番目のビットが「1」になり、その用紙種類で「Normal」がサポートされていればm(例えば1)番目のビットが「1」になり、その用紙種類で「High」がサポートされていればp(例えば2)番目のビットが「1」になり、そのパラメータ2が関わる用紙サイズで縁無し印刷がサポートされていればq(例えば7)番目のビットが「1」になる。
或る用紙サイズについて、複数種類の用紙種類がサポートされている場合には、そのサポートされている用紙種類と同じ数だけ、用紙種類の先頭タグ、パラメータ1、パラメータ2及び終端タグのセットが、その用紙サイズの先頭タグと終端タグとの間に入れ込まれる。
上記の入れ子構造は、例えば、プリンタ15における印刷条件の優先順位に基づく構造になっている。例えば、プリンタ15では、後述するように、印刷品質、レイアウト、用紙種類及び用紙サイズの順に優先順位が高くなっているので、それにあわせて、用紙サイズが最も外にあり、その中に、用紙種類、レイアウト及び印刷品質を入れ込んだ入れ子構造にすることができる。
プリンタドライバ21は、図9B及び図9Cで表す入れ子構造の仕様情報を受信し、その仕様情報を解析することで、プリンタ15の仕様、すなわち、プリンタ15でどんな用紙サイズがサポートされており、各用紙サイズではどんな用紙種類がサポートされており且つどんなレイアウトで印刷が可能であり、どの用紙種類ではどんな印刷品質がサポートされているかを、特定することができる。
再び図8を参照する。プリンタドライバ21は、プリンタ15から受信した仕様情報をホスト記憶域19に記憶させる(S11)。
プリンタドライバ21は、ユーザから入力装置5を介してユーザインタフェース(以下、UI)の表示要求を受けた場合には(S12でYES)、ホスト記憶域19に記憶されている仕様情報の中から各種印刷条件毎にユーザ所望の印刷パラメータを受け付けるためのUI(以下、印刷パラメータ選択画面)を表示する(S13)。
図10は、印刷パラメータ選択画面80の構成例を示す。
印刷条件として、例えば、用紙サイズ、用紙種類、印刷品質及びレイアウトがある。印刷パラメータ選択画面80には、各種印刷条件毎に、印刷パラメータの選択を受け付けるためのメニュー(例えばプルダウン式のメニュー)が表示される。プリンタドライバ21は、各種印刷条件毎に、メニューの表示(選択可能に表示する印刷パラメータをどれにするか)を制御することができる。
例えば、プリンタドライバ21において、優先順位として、高い方から低い順に、用紙サイズ、用紙種類、レイアウト及び印刷品質が設定されているとする。この場合、プリンタドライバ21は、仕様情報34に含まれている一以上の用紙サイズパラメータの中から或る用紙サイズパラメータが選択された場合には、用紙種類のメニューには、その用紙サイズパラメータに関わる用紙種類パラメータを選択可能に表示し、且つ、レイアウトのメニューには、その用紙サイズパラメータに関わるレイアウトパラメータを選択可能に表示し、その用紙サイズパラメータでサポートされていないパラメータ(例えば、その用紙サイズの先頭タグと終端タグとの間に入れ込まれていないパラメータ)は、選択可能に表示しない。また、プリンタドライバ21は、同様に、或る用紙種類パラメータが選択された場合には、その用紙種類パラメータに対応する印刷品質パラメータを印刷品質のメニューとして選択可能に表示する。
また、プリンタドライバ21は、優先順位の設定をユーザから受けてもよい。例えば、プリンタドライバ21は、用紙種類を最優先することを選択された場合には、仕様情報34に含まれている複数の用紙種類パラメータの全てを選択可能に表示し、その用紙種類パラメータから或る用紙種類パラメータが選択された場合には、その用紙種類パラメータに対応する用紙サイズパラメータを選択可能に表示しても良い。
このように、プリンタドライバ21は、プリンタ15から仕様情報34を受信した場合には、その仕様情報34に基づいて、印刷パラメータを選択可能に表示するので、必ず、プリンタ15でサポートされている印刷パラメータを選択させ、且つ、各種印刷条件毎に選択された印刷パラメータの関係(例えば、用紙サイズ、用紙種類、印刷品質及びレイアウトの関係)も、プリンタ15でサポートされている関係とすることができる。
なお、プリンタドライバ21は、プリンタ15が双方向通信を行うようになっていない場合、プリンタ15から仕様情報を受けることはできない。
この場合には、プリンタドライバ21は、所定の印刷パラメータ群26を記憶しており、その所定の印刷パラメータ群26に基づいて、各種印刷条件毎の印刷パラメータメニューの表示を制御することができる。所定の印刷パラメータ群26の構成も、プリンタ15から受信する仕様情報34と同様の入れ子構造になっていてもよい。所定の印刷パラメータ群26の構造及びそれに含まれている印刷パラメータは、プリンタの全ての機種に対応しているわけではないので、プリンタ15に送信される各種印刷条件毎の印刷パラメータの関係は、プリンタ15でサポートされていない場合もある。その場合に、プリンタ15が、後に詳述する補正処理を行うことで、ユーザの要求に近い印刷結果を出力することができる。
さて、再び図8を参照する。上述した印刷パラメータ選択画面80を介して各種印刷条件毎に印刷パラメータが選択され、ユーザから印刷実行の命令を受けた場合には(S14)、プリンタドライバ21は、選択された印刷パラメータを用いた印刷処理を実行する(S15)。印刷パラメータ選択画面80で印刷パラメータの選択を受けずに、或いは印刷パラメータ選択画面80を表示することなく(S12でNO)、印刷実行の命令を受けた場合には(S14)、プリンタドライバ21は、デフォルトの印刷パラメータを用いた印刷処理を実行する(S15)。
以上が、本実施形態に係るプリントシステムで行われる処理流れの概要である。
このプリントシステムにおいて、プリンタドライバ21は、プリンタの機種毎に対応させる必要の無いいわゆる汎用型のドライバとすることができる。そのため、プリンタドライバ21は、プリンタ15が双方向通信を行う場合には、プリンタ15に仕様を問合せ、それに応答して、仕様情報をプリンタ15から受信し、その仕様情報中の印刷パラメータを用いた印刷処理を行うことができる。つまり、プリンタ15は、プリンタ15から仕様情報を受信することで、どんな機種のプリンタ15が接続されても、その機種の仕様に応じた印刷処理を行うことができる。
また、プリンタドライバ15は、プリンタ15が双方向通信を行わないとわかった場合には、プリンタ15に対して仕様の問合せを行わない。プリンタ15が単方向プリンタであっても、プリンタドライバ21は、予め記憶されている印刷パラメータ群26中の印刷パラメータを用いて、印刷処理を行うことができる。
S15で行われる印刷処理は、図7のS7において、プリンタ15が(a)又は(b)に該当するものであると判断された場合に行われる処理である。そのため、S15の印刷処理では、特定モードが実行され、その特定モード中に、特定言語で記述されたコマンドがプリンタドライバ21からプリンタ15に送信される。
図11Aは、特定言語で記述されたコマンドのフォーマット例を示す。
特定言語で記述されたコマンド(以下、「特定言語コマンド」と称する)には、ヘッダフィールド251と、クラスフィールド253と、パラメータレングスフィールド255と、コマンド名フィールド257と、パラメータブロックフィールド259とがある。特定言語コマンド全体のデータサイズは、可変サイズとすることができる。
ヘッダフィールド251は、所定サイズ、例えば1バイトである。ヘッダフィールド251には、例えば、所定のヘッダ情報が所定形式で記述される。
クラスフィールド253は、所定サイズ、例えば1バイトである。クラスフィールド253には、特定モードに関わる複数のクラスのうちの一つのクラスを表すクラス情報(例えばID)が例えば所定形式(例えばASCIIコード)で登録される。プリンタ15は、クラスフィールド253に書かれたクラス情報を参照することにより、受信した特定言語コマンドがどのクラスに属するコマンドであるかを特定することができる。
パラメータレングスフィールド255は、所定サイズ、例えば4バイトであり、そのフィールド255には、パラメータブロックフィールド259に登録されるパラメータブロックのデータ長を表すデータが登録される。そのデータとしては、例えば、リトルエンディアンが採用される。
コマンド名フィールド257は、所定サイズ、例えば4バイトであり、そのフィールド257には、コマンド名を表すデータが登録される。プリンタ15は、このフィールド257に書かれたコマンド名と、クラスフィールド253に書かれたクラスとにより、受信した特定言語コマンドを識別することができる。
パラメータブロックフィールド259は、可変サイズであり、そのフィールド259には、パラメータブロックが書かれる。パラメータブロックは、一又は複数のパラメータユニットで構成される。各パラメータユニットでは、コマンド毎に、各パラメータの値のサイズと順序が規定される。また、パラメータユニットにおいて、パラメータの値として所定バイト(例えば2バイト)以上の数値が用いられる場合には、各特定言語コマンドの定義で特に示さない限り、ビッグエンディアンが採用される。
以下、各フィールドに書かれる情報について詳細に説明する。
図11Bは、クラスフィールドに書かれるクラスの種類の一例を示す。
クラスフィールド253には、特定モードに関する複数種類のクラスの中からプリンタドライバ21によって選択されたクラスが登録される。特定モードに関する複数種類のクラスとして、例えば、LUT(ルックアップテーブル)、クオリティ、ジョブ、ページ及びデータの5種類が用意されている。
クラス「LUT」は、ルックアップテーブルの提供を表すクラスである。クラス「LUT」を表すコード(例えば「l」)は、ルックアップテーブルがプリンタドライバ21からプリンタ15に送信される場合に、クラスフィールド253にセットされる。このクラスの特定言語コマンドと、或るルックアップテーブルとがプリンタ15に送信された場合、プリンタ15では、その送信された或るルックアップテーブルが、所定の画像処理、例えばハーフトーニング処理の際に使用される。一方、このクラスの特定言語コマンドがプリンタ15に送信されない場合には、プリンタ15に内蔵のデフォルトのルックアップテーブルが画像処理の際に使用される。
クラス「クオリティ」は、品質に関するパラメータの提供を表すクラスである。クラス「クオリティ」を表すコード(例えば「q」)は、パラメータがプリンタドライバ21からプリンタ15に送信される場合に、クラスフィールド253にセットされる。このクラス「クオリティ」の特定言語コマンドにおいて、パラメータユニットとしてセットされるパラメータとしては、複数種類、例えば、以下の(1)〜(9)の種類、
(1)用紙種類ID(バイトオフセット0、バイト長1)、
(2)印刷品質(バイトオフセット1、バイト長1)、
(3)カラー/モノクロ(バイトオフセット2、バイト長1)、
(4)明度強度設定(バイトオフセット3、バイト長1)、
(5)コントラスト強度設定(バイトオフセット4、バイト長1)、
(6)彩度強度設定(バイトオフセット5、バイト長1)、
(7)カラープレーン(バイトオフセット6、バイト長1)、
(8)パレットサイズ(バイトオフセット7、バイト長2)、
(9)パレットデータ(バイトオフセット8、データサイズ分のバイト長)、
のパラメータがある。この実施形態では、優先順位の高い方から低い方にかけて、用紙種類ID>印刷品質>カラープレーン>パレットサイズ>パレットデータとなっている。
「用紙種類ID」は、用紙種類を表すIDである。用紙種類としては、写真用紙、普通紙、光沢紙など、様々な種類を採用することができる。
印刷品質とは、印刷結果となる画像の品質であり、例えば、前述したように、「Draft」、「Normal」及び「High」の三種類がある。
「カラー/モノクロ」は、黒を、シアン、マゼンタ及びイエローの三色で表現するか(カラー)、或いは、黒インクのみで表現するか(モノクロ)を表す。
「明度強度設定」、「コントラスト強度設定」及び「彩度強度設定」は、いずれも、プリンタに指示する補正量を表すパラメータである。各種設定は、各色毎に行うことができる。各種設定は、例えば、第一の値(例えば−50)〜第二の値(例えば+50)の範囲で行うことができる。もし、第一の値よりも小さい値が設定された場合、プリンタ15では、第一の値が設定されたものとして補正が行われ、第二の値よりも大きい値が設定された場合、プリンタ15では、第二の値が設定されたものとして補正が行われる。
「カラープレーン」は、プリンタ15に転倒される印刷データの種別を表す。例えば、「カラープレーン」には、フルカラーと256カラーというのがある。フルカラーは、RGB画像データの1ピクセルのカラーが3バイトで表現されていることを表し、256カラーは、RGB画像データの1ピクセルが1バイトで表現されていることを表す。
「カラーパレットサイズ」は、「カラープレーン」で256カラーの場合のカラーパレットのサイズを表す。「カラープレーン」でフルカラーの場合、「カラーパレットサイズ」は0(ゼロ)と設定される。
「カラーパレットデータ」は、「カラーパレットサイズ」で設定された値のデータサイズを持つカラーパレットのデータ列である。つまり、「カラープレーン」で256カラーがセットされた場合、プリンタドライバ21は、或る記憶領域に記憶されたカラーパレット(例えばプリンタドライバ21が保持している)をプリンタ15に送信する。「カラープレーン」がフルカラーの場合、プリンタドライバ21は、カラーパレットのデータを送らない。
クラス「ジョブ」は、印刷ジョブに関するジョブパラメータの提供を表すクラスである。クラス「ジョブ」の特定言語コマンドが送信される場合、例えば、そのコマンドのクラスフィールド253には、クラス「ジョブ」を表すコード(例えば「j」)がセットされ、コマンド名フィールド257に、ジョブのスタートを表すコード(例えば「setj」)と、ジョブのエンドを表すコード(例えば「endj」)とのいずれかがセットされる。また、ジョブのスタートを表すコードが特定言語コマンドにセットされた場合、そのコマンドのパラメータユニットには、複数種類のジョブパラメータ、例えば、以下の(1)〜(8)の種類のジョブパラメータ、
(1)定型用紙幅(バイトオフセット0、バイト長4)、
(2)定型用紙長(バイトオフセット4、バイト長4)、
(3)上マージン(バイトオフセット8、バイト長2)、
(4)左マージン(バイトオフセット10、バイト長2)、
(5)印刷領域幅(バイトオフセット12、バイト長4)、
(6)印刷領域長(バイトオフセット16、バイト長4)、
(7)入力画像密度(バイトオフセット20、バイト長1)、
(8)双方向印刷/単方向印刷(バイトオフセット21、バイト長1)、
がセットされる。
「定型用紙幅」は、用紙幅をあらわし、「定型用紙長」は、用紙長を表す。これらの値は、単位は例えばピクセル(例えば、インチ×360ppi(ピクセル/インチ))であり、プリンタ15でサポートされる値である。より具体的には、例えば、プリンタドライバ21は、各種用紙サイズ毎に、用紙幅及び用紙長を記憶しており、同様に、プリンタ15も、各種用紙サイズ毎に、用紙幅及び用紙長を記憶している。プリンタドライバ15は、印刷パラメータ選択画面80(図10参照)等で或る用紙サイズが選択された場合、記憶されている情報から、その用紙サイズに対応した用紙幅及び用紙長を特定し、特定された用紙幅及び用紙長をセットする(つまり、用紙サイズを用紙幅及び用紙長の値でセットする)。プリンタ15は、その用紙幅及び用紙長に基づいて、印刷画像データを生成する。なお、もし、セットされた用紙幅又は用紙長が、プリンタ15でサポートされていない値である場合には、プリンタ15が、その用紙幅又は用紙長を、プリンタ15の記憶域に設定されている複数の用紙幅又は用紙長のうちの最も近い用紙幅又は用紙長に変換し、変換後の用紙幅又は用紙長を用いて処理を進める。
「上マージン」は、用紙上端から上端印刷ドットまでの距離を表し、「左マージン」は、用紙左端から左端印刷ドットまでの距離である。これらの値は、例えば単位はピクセル(例えば、インチ×入力画像密度(360又は720ppi))である。なお、入力画像密度とは、プリンタ15に送信されるRGB画像データの解像度である。それに対し、出力解像度とは、印刷される画像の解像度(印刷画像データの解像度)、換言すれば、印刷解像度である。
「印刷領域幅」は、印刷画像データの幅を表し、「印刷領域長」は、印刷画像データの長さを表す。これらの値は、例えば単位はピクセル(例えば、インチ×入力画像密度(360又は720ppi))である。
「入力画像密度」は、プリンタ15に送信されるRGB画像データの画像密度(換言すれば解像度)を表す。例えば、水平方向密度×垂直方向密度で言うと、360×360ppiと、720×720ppiの二種類がある。例えば、前者は、印刷対象が画像の場合に採用され、後者は、印刷対象が画像と文字のいずれの場合にも採用されることができる。
「双方向印刷/単方向印刷」は、前述した双方向印刷と単方向印刷のどちらをプリンタ15に実行させるかを表す。
クラス「ページ」は、ページに関する情報の提供を表すクラスである。クラス「ページ」の特定言語コマンドが送信される場合、例えば、そのコマンドのクラスフィールド253には、クラス「ページ」を表すコード(例えば「p」)がセットされ、コマンド名フィールド257に、ページのスタートを表すコード(例えば「sttp」)と、ページのエンドを表すコード(例えば「endp」)とのいずれかがセットされる。また、ページのエンドを表すコードが特定言語コマンドにセットされた場合、そのコマンドのパラメータユニットには、次のページが有るか無いかを表す情報がセットされる。プリンタは、次のページが有ることを表す情報を検出した場合には、所定タイミングで(例えばその検出と同時に)、次のページの給紙動作を実行することができる。
クラス「データ」は、RGB画像データ(例えば一ラスタ分のRGBデータ)の提供を表すクラスである。クラス「データ」の特定言語コマンドが送信される場合、例えば、そのコマンドのクラスフィールド253には、クラス「データ」を表すコード(例えば「d」)がセットされ、パラメータユニットには、複数種類のデータパラメータ、例えば、以下の(1)〜(5)の種類のデータパラメータ、
(1)Xオフセット(バイトオフセット0、バイト長2)、
(2)Yオフセット(バイトオフセット2、バイト長2)、
(3)圧縮種別(バイトオフセット4、バイト長1)、
(4)ラスタデータサイズ(バイトオフセット5、バイト長2)、
(5)RGBラスタデータ(バイトオフセット7、RGBラスタデータそれ自体のバイト長)、
がセットされる。
「Xオフセット」とは、ページ基点(例えば左上隅)からのX座標(水平方向に沿った座標)のオフセットである(単位は例えばピクセル)。これは、例えば、入力画像密度に依存する。
「Yオフセット」とは、ページ基点(例えば左上隅)からのY座標(垂直方向に沿った座標)のオフセットである(単位は例えばピクセル)。これは、例えば、入力画像密度に依存する。本実施形態では、1ラスタずつRGBデータが転送されるので、この「Yオフセット」の値は、1ずつインクリメントされる。
「圧縮種別」は、1ラスタのRGBデータの圧縮種別である。複数の圧縮種別として、例えば、非圧縮と、点順次ランレングス圧縮とがある。プリンタドライバ21は、1ラスタのRGBデータ毎に、点順次ランレングス圧縮を行い、非圧縮のRGBデータのデータサイズと、圧縮後のRGBデータのデータサイズとを比較し、非圧縮のRGBデータのデータサイズの方が小さければ、非圧縮でRGBデータを送信し、逆に、圧縮後のRGBデータのデータサイズの方が小さければ、圧縮後のRGBデータを送信する。また、非圧縮か圧縮かに応じて、プリンタドライバ21は、パラメータユニットとしてセットする「圧縮種別」の内容を違える。
「ラスタデータサイズ」は、RGBラスタデータのデータサイズである。
「RGBラスタデータ」は、RGBラスタデータそれ自体である。フルカラーの場合、R、G、Bの順で、1ピクセルあたり3バイトのデータであり、256カラーの場合、1ピクセルあたり1バイトのデータである。
このクラス「データ」では、プリンタドライバ21は、同一のラスタのRGBデータを二回以上送信しないようになっている。もし、同一ラスタのRGBデータを二回以上送信されたならば、プリンタ15は、例えば、二回目以降のRGBデータがセットされたコマンドを読み捨てる。
また、このクラス「データ」では、プリンタドライバ21は、同一ページにおけるクラス「データ」の特定言語コマンドにおいて、「Yオフセット」の値を、同一ページにおける前回の値(例えば5)以前の値(例えば4)にしないようにする。もし、「Yオフセット」の値が前回の値以前の値になって送信されたならば、プリンタ15は、例えば、その前回の値以前の値がセットされたコマンドを読み捨てる。
以上が、特定言語コマンドに関する説明である。特定言語コマンドは、図8のS15の印刷処理において、プリンタドライバ21からプリンタ15に送信される。
図12は、図8のS15の印刷処理で行われる具体的な処理流れの一例を示す。
この図12に示すように、S15の印刷処理では、例えば、段階A〜段階Sの順で、処理が行われる。以下、各段階について、詳細に説明する。
(1)段階A。
プリンタ15が双方向通信を行う場合には、前述したように、プリンタドライバ21が、D4プロトコルに従う形式で、仕様情報取得コマンドをプリンタ15に送信し、プリンタ15は、そのコマンドに応答して、D4プロトコルで、入れ子構造の仕様情報をプリンタドライバ21に送信する。この場合、プリンタ15において、D4プロトコルに係るポートがオープンになっている。
しかし、プリンタ15が双方向通信ではなく単方向通信を行う場合には、前述したように、プリンタドライバ21は、プリンタ15の仕様情報を知ることはできない。単方向プリンタには、D4プロトコル層を有しているものもあれば、D4プロトコル層を有していないものもある。プリンタドライバ21は、プリンタ15が単方向プリンタの場合には、そのプリンタ15がD4プロトコル層を有しているのかどうかを知ることはできない。
そこで、まず、この段階Aで、プリンタドライバ21は、D4プロトコルをプリンタ15に解除させるためのコマンド(以下、D4プロトコル解除コマンド)を生成し、そのD4プロトコル解除コマンドを、プリンタ15に送信する。
プリンタ15は、双方向通信を行うが故にD4プロトコルに係るポートをオープンにしていれば、D4プロトコル解除コマンドを読み捨て、D4プロトコルの解除を行わないようにする。プリンタ15が双方向通信を行う場合には、プリンタドライバ21は、D4プロトコル層での通信を行うことができるので、そのコマンドがプリンタ15で読み捨てられても問題がない。
一方、例えば、プリンタ15が、単方向プリンタである場合であって、且つ、D4プロトコル層を有している場合には、そのプリンタ15は、D4プロトコルを解除する。プリンタ15がD4プロトコル層を有していない場合には、そのプリンタ15は、D4プロトコル解除コマンドを読み捨てる。いずれにしても、単方向プリンタに対しては、プリンタドライバ21は、プリンタ15がD4プロトコル層を有していないという前提で、D4プロトコル層を利用しない通信を行うことができる。
(2)段階B。
プリンタドライバ21は、D4プロトコル解除コマンドを送信した後、或るタイミングで(例えば、D4プロトコル解除コマンドに対する所定の応答をプリンタ15から受けた場合に)、初期化コマンド(例えば「ESC@」というコードを含んだコマンド)を、プリンタ15に送信する。プリンタ15は、その初期化コマンドに応答して、所定の初期化処理を行う。この初期化処理では、例えば、プリンタ15は、プリンタ記憶域33に設定されている印刷パラメータを初期(デフォルト)のパラメータに戻す等の処理を行う。
(3)段階C。
プリンタドライバ21は、初期化コマンドを送信した後、或るタイミングで(例えば、初期化コマンドに対する所定の応答を受けた場合に)、リモートモードに移行させるためのコマンド(以下、リモート移行コマンド)をプリンタ15に送信する。プリンタ15は、そのリモート移行コマンドに応答して、レガシーモードからリモートモードに移行する。
なお、この段階Cでは、プリンタドライバ21は、一旦、レガシーモードに移行させるためのコマンド(以下、レガシー移行コマンド)を送信し、その後で(例えば所定の応答が返って来た後で)、リモート移行コマンドを送信しても良い。この場合、プリンタ15は、レガシーモード以外のモードになっている場合には、レガシー移行コマンドに応答してレガシーモードに移行し、レガシーモードになっている場合にレガシー移行コマンドを受けた場合には、そのコマンドを読み捨てることができる。
(4)段階D。
プリンタドライバ21は、或るタイミングで(例えば、リモート移行コマンドに対してモード以降完了通知をプリンタ15から受けた後に)、レガシーモードでのジョブ開始を意味するコマンド(以下、レガシージョブ開始コマンド)を、プリンタ15に送信する。プリンタ15は、レガシージョブ開始コマンドに応答して、ジョブ開始をプリンタ記憶域33(又はバッファ133)にセットし、それ以降、レガシーモードでのジョブ終了を意味するコマンド(以下、レガシージョブ終了コマンド)を受けるまでに、コマンドやデータを受信した場合には、そのコマンドやデータは、レガシーモードにおける一つの印刷ジョブに関わるコマンドやデータであると認識する。
レガシーモードでは、例えば、コマンドやデータがストリームでプリンタドライバ21からプリンタ15に流れ込み、プリンタ記憶域33に蓄積されていく。このため、このままでは、プリンタ15は、プリンタ記憶域33のどこからどこまでは一つの印刷ジョブに係るコマンドやデータであるかを特定することができない。
そこで、レガシーモードでコマンドやデータを送信する前に、プリンタドライバ21が、プリンタ15における言語処理モードを、レガシーモードとは別のリモートモードに移行させ、そのリモートモードにおいて、ジョブの開始や終了を伝える。これにより、プリンタ15は、レガシーモードにおいてストリームでコマンドやデータを受信し記憶していっても、どこからどこまでが一つの印刷ジョブに関わるコマンドやデータで有るかを特定することができる。
(5)段階E。
プリンタドライバ21は、或るタイミングで(例えば、レガシージョブ開始コマンドに応答してセット完了通知を受けた場合に)、レガシー移行コマンドを、プリンタ15に送信する。プリンタ15は、そのレガシー移行コマンドに応答して、リモートモードからレガシーモードに移行する。
なお、この実施形態では、このレガシー移行コマンドが、リモートモードの解除と、レガシーモードへの移行との両方の意味を持っているが、リモートモードを解除するためのコマンドが送信された後に、レガシー移行コマンドが送信されても良い。
(6)段階F。
プリンタドライバ21は、或るタイミングで(例えば、レガシーモードへの移行の完了通知を受けたプリンタ15から場合に)、特定モードへ移行するためのコマンド(以下、特定モード移行コマンド)を、プリンタ15に送信する。プリンタ15は、その特定モード移行コマンドに応答して、レガシーモードから特定モードに移行する。
(7)段階G。
この段階Gから、後述の段階Mまでが、特定モードにおいて行われる処理である(図12で、点線枠で囲まれた部分)。特定モードにおいて送信されるコマンドやデータは、ストリームで、プリンタ15に流れ込むようになっている。この場合、プリンタ15は、ストリームで流れ込んで来るコマンドやデータを前述したバッファ133に蓄積していく。
さて、この段階Gでは、プリンタドライバ21は、クラス「LUT」に関する特定言語コマンド(以下、LUTコマンド)を生成し、LUTコマンドをプリンタ15に送信する。ここでは、プリンタドライバ21は、そのLUTコマンドにより、LUTを送ることができる。プリンタ15は、LUTを受信した場合は、そのLUTを用いて画像処理(例えばハーフトーニング処理又は色変換処理)を行い、LUTを受信しない場合には、予めプリンタ記憶域33に記憶されているLUT(図示せず)を用いて画像処理を行う。
(8)段階H。
プリンタドライバ21は、LUTコマンドに続いて、クラス「クオリティ」に関する特定言語コマンド(以下、クオリティコマンド)をプリンタ15に送信する。プリンタドライバ21は、前述したように、用紙種類IDや印刷品質等のパラメータをクオリティコマンドにセットして送信する。プリンタドライバ21は、クオリティコマンドにセットするパラメータのうち、例えば、用紙種類ID及び印刷品質については、印刷パラメータ選択画面80を介してユーザに選択されたもの(例えば用紙種類パラメータ及び印刷品質パラメータ)に基づいて、セットすることができる。
プリンタ15は、受信したクオリティコマンドにセットされている各種印刷パラメータを抽出し、抽出された各種印刷パラメータを、プリンタ記憶域33に書き込む。
(9)段階I。
プリンタドライバ21は、クオリティコマンドに続いて、クラス「ジョブ」に関する特定言語コマンドであって、ジョブの開始を意味するコードを含んだコマンド(以下、特定ジョブ開始コマンド)を、プリンタ15に送信する。プリンタドライバ21は、前述したように、用紙サイズに関する情報(定型用紙幅、定型用紙長)や、印刷領域に関する情報(上マージン、左マージン、印刷領域幅、印刷領域長)等のパラメータを特定ジョブ開始コマンドにセットして送信する。プリンタドライバ21は、特定ジョブ開始コマンドにセットするパラメータのうち、例えば、用紙サイズに関する情報や印刷領域に関する情報については、印刷パラメータ選択画面80を介してユーザに選択されたもの(例えば用紙サイズパラメータ及びレイアウトパラメータ)に基づいて、算出し、算出された情報をセットすることができる。
プリンタ15は、特定ジョブ開始コマンドに応答して、特定モードにおけるジョブの開始をプリンタ記憶域33(又はバッファ133)にセットする。プリンタ15は、それ以降、特定モードでのジョブ終了を意味するコマンド(以下、特定ジョブ終了コマンド)を受けるまでに、コマンドやデータを受信した場合には、そのコマンドやデータは、特定モードにおける一つの印刷ジョブに関わるコマンドやデータであると認識することができる。
なお、段階Iまでが終了すると、プリンタ15が行う処理にとって必要な複数のパラメータがセットされることになる。しかし、セットされた複数のパラメータの全てが、特にプリンタ15が単方向プリンタである場合には、プリンタ15でサポートされているとは限らない。そのため、セットされた複数のパラメータのうちプリンタ15でサポートされていないパラメータについては、プリンタ15でサポートされているパラメータに補正する必要がある。その補正に関わる処理は、例えば、段階Iの終了時点から、1ページ分のRGBデータがプリンタ15に蓄積されてその1ページ分のRGBデータに基づく印刷画像データが生成されるまでの任意のタイミングで、プリンタ15が行うことができる。
プリンタ15は、パラメータの補正に関わる印刷条件の優先順位を例えばプリンタ記憶域33において記憶している。その印刷条件の優先順位は、例えば、高い方から低い方にかけて、用紙サイズ、用紙種類、レイアウト、印刷品質となっている。この優先順位の基準は、所定の観点、例えば、メモリカード等からRGB画像を読み込んで印刷するいわゆるダイレクト印刷では、プリンタ15が画像のレイアウトを行うが、本実施形態における特定モードでは、プリンタドライバ21が画像のレイアウトを行って出力する点に基づいて定められている。すなわち、プリンタドライバ21がRGB画像データのレイアウトを行っても、プリンタでなるべくエラーを起こさずに印刷することができるようにするということに基づいて、上記優先順位が定められている。なお、プリンタドライバ21が行うレイアウトとは、例えば、アプリケーションソフト22から出力された所定の解像度(ppi)の画像を、ユーザ所望の用紙サイズ及びレイアウトに基づいて、単位長あたりのピクセル数を増減してサイズ調整する行為である。
プリンタ15は、上記優先順位に従って、パラメータの補正を行うことができる。
例えば、プリンタ15は、プリンタドライバ21からの用紙サイズに関する情報(例えば定型用紙幅、定型用紙長)がプリンタ15でサポートされているどの用紙サイズに関する情報にもマッチしない場合には、プリンタドライバ21からの用紙サイズに関する情報を、プリンタ15がサポートしている最大の用紙サイズに関する情報に補正する。
また、例えば、プリンタ15は、用紙サイズに関する情報はマッチしているが、用紙種類に関する情報(例えば用紙種類ID)がマッチしていない場合には、プリンタドライバ21からの用紙種類に関する情報を、上記マッチしている用紙サイズに関する情報に属する範囲内で、プリンタ15がサポートしている用紙種類に関する情報に補正する。具体的には、例えば、図2を参照して言えば、プリンタドライバ21から用紙サイズ「L判」で用紙種類「光沢紙」を受けた場合、プリンタ15は、その用紙種類「光沢紙」を採用するためには用紙サイズを例えば「A4」に変更すれば良いが、そうはせずに、用紙サイズ「L判」を優先的に採用し、プリンタドライバ21からの用紙種類「光沢紙」を、用紙サイズ「L判」に対応した用紙種類「写真用紙」に補正する。もし、その用紙サイズに対応した用紙種類が複数個存在する場合には、プリンタ15は、手動で又は自動で、一つの用紙種類を選択し、プリンタドライバ21からの用紙種類を、その選択された用紙種類に補正することができる。
以降、プリンタ15は、レイアウト及び印刷品質についても、用紙種類についての補正と同様に、上記優先順位に基づいて、必要に応じて補正していく。なお、プリンタ15は、例えば、縁有りから縁無しに補正する場合には、印刷領域を拡大する補正も行うことができる。また、例えば、プリンタ15は、縁無しから縁有りに補正する場合には、印刷領域を縮小する(又は、印刷領域の所定端をマージンが生じる分だけカットする)補正も行うことができる。また、例えば、プリンタ15は、印刷品質「Draft」を補正する場合には、「Normal」の方を「High」よりも優先的に採用することができ、「Normal」を補正する場合には、「High」の方を「Draft」よりも優先的に採用することができ、「High」を補正する場合には、「Normal」の方を「Draft」よりも優先的に採用することができる(つまり、プリンタドライバ21からの印刷品質にできるだけ近い印刷品質に補正することができる)。
(10)段階J。
プリンタドライバ21は、特定ジョブ開始コマンドに続いて、ページの開始を意味する特定言語コマンド(以下、ページ開始コマンド)を、プリンタ15に送信する。プリンタ15は、ページ開始コマンドに応答して、ページ開始をプリンタ記憶域33(又はバッファ133)にセットし、それ以降、ページ終了を意味する特定言語コマンド(以下、ページ終了コマンド)を受けるまでに、コマンドやデータを受信した場合には、そのコマンドやデータは、特定モードにおける一つのページに関わるコマンドやデータであると認識する。また、プリンタ15は、ページ開始コマンドに応答して、直ちに、給紙を開始してもよい。
(11)段階K。
プリンタドライバ21は、ページ開始コマンドに続いて、一ラスタ分のRGBデータを有するデータコマンドをプリンタ15に送信する。プリンタドライバ21は、1ページ分のRGBラスタデータの送信を終えるまで、データコマンドを送り続ける。その際、プリンタドライバ21は、前述したように、RGBラスタデータの圧縮前と圧縮後のデータサイズの違いを比較し、より小さいデータサイズで送れる方法でRGBラスタデータを送信する。プリンタ15は、受信するデータコマンドをバッファ133に蓄積していく。プリンタ15は、所定ラスタ分(例えば一ページ分)のRGBラスタデータが蓄積された場合には、蓄積されたRGBラスタデータを、プリンタ記憶域33にセットされた各種パラメータに基づいて処理を行っても良い。また、プリンタ15は、入力されたRGBデータがあらかじめ指定された印刷領域(例えば、実際に受信したRGBラスタデータで構成される印刷領域長が、プリンタドライバ21からの印刷領域長)に満たない場合、残りは空白のデータが送られたものと判断してもよい。
(12)段階L。
プリンタドライバ21は、一ページ分のRGBラスタデータを送信した場合、それに続いて、次のページが存在するか否かを表す次ページ有無情報がセットされたページ終了コマンドをプリンタ15に送信する。
プリンタ15は、ページ終了コマンドに応答して、ページ終了をプリンタ記憶域33(又はバッファ133)にセットする。また、プリンタ15は、そのページ終了コマンドに応答して、次ページ有無情報を参照し、次ページがあれば、次の給紙処理を開始しても良いし、次ページが無ければ、所定の終了処理を行っても良い。
一つのジョブにおいてn枚のページがあれば、段階J、K及びLが、n回繰り返される。
(13)段階M。
プリンタドライバ21は、最後のページのページ終了コマンドに続いて、特定ジョブ終了コマンドをプリンタ15に送信する。
プリンタ15は、特定ジョブ終了コマンドに応答して、特定ジョブ終了をプリンタ記憶域33(又はバッファ133)にセットする。また、プリンタ15は、特定ジョブ終了コマンドを受けた場合には、バッファ133(又はプリンタ記憶域33)に蓄積されたデータを全て読み出し、排紙が未完了であれば排紙処理を行っても良い。
(14)段階N。
プリンタドライバ21は、例えば、特定ジョブ終了コマンドに続いて、レガシー移行コマンドを、プリンタ15に送信する。プリンタ15は、そのレガシー移行コマンドに応答して、特定モードからレガシーモードに移行する。
なお、この実施形態では、このレガシー移行コマンドが、特定モードの解除と、レガシーモードへの移行との両方の意味を持っているが、特定モードを解除するためのコマンドが送信された後に、レガシー移行コマンドが送信されても良い。
(15)段階O。
プリンタドライバ21は、或るタイミングで(例えば、レガシー移行コマンドに対する所定の応答を受けた場合に)、リモート移行コマンドをプリンタ15に送信する。プリンタ15は、そのリモート移行コマンドに応答して、レガシーモードからリモートモードに移行する。
(16)段階P。
プリンタドライバ21は、或るタイミングで(例えば、リモート移行コマンドに対してモード以降完了通知をプリンタ15から受けた後に)、レガシージョブ終了コマンドを、プリンタ15に送信する。プリンタ15は、レガシージョブ終了コマンドに応答して、ジョブ終了をプリンタ記憶域33(又はバッファ133)にセットする。
(17)段階Q。
プリンタドライバ21は、或るタイミングで(例えば、レガシージョブ終了コマンドに応答して完了通知を受けた場合に)、レガシー移行コマンドを、プリンタ15に送信する。プリンタ15は、そのレガシー移行コマンドに応答して、リモートモードからレガシーモードに移行する。
なお、この実施形態では、このレガシー移行コマンドが、リモートモードの解除と、レガシーモードへの移行との両方の意味を持っているが、リモートモードを解除するためのコマンドが送信された後に、レガシー移行コマンドが送信されても良い。
(18)段階R。
プリンタドライバ21は、或るタイミングで(例えば、レガシー移行コマンドに対する所定の応答をプリンタ15から受けた場合に)、初期化コマンド(例えば「ESC@」というコードを含んだコマンド)を、プリンタ15に送信する。プリンタ15は、その初期化コマンドに応答して、所定の初期化処理を行う。この初期化処理では、例えば、プリンタ15は、特定モードにおいてプリンタ記憶域33に設定された印刷パラメータを初期(デフォルト)のパラメータに戻す等の処理を行う。
以上が、図8のS15の印刷処理についての説明である。なお、この印刷処理において、特定モードでは、送信される複数のクラスに関わるコマンドの送信手順(例えば入れ子構造になった手順)が、予め定められている。プリンタ15は、その送信手順とは異なる手順でコマンドを受信した場合(例えば、ページ終了コマンドを受ける前に新たなページ開始コマンドを受けた場合)には、そのコマンドを読み捨てる。
また、プリンタドライバ21は、特定言語で記述された新たな印刷ジョブをプリンタ15に実行させる場合には、特定ジョブ開始コマンドを送った後、特定モードを解除させること無く、特定ジョブ開始コマンドを送信してもよい。すなわち、特定モードにおいて、一旦レガシーモードに移行することなく、段階I〜段階Mが繰り返し行われても良い。
上述した実施形態によれば、プリンタドライバ21は、RGB画像データを送信することができるようになっている。また、ホスト装置1では、プリンタ15が単方向通信と双方向通信のどちらを行うかや、プリンタ15が特定言語をサポートしているかどうかが検出される。プリンタドライバ21は、プリンタ15が双方向通信を行い且つ特定言語をサポートしているとわかった場合に、プリンタ21の仕様情報を問い合わせ、それに応答して受信するプリンタ21の仕様情報中のパラメータを用いた印刷コマンドを送る。この場合、プリンタ15は、自分の仕様情報に基づく印刷コマンドを受けるので、その印刷コマンドを確実に処理できる。以上のことから、プリンタ15の機種別にプリンタドライバ21を構築することなく、汎用型のプリンタドライバ21を提供することができる。
ところで、上述した実施形態において、印刷パスを構成する複数のモジュールや、それら複数のモジュールを管理するDPC131等が、プロセッサ35に読み込まれて、処理を実行することで、プリンタ15からの印刷が行われる。そして、その処理は、以下に説明するソフトウェア群37の構成や機能の下で行われる。ゆえに、まず、図13A〜図15を参照して、プリンタ15におけるソフトウェア群37の構成や機能を説明し、その後、図16〜図18を参照して、プリンタ15における詳細な処理流れを説明する。
図13Aは、ソフトウェア群37の構成例を示す。
ソフトウェア群37は、図13Aに示すような階層構造を有することができる。例えば、最下位に、オペレーティングシステム(OS)333があり、その上位に、プリンタ15の各種ハードウェア(例えばI/F13やエンジンコントローラ41)を制御する各種ハードウェア制御モジュール331が用意されている。各種ハードウェア制御モジュール331の上位には、モジュール群335がある。モジュール群335の上位には、モジュール群335中のモジュールや必要なハードウェア制御モジュール331を選択して印刷パスを構築するDPC131がある。DPC131の上位には、下位から上位へ、ファンクション327、サービス323、ユーザインタフェース(UI)321がある。
ファンクション327は、プリンタ15に元から用意されていた機能とは異なる一群の機能を実現するために用意されている。例えば、ファンクション327は、メモリカードが別のI/F71に挿されてそのメモリカードから画像が読み出される場合に呼び出される。
サービス323は、例えばUI321と協働して、プリンタ15に設けられた操作パネル(図示せず)からの要求や、外部の機器(例えばホスト装置1や別のデバイス73)からの要求を受け取り、各種の印刷処理を起動する。例えば、UI321を介して、外部からの要求を受け取ったサービス323は、ハーネス群325中の所定のハーネスを用いて、ファンクション327やDPC131、あるいはその他のモジュールを呼び出すことができる。ハーネスと呼ばれる機能別の単位を用意しているのは、プリンタ15の内部には、単純にソフトウェアにより処理される種々の機能以外に、それらの機能に関わるIFD101や各種ハードウェアのステータスを管理するステータス管理モジュールDSMなども存在するからである。ハーネスと呼ばれる機能別の単位を用意することで、ソフトウェアモジュール群の呼び出しを、DPC131を用いて行なうことができる。
DPC131は、例えば以下のことをきっかけとして動作することができる。すなわち、例えば、所定のイベント(例えば、UI321を介したユーザ操作、或いは、ホスト装置1からのコマンドの受信)が検出され、サービス323が、それの下層のハーネス群325の中から、イベントに関わるハードウェア(例えば、コマンドを受信したI/F13)に対応したハーネスを選択して呼び出した場合に、DPC131が、そのハーネスの呼び出しをきっかけとして、動作することができる。上位の層からみれば、DPC131に対して種々のアプリケーションインタフェース(例えば、モジュールの確保を行なわせる関数(例えば「LockProcess」)など)が定義されている。上位の層は、所望のアプリケーションインタフェース(以下、API)を用いて、DPC131を制御する。DPC131は、機能別の単位であるハーネスから呼び出されて動作を開始し、ハーネスが要求する処理を実現するのに必要なモジュールの組合わせを実現するのである。
補足すれば、例えば、サービス323は、印刷アプリケーションを機種仕様に合わせて複数個保有することができる。その保有しているものはハーネス機能を含むファンクションモジュールという形で持つことができる。例えば、プリンタ15が、スキャナを有し、スキャナでスキャンされたイメージを印刷するといういわゆるコピー機能を有していれば、コピー機能のためのファンクションモジュールが、サービス323の管理下にぶら下がることができる。また、例えば、プリンタ15が、RGB画像データが記憶されたメモリカードからそのRGB画像データを読み込んで印刷する機能を有している場合には、カード印刷のためのファンクションモジュールが、サービス323の管理下にぶら下がることができる。ホスト装置1からのデータを受けるI/F13のハーネスも、上記と同様にファンクションという位置付けで、サービス323の管理下にぶら下がることができる。従って、サービス323が、モジュール実行の指示を各ファンクション(ハーネスという位置付けであっても良い)に対して行い、各ファンクションが、DPC131の定義する印刷パスを指定して(例えば、印刷処理IDをDPC131に通知して)、DPC131で定義されているAPIをそれの手続きに従って実行することができる。これにより、一つのアプリケーションに相当する印刷処理の実行が可能となる。
図13Bは、DPC131がコントロールするモジュール群335の一例を示す。
モジュール群335には、「イニシエータ」というモジュール種類に属する一以上のモジュール(以下、イニシエータモジュール)と、「ターミネータ」というモジュール種類に属する一以上のモジュール(以下、ターミネータモジュール)と、「メンバ」というモジュール種類に属する一以上のモジュール(以下、メンバモジュール)とがある。イニシエータモジュール(例えばデータ取得モジュール103)は、印刷パスの先頭に位置するものとして規定されているモジュールである。ターミネータモジュールは、印刷パスの終端に位置するものとして規定されているモジュールである。メンバモジュールは、イニシエータモジュールとターミネータモジュールとの間に位置するものとして規定されているモジュールである。
モジュール群335に含まれる各モジュールがどのモジュール種類に属するかという情報(例えば、モジュールのIDと種類との対応付け)は、所定の場所(例えば、DPC131又はそれとは別のプリンタ記憶域33上の場所)に登録されている。DPC131が、その情報を参照することにより、モジュール群335に含まれる各モジュールがどのモジュール種類に属するかを特定することができる。
イニシエータモジュール、メンバモジュール及びターミネータモジュールの配列については、実現すべき印刷処理の内容毎に予め決められている。具体的には、図13Cに例示するように、モジュールの配列(例えば、先頭から終端の順に並べられたモジュールID)が、印刷処理を識別するための印刷処理IDと、その印刷処理の際に呼び出されるハーネスのIDとに対応付けられている。モジュールの配列を表す情報(例えば、モジュール配列と、印刷処理IDと、呼び出しハーネスIDとの対応付け)は、所定の場所(例えば、DPC131又はそれとは別のプリンタ記憶域33上の場所)に登録されている。DPC131が、その情報を参照することにより、どの印刷処理を行うときにどのハーネスが呼び出されどのような印刷パスを構築すればよいかを特定することができる。
この実施形態では、モジュール(特に、例えばモジュール群335中のモジュール)には幾つかのステータスがあり、そのステータスは例えば以下のように遷移する。
図13Dは、モジュールのステータスの遷移の様子を示す。
モジュールのステータスとしては、例えば、「STAND-BY」、「READY」及び「PROCESSING」の3つがある。「STAND-BY」は、モジュールがDPC131から呼び出し可能であることを意味する。「READY」は、モジュールが、「STAND-BY」の場合に、DPC131から後述するG-READY関数による呼び出しを受けることにより、ジョブの実行が可能になった状態であることを意味する。「PROCESSING」は、「READY」の場合に、DPC131から後述のSTART-J関数を受けることにより、ジョブの実行中になったことを意味する。モジュールは、「PROCESSING」状態の場合に、ジョブの終了を受けたならば、「READY」状態に戻り、「READY」状態の場合に、キャンセルを受けたならば、「STAND-BY」状態に戻る。
次に、モジュールとモジュールとの間のデータのやりとりについて説明する。
図14Aは、各モジュールが有する機能を示す。
各モジュールは、下流側のモジュールに対する機能(換言すれば、上流側のモジュールとしての機能)と、上流側のモジュールに対する機能(換言すれば、下流側のモジュールとしての機能)とを有する。下流側のモジュールに対する機能には、以下の(A)又は(B)、
(A)RP(Read Providing):ストリームリード関数を提供する機能、
(B)WC(Write Call):ストリームライト関数を呼び出す機能、
がある。一方、上流側のモジュールに対する機能には、以下の(a)又は(b)、
(a)RC(Read Call):ストリームリード関数を呼び出す機能、
(b)WP(Write Providing):ストリームライト関数を提供する機能、
がある。
モジュール群335のうち、DPC131により指定された二以上のモジュールが、DPC131により指定された配列で並ぶことにより、印刷パス、すなわち、ストリームが流れるパス(換言すれば、データ処理の流れ)を構築する。その際、各モジュールは、上流側のモジュールの用意したデータを読み取るストリームリード関数、あるいはデータを下流側のモジュールに書き込むストリームライト関数のいずれかを用いてデータをやりとりする。
ここで、下流側のモジュールがデータを上流側へ読みに行く場合、データがおかれている場所(ポインタの位置)は、データを用意した上流側のモジュールが知っていると考えられる。一方、上流側のモジュールが下流側へデータを書きに行く場合、データを書き込む場所(ポインタの位置)は、データを受け取る下流側のモジュールが知っていると考えられる。
本出願人は、この点に着目し、本実施形態において、ストリームリード関数およびストリームライト関数については、その関数を提供する側と、その関数を用いてデータの読み書きを実際に行なう側とを区別し、モジュールの組み合わせによらず、データのやりとりが行なえる仕組みを用意している。これらの機能の組み合わせを示したのが、この図14Aである。
図14Bは、イニシエータモジュール、メンバモジュール及びターミネータモジュールの各々が有する機能を示す。
メンバモジュールは、上流側のモジュールとしての機能「RC」及び「WP」のうちのいずれかと、下流側のモジュールとしての機能「RP」及び「WC」のうちのいずれかとを有するので、図14Bに示す通り、全部で4通りのモジュールとなり得る。各モジュールがいずれの機能を有するかは、各モジュールの処理内容により決定することができるが、好適には、例えば、そのモジュール内部での処理によりバッファにデータを蓄えるタイプのモジュールは、機能「WC」を有するモジュールとして設計される。
イニシエータモジュールは、データ処理の先頭に位置し、上流側にモジュールが存在することはないので、上流側のモジュールに対する機能「RP」及び「WC」を有する必要はなく、下流側のモジュールに対する機能「RC」又は「WP」を有すれば良い。
ターミネータモジュールは、データ処理の終端に位置し、下流側にモジュールが存在することはないので、下流側のモジュールに対する機能「RC」及び「WP」を有する必要はなく、上流側のモジュールに対する機能「RP」及び「WC」を有すれば良い。
DPC131は、ハーネスから所定の印刷処理の実施を指示された場合、図13Cに例示した情報(例えばテーブル)を参照し、その情報中の印刷パス定義に従って、組み合わせるべきモジュール特定する。次に、DPC131は、各モジュールに対して、G-READY関数を呼び出して、各モジュールの使用を予約する。各モジュールは、DPC131からの呼び出しに応答できる場合は、G-READY関数の引数に、次の値を入れて返す。DPC131からG-READY関数を呼び出す際、引数としては[X1,IX1,Y1,IY1]の四つが与えられる。この引数の内容は次の通りである。
(1)X1:下流側モジュールに対する機能として「RP」を有するイニシエータモジュール又はメンバモジュールが、自ら提供するストリームリード関数のポインタを入れて返す引数である。上流側に対する機能として「RC」を有するターミネータモジュール又はメンバモジュールは、この引数にヌル(NULL)を入れて返す。NULLは、何も指定されてないことを示す変数である。
(2)IX1:下流側モジュールに対する機能として「RP」を有するイニシエータモジュールまたはメンバモジュールが、自ら提供するストリームリード関数の呼び出しの際に指定すべきコンテクストIDを入れて返す引数である。上流側に対する機能として「RC」を有するターミネータモジュール又はメンバモジュールは、この引数に値0を入れて返す。各モジュールが、コンテクストIDを返すのは、同じモジュールが同時に二つの処理に用いられる場合が有り得るからである。この場合、DPC131は、各モジュールに対して処理開始や終了を指示する際、このコンテクストIDを用いて、処理の開始と終了のどちらであるかを特定する。
(3)Y1:上流側モジュールに対する機能として「WP」を有するメンバモジュール又はターミネータモジュールが、自ら提供するストリームライト関数のポインタを入れて返す引数である。下流側に対する機能として「WC」を有するイニシエータモジュール又はメンバモジュールは、この引数にヌル(NULL)を入れて返す。
(4)IY1:上流側モジュールに対する機能として「WP」を有するメンバモジュール又はターミネータモジュールが、自ら提供するストリームライト関数の呼び出しの際に指定すべきコンテクストIDを入れて返す引数である。下流側に対する機能として「WC」を有するイニシエータモジュール又はメンバモジュールは、この引数に値0を入れて返す。
図15は、印刷パスにおけるデータ処理の流れの一例を示す。この図15では、説明をより分かりやすくするために、ストリームリード関数又はストリームライト関数のいずれかを提供するモジュールの部分がハッチングで示されている。この例では、印刷パスは、RGP印刷パスであり、先頭から終端にかけて、RPを有するイニシエータモジュールI−A(特定言語処理モジュール113)、RCとWCとを有するメンバモジュールM−E(色変換/ハーフトーニング処理モジュール115)、WPとRPとを有するメンバモジュールM−H(インターレース処理モジュール117)、及びRCを有するターミネータモジュールT−Aの順で配列される。
DPC131からG-READY関数が呼び出されると、イニシエータモジュールI−Aは、上記のG-READY関数の定義に従い、ストリームリード関数を提供するとして、その関数のポインタSR1と、そのコンテクストID(RID1)を有効な引数として、DPC131に返す。メンバモジュールM−Eは、自らは提供する関数がないとして、有効な引数は返さない。メンバモジュールM−Hは、ストリームリード関数とストリームライト関数とを提供するとして、下流側に対するポインタSR2、そのコンテクストID(RID2)、上流側に対するポインタSW1、及びそのコンテクストID(WID1)を、引数として返す。ターミネータモジュールT−Aは、自らは提供する関数がないとして、有効な引数は返さない。
DPC131は、これらの引数を受け取った後、データ処理に必要なタイミングで、各モジュールに対して、START-J関数を呼び出すことで、データ処理の開始を指示する。このとき、START-J関数には、次の引数[U1,IU1,V1,IV1]が与えられる。この引数の内容は次の通りである。
(1)U1:モジュールが、使用するストリームリード関数のポインタを与える。このストリームリード関数のポインタは、上流側に位置しRPを有するイニシエータモジュール又はメンバモジュールが、提供するものである。WPを有するターミネータモジュール及びメンバモジュールは呼び出す際には、この引数をヌル(NULL)としなければならない。
(2)IU1:ストリームリード関数を利用するモジュールが指定すべきコンテクストIDである。このコンテクストIDは、上流側に位置しRPを有するイニシエータモジュール又はメンバモジュールが、提供するものである。WPを有するターミネータモジュールおよびメンバモジュールは呼び出す際には、この引数を値0としなければならない。
(3)V1:モジュールが、使用するストリームライト関数のポインタを与える。このストリームライト関数のポインタは、下流側に位置しWPを有するターミネータモジュールまたはメンバモジュールが、提供するものである。RPを有するイニシエータモジュールおよびメンバモジュールは呼び出す際には、この引数をヌル(NULL)としなければならない。
(4)IV1:ストリームライト関数を利用するモジュールが指定すべきコンテクストIDである。このコンテクストIDは、下流側に位置しWPを有するターミネータモジュールまたはメンバモジュールが、提供するものである。RPを有するイニシエータモジュールおよびメンバモジュールは呼び出す際には、この引数を値0としなければならない。
上記の規則に従って、各モジュールに対してSTART-J関数の呼び出しの際に、引数が引き渡される。すなわち、ストリームリード関数については、上流側のモジュールが用意したポインタが下流側のモジュールに引き渡され、ストリームライト関数については、下流側のモジュールが用意したポインタが上流側のモジュールに引き渡される。この結果、図15の右側に示す通り、各モジュールは、ストリームリード関数を用いる場合には、下流側のモジュールが上流側のモジュールが用意したポインタを利用してデータを読み出し、ストリームライト関数を利用する場合には、上流側のモジュールが下流側のモジュールが用意したポインタを利用してデータを書き込む。こうして、各モジュールは、自らのデータを書き込んだり、相手のデータを読み出したりする条件について、DPC131により呼び出されるまで全く知らなくても、スムーズにデータのやりとりを行なうことができる。
以上が、プリンタ15におけるソフトウェア群37の構成や機能についての説明である。次に、その構成や機能の下でプリンタ15において行われる処理流れの一例を説明する。
図16乃至図18は、レガシー言語で記述されたコマンドを受信した後に特定言語で記述されたコマンドを受信した場合にプリンタ15で行われる一連の処理流れを示す。
ホスト装置1からプリンタ15のI/F13がコマンドを受信した場合(S21)、IFD101が、ハーネス群325中のI/F13に対応したハーネス(以下、IFハーネス)303の第一のAPIをコールして、データ到着通知をIFハーネス303に送る(S22)。IFハーネス303は、複数のAPIを有しており、IFD101は、それら複数のAPIのうちS21の場合には第一のAPIをコールするように構成されている。
IFハーネス303は、データ到着通知の受信に応答して、サービス323が有する一以上のAPIのうちの所定のAPIをコールし、データ到着通知をサービス323に送る(S23)。
サービス323は、プリンタ15における印刷パスの排他を管理している。例えば、サービス323は、ダイレクト印刷のための印刷パスが構築されている場合には、他の印刷パスを構築しないようビジー状態になっておおり、どの印刷パスも構築されていない場合には、アイドル状態になっている。サービス323は、ビジー状態の場合には、コール元のIFハーネス303にエラーを返す。一方、サービス323は、アイドル状態の場合には、IFハーネス303の第二のAPIをコールして、印刷開始通知(コールバック関数)をIFハーネス303に送る(S24)。サービス323は、IFハーネス303からのデータ到着通知に対して印刷開始通知を出す場合にはIFハーネス303の第二のAPIをコールするように構成されている。第二のAPIがコールされると、その第二のAPIが実行されることにより、例えば以下のS25及びS28の処理が行われる。
IFハーネス303は、印刷処理のIDと、その印刷処理のための印刷パスを構成するモジュールの確保要求とを、DPC131に出す(S25)。S21からS25の処理は、ホスト装置1からのコマンド受信に起因して行われたものであり、受信したコマンドは、レガシー言語で記述されている可能性が高い。そのため、このS25では、IFハーネス303は、印刷処理のIDとして、レガシー言語モード印刷をDPC131に通知する。
DPC131は、印刷処理IDの通知とモジュール確保要求とに応答して、受けた印刷処理IDに対応する印刷パス定義を、図13Cに例示した情報を参照することにより特定し、特定された印刷パス定義が表す印刷パスの構成にとりかかる。ここでは、DPC131は、印刷処理IDとしてレガシー言語モード印刷を受けるので、レガシーパスの構成にとりかかる。DPC131は、図13Cに例示した情報から、レガシーパスを構成するモジュールとして、データ取得モジュール103(イニシエータモジュールI−B)とレガシー言語処理モジュール105(ターミネータモジュールT−B)とを特定し、それぞれを、G-READY関数によって呼び出す(S26及びS27)。これにより、呼び出されたデータ取得モジュール103及びレガシー言語処理モジュール105は、「STAND-BY」状態から「READY」状態に遷移する。
次に、IFハーネス303は、印刷処理の実行を、DPC131に要求する(S28)。DPC131は、その要求に応答して、データ取得モジュール103とレガシー言語処理モジュール105とに、START-J関数を送る(S29及びS30)。START-J関数を受けたデータ取得モジュール103及びレガシー言語処理モジュール105は、「READY」状態から「PROCESSING」状態に遷移する。これにより、レガシーパスが構築されたことになる。なお、この際、レガシー言語処理モジュール105は、PED107に対して排他要求を発行する。これより、PED107は、その後に別のモジュールから排他要求を受けても、排他状態を解除するまでは、その排他要求を受け付けない。
以降、印刷コマンドがレガシーパスに流れ込んできた場合には、印刷コマンドがバッファ133に蓄積され、その印刷コマンドに基づく処理が行われる。例えば、レガシー言語処理モジュール105は、データ取得モジュール103にデータを要求し(S31−1)、それに応答して、データ取得モジュール103が、補助バッファ(例えばバッファ133よりも容量の少ないバッファ)134から、データ(例えば所定サイズ分(例えば一バイト)のデータ)を読み出し、読み出したデータをレガシー言語処理モジュール105に渡す(S31−4)。レガシー言語処理モジュール105は、そのデータに基づくコマンドをPED107に送る。このS31−1及びS31−4の処理が、繰り返される。なお、このS31−1及びS31−4の処理は、例えば、図15を参照して説明した方法で行われる。そのため、補助バッファ(例えば256バイトの容量を持ったバッファ)134は、データ取得モジュール103が有していても良い。また、データ取得モジュール103は、補助バッファ134にデータが無い場合には、IFD101にデータを要求し(S31−2)、IFD101が、バッファ133からデータを取得し、取得したデータをデータ取得モジュール103に渡すことができる。
レガシー言語処理モジュール105は、S31−4により取得されたコマンドを解析し、その解析結果に基づく処理を行う。例えば、レガシー言語処理モジュール105により、特定モード移行コマンドが検出されるまでは、例えば、前述した仕様情報をホスト装置1に通知することや、図12の段階A〜段階Eまでの処理が行われる。
S31−1及びS31−4の処理が繰り返し行われている間も、印刷コマンド(ストリーム)が流れ込んできた場合には、バッファ133にその印刷コマンドは蓄積される。これは、レガシー言語ではなく特定言語で書かれた印刷コマンドが流れ込んできた場合も同様である。レガシー言語処理モジュール105が所定のコマンド(例えばレガシージョブ終了コマンド又は特定モード移行コマンド)を検出するまで、図17に示すように、S31−1〜S31−4の処理が行われる(S32−1〜S32−4)。
S32−4において、レガシー言語処理モジュール105は、特定モード移行コマンドを検出した場合には、IFハーネス303の第三のAPIをコールし、RGB画像の印刷開始をIFハーネス303に通知する(S33)。すなわち、レガシーパスからRGB印刷パスへの切り替えのための処理が開始される。ここでは、データ取得モジュール103が、レガシー言語処理モジュール105から所定の通知を受け、それに応答して、IFハーネス303の第三のAPIをコールし、RGB画像の印刷開始をIFハーネス303に通知しても良い。第三のAPIは、コマンドの検出に応答してコールされるAPIなので、第一のAPIと類似した構成とすることができる。
RGB画像の印刷開始通知を受けたIFハーネス303は、図16のS25及びS28と実質的に同様の処理を行うことができる(S34及びS37)。
すなわち、IFハーネス303は、印刷処理のIDと、その印刷処理のための印刷パスを構成するモジュールの確保要求(例えば「LockProcess−RGB印刷パス」)を、DPC131に出す(S34)。IFハーネス303は、RGB画像の印刷開始通知を受けたので、印刷処理のIDとして、特定言語モード印刷をDPC131に通知する。
DPC131は、印刷処理IDとして特定言語モード印刷を受けるので、RGB印刷パスの構成にとりかかる。DPC131は、図13Cに例示した情報から、RGB印刷パスを構成するモジュールとして、特定言語処理モジュール113(イニシエータモジュールI−A)、色変換/ハーフトーニング処理モジュール115(メンバモジュールM−E)、インターレース処理モジュール117(メンバモジュールM−H)及び印刷処理モジュール119(ターミネータモジュールT−A)を特定し、それぞれを、G-READY関数によって呼び出す(S35及びS36)。
次に、IFハーネス303は、印刷処理の実行(例えば「StartProcess−RGB印刷パス」)を、DPC131に要求する(S37)。DPC131は、その要求に応答して、各モジュール113、115、117及び119に、START-J関数を送る(S38及びS39)。START-J関数を受けた各モジュール113、115、117及び119は、「READY」状態から「PROCESSING」状態に遷移する。これにより、RGB印刷パスが構築されたことになる。なお、この際、RGB印刷パスのイニシエータとなる印刷処理モジュール119は、レガシーパスのイニシエータのように、PED107に対して排他要求を発行することは行わずに、データを送るようにする。なぜなら、レガシーパスの構築によって既にPED107の確保はできているので、排他要求を発行せずとも、PED107にデータを受け取ってもらえ、且つ、わざわざ排他要求を発行しても、PED107は前述したように既に別のイニシエータによって確保済みなので、その排他要求を受け付けてもらえないからである。
本実施形態では、印刷パスを構築しようとするタイミング(換言すれば、DPC131から各モジュールのAPI(G-READY、START-J等)が呼ばれるタイミング)で、DPCが、その印刷パス(例えばレガシーパスやRGB印刷パス)を構成する各モジュールに、印刷パスを表す情報(つまりデータ処理経路の情報)を伝える。具体的には、例えば、DPC131は、呼び出すAPIの引数に印刷パス情報を入れてそのAPIをコールする。印刷パス情報としては、例えば、該印刷パス情報の提供先となるモジュールの最も近くに位置する上流側及び下流側のうちの少なくとも一方のモジュールのIDとすることができる。
S39までの処理が完了すると、レガシーパスの切り替え先となるRGB印刷パスが構築される。図16〜図18の処理流れ例では、RGB印刷パスは、プリンタ15において特定モード移行コマンドが検出されたときに、構築される。
RGB印刷パスが構築されたならば、図17に点線枠703で示すように、前述した特定モードの実行(換言すれば、図12の段階G〜段階Mまでの処理)が可能となる。特定モードにおいて、図16〜図18の処理流れ例では、RGB印刷パスのイニシエータ(つまり特定言語処理モジュール113)は、レガシーパスのターミネータ(つまりレガシー言語処理モジュール)105からデータをもらい、そのデータを、下流へ流す。具体的には、例えば、特定言語処理モジュール113は、例えば、レガシー言語処理モジュール105にデータを要求する(S40)。レガシー言語処理モジュール105は、データ取得モジュール103にデータを要求し(S41−1)、それに応答して、データ取得モジュール103が、補助バッファ134から、データ(コマンド)を読み出し、読み出したデータをレガシー言語処理モジュール105に渡す(S41−4)。必要に応じて、図16のS31−2及びS31−3と同様の処理が行われる(S41−2及びS41−3)。レガシー言語処理モジュール105は、データ取得モジュール103からのデータを特定言語処理モジュール113に渡す(S42)。特定言語処理モジュール113は、渡されたデータ(特定言語で書かれたコマンド)を解析し、そのコマンドに基づく処理を実行する。渡されたものがRGBデータの場合、特定言語処理モジュール113は、取得したRGBデータを下流のモジュールに流す(S43)。流されたRGBデータは、各メンバモジュール115、117によって、色変換、ハーフトーニング及びインターレース等の処理が施される。それらの処理が施されたRGBデータに基づいて、印刷処理モジュール119によって、PED107の制御コマンドが作られ、その制御コマンドが、PED107に送られる(S44)。
レガシー言語処理モジュール105と特定言語処理モジュール113との間でデータの授受を可能にするために、モジュール105及び113は、イニシエータ又はターミネータであっても、メンバモジュールと実質的に同様の構成(つまり、上流側に対する機能と下流側に対する機能との双方を有する構成)になっていてもよい。
上記のように、特定モードになった場合、レガシー言語処理モジュール105は、取得されるコマンドを全く解析することなく、特定言語処理モジュール113にコマンドを流す。このため、レガシー言語処理モジュール105は、特定モードの実行中に、特定モードの解除を意味するレガシー移行コマンドが流れてきても、それを検出せずに、そのレガシー移行コマンドを特定言語処理モジュール113に流す。特定言語モジュール113は、そのレガシー移行コマンドを検出する。また、そのレガシー移行コマンドは、より下流に流れて、下流側のモジュール115、117及び119のうちの少なくとも一つも検出しても良い。また、この検出は、上流側から下流側にかけて順次に行われても良い。特定モードの解除を検出したモジュール(例えば113、115、117及び119)は、例えばその解除が検出された順に、DPC131に、特定モード解除通知(例えば「EndJob」)を出す(S45、S46)。各モジュール113、115、117及び119は、この場合に、「PROCESSING」状態から「READY」状態になることができる。
各モジュールから特定モード解除通知を受けたDPC131は、IFハーネス303の第四のAPIをコールし、特定モードの解除のための処理要求(例えば「StartProcess−RGB印刷パス−コールバック」)を、IFハーネス303に出す(S47)。
IFハーネス303は、S37で印刷処理の実行を要求してから、コールされるまで待ち状態となっている。その状態において、IFハーネス303は、特定モードの解除のための処理要求を受けた場合、DPC131の所定のAPIをコールし、特定モードの解除処理の要求(例えば「RelaeseProcess−RGB印刷パス)を出す(S48)。DPC131は、その要求に応答して、RGB印刷パスを構成する各モジュール113、115、117及び119に、キャンセル要求(例えば「CancelReady」)を出す(S49及びS50)。このキャンセル要求は、特定モード解除通知を受信した順序と同じ順序で発行することができる。各モジュール113、115、117及び119は、その要求に応答して、「READY」状態から「STAND-BY」状態になることができる。これにより、RGB印刷パスが解除される。換言すれば、RGB印刷パスがなくなる。
また、IFハーネス303は、レガシー言語処理モジュール105に、特定モードの解除通知を出す(S51)。レガシー言語処理モジュール105は、その解除通知を受けてからは、再び、データ取得モジュール103から渡されるデータ(コマンド)の解析を行う。すなわち、例えば、図16のS31−1〜S31−4の処理が行われる(S52−1〜S52−4)。
補助バッファ134が空になった場合、データ取得モジュール103が、IFD101にデータを要求する。しかし、バッファ133も空になっていれば、データはデータ取得モジュール103には送られて来ない(例えば、バッファ133が空になっていることを意味する通知がIFD101からデータ取得モジュール103に送られる)。
この場合には、レガシーパスも解除され、プリンタ15からレガシーパスが無くなる。具体的には、例えば、バッファ133が空になったことは、まず、データ取得モジュール103で検出され、レガシーモード解除通知(例えば「EndJob」)が、データ取得モジュール103からDPC131に送られる(S53)。その後、バッファ133が空になったことが、データ取得モジュール103からレガシー言語処理モジュール105に通知されて、レガシー言語処理モジュール105でも検出され、レガシーモード解除通知(例えば「EndJob」)が、レガシー言語処理モジュール105からDPC131に送られる(S54)。
レガシーパスの構成要素である全てのモジュール103及び105からレガシーモード解除通知を受けたDPC131は、IFハーネス303の第五のAPIをコールし、レガシーモードの解除のための処理要求(例えば「StartProcess−レガシーパス−コールバック」)を、IFハーネス303に出す(S55)。各モジュール103、105は、この場合に、「PROCESSING」状態から「READY」状態になることができる。
IFハーネス303は、レガシーモードの解除のための処理要求を受けた場合、DPC131の所定のAPIをコールし、レガシーモードの解除処理の要求(例えば「RelaeseProcess−レガシーパス)を出す(S56)。DPC131は、その要求に応答して、レガシーパスを構成するモジュール103及び105に対し、例えば、レガシーモード解除通知を受けた順序と同じ順序で、キャンセル要求(例えば「CancelReady」)を出す(S57及びS58)。各モジュール103、105は、その要求に応答して、「READY」状態から「STAND-BY」状態になることができる。これにより、レガシーパスが解除される。換言すれば、RGB印刷パスがなくなる。
最後に、IFハーネス303は、印刷終了通知をサービス305に出す(S59)。これにより、サービス305は、排他を解除し、印刷処理の要求を受け付けることができる。例えば、サービス305は、印刷終了通知を受けるまでは、他の印刷処理要求(例えばダイレクト印刷のための要求)を別のハーネスから受けても、その印刷処理要求を受け付けないが、印刷終了通知を受けた後は、その印刷処理要求を受け付けることができる。
以上、上述した実施形態によれば、プリンタ15では、ホスト装置1から受信されるデータの種別に関わらず、とりあえずは全てレガシーパスでデータを受け、特定の種別のデータであるということがレガシーパスの特定の場所で検出された場合に、特定の種別のデータが、その特定の種別のデータを処理するための別の印刷パスに転送され、その別の印刷パスで処理される。これにより、レガシーパスそれ自体の構成を変更するといった大きな設計変更を行うことなく、特定の種別のデータを処理するための機能を設けることができる。
ところで、上述した実施形態について、以下のような幾つかの変形例が考えられる。以下、それについて説明する。
(1)第一の変形例。
図19は、本発明の一実施形態の第一変形例におけるプリンタドライバの構成例を示す。図20は、図19のプリンタドライバからデータを受信するプリンタにおける印刷パスの構成例を示す。
この第一変形例は、レガシーパスと、RGBデータ処理するパスとが同時に使用される別の例に関わる。具体的には、この第一変形例では、プリンタドライバ21から送信されるRGBデータを、XHTML-Print(MIME Multiplexed)のRGBデータとすることができる。
しかし、単純に、RGBデータを、XHTML-PrintのRGBデータとしてしまうことは好ましくないと考えられる。なぜなら、第一に、XHTML-Printでは、処理対象として画像が参照されるため、プリンタ15がホスト装置1から別途その画像を読み込むことになり、それゆえ、プリンタ15が双方向通信を行う能力を持っていなければならず、双方向通信を行えないプリンタでは、XHTML-Printを実行できないからである。また、第二に、処理対象の画像のデータサイズは大きいこともあるので、ホスト装置1からの読み込みに長い時間がかかり、印刷速度が遅くなってしまうことがあり得るからである。
そこで、この第一変形例では、図19に示すように、プリンタドライバ21が、パッキング処理部390を備え、その処理部390により、参照される画像もパッキング(エンコード)し、XHTML-Printに関わるコマンドをストリームデータでプリンタに送るように構成されている。プリンタ15では、レガシーパスでそのストリームデータを受け、レガシーパスの特定の場所(例えばレガシー言語処理モジュール105)で、XHTML-Printに関わるコマンドであると検出された場合に、DPC131により、また別のRGB印刷パスが構築され、そのまた別のRGB印刷パスにより、XHTML-Printに関わるコマンドが処理される。また別のRGB印刷パスは、例えば、前述したRGB印刷パスの特定言語処理モジュール113と、色変換/ハーフトーニング処理モジュールとの間に、上流側から下流側かにかけて、MIME(Multipurpose Internet Mail Extension)に関する処理を行うMIME処理モジュール441と、XHTML-Printに関わる処理(例えばデコード)を行うXHTML-Print印刷処理モジュール443とを有する。
(2)第二の変形例。
プリンタ15(例えば、その中のサービス323)は、レガシーパスしか構築されていないときは、ホストからのRGBデータを処理するためのRGB印刷パスとは別のRGB印刷パス(例えば、ダイレクト印刷のための印刷パス)を構築しても良い。その場合、PED107は、レガシーパスにより予約をかけられて排他状態となっているから、排紙はできないが、RGBデータを、印刷の直前の状態(例えばインターレース処理まで済んだ状態)にしてプリンタ記憶域33に一時記憶させておき、レガシーパスの解除後に、その記憶させておいたデータを読み込んで印刷してもよい。
(3)第三の変形例。
プリンタ15は、ホスト装置1から何かしらデータを受信した場合にレガシーパスを構築するが、その場合に(例えば、レガシーパスの構築と同じ(例えば実質的に同じ)タイミングで)、RGB印刷パスも構築しても良い。
(4)第四の変形例。
補助バッファ134が無く、バッファ133から読み出されたデータをレガシー言語処理モジュール105が受けても良い。その場合、特定モード移行コマンドが読み出されて、RGB印刷パスが構築されたならば、それ以降のデータは、特定言語処理モジュール113が、バッファ133から直接取得しても良い。また、特定言語処理モジュール113がバッファ133から直接データを取得するようになった場合には、プリンタ15は、所定のイベントが検出されるまで(例えば特定言語処理モード113が特定モードの解除を検出するまで)、レガシーパスを解除してもよく、そのイベントが検出された場合に、再度、レガシーパスを構築しても良い。
以上、本発明の好適な実施形態及び幾つかの変形例を説明したが、これらは本発明の説明のための例示であって、本発明の範囲をこれらの実施形態及び変形例にのみ限定する趣旨ではない。本発明は、他の種々の形態でも実施することが可能である。例えば、ホスト装置1とプリンタ15とは、インターネット等の通信ネットワークを介して接続され、プリンタ15は、その通信ネットワークを介してホスト装置1にデバイスIDや仕様情報を送信してもよい。また、例えば、プリンタ15に記憶されている優先順位のどこまでがユーザが許容できるレベルであるかを、プリンタ15の操作パネル或いはプリンタドライバ21等のユーザインタフェースを介してプリンタ15に設定し、プリンタ15は、設定された順位よりも高い順位の印刷条件に関するパラメータも変更しなければいけない場合には、印刷できないことを表す情報(更に、このパラメータを設定してくれれば印刷できるということを表す情報が含まれていても良い)をプリンタドライバ21に送信してもよい。