以下に添付図面を参照して、この発明に係る画像処理装置の実施形態を詳細に説明する。図1は、本実施形態に適用可能な印刷システムの一例の構成を示す。図1に例示される印刷システムは、プリンタサーバ50とプリンタ60とがネットで接続され、プリンタサーバ50からプリンタ60に対して圧縮符号化された画像データをネットワークを介して送信し、プリンタ60に画像データに従った印字を実行させる。
より具体的には、プリンタサーバ50は、例えば図示されないコンピュータからネットワークを介して伝送されたPDL(Page Description Language)データに基づき画像データを生成し、生成された画像データを圧縮符号化する。そして、この画像データを圧縮符号化した符号データを、例えばPDLデータに含まれる、印字対象の用紙サイズや印字解像度といった印字に関する属性データと共に、ネットワークを介してプリンタ60に送信する。プリンタ60では、これら伝送された符号データおよび属性データを受信し、符号データを復号して画像データとし、この画像データおよび属性データに従い印字動作を行う。
先ず、プリンタサーバ50について説明する。図1において、プリンタサーバ50は、CPU(Central Processing Unit)100と、メモリコントローラ部51と、ディスプレイコントローラ用のASIC(Application Specific Integrated Circuit)52と、パネルコントローラ用のASIC53と、メインメモリ130と、プログラムが格納されるROM140とを有する。メモリコントローラ部51、ディスプレイコントロール用のASIC52およびパネルコントローラ用のASIC53は、それぞれバス113を介して互いに通信可能とされている。
メモリコントローラ部51は、CPU I/F101、メモリアービタ(ARB)102、メモリコントローラ103、DMA(Direct Memory Access)コントローラ104およびバスコントローラ105を有する。また、メモリアービタ102に対して通信コントローラ106が接続される。
CPU100は、CPU I/F101を介してメモリアービタ102に接続され、ROM140に記憶されるプログラムに従い、プリンタサーバ50の全体を制御する。また、CPU100は、例えば図示されないコンピュータで作成されネットワークを介して送信されたPDLデータを解析してバンドデータの描画を行う。
メモリアービタ102は、メインメモリ130とメモリコントローラ内蔵CPUの各部とのアクセス調停を行う。通信コントローラ106は、ネットワークなどによる通信を制御する。バスコントローラ105は、バス113に接続される各部とのバス調停を行う。メモリコントローラ103は、メインメモリ130に対するアクセス制御を行う。CPU I/F101は、メモリアービタ102とCPU100との間の通信を制御する。
メインメモリ130は、PDLデータが格納されるPDLデータ領域130Aと、バンド画像データが格納される画像データ領域130Bと、バンド画像データが符号化された符号データが格納されるページ符号データ領域130Cとを有する。
ディスプレイコントロール用のASIC52は、バスI/F107およびディスプレイコントローラ108を有する。バスI/F107は、バス113とディスプレイコントローラ用のASIC52との間の通信を制御する。ディスプレイコントローラ108は、例えばLCD(Liquid Crystal Display)からなるディスプレイ109の表示を制御する。例えば、CPU100によりプログラムに従い生成された表示制御信号が、バス113などを介してディスプレイコントローラ108に供給される。ディスプレイコントローラ108は、供給された表示制御信号に基づきディスプレイ109を駆動する。
パネルコントローラ用のASIC53は、バスI/F111およびパネルコントローラ112を有する。バスI/F111は、バス113とパネルコントローラ用のASIC53との間の通信を制御する。パネルコントローラ112は、入力部121を制御する。入力部121は、複数の操作子を有すると共に、押圧位置に応じた信号を出力するタッチパネルを有し、このタッチパネルとディスプレイ109とを組み合わせることで、表示に応じた操作が可能なオペレーションパネルが構成される。
次に、プリンタ60について説明する。プリンタ60は、メモリコントローラを内蔵したCPU(Central Processing Unit)部61と、画像処理用のASIC(Application Specific Integrated Circuit)62と、パネルコントローラ用のASIC63と、メインメモリ230と、プログラムが格納されるROM240とを有する。メモリコントローラ内蔵のCPU部61、画像処理用のASIC62およびパネルコントローラ用のASIC63は、それぞれバス213を介して互いに通信可能とされている。
メモリコントローラ内蔵のCPU部61は、CPU200、CPU I/F201、メモリアービタ202、メモリコントローラ203、DMAコントローラ204、バスコントローラ205、通信コントローラ206および割り込みコントローラ250を有する。CPU200は、ROM240に記憶されるプログラムに従い、プリンタ60の全体を制御する。
メモリアービタ202は、メインメモリ230とメモリコントローラ内蔵CPU61の各部とのアクセス調停を行う。通信コントローラ206は、ネットワークなどによる通信を制御する。バスコントローラ205は、バス213に接続される各部とのバス調停を行う。メモリコントローラ203は、メインメモリ230に対するアクセス制御を行う。CPU I/F201は、メモリアービタ202とCPU200との間の通信を制御する。
例えばプリンタサーバ50からネットワークを介して送信された、画像データが圧縮符号化された符号データは、通信コントローラ206により受信され、メモリアービタ202を介してメインメモリ230に格納される。プリンタ60側では、メインメモリ230の領域全体を、バンド毎の符号データをページ単位で記憶するページ符号データ領域として用いることができる。
画像処理用のASIC62は、バスI/F207、復号部209およびエンジンコントローラ210を有する。バスI/F207は、バス213と画像処理用のASIC62との間の通信を制御する。復号部209は、メインメモリ230から読み出した符号データを復号し、画像データとしてエンジンコントローラ210に供給する。エンジンコントローラ210は、プリンタエンジン260を制御し、画像データに従った印字を行わせる。
なお、詳細は後述するが、復号部209は、符号データの復号時にエラーが発生すると、その旨を示すエラー信号を出力する。このエラー信号は、メモリコントローラ内蔵CPU61内の割り込みコントローラ250に供給される。割り込みコントローラ250は、このエラー信号を受け取ると、CPU200に対して割り込みをかけるための割り込み信号を生成し、CPU200に供給する。
ディスプレイコントロール用のASIC64は、バスI/F227およびディスプレイコントローラ228を有する。バスI/F227は、バス213とディスプレイコントローラ用のASIC64との間の通信を制御する。ディスプレイコントローラ228は、例えばLCDからなるディスプレイ229の表示を制御する。例えば、CPU200によりプログラムに従い生成された表示制御信号が、バス213などを介してディスプレイコントローラ228に供給される。ディスプレイコントローラ228は、供給された表示制御信号に基づきディスプレイ229を駆動する。
パネルコントローラ用のASIC63は、バスI/F211およびパネルコントローラ212を有する。バスI/F211は、バス213とパネルコントローラ用のASIC63との間の通信を制御する。パネルコントローラ212は、入力部221を制御する。入力部221は、複数の操作子を有すると共に、押圧位置に応じた信号を出力するタッチパネルを有し、このタッチパネルとディスプレイ229とを組み合わせることで、表示に応じた操作が可能なオペレーションパネルが構成される。
図2は、処理の全体的な流れを示す。例えば図示されないコンピュータにおいて生成された印字データ(PDLデータ)が、プリンタサーバ50のメインメモリ130におけるPDLデータ領域130Aに記憶されているものとする。プリンタサーバ50において、CPU100上で動作するプログラムのモジュールの一つである描画コマンド生成部で、PDLデータ領域130Aに記憶されるPDLデータを解析し、描画コマンドを生成する。描画コマンドは、例えばメインメモリ130のPDLデータ領域130Aに記憶される。
CPU100上で動作するプログラムのモジュールの一つである描画処理部は、メインメモリ130のPDLデータ領域130Aから描画コマンドを受け取り、メインメモリ130の画像データ領域130Bに対してバンド画像データを描画する。メインメモリ130の画像データ領域130Bに記憶されたバンドデータは、CPU100上で動作するプログラムのモジュールの一つである符号化部で符号化され、バンド毎の符号データとされてメインメモリ130のページ符号データ領域130Cに記憶される。
プリンタサーバ50のメインメモリ130のページ符号データ領域130Cに記憶された符号データは、通信コントローラ106によりプリンタサーバ50からプリンタ60に対してネットワークを介して送信される。この符号データは、プリンタ60において、通信コントローラ206により受信され、メインメモリ230に記憶される。復号部209は、メインメモリ230から各バンド毎の符号データからなる1ページ分の符号データを読み出して復号し、符号データが復号された画像データをエンジンコントローラ210に供給する。エンジンコントローラ210は、供給された画像データに従いプリンタエンジン260を制御して、印字を行う。
<データフローについて>
次に、図3〜図5を用いて、画像データの符号化および復号時、ならびに、復号時にエラーが発生した場合のデータフローについて説明する。図3は、画像データの符号化処理におけるデータフローの例を示す。以下では、画像データの符号化をプリンタサーバ50で行うものとする。これに限らず、画像データの符号化をプリンタ60側で行ってもよいし、プリンタ60に対して所定のインターフェイスで接続されたコンピュータなどで行ってもよい。但し、プリンタ60側で符号化を行った場合、生成された符号データにエラーが発生する可能性は極めて小さいと考えられる。画像データを描画するためのPDLデータは、予め作成されメインメモリ130のPDLデータ領域130Aに格納されているものとする。
プリンタサーバ50において、CPU100は、メインメモリ130のPDLデータ領域130AからPDLデータを読み出し(経路A)、読み出したPDLデータを解析してバンド画像データを生成する。このとき、CPU100は、バンド画像データに対して階調処理など所定の画像処理を施すことができる。生成されたバンド画像データは、メインメモリ130の画像データ領域130Bに格納される(経路B)。その後、CPU100は、画像データ領域130Bからバンド画像データを読み出して符号化する(経路C)。画像データに対する符号化処理の詳細については後述する。バンド画像データが符号化された符号データは、メインメモリ130のページ符号データ領域130Cに格納される(経路D)。
図4は、符号データの復号処理におけるデータフローの例を示す。復号処理は、プリンタサーバ50で画像データが符号化された符号データをプリンタ60に転送して、プリンタ60側で行われる。プリンタサーバ50において、1ページの符号データがメインメモリ130の符号データ領域130Cから読み出され、通信コントローラ106によりネットワークを介してプリンタ60に送信される。この符号データは、プリンタ60側の通信コントローラ206に受信され、メインメモリ230に格納される(経路E)。
メインメモリ230から読み出された符号データが復号部209に転送される(経路F)。復号部209は、転送された符号データをプリンタエンジン260に同期して復号し、符号データが復号された画像データをプリンタコントローラ210に供給する(経路G)。プリンタコントローラ210は、プリンタエンジン260を制御して、供給された画像データの印字を行う。
図5は、復号処理時にエラーが発生した場合のデータフローの例を示す。先ず、図4と同様にして、プリンタサーバ50のメインメモリ130における符号データ領域130Cから読み出された符号データが、ネットワークを介してプリンタ60に転送され、プリンタ60のメインメモリ230に格納される(経路H)。復号部209は、メインメモリ230から読み出された符号データを復号する(経路I)。復号処理の詳細については、後述する。
復号部209は、符号データの復号時に、符号データのエラーを検出する。復号部209は、符号データにエラーが検出されたら、その旨を示すエラー信号を割り込みコントローラ250に対して出力する(経路K)。割り込みコントローラ250は、復号部209からのエラー信号を受け取ると、割り込み信号を生成してCPU200に供給し、CPU200の処理に対して割り込みをかける。CPU200は、割り込みコントローラ250からの割り込みを受けると、エンジンコントローラ210に対して印字動作の停止を要求する(経路L)。
また、CPU200は、復号部209から、検出したエラーの種類などを示すエラーステータス信号を読み込む(経路J)。CPU200は、読み込んだエラーステータス信号に基づき、ディスプレイ229に対してエラーが発生した旨を表示させる(経路M)。
<符号化処理について>
次に、本実施形態に適用可能な画像データの符号化処理について説明する。本実施形態では、画像データの符号化をMTF符号化方式を用いて行う。MTF符号化方式は、特許第4000266号公報に開示されるように、小さい動的な辞書をMTF(Move To Front)制御することにより、辞書と一致したインデクス値を符号化する符号化方式である。このMTF符号化方式による符号化は、既出の文字の中で前回出現した文字が、今回出現する確率が最も高いと見做す符号化方法である。
MTF符号化方式は、次のように動作する。入力される値が取り得る全ての値を保持するリストを持っており、入力された値とそのリスト中の値を比較し、同じ値を持つリスト中の位置をシンボルとして符号を生成する。次いで、この比較対象となった値をリスト中から削減し、その入力値をリストの先頭へもってくる。
例えば、5つの文字「a」、「b」、「d」、「o」および「Y」から作られている文字系列を例にとって説明する。先ず、この5つの文字に対するリストR={a,b,d,o,Y}を作成し、各文字に対してシンボル0、1、2、3および4を与える。次に、入力文字系列(例えば{Ydbbaaaadoo})を1文字ずつ調べ、対応するリストのシンボルを出力し、その文字をリストの先頭へ移動する作業を、入力系列全ての文字を出力するまで繰り返し、最終的に、出力系列{4,3,3,0,3,0,0,0,2,4,0}が得られる。
図6は、符号化を行う符号化処理部150の機能を示す。符号化処理部150は、画像データ読み込み部151、MTF符号化処理部152、ハフマン符号化処理部153、符号書き込み部154、ラインカウンタ155および符号カウンタ156を含む。これら符号化処理部150に含まれる各部は、例えばCPU100上で動作するプログラムのモジュールからなる。
画像データ読み込み部151は、メインメモリ130の画像データ領域130Bから画像データを読み込み、MTF符号化処理部152に転送する。図7(a)は、符号化する画像データの例を示す。符号化処理部150では、このように、ライン単位の画像データを符号化する。MTF符号化処理部152は、この例では32個のデータを格納する辞書を持ち、画像データ読み込み部151が読み込んだデータを、MTF処理により辞書のデータと比較し、一致した場合、一致した辞書データに対応付けられたインデクス値をハフマン符号化処理部153に転送し、一致しなかった場合は、読み込んだデータをESC(エスケープ)データとして、ハフマン符号化処理部に153に転送する。
ハフマン符号化処理部153は、MTF符号化処理部152から転送されたインデクス値またはESCデータに対して図示されない符号バッファを用いてハフマン符号化処理を行い可変長符号による符号データを生成し、符号書き込み部154に転送する。符号書き込み部154は、ハフマン符号化処理部153から転送された符号データを、符号書き込み部154が有する図示されない出力符号バッファを介してメインメモリ130に転送し、ページ符号データ領域130Cに記憶させる。
図7(b)は、図7(a)に例示した画像データが符号化された符号データの一例を示す。このように、ライン単位に可変長符号を用いて符号化が行われ、1ラインの画像データが符号化されたライン符号データに続けてライン終端符号が配置される。符号書き込み部154は、例えば、ライン終端の画像データの符号をメインメモリ130に転送した後、ライン終端符号を生成し、このライン終端符号を、メインメモリ130における当該ライン終端の画像データの符号の直後に書き込む。
ラインカウンタ155は、符号化されたラインをカウントするもので、例えば符号書き込み部154においてライン終端符号が書き込まれる度に、カウント値IYを1だけ増加させる。符号カウンタは、例えば符号書き込み部154で1ワード分の符号データをメインメモリ130に書き込む度に、符号カウント値Cを1だけ増加させる。符号カウント値Cは、ライン終端でクリアされる。
なお、符号バッファは、図8に例示されるように、例えば2ワード分の容量を持ち、可変長の符号データを先頭から詰め込む。符号バッファに詰め込まれた有効な符号データの終端が符号ポインタで示される。ここで、1ワードは1回のアドレス指定で読み出されるデータの単位であって、ここでは32ビットであるものとする。したがって、符号バッファは、64ビット分の符号データを格納することができる。
図9は、本実施形態に適用可能な符号フォーマットの例を示す。なお、以下において、「0b」は、続く数値が2進数で表現されていることを示す。
図9(a)は、インデクス値を符号化したインデクス符号の符号表の例を示す。インデクス値を示す32個の符号名にそれぞれ符号が対応付けられている。符号名の末尾の2文字がインデクス値を示す。インデクス値が小さいほど出現頻度が高いため、短いインデクス符号が割り当てられる。インデクス値は、MTF符号化方式で用いる辞書のアドレスを示す。
また、本実施形態においては、符号化を効率良く行うために、ハフマン木に従い、符号長が3ビット(最短符号長)から9ビットまでの全ての符号をインデクス値「00」〜「28」の29個のインデクス値に対して使い切っている。残りの3個のインデクス値「29」〜「31」に対しては、符号長が12ビットの符号を、符号の値が小さい方から順に割り当てる。上述した符号長が12ビットのライン終端符号と併せて考えると、ハフマン木に従い、符号長が12ビットの符号のうち4個の符号(0b111111111011〜0b111111111110)が、この符号表に存在しないことになる。
この図9(a)に例示する符号表は、例えばROM104にインデクス符号テーブルとして予め格納される。すなわち、インデクス符号テーブルは、符号名(インデクス値)と、インデクス符号と、符号長とが互いに関連付けられて格納される。ハフマン符号化処理部153は、符号化処理の際に、ROM104からインデクス符号テーブルを読み出して符号化を行う。
図9(b)は、ESCデータの符号フォーマット例を示す。ESCデータは、データ値が辞書に無い場合に用いるもので、当該データ値がそのまま適用される。この例では、16ビットのデータとして符号化するために、符号長が16ビットとなっている。ESCデータの先頭には、符号長が3ビットのESCヘッダが付加される。
図9(c)は、ライン終端符号の例を示す。ライン終端符号は、2進数の値「1」が12個連なった符号とし、符号データにおけるラインの終端を判定するために用いられる。出現頻度が低いため、長い符号長が割り当てられている。
以下、図10〜図19を用いて、本実施形態に適用可能な符号化方法について説明する。図10は、符号化処理の全体的な流れを示す一例のフローチャートである。ステップS10で、ラインカウンタ155のカウント値IYと符号カウンタ156の符号カウント値Cとをクリアし、それぞれ値「0」とする。ステップS11で、ライン単位に符号化を行う。1ライン分の符号化が終了したら、次のステップS12で処理したラインのカウント値IYをカウントアップする。そして、次のステップS13でカウント値IYが画像の高さで処理したか否かを判定し、処理したと判定された場合、処理を終了する。処理が終了していないと判定された場合は、処理がステップS11に戻される。
図11は、図10のステップS11におけるライン単位の符号化処理の一例のフローチャートを示す。ステップS20で、符号バッファを0すなわち空に初期化し、符号バッファのポインタ値を64ビットに初期化する。
次のステップS21で、画像データ読み込み部151は、メインメモリ130から画像データを16ビット単位に読み込み、MTF符号化処理部152に渡す。MTF符号化処理部152は、次のステップS22で、読み込んだ画像データと一致する辞書データを探索する。
図12は、ステップS22による辞書探索処理の一例のフローチャートを示す。MTF符号化処理部152は、ステップS40でインデクス値Iを0とし、次のステップS41でI番目の辞書データが、図11のステップS21で読み込まれた画像データと一致するか否かを判定する。若し、一致しないと判定した場合、次のステップS42でインデクス値Iを1だけ増加させ、次のステップS43でインデクス値Iが32未満であるか否かを判定する。若し、インデクス値Iが32未満であると判定したら、処理をステップS41に戻す。
一方、ステップS43で、インデクス値Iが32以上であると判定したら、処理をステップS46に移行させてフラグHITFLGの値を0とする。そして、図12のフローチャートによる一連の処理を終了させて処理を図11のフローチャートのステップS23に移行させる。
上述のステップS41で、MTF符号化処理部152が、I番目の辞書データと読み込まれた画像データとが一致すると判定したら、処理をステップS44に移行させ、一致したインデクス値Iを値DICTNUMとし、次のステップS45でフラグHITFLGの値を1とする。
図13を用いて、辞書探索についてより具体的に説明する。例えば読み込んだ画像データの値を「0x5555」として、MTF符号化処理部152は、辞書から、読み込んだ画像データの値と一致する辞書データの値「0x5555」を探索する。この例では、探索の結果、読み込んだ画像データの値が14番目の辞書データと一致することが確認されたため、インデクス値を「14」としている。このインデクス値「14」がMTF符号化処理部152から出力されることになる。MTF符号化処理部152は、読み込んだ画像データと一致する辞書データが存在する場合、フラグHITFLG=1とする。一致する値が辞書に存在しない場合は、フラグHITFLG=0とする。
図11のフローチャートの説明に戻り、ステップS22の辞書探索が終了すると、次のステップS23で、フラグHITFLGに基づき入力画像データと一致する辞書データが存在するか否かが判定される。若し、フラグHITFLG=1であって、入力画像データと一致する辞書データが存在すると判定された場合、処理がステップS24に移行される。
ステップS24では、MTF符号化処理部152からインデクス値が出力され、ハフマン符号化処理部153に渡される。ハフマン符号化処理部153は、MTF符号化処理部152から渡されたインデクス値を、図9を用いて説明した符号フォーマットに従い符号化する。符号化された符号データは、符号バッファに格納される。
図14は、ステップS24におけるインデクス符号化処理の一例のフローチャートを示す。ハフマン符号化処理部153は、ステップS70で、図9(a)に示した符号フォーマットに基づき、値「DICTNUM」でインデクス符号テーブルの符号名を参照して、参照された符号名に対応するインデクス符号を符号データとして求めると共に、当該符号名に対応する符号長を求める。これら符号データおよび符号長を用いて、ステップS71の符号出力処理で符号データの出力を行う。符号出力処理の詳細については、後述する。
図11のフローチャートの説明に戻り、ステップS24によるインデクス符号化処理が終了すると、処理がステップS25に移行される。ステップS25で、MTF符号化処理部152は、辞書の更新処理を行う。図15は、ステップS25における辞書更新処理の一例のフローチャートを示す。MTF符号化処理部152は、ステップS50でインデクス値Iを1とし、次のステップS51で(I−1)番目の辞書データをI番目の辞書データとし、次のステップS52でインデクス値Iを1だけ増加させる。そして、次のステップS53で、MTF符号化処理部152は、インデクス値Iが値DICTNUM未満であるか否かを判定する。若し、インデクス値Iが値DICTNUM未満であると判定したら、処理をステップS51に戻す。一方、インデクス値Iが値DICTNUM以上であると判定したら、処理をステップS54に移行させ、値DICTNUMが示す順番の辞書データを0番目の辞書データとする。ステップS54の処理が終了すると、図15のフローチャートによる一連の処理が終了され、処理が図11のステップS29に移行される。
図16を用いて、辞書の更新処理についてより具体的に説明する。MTF符号化処理部152は、読み込んだ画像データと値が一致する辞書データを辞書の先頭に移動させ、他の辞書データの辞書内での順番を順次繰り下げて辞書を更新する。この例では、読み込んだ画像データが14番目の辞書データと一致したので、辞書の1番目〜14番目の辞書データを1つずつ後方にずらし、一致した画像データを0番目の辞書に格納する。
図11のフローチャートの説明に戻り、上述したステップS23で入力画像データと一致する辞書データが存在しないと判定されたら、処理はステップS26に移行される。ステップS26で、MTF符号化処理部152は、入力画像データに対してESC符号化処理を行なう。ESC符号化処理では、入力画像データがそのまま符号として用いられ、ESC符号が生成される。
図17は、ステップS26におけるESC符号化処理の一例のフローチャートを示す。MTF符号化処理部152は、ステップS75でESCヘッダの値0を符号長が3ビットの符号データとして、次のステップS76の符号出力処理で、符号データおよび符号長を用いて符号データの出力処理を行う。次のステップS77で、ステップS21で読み込まれた画像データを符号データとし、符号長を16ビットとして、次のステップS78の符号出力処理で符号データおよび符号サイズを用いて符号データの出力処理を行う。ステップS76およびステップS78の符号出力処理の詳細については後述する。
図11のフローチャートの説明に戻り、ステップS26でESC符号化処理が行われると、処理はステップS27に移行され、ステップS21で読み込んだデータを画像データとし、次のステップS28で、ESC符号による辞書更新処理が行われる。
図18は、ステップS28におけるESC符号による辞書更新処理の一例のフローチャートを示す。MTF符号化処理部152は、ステップS60で、インデクス値Iを1として、次のステップS61で(I−1)番目の辞書データをI番目の辞書データとし、次のステップS62でインデクス値Iを1だけ増加させる。そして、次のステップS63で、インデクス値Iが32未満であるか否かを判定する。若し、インデクス値Iが32未満であると判定したら、処理をステップS61に戻す。一方、インデクス値Iが32以上であると判定したら、処理をステップS64に移行させ、画像データを0番目の辞書データとする。ステップS64の処理が終了すると、図18のフローチャートによる一連の処理が終了され、処理が図11のステップS29に移行される。
図11のフローチャートの説明に戻り、ステップS25の辞書更新処理またはステップS28のESC辞書更新処理が終了すると、処理がステップS29に移行され、1ライン分のワード数を処理したか否かが判定される。若し、未だ1ライン分を処理していないと判定された場合は、処理はステップS21に戻され、次の1ワード分の処理が行われる。
一方、1ライン分のワード数の処理が終了したと判定された場合、処理はステップS30に移行される。ステップS30で、ハフマン符号化処理部153は、ライン終端符号の符号化を行う。すなわち、値「0xFFF」(=値「0b111111111111」)をライン終端符号の符号データとし、符号長を12ビットとする。次のステップS31で、このライン終端符号に対する出力処理が行われる。符号出力処理については後述する。
次のステップS32で、符号バッファが空か否かが判定される。若し、空であると判定されたら、図11のフローチャートによる一連の符号化処理が終了される。一方、符号バッファが空ではないと判定されたら、処理はステップS33に移行される。ステップS33では、符号バッファ内の符号データが32ビットだけ右シフトされて出力符号バッファに格納され、次のステップS34で、出力符号バッファに格納された符号データが出力される。そして、次のステップS35で符号カウント値Cが1だけ増加され、図11のフローチャートによる一連の処理が終了される。
図19は、上述のステップS31、ステップS71、ステップS76およびステップS78における符号出力処理の一例のフローチャートを示す。符号出力処理は、可変長の符号長の符号データをワードサイズ(この例では32ビット)に纏めて出力する。符号バッファは64ビットであり、符号サイズの長さの可変長の符号データ順次付加していく。符号ポインタは、符号バッファの中の有効な符号の終端を示す。
ステップS80で、ハフマン符号化処理部153は、符号ポインタから符号長を減じた値を新たな符号ポインタとする。すなわち、符号バッファに符号データを付加するために、符号長分、符号ポインタを更新している。次のステップS81で、符号データを符号ポインタで移動させて位置を合わせて、符号バッファに付加する。次のステップS82で、符号ポインタの値が32以下であるか否かを判定する。若し、符号ポインタの値が32を超えていると判定されたら、符号出力処理を終了し、図19のフローチャートによる一連の処理が終了される。
一方、符号ポインタの値が32以下であれば、ステップS83〜ステップS87で、符号バッファの上位32ビットが出力される。すなわち、ステップS83で符号バッファが32ビット右シフトされて出力符号バッファに出力され、次のステップS84で出力符号バッファの内容が出力される。次のステップS85で、符号ポインタに32が加算され、次のステップS86で符号バッファが32ビット左シフトされる。そして、次のステップS87で、符号カウント値Cが1だけ増加され、図19のフローチャートによる一連の処理が終了される。
<復号処理について>
次に、本実施形態による復号処理について説明する。本実施形態では、プリンタ60において、復号処理時に符号データのエラーの有無を検出し、エラーが検出されたら、CPU200に対して割り込みをかけて印字動作を停止させる。例えば、復号する符号データが符号表において有り得ない符号である場合に、エラーがあったとして検出する。
また、所定範囲の符号データを復号した際の復号量が予め指定された指定復号量と異なる場合に、エラーがあったとして検出する。例えば所定範囲が1ラインであって復号量が画素数である場合、符号データが復号された画像による1ラインの画素数が、指定された水平画素数と一致しない場合に、エラーがあったとして検出する。また例えば所定範囲が1ページであって、復号量が1ページにおいて復号された符号長である場合、1ページの符号長が指定された符号長と一致しない場合に、エラーがあったとして検出する。
図20は、本実施形態に適用可能な復号部209の一例の構成を示す。復号部209は、アービタ300、符号アドレス生成部301、レジスタ302および303、復号処理部304、エラー信号生成部305、エラーステータスレジスタ306、ならびに、コントローラ307を有する。コントローラ307は、例えばマイクロプロセッサからなり、図示されないROMに予め記憶されたプログラムに従い、この復号部209の各部の動作を制御する。
アービタ300は、バスI/F207を介してバス213に接続され、メインメモリ230からの符号データの読み込みの調停を行う。符号アドレス生成部301は、メインメモリ230に記憶されるページの符号データを読み出すためのアドレスを生成する。
例えば、復号部209からメインメモリ230に対して符号データの読み出しを要求する際には、コントローラ307の制御により、アービタ300とバスI/F207との間でメモリリクエストおよびメモリACKのやりとりが行われる。その後、符号アドレス生成部301で生成されたメモリアドレスと、読み出しを命令するR/W信号とが、アービタ300からバスI/F207、バス213などを介してメモリコントローラ203に渡される。メモリコントローラ203は、渡されたメモリアドレスおよびR/W信号に従いメインメモリ230から符号データを読み出す。読み出された符号データは、メモリコントローラ203、バス213などを介して復号部209に転送され、リードデータとしてアービタ300に渡される。
復号処理部304は、符号アドレス生成部301で生成されたアドレスに従いメインメモリ230から読み出された符号データをアービタ300から受け取り、受け取った符号データを復号する。符号データが復号された画像データは、エンジンコントローラ210に対して出力される。
ここで、コントローラ307は、印字対象となる画像データの水平画素数を取得する。水平解像度は、例えば、プリンタサーバ50からネットワークを介して転送された、印字の属性データに含まれる用紙サイズ、印字方向(用紙の向き)および印字解像度の情報に基づき取得することができる。それと共に、コントローラ307は、メインメモリ230に記憶される符号データのデータサイズから1ページ分の符号のワード単位の符号長を取得する。符号長は、プリンタサーバ50からネットワークを介してプリンタ60に転送するようにしても良い。コントローラ307は、これら水平画素数および符号長を、それぞれレジスタ302および303に格納する。
復号処理部304は、符号データの復号処理の際に、レジスタ302および303に格納される水平画素数および符号長に基づき、復号している符号データのエラーを検出する。ここでは、符号データのフォーマット上のエラーであるシンタクスエラーと、符号データが復号された結果に対して発生したセマンティクスエラーとが検出される。復号処理部304は、これらシンタクスエラーやセマンティクスエラーが検出された場合に、これらのエラーが検出されたことを示すシンタクスエラー信号やセマンティクスエラー信号を出力する。
また、復号処理部304は、メインメモリ230から符号データが読み込まれると、符号カウント値Cを1だけ増加させ、符号データにエラーが検出された場合に、この符号カウント値Cを出力する。これらシンタクスエラー信号、セマンティクスエラー信号および符号カウント値は、エラー信号生成部305に供給される。
エラー信号生成部305は、復号処理部304からシンタクスエラー信号またはセマンティクスエラー信号が供給されると、符号エラーが発生したことを示すエラー信号を、割り込みコントローラ250に対して出力し、CPU200に対して割り込みをかける。また、検出したエラーのステータスを示すエラーステータス値を、エラーステータスレジスタ306に格納する。例えばエラー信号に応じてCPU200からこの復号部209に対してアクセスがなされた場合に、このエラーステータスレジスタ306に格納されるエラーステータス値がCPU200に対して返される。
図21は、復号処理部304の一例の構成を示す。符号読み込み部310は、アービタ300およびバスI/F207などを介してメインメモリ230から符号データを読み出す。メインメモリ230からの符号データの読み出しは、1ワード単位で行われる。メインメモリ230から読み込まれた符号データは、ハフマン復号処理部311に転送され、図示されない入力符号バッファに格納される。ハフマン復号処理部311は、符号読み込み部から転送された符号データのハフマン符号を、図示されない符号バッファを用いて復号して、MTF復号処理部312に転送する。符号バッファは、図8を用いて説明した構成と同一であるので、ここでの説明を省略する。
MTF復号処理部312は、この例では32個のデータを格納する辞書を持ち、ハフマン復号処理部311から転送された復号データがインデクス値である場合は、復号されたインデクス値により辞書を読み込み、MTF処理により画像データを求め、画像データ書き込み部313に転送する。また、ハフマン復号処理部311から転送された復号データがESCデータの場合は、復号データを直接的に画像データ書き込み部313に転送する。画像データ書き込み部313は、MTF復号処理部312から転送された画像データを図示されないラインメモリに一時的に格納し、画像データをライン単位でエンジンコントローラ210に対して出力する。
符号カウンタ320は、メインメモリ230から読み込まれた1ワードの符号データが入力符号バッファに格納されると、符号カウント値Cを1だけ増加させる。換言すれば、符号カウント値Cは、メインメモリ230における符号データのアドレスを示す。また、符号カウント値Cを1ページ内で累積的に増加させていくことで、復号した符号データの1ページ分の符号長を取得することができる。
ラインメモリカウンタ321は、画像データ書き込み部313が有するラインメモリに書き込まれた画像データを画素単位でカウントし、カウント値LMを出力する。
ここで、ハフマン復号処理部311は、符号データの復号の際に、レジスタ302および303に格納される水平画素数および符号長に基づき、符号データのセマンティクスエラーおよびシンタクスエラーを検出する。ハフマン復号処理部311は、符号データにセマンティクスエラーを検出した場合、その旨示すセマンティクスエラー信号を出力する。同様に、符号データにシンタクスエラーを検出した場合、その旨示すシンタクスエラー信号を出力する。また、セマンティクスエラーまたはシンタクスエラーが検出された場合、符号カウント値Cを出力する。
<エラー検出処理について>
次に、本実施形態による符号データのエラー検出処理について説明する。上述したように、符号のシンタクスエラーと、復号結果のセマンティクスエラーとを検出する。
先ず、シンタクスエラーの検出について、図22を用いて説明する。図22は、上述した図9(a)の符号表に対して、ハフマン木に従った符号長が3ビットから12ビットまでの全ての符号を、符号長および符号名に対応付けて示す。図22に示される符号の中には、ESC符号における符号長3ビットのESCヘッダと、インデクス値「0」〜「31」にそれぞれ対応付けられた符号と、ライン終端符号とが含まれる。また、図22に示される符号のうち、符号「0b111111111011」〜符号「0b111111111110」の4個の符号は、有効な値が割り当てられていない符号である。
復号の際には、未復号の符号の先頭から12ビットを切り取り、この12ビットの符号の先頭から順次ビットの値を判定し符号表の逆変換である逆符号表を参照することで、対応する符号名を取得する。図23は、図9(a)の符号表に対応する逆符号表の例を示す。符号長が3ビット〜12ビットのハフマン符号に基づく符号に対して、符号名と符号長とが対応付けられている。この逆符号表は、インデクス逆符号テーブルとして、例えばMTF復号処理部312が有する図示されないROMに予め格納される。なお、ESCヘッダとライン終端符号とをインデクス逆符号テーブルに含めてもよい。
図23において、符号における「x」は、そのビットが特に規定されないことを示す。すなわち、12ビットに切り取られた符号のうち最初の3ビットを見ることで、その符号が符号名「INDEX00」に対応することが確定する。一方、12ビットに切り取られた符号のうち12ビット全てを見なければ、その符号が符号名「INDEX29」に対応するか否かは確定しない。
ここで、上述したように、符号長が3ビット〜12ビットの符号のうち、符号長が12ビットの4個の符号(「0b111111111011」〜「0b111111111110」)は、ハフマン木としては存在するが、有効な値が割り当てられていない符号である。すなわち、この4個の符号は、上述の逆符号表には含まれておらず、符号データが正常であれば、復号時に出現するはずのない有り得ない符号である。したがって、未復号の符号データの先頭から12ビットを切り取った符号がこの4個の符号の何れかであれば、シンタクスエラーが発生していると判断できる。
次に、セマンティクスエラーの検出について、図24〜図28を用いて説明する。図24は、MTF符号化処理の例をより具体的に示す。なお、図24において、「0x」は、後続する数値が16進表記されていることを示す。画像データは、例えば画素データのデータ長が16ビットであって、16ビット単位で符号化される。先頭すなわち0番目のデータ「0xFFFF」が入力された際には、辞書には何も登録されていないので、この0番目のデータをESC符号化すると共に、このデータ「0xFFFF」を最初のインデクス値「00」に対応付けて辞書データとして辞書に登録する。
次の1番目のデータ「0xFFFF」は、インデクス値「00」の辞書データと一致するため、インデクス値「00」に対応する符号に符号化する。2番目のデータ「0xF333」は、辞書に登録されていないので、ESC符号化すると共に、辞書を更新して辞書の先頭に登録する。3番目のデータ「0x3333」は、辞書に登録されていないので、ESC符号化すると共に、辞書を更新して辞書の先頭に登録する。4番目のデータ「0x3333」は、インデクス値「00」の辞書データと一致するため、インデクス値「00」に対応する符号に符号化する。5番目のデータ「0x3333」は、インデクス値「00」の辞書データと一致するため、インデクス値「00」に対応する符号に符号化する。6番目のデータ「0x333F」は、辞書に登録されていないので、ESC符号化すると共に、辞書を更新して辞書の先頭に登録する。7番目のデータ「0xFFFF」は、辞書のインデクス値「03」の辞書データと一致するため、インデクス値「03」に対応する符号に符号化する。また、この7番目のデータは、ラインの終端のデータであるので、ライン終端符号が付加される。
図25は、図24で説明したように符号化された符号を、具体的な値で示す。図25(a)は、分かりやすいように、元の画像データの区切りを符号に対応させて示すと共に、符号を4ビット毎に纏めて示している。図25(a)を、実際の符号により近い表現を用いて示した例が図25(b)である。このように、画像データの16ビット毎にインデクス符号化またはESC符号化された符号が隙間無く連続的に並べられて、1ライン分の符号データが構成される。各符号は、ハフマン符号の規則に従った可変長符号であるので、符号データの先頭から順に復号する必要がある。
図26は、図25に示した符号データを例に挙げて、MTF符号の復号処理の例をより具体的に示す。本実施形態では、符号データを、未復号部分の先頭から12ビットを切り取って復号処理を行う。符号データから切り取った12ビットの符号の先頭の2ビットおよび12ビット全体から、その12ビットがインデクス符号、ESC符号およびライン終端符号の何れであるかを判定する。
すなわち、先頭の2ビットが値「00」であれば、当該12ビットはESC符号の一部であり、値「00」以外であれば、当該12ビットはインデクス符号またはライン終端符号である。ESC符号であれば、符号データにおける当該12ビットの4ビット目から16ビット分の符号が取り出されてそのまま16ビットの画像データとして用いられ、この16ビットの次のビットが、未復号部分の先頭とされる。
また、当該12ビットが値「1」の連続であれば、当該12ビットは、ライン終端符号である。これら以外の場合、当該12ビットは、インデクス符号である。この場合、当該12ビットに基づき逆符号表を参照して、対応するインデクス符号を探索する。そして、逆符号表において、探索されたインデクス符号に対応付けられた符号名を求め、辞書から、この符号名に対応する辞書データを求め、画像データとする。また、符号データにおいて、探索されたインデクス符号の符号長分を消費した次のビットが、未復号部分の先頭とされる。
図26において、0番目の処理は、未復号部分の先頭からの12ビットの符号が値「0b000111111111」であり、先頭の3ビットが値「0b000」であることから当該符号がESC符号であることが分かる。これにより、ESCヘッダの3ビットに付加された16ビットの符号(この例では値「0b1111111111111111」=値「0xFFFF」)を画像データとして出力し、消費した19ビット分、未復号の符号データの先頭をシフトさせる。また、この値「0xFFFF」の画像データを、符号名「INDEX00」の辞書データとして辞書に登録して辞書を更新する。
1番目の処理は、未復号部分の先頭からの12ビットの符号が0b001000111100」であり、先頭の3ビットが値「001」であることから当該符号が符号名「INDEX00」のインデクス符号を含むことが分かる。これにより、符号名「INDEX00」に対応する辞書データ「0xFFFF」を画像データとして出力し、消費した3ビット分、未復号の符号データの先頭をシフトさせる。
2番目の処理は、未復号部分の先頭からの12ビットの符号が値「0b000111100110」であり、先頭の3ビットが体「0b000」であることから当該符号がESC符号であることが分かる。これにより、ESCヘッダの3ビットに付加された16ビットの符号(この例では値「0b1111001100110011」=値「0xF333」)を画像データとして出力し、消費した19ビット分、未復号の符号データの先頭をシフトさせる。また、この値「0xF333」の画像データを、符号名「INDEX00」の辞書データとして辞書に登録して辞書を更新する。
3番目の処理は、未復号部分の先頭からの12ビットの符号が値「0b000001100110」であり、先頭の3ビットが体「0b000」であることから当該符号がESC符号であることが分かる。これにより、ESCヘッダの3ビットに付加された16ビットの符号(この例では値「0b0011001100110011」=値「0x3333」)を画像データとして出力し、消費した19ビット分、未復号の符号データの先頭をシフトさせる。また、この値「0x3333」の画像データを、符号名「INDEX00」の辞書データとして辞書に登録して辞書を更新する。
4番目の処理は、未復号部分の先頭からの12ビットの符号が値「0b001001000001」であり、先頭の3ビットが値「001」であることから当該符号が符号名「INDEX00」のインデクス符号を含むことが分かる。これにより、符号名「INDEX00」に対応する辞書データ「0x3333」を画像データとして出力し、消費した3ビット分、未復号の符号データの先頭をシフトさせる。
5番目の処理は、未復号部分の先頭からの12ビットの符号が「0b001000001100」であり、先頭の3ビットが値「001」であることから当該符号が符号名「INDEX00」のインデクス符号を含むことが分かる。これにより、符号名「INDEX00」に対応する辞書データ「0x3333」を画像データとして出力し、消費した3ビット分、未復号の符号データの先頭をシフトさせる。
6番目の処理は、未復号部分の先頭からの12ビットの符号が値「0b000001100110」であり、先頭の3ビットが体「0b000」であることから当該符号がESC符号であることが分かる。これにより、ESCヘッダの3ビットに付加された16ビットの符号(この例では値「0b0011001100111111」=値「0x333F」)を画像データとして出力し、消費した19ビット分、未復号の符号データの先頭をシフトさせる。また、この値「0x333F」の画像データを、符号名「INDEX00」の辞書データとして辞書に登録して辞書を更新する。
7番目の処理は、未復号部分の先頭からの12ビットの符号が値「0b100011111111」であり、先頭の4ビットが値「1000」であることから当該符号が符号名「INDEX03」のインデクス符号を含むことが分かる。これにより、符号名「INDEX03」に対応する辞書データ「0xFFFF」を画像データとして出力し、消費した4ビット分、未復号の符号データの先頭をシフトさせる。
8番目の処理は、未復号部文の先頭からの12ビットの符号が値「0b111111111111」であり、当該符号がライン終端符号であることが分かる。そのため、ここでこのラインに対する復号処理を終了する。
次に、復号対象の符号データにエラーが含まれる場合について、図27および図28を用いて説明する。例えば図27(a)に例示されるような符号データを考える。なお、この図27(a)に示される符号データは、図25(a)に示した符号データと同一のデータである。図27(a)の符号データにおいて、位置500A〜500Eは、画像データの境界を示す。
この図27(a)に示される符号データについて、2番目の画像データの符号「0b0001111001100110011」における3ビット目の値が値「0」から値「1」に変化した場合について考える。
この場合、図27(b)に示されるように、符号エラーにより、元の符号「0b0001111001100110011」が符号「0b0011111001100110011」に変化したために、逆符号表に基づき、先頭の3ビット(「001」)で当該符号が符号名「INDEX00」のインデクス符号を含むものと判断される。したがって、図28の2番目における「復号された16ビット単位の画像データ」の項に示すように、符号名「INDEX00」に対応する辞書データを画像データとして出力し、消費した3ビット分、未復号の符号データの先頭をシフトさせることになる。すなわち、符号データにおける2番目の画像データの後端が位置501Aとなり、図27(a)に示した符号エラーの無い場合の2番目の画像データの後端の位置500Aに対してずれてしまう。
新たな未復号の符号データの先頭から12ビットを取り出した符号「0b111100110011」は、先頭の6ビット(「111100」で、当該符号が符号名「INDEX19」のインデクス符号を含むものと判断される。したがって、図28の3番目における「復号された16ビット単位の画像データ」の項に示すように、符号名「INDEX19」に対応する辞書データを画像データとして出力し、消費した6ビット分、未復号の符号データの先頭をシフトさせることになる。ここで、符号名「INDEX19」に対応する辞書データは、未だ辞書に登録されていないため、出力される画像データの値は不定となる。
以下同様にして、符号エラーが存在していても、図27(b)および図28の2番目以降の画像データに例示されるように、逆符号表に従い復号が行われていく。上述したように、符号表は、ハフマン木に従い、符号長が3ビットの符号から12ビットの符号までを、符号長が12ビットの符号の一部を除いてほぼ使い切っている。そのため、エラーにより符号の一部が変化しても、変化後の符号が符号表(逆符号表)上に存在し、復号できてしまう可能性が高い。すなわち、このエラーは、符号フォーマット上のエラーではなく、復号後に発覚するセマンティクスエラーである。
このようなセマンティクスエラーの場合、エラーが無い正しい符号データに対して、復号後の画像データの数が異なっていることが考えられる。図27の例では、図27(a)に例示される符号エラーの無い状態における2番目の画像データ以降のデータ境界の位置500A〜500Eに対して、1ビットの符号エラーが発生した状態では、図27(b)に例示されるように、データ境界の位置が位置501A〜501Hとずれてしまっている。その結果、符号エラーの無い状態で1ラインの画像データ数が8個であったのに対し、符号エラー発生後は1ラインの画像データ数が11個となり、1ビットの符号エラー発生により画像データ数が増加してしまっている。
そこで、復号後のラインの画素数を、1ラインの画素数として予め指定された水平画素数と比較することで、このようなセマンティクスエラーを検出することができる。また、符号エラーが発生していても、画素数には変化が無い場合も考えられる。この場合は、1ページ分の符号長をカウントし、予め指定された1ページ分の符号長と比較することで、セマンティクスエラーを検出することができる。
<復号処理の詳細>
図29は、復号処理の全体的な流れを示す一例のフローチャートである。ステップS100で、復号処理部304は、ラインカウンタのカウント値IYと符号カウンタのカウント値Cとをクリアし、それぞれ値「0」とする。ステップS101で、ラインメモリカウンタ321のカウント値LMをクリアし、値「0」とする。
復号処理部304は、次のステップS102で、ライン単位に復号処理を行う。1ライン分の復号処理が終了したら、次のステップS103でカウント値IYを1だけ増加させ、ステップS104でカウント値IYが画像の高さまで処理したか否かを判定する。画像の高さを示す情報は、印字の属性データに含まれる用紙サイズ、印字方向(用紙の向き)および印字解像度の情報に基づき取得することができる。若し、カウント値IYが画像の高さに達していないと判定されたら、処理がステップS101に戻され、次のラインについて処理が開始される。
一方、ステップS104で、画像の高さまで処理したと判定された場合、処理がステップS105に移行される。ステップS105では、復号処理部304は、符号カウント値Cが指定された符号長より小さいか否かを判定する。若し、小さくないと判定したら、1ページ分の復号処理が終了したとされ、図29のフローチャートによる一連の処理が終了される。
一方、ステップS105で、符号カウント値Cが指定された符号長よりも小さいと判定したら、復号処理部304は、処理をステップS106に移行させる。ステップS106で、ハフマン復号処理部311は、符号エラーが発生したとして、発生したエラーの種類を示すエラーステータスと、符号カウント値Cとを含む割り込み信号をCPU200に入力して、CPU200に対して割り込みをかける。
より具体的には、復号処理部304において、ハフマン復号処理部311は、エラーステータス値をセマンティクスエラーを示す値として、セマンティクスエラーを示す情報であるセマンティクスエラー信号を生成する。そして、生成したセマンティクスエラー信号と符号カウント値Cとをエラー信号生成部305に対して出力する。エラー信号生成部305は、これらセマンティクスエラーを示す情報と符号カウント値Cとを含んだエラー信号を生成し、割り込みコントローラ250に送信する。割り込みコントローラ250は、受信したエラー信号に基づきセマンティクスエラーを示す情報と符号カウント値Cとを含んだ割り込み信号を生成し、この割り込み信号をCPU200に入力してCPU200に割り込みをかける。
なお、CPU200は、上述のステップS106でエラーの検出に伴い割り込みがかけられると、図5に経路Lとして示したように、エンジンコントローラ210を制御して、プリンタエンジン260による印字処理を停止させる。プリンタエンジン260がインクジェット方式の場合には、印字ヘッドを浮かせると共にジェットの噴出を止めることで行うことが考えられる。また、レーザプリンタでは、レーザ照射を停止させることで印字処理を停止させることが考えられる。
これに限らず、印字処理の停止は、例えば復号部209における復号処理を停止させることで行うことができる。プリンタエンジン260に対する印字データの送信を停止させてもよい。
図30は、図29におけるステップS102のライン単位の復号処理をより詳細に示す一例のフローチャートである。ステップS110で、ハフマン復号処理部311は、ハフマン復号処理部311が有する図示されない符号バッファを空(0ビット)に初期化し、符号ポインタを64ビットに初期化する。
次のステップS111で、符号入力処理により符号データが読み込まれ、符号バッファの先頭から詰め込まれる。次のステップS112で、ハフマン復号処理部311は、符号バッファを52ビット右シフトさせる。これにより、符号バッファに格納された符号データから12ビット分の符号データが切り取られる。次のステップS113で、ハフマン復号処理部311は、ステップS112で切り取った12ビット分の符号データの値が値「0xFFF」(=「0b111111111111」)であるか否か、すなわち、当該12ビット分の符号データがライン終端符号であるか否かを判定する。若し、ライン終端符号ではないと判定したら、処理をステップS114に移行させる。
ステップS114で、ハフマン復号処理部311は、ステップS112で切り取った12ビット分の符号データの値が、値「0xFFB」(=「0b111111111011」)未満であるか否かを判定する。すなわち、このステップS114で、当該12ビット分の符号データが、図22を用いて説明した「有り得ない符号」であるか否かを判定する。当該12ビット分の符号データの値が値「0xFFB」以上であって、且つ、値「0xFFF」未満である場合に、当該12ビット分の符号データが「有り得ない符号」であると判定でき、シンタクスエラーが検出される。なお、当該12ビット分の符号データの値が値「0xFFF」未満であるか否かは、上述のステップS113の判定により知ることができる。
ハフマン復号処理部311は、若し、ステップS114で、当該12ビット分の符号データの値が値「0xFFB」未満であると判定したら、処理をステップS115に移行させ、符号バッファを61ビット右シフトさせて符号データの先頭の3ビットを切り出す。次のステップS116で、ハフマン復号処理部311は、切り出した3ビットの符号データの値が値「0」すなわち値「0b000」であるか否かを判定する。当該3ビットの符号データの値が値「0」であれば、この3ビットに続く符号データがESC符号であることを示し、値が値「0」以外であれば、この3ビットに続く符号データがインデクス符号であることを示す。
ハフマン復号処理部311は、若し、ステップS116で当該3ビットの符号データの値が値「0」であると判定したら、処理をステップS118に移行させる。ステップS118では、MTF復号処理部312により、ESC符号の復号処理が行われる。一方、値「0」以外であると判定したら、処理をステップS117に移行させる。ステップS117では、MTF復号処理部312により、インデクス符号の復号処理を行う。ステップS117またはステップS118による復号処理が終了したら、処理がステップS111に戻され、次の符号が入力される。
ハフマン復号処理部311は、上述のステップS113で、符号データの値が値「0xFFF」であると判定したら、処理をステップS120に移行させる。ステップS120で、ハフマン復号処理部311は、ラインメモリカウンタ321からカウント値LMを取得し、このカウント値LMが指定された水平画素数未満であるか否かを判定する。指定された水平画素数は、レジスタ304から読み込んで取得する。若し、カウント値LMが指定された水平画素数未満であると判定されたら、処理をステップS121に移行させる。
また、ハフマン復号処理部311は、ステップS120で、ラインメモリカウンタ321のカウント値LMが指定された水平画素数以上であると判定したら、処理をステップS122に移行させる。ステップS122では、符号カウンタ320から符号カウント値Cを取得し、この符号カウント値Cが指定された符号長を超えるか否かが判定される。指定された符号長は、レジスタ303から読み込んで取得する。若し、ステップS122で、符号カウント値Cが指定された符号長を超えると判定したら、処理をステップS121に移行させる。
ステップS121で、ハフマン復号処理部311は、セマンティクスエラーによる符号エラーが発生したとして、発生したエラーの種類を示すエラーステータスと、符号カウント値Cとを含む割り込み信号をCPU200に入力して、CPU200に対して割り込みをかける。CPU200は、この割り込みに応じて、上述したようにして例えばエンジンコントローラ210を制御して印字処理を停止させる。CPU200に対して割り込みをかける処理は、図29のステップS106で説明した処理と同様なので、詳細な説明を省略する。
一方、上述のステップS122で、符号カウント値Cが指定された符号長を超えないと判定したら、この図30のフローチャートによる一連の処理を終了させ、処理を図29のステップS103に移行させる。
また、上述したステップS114で、符号データの値が値「0xFFB」以上であると判定したら、処理をステップS119に移行させる。この場合は、ステップS112で切り出した符号データが逆符号表に無い符号すなわち「有り得ない符号」であることを意味する。そのため、ステップS119で、ハフマン復号処理部311は、シンタクスエラーによる符号エラーが発生したとして、発生したエラーの種類を示すエラーステータスと、符号カウント値Cとを含む割り込み信号をCPU200に入力して、CPU200に対して割り込みをかける。CPU200は、この割り込みに応じて、上述したようにして例えばエンジンコントローラ210を制御して印字処理を停止させる。CPU200に対して割り込みをかける処理は、図29のステップS106で説明したセマンティクスエラーの場合と同様なので、詳細な説明を省略する。
図31は、上述したステップS111の符号入力処理を示す一例のフローチャートである。最初のステップS160で、ハフマン復号処理部311は、符号ポインタの値が32以上か否かを判定する。若し、符号ポインタの値が1ワード分すなわち32未満であると判定したら、処理をステップS165に移行させる。一方、符号ポインタの値が32以上であると判定したら、処理をステップS161に移行させる。
ステップS161で、符号読み込み部310は、メインメモリ230の符号カウント値Cが示すアドレスから符号データを読み込み、ハフマン復号処理部311の入力符号バッファに対して格納する。そして、次のステップS162で、符号カウント値Cを1だけ増加させ、ステップS163で符号ポインタの値から32を減じて新たな符号ポインタの値とする。そして、次のステップS164で、入力符号バッファの符号データを、符号ポインタが示す位置に合わせて符号バッファに追加して、処理をステップS165に移行させる。
ステップS165で、ハフマン復号処理部311は、符号カウント値Cが指定された符号長を超えたか否かを判定する。指定された符号長の情報は、レジスタ303から取得する。若し、超えていないと判定されたら、この図31のフローチャートによる一連の処理を終了して、元のフローチャートの処理に戻る。
一方、ステップS165で、ハフマン復号処理部311は、符号カウント値Cが指定された符号長を超えたと判定したら、処理をステップS166に移行させる。この場合、符号データにセマンティクスエラーが発生していると考えられる。そのため、ステップS166では、上述のステップS106などと同様にして、エラーステータスをセマンティクスエラーとして、シンタクスエラーを示す情報であるシンタクスエラー信号と符号カウント値Cとからエラー信号生成部305でエラー信号を生成し、CPU200に対して割り込みをかける。CPU200は、割り込みがかけられると、上述したようにして印字処理を停止させる。
図32は、上述したステップS118におけるESC符号の復号処理を示す一例のフローチャートである。ステップS130で、符号バッファが3ビット左シフトされると共に、符号ポインタの値が3だけ減ぜられてESCヘッダが取り除かれる。そして、次のステップS131で図31を用いて説明したようにして符号入力処理が行われ、ハフマン復号処理部311の符号バッファから符号データがMTF復号処理部312に入力される。次のステップS132で、ハフマン復号処理部311は、符号バッファを48ビット右シフトさせて16ビット分の符号データを切り出す。次のステップS133で、符号バッファが16ビット左シフトされると共に、符号ポインタの値から16ビットが減ぜられて符号ポインタが更新される。
次のステップS134で、ステップS132で切り出された16ビット分の符号データが画像データとして出力される。この画像データは、画像データ書き込み部313に供給され、図示されない画像ラインメモリに格納される。画像データが画像ラインメモリに格納されると、ラインメモリカウンタのカウント値LMが1だけ増加される。
次のステップS136で、ラインメモリカウンタ321のカウント値LMが指定された水平画素数を超えたか否かが判定される。若し、超えていないと判定されたら、この図31のフローチャートによる一連の処理が終了され、処理が図29のフローチャートのステップS111に戻される。
一方、ステップS136で、ハフマン復号処理部311は、カウント値LMが指定された水平画素数を超えたと判定したら、処理をステップS137に移行させる。この場合、符号データにセマンティクスエラーが発生していると考えられる。そのため、ステップS137では、上述のステップS106などと同様にして、エラーステータスをセマンティクスエラーとして、シンタクスエラーを示す情報であるシンタクスエラー信号と符号カウント値Cとからエラー信号生成部305でエラー信号を生成し、CPU200に対して割り込みをかける。CPU200は、割り込みがかけられると、上述したようにして印字処理を停止させる。
図33は、上述したステップS117におけるインデクス符号の復号処理を示す一例のフローチャートである。ステップS140で、ハフマン復号処理部311は、符号バッファを52ビット右シフトさせる。これにより、符号データから12ビットが切り出されてアドレス値とされる。次のステップS141で、上述した図23に例示されるインデクス逆符号テーブルにおける符号をアドレス値で参照する。これにより、アドレス値に対応する符号名が求められ、この符号名が示す値を値DICTNUMとする。それと共に、アドレス値に対応する符号長を求める。
次のステップS142で、符号バッファを、求められた符号長だけ左シフトさせると共に、符号ポインタの値から符号長を減じて新たな符号ポインタとし、符号ポインタを更新する。そして、次のステップS143で、図34に例示されるようにして値DICTNUMをインデクスとして辞書をアクセスして辞書データを求め、ステップS144で辞書を更新する。ステップS145で、MTF復号処理部312は、ステップS143で求められた辞書データを画像データとして出力する。図34の例では、値DICTNUM=14に対応する辞書データ「0x5555」を画像データとして出力する。
画像データが出力されると、ステップS146で、ラインメモリカウンタ321のカウント値LMが1だけ増加される。そして、次のステップS147で、MTF復号処理部312は、カウント値LMが指定された水平画素数を超えたか否かを判定する。若し、超えていないと判定したら、この図33のフローチャートによる一連の処理が終了され、処理が図30のフローチャートのステップS111に戻される。
一方、ステップS147で、ハフマン復号処理部311は、カウント値LMが指定された水平画素数を超えたと判定したら、処理をステップS148に移行させる。この場合、符号データにセマンティクスエラーが発生していると考えられる。そのため、ステップS148では、上述のステップS106などと同様にして、エラーステータスをセマンティクスエラーとして、シンタクスエラーを示す情報であるシンタクスエラー信号と符号カウント値Cとからエラー信号生成部305でエラー信号を生成し、CPU200に対して割り込みをかける。CPU200は、割り込みがかけられると、上述したようにして印字処理を停止させる。
<エラー表示について>
上述のようにして符号エラーが検出された際に、印字動作を停止させると共に、符号エラーが発生した旨をユーザに通知できるようにすると、好ましい。以下では、プリンタ60における表示によってエラー発生を通知する例について説明する。図35は、プリンタ60において、入力部221およびディスプレイ229を組み合わせて構成されるオペレーションパネル400の一例の外観を示す。オペレーションパネル400に対し、表示部401が設けられると共に、ボタン群410および413、ならびに、スタートボタン412などの操作子が設けられる。
表示部401は、ディスプレイ229と、入力部221の押圧された位置に対応する信号を出力する操作子とが一体的に構成された所謂タッチパネルからなる。ボタン群410および413、ならびに、スタートボタン412は、入力部221に対応し、ユーザ入力を受け付ける。ボタン群410は、例えば初期設定やプリンタ60の機能を選択する複数の操作子を含む。ボタン群413は、テンキー411を含み、数値の入力、入力された数値などのリセット、予熱の切り替え、停止操作を行う複数の操作子を含む。
スタートボタン412は、印字動作の開始を指示する。例えば、スタートボタン412が操作されることで、メインメモリ230から符号データが読み出されて復号部209で復号され、符号データが復号された画像データがエンジンコントローラ210に供給されてプリンタエンジン260が駆動され、印字が開始される。これに限らず、印字動作は、プリンタサーバ50から転送される印字開始コマンドにより開始させることもできる。
図36は、表示部401に表示される、通常の操作画面の一例を示す。通常の操作画面においては、出力形式選択領域420と、入力形式選択領域421とが設けられる。入力形式選択領域421は、印字データの入力先を指定できる。出力形式選択領域420は、印字用紙(サイズ、向きなど)の指定、印字の際の倍率指定などを行うことができる。
図37は、符号エラーが検出された際の表示部401に対するエラー表示の一例を示す。図37の例では、エラーが検出された旨を通知するエラー通知表示430と、エラーの原因を通知するエラー原因通知表示431が表示部401に表示される。これらエラー通知表示430およびエラー原因通知表示431は、図37に例示するように表示部401の全面に表示させてもよいし、表示部401の一部に表示させてもよい。
すなわち、復号部209において、符号データのエラーが検出されると、上述したように、復号部209からエラーステータス値を含むエラー信号が出力され、このエラー信号に基づき図5の経路Kに従ってCPU200に対して割り込みがかけられる。CPU200は、この割り込みに応じてエンジンコントローラ210を制御して印字動作を停止させる。それと共に、CPU200は、エラー通知表示430およびエラー原因通知表示431を表示させるための表示制御信号を生成し、この表示制御信号を経路Mに従いディスプレイコントローラ228に転送する。ディスプレイコントローラ228は、受信した表示制御信号に従いディスプレイ229を駆動して、表示部401に対してエラー通知表示430およびエラー原因通知表示431を表示させる。
なお、エラーの通知は、表示部401に対する表示で行うのに限られない。例えば、LED(Light Emitting Diode)などを用いて、エラーの通知を行うための専用の表示部を設けてもよいし、音声出力部を設けて音声でエラー通知を行ってもよい。さらに、エラー通知は、プリンタサーバ50で行うようにしてもよい。例えば、CPU200は、エラー信号に基づく割り込みによりエラー通知信号を生成し、このエラー通知信号をネットワークを介してプリンタサーバ50に転送し、CPU100に渡す。CPU100は、このエラー通知信号に応じて例えばディスプレイ109に対してエラー表示を行う。
以上説明したように、本実施形態によれば、符号データのシンタクスエラーまたはセマンティクスエラーを検出し、これらのエラーが検出された際に、印字処理を停止するようにしている。そのため、符号データにエラーが存在しても、プリンタの印字機構に負荷をかけることが防がれる。また、エラーが存在する符号データにより印字品質が劣化することを防止することができる。
なお、本実施形態は、階調処理後の少値画像データの符号化および復号処理、階調処理前の多値画像データの符号化および復号処理の何れにも適用可能である。また、上述では、画像データの符号化方式としてMTF符号化方式を用いているが、これはこの例に限定されない。例えば、同値のデータが連続する数(ランレングス)を求めるランレングス符号化方式を本実施形態による画像データの符号化方式に適用することも可能である。
さらに、上述では、画像データの印字のみを行うプリンタ60を例として説明したが、これはこの例に限定されない。例えば、プリンタ機能、スキャナ機能、コピー機能、FAX機能を1の筐体で実行可能な複合機に、本実施形態を適用することもできる。