以下、本発明を実施するための形態について図面を用いて説明する。
<画像形成システムの構成>
図1は、本実施形態における画像形成システムの構成を示す図である。図1に示すように、本実施形態における画像形成システムは、画像形成装置100と、イーサネット(登録商標)等のLAN(Local Area Network)160を介して画像形成装置100と接続されているホストコンピュータ(PC)170および175を備える。
画像形成装置100は、リーダー装置120、プリンタ装置130、操作表示部140および画像記憶部150、ならびにこれら各構成要素を制御する制御装置(コントローラ部)110を含む。
制御装置110は、CPU112、ROM114、RAM116等を有し、CPU112がROM114、RAM116、または他の記憶媒体に格納されたプログラムに基づいて、画像形成装置100全体を統括制御する。例えば、制御装置110は、CPU112に、それぞれPDL解釈処理、ディスプレイリスト生成処理、及びレンダリング処理等を行うためのあらかじめ決められたプログラムをロードする構成をとる。またレンダリング処理に関しては、ここでは記述しないが専用のハードウェアを利用しても構わない。
プリンタ装置130は、画像データの出力を行う。操作表示部140は、画像出力処理を行うための各種印刷設定の操作を行うキーボード、及び画像出力設定を行う操作ボタン等の表示を行う液晶パネルを備える。画像記憶部150は、画像データやドキュメントデータ、印刷装置制御言語(例えば、ESCコード、PDL(Page Description Language))などの印刷データを格納することができる。例えば、画像記憶部150は、LAN160を介してホストコンピュータ(PC)170より受信した画像データ、ドキュメントデータおよびPDL、ならびにリーダー装置120を制御して読み込む画像データ等を格納することができる。本実施形態では、画像形成装置100を説明するのにMFP(Multi Function Printer)を例として用いた。もちろん、SFP(Single Function Printer)やLBP(Laser Beam Printer)、その他のプリント方式のプリンタでもよいことは言うまでもない。
<画像形成装置100において動作するソフトウェアモジュールの構成>
図2は、本実施形態における画像形成装置100の制御装置110において動作するソフトウェアモジュールの構成を示す図である。これらソフトウェアは、画像形成装置100におけるROM114にて保存され、起動時に、RAM116へ展開され、CPU112によって実行されることで動作する。
ジョブ制御部200は、印刷ジョブの入力から出力を関数コールやメッセージ通信などの手段によって制御する。
PDL解析部201、202、203は、画像形成装置100に搭載されるPDLの種類(例えば、PostScript、PCL、XPSなど)だけの数が存在する。PDL解析部201、202、203は、ジョブ制御部200からの制御に従い、PDL受信バッファ(図示せず)に格納されたPDLデータを読み込み、解釈処理を実行する。
ディスプレイリスト(Display List)生成部210は、ジョブ制御部200からの制御とPDL解析部201、202、203から渡された描画情報により処理を実行し、生成したディスプレイリストをメモリに格納する。
レンダリング処理部220は、RAM116からディスプレイリストをロードし、レンダリング処理を実行することでディスプレイリストをイメージデータに変換し、画像記憶部150へ出力する処理を行う。
画像処理部230は、画像記憶部150から描画ビットマップイメージおよび属性ビットマップイメージをロードし、属性に応じた最適な画像処理パラメーターで画像処理を実行する。画像処理と合わせてコントーンイメージデータをハーフトーンイメージデータに変換し、画像記憶部150へ出力する処理を行う。
<画像形成装置100において動作する描画補正処理ソフトウェアモジュールの構成>
図3は本実施形態におけるPDL解析部201、202、203に含まれる描画補正処理ソフトウェアモジュールの構成を示す図である。
描画命令受付部310は、PDLに含まれる描画命令を受付ける。
補正対象決定部320は、描画領域特定部321、最前面描画命令特定部322、隣接性判定部323、連続性判定部324、描画ルール判定部325を含み、描画命令受付部310が受付けた描画命令から補正対象となる描画処理を決定する。
描画領域特定部321は、描画命令の領域配置の情報から、描画命令の描画領域を特定する。なお描画命令の描画領域は、描画命令によって描画されるオブジェクトの描画されるべき領域のことである。
最前面描画命令特定部322は、描画命令の描画領域の情報を用いて、最前面の描画命令を特定する。隣接性判定部323は、描画命令の領域的な隣接性を判定する。連続性判定部324は、連続する描画命令から、最前面の描画命令が全て隣接する最大の単位を特定する。描画ルール判定部325は、描画命令の描画ルールを判定する。なお、描画命令の描画ルールは、その描画命令に従って描画される画像の描画ルールであるため、画像の描画ルールと呼ぶこともある。
描画命令補正部330は、描画命令実行順序変更部331、描画命令結合部332、描画命令スキップ部333、描画命令補間部334を含み、補正対象決定部320が補正対象として特定した描画命令に補正処理を行う。描画命令実行順序変更部331は、背面の描画命令を先に実行した後に、最前面の描画命令を実行するように描画命令の実行順序を変更することにより補正する。描画命令結合部332は、最前面の描画命令を結合することにより補正する。描画命令スキップ部333は、背面の描画処理をスキップすることにより補正する。描画命令補間部334は、描画命令の境界部分の画素を最前面の描画命令のいずれかで塗りつぶすことにより補正する。
描画命令実行部340は、描画命令補正部が補正した描画処理を実行する。
なお、これらの描画補正処理ソフトウェアは、PDL解析部201、202、203ではなく、ディスプレイリスト生成部210、レンダリング処理部220、画像処理部230にて実装してもよい。また、複数のモジュールに分散して実装してもよいし、専用のハードウェアを利用しても構わない。これらの描画補正処理ソフトウェアの処理の詳細は、図9から図11を参照して後述する。
<画像形成装置100の描画ルール>
図8は、本実施例における画像形成装置100の描画ルールを説明するための図である。描画ルールの例としては、図8に挙げた交差ルール、中心ルール、左上ルール、左辺ルールなどがあるが、この他のルールでも構わない。図8に示す画素801から812の大きさは画像形成装置100の解像度に依存する。通常は、画像形成装置100の解像度が600dpiであるの場合に、画素の大きさは1/600=0.00167inchとなる。また、画像形成装置100の解像度が1200dpiである場合、画素の大きさは1/1200=0.00083inchとなる。図8に示すオブジェクト820は描画命令によって描画されるオブジェクトを表し、画素801から812に部分的にかかっている。
交差ルールでは、オブジェクト820は、オブジェクト820の領域にわずかでも交差する画素を塗りつぶす。よって、オブジェクト820は画素801、802、803を塗りつぶす。
中心ルールでは、オブジェクト820は、画素の中心がオブジェクト820の領域内にある画素のみを塗りつぶす。よって、オブジェクト820は画素805、806を塗りつぶすが、画素804は塗りつぶさない。
左上ルールでは、オブジェクト820は、画素の左上の頂点がオブジェクト820の領域内にある画素のみを塗りつぶす。よって、オブジェクト820は画素807を塗りつぶすが、画素808、809は塗りつぶさない。
左辺ルールでは、オブジェクト820は、画素の左辺がオブジェクト820の領域に包含される画素、および画素の左辺がオブジェクト820の領域とわずかでも交差する画素を塗りつぶす。よって、オブジェクト820は画素810、811を塗りつぶすが、画素812は塗りつぶさない。
本実施例では、ラインやテキスト、グラフィックのオブジェクトは交差ルールで描画し、イメージのオブジェクトは中心ルールで描画する。これにより、描画命令の属性情報によって描画ルールを判定することができる。しかし、本発明の対象は、ページ内に複数の描画ルールが混在するものであればこれに限定されるものではなく、例えば描画命令ごとに描画ルールを指定してもよいし、その他の条件で描画ルールを切り替えるようにしてもよい。また、上記で説明した描画ルールに限定されるものでもない。
(実施例1)
以下、発明を実施するための形態のうち、実施例1に特有の処理について説明する。なお、実施例1は、オブジェクト画像の分割処理に起因する画像不正が発生しうる条件を判定し、描画命令の実行順序を変更するか、もしくは最前面の描画命令を結合することにより、画像不正のないオブジェクト画像を生成する。
<画像形成装置100の描画処理>
図9は、本実施例における画像形成装置100の描画処理を示すフローチャートである。
図9の描画処理では、変数として、現在処理対象としている最新の描画命令を格納する処理対象描画命令cur_inst、および直前に処理した描画命令を格納する直前描画命令prev_instを使用する。また、キューとして、一時キューtmp_que、前景キューfg_que、背景キューbg_queを使用する。一時キューtmp_queは描画命令を一時的にスプールするキューであり、最前面の描画命令が見つかるまでの間、描画命令の実行を保留するために使用される。最前面の描画命令が見つかると、一時キューtmp_queの描画命令は背面の描画命令として背景キューbg_queに移動され、最前面の描画命令は前景キューfg_queに追加される。前景キューfg_queは、最前面の描画命令をスプールするキューであり、最前面の描画命令が継続して隣接している間に限り、最前面の描画命令の実行を保留するために使用される。背景キューbg_queは、背面の描画命令をスプールするキューであり、前景キューfg_queと同じ期間だけ背面の描画命令の実行を保留するために使用される。このように背面の描画命令と最前面の描画命令の実行を保留し、分離してスプールすることにより、描画命令の実行順序を変更したり、最前面の描画命令のみを選択的に結合したりすることが可能となる。
図9のフローチャートに示す描画処理は、RAM116に格納されたプログラムを実行したCPU112によって実行される。なお、描画処理はページごとに実行される。以下、描画処理の各ステップの処理について説明する。
ステップS901では、CPU112が、以降の処理で使用する変数およびキュー等を初期化する。すなわち、直前描画命令prev_instをNULLで初期化し、一時キューtmp_que、背景キューbg_que、前景キューfg_queをクリアして空にする。
ステップS902では、CPU112が、次の描画命令があるか否か判定する。次の描画命令がある(YES)と判定した場合は、次の描画命令を読み込んで、ステップS903に進む。次の描画命令がない(NO)と判定した場合はステップS916に進む。
ステップS903では、CPU112が、処理対象描画命令cur_instの値を、ステップS902で読み込んだ描画命令に設定する。
ステップS904では、CPU112が、直前描画命令prev_instがNULLであるか否かを判定する。NULLである(YES)と判定した場合は、ステップS907に進む。NULLでない(NO)と判定した場合はステップS905に進む。
ステップS905では、CPU112が、直前描画命令prev_instの描画領域が、処理対象描画命令cur_instの描画領域に含まれるか否かを判定する。描画領域が同一である場合も、含まれるものとして判定する。含まれる(YES)と判定した場合はステップS906に進む。含まれない(NO)と判定した場合はステップS908に進む。本ステップの処理により、描画命令の描画領域が直後の描画命令の描画領域に含まれるか否かを判定することができ、含まれる場合は背面の描画命令として、含まれない場合は最前面の描画命令として、判定することができる。
ステップS906では、CPU112が、直前描画命令prev_instに格納した描画命令(ステップS905で特定した背面の描画命令)を一時キューtmp_queに追加する。
ステップS907では、CPU112が、直前描画命令prev_instの値を、処理対象描画命令cur_instに格納した描画命令に設定する。
ステップS902からステップS907までの処理により、背面の描画命令がtmp_queに格納される。一方、ステップS905でNOとなった時点で、直前描画命令prev_instの値は、最前面の描画命令と判定され、処理はステップS908に進む。
ステップS908では、直前描画命令prev_instの描画ルール(ステップS905で特定した最前面の描画命令の描画ルール)が交差ルールであるか否かを判定する。本実施例では、描画ルールは描画命令の属性情報と対応するため、本ステップの判定は、直前描画命令prev_instの属性情報が、ライン、テキスト、グラフィックのいずれかである場合は交差ルールであると判定することにより行われる。最前面の描画命令の描画ルールが交差ルールである場合に、当該最前面の描画命令と直前の最前面の描画命令との境界部分(共通輪郭)における画素は、必ず当該最前面の描画命令で塗りつぶされることになるため、画像不正は生じない。そのため、当該最前面の描画命令およびその描画領域に含まれる背面の描画命令と、その前の描画命令との間の実行順序の変更は行わなくてもよい。一方、最前面の描画命令の描画ルールが交差ルールでない場合に、オブジェクト画像の分割処理に起因する画像不正が発生しうる(前景画像の輪郭の画素において前景画像を用いず背景画像を用いた不正描画が行われる可能性がある)と判定する。本ステップでは、交差ルールである(YES)と判定した場合にステップS911に進み、交差ルールでない(NO)と判定した場合にステップS909に進む。
なお、本ステップの判定処理をスキップしてステップS909に進んでもよい。また、ここで、交差ルールと中心ルールが混在する場合に最前面の描画命令の描画ルールが交差ルールであれば画像不正を生じないと判定することを説明したが、本ステップで、画像不正を生じない他の判定方法を用いてもよい。例えば、左上ルールと中心ルールが混在し、かつ、描画命令がページの下から上に向かって描画された場合は、最前面の描画命令の描画ルールが左上ルールであれば画像不正は生じないため、そのような場合にはステップS911に進むように制御してもよい。
ステップS909では、CPU112が、前景キューfg_queが空であるか否かを判定する。空である(YES)と判定した場合、ステップS913に進む。空でない(NO)と判定した場合、ステップS910に進む。
ステップS910では、CPU112が、直前描画命令prev_instの描画領域(ステップS905で特定した最前面の描画命令の描画領域)が、前景キューfg_queに格納された描画命令の描画領域に隣接するか否かを判定する。ここで、描画領域が隣接するとは、空間的に隣り合う描画命令で描画されるオブジェクトの輪郭の一部の区間が完全に同じ座標である状態を意味し、例えば、隣り合う2つの矩形(バンド単位の画像)の一辺の座標が一致している場合などが該当する。例えば、イメージ描画命令502、504は、その描画命令で描画されるイメージ602、604の輪郭の一部の区間が(X=100.9,Y=200.6)と(X=300.6,Y=200.6)とを結ぶ線分で一致しているため、隣接している。一方、グラフィック描画命令501、503は、その描画命令で描画されるグラフィック601、603の輪郭に同じ座標である区間を持たないため、隣接していない。輪郭の一部の区間が同じ座標であればよく、それ以外の領域が重なっていたりしてもよい。
ステップS910の処理により、ステップS905で特定した最前面の描画命令が互いに隣接するか否かを判定すること(隣接する前景画像を検出すること)ができる。最前面の描画命令が隣接していない場合に、オブジェクト画像の分割処理に起因する画像不正が発生することはないため、当該最前面の描画命令およびその描画領域に含まれる背面の描画命令と、その前の描画命令との間の実行順序の変更は行わなくてもよい。ステップS910では、隣接する(YES)と判定した場合に、ステップS913に進み、隣接していない(NO)と判定した場合に、ステップS911に進む。具体的には、最前面の描画命令が互いに隣接していないと判定した場合に、ステップS911以降の処理で、スプールした描画命令を実行およびクリアする処理を行い、その後で、描画命令のスプールを新たに開始する。最前面の描画命令が互いに隣接すると判定した場合に、ステップS913以降の処理で、描画命令のスプールを継続する。このような構成により、最前面の描画命令が全て隣接する一連の描画命令の最大の単位に処理を適用することができ、描画命令の一体性の判定の精度を向上することができる。また、最前面の描画命令が隣接していない場合に、描画命令のスプールを新たに開始するため、描画命令をページ全体にわたってスプールする手法に比べて、高速かつ省メモリで処理することができる。
ステップS911では、CPU112が、背景キューbg_queの描画命令を実行してクリアする。ここで、CPU112は、背景キューbg_queに格納した順に描画命令を実行する。
ステップS912では、CPU112が、前景キューfg_queの描画命令を実行してクリアする。ここで、CPU112は、前景キューfg_queに格納した順に描画命令を実行する。他の実施例としては、CPU112が、前景キューfg_queの描画命令を結合し、新たな描画命令を生成して実行するようにしてもよい。
ステップS911、ステップS912の処理により、スプールした描画命令について、背面の描画命令をまとめて実行し、その後で、最前面の描画命令をまとめて実行することができる。本ステップの処理により、最前面の描画命令が背面の描画命令より後に実行されるようになり、画像不正のないオブジェクト画像を生成することができる。
ステップS913では、CPU112が、背景キューbg_queに一時キューtmp_queを結合する。この処理は、背景キューbg_queの最後に一時キューtmp_queに格納された描画命令を追加することによって行われる。
ステップS914では、CPU112が、一時キューtmp_queをクリアして空にする。
ステップS915では、CPU112が、直前描画命令prev_instに格納した描画命令を前景キューfg_queに追加する。
ステップS908からステップS915までの処理により、背面の描画命令を背景キューbg_queに、最前面の描画命令を前景キューに格納することができる。そして、最前面の描画命令の隣接性を判定し、最前面の描画命令が隣接していないと判定した時点で、背面の描画命令をまとめて実行した後に、最前面の描画命令をまとめて実行するよう、描画命令の実行順序を変更して実行することができる。
ステップS916では、CPU112が、背景キューbg_queの描画命令を実行してクリアする。ここで、CPU112は、背景キューbg_queに格納した順に描画命令を実行する。
ステップS917では、CPU112が、一時キューtmp_queの描画命令を実行してクリアする。ここで、CPU112は、一時キューtmp_queに格納した順に描画命令を実行する。
ステップS918では、CPU112が、前景キューfg_queの描画命令を実行してクリアする。ここで、CPU112は、前景キューfg_queに格納した順に描画命令を実行する。他の実施例としては、CPU112が、前景キューfg_queの描画命令を結合し、新たな描画命令を生成して実行するようにしてもよい。
ステップS919では、CPU112が、直前描画命令prev_instに格納した描画命令を実行する。本ステップが終了すると、CPU112は、描画処理を終了する。
本実施例の描画処理フローで図5のグラフィック描画命令を処理することにより、画像不正のないオブジェクト画像を生成することができる。
グラフィック描画命令501についての処理においては、ステップS902でグラフィック描画命令501が次の描画命令であると判定し、ステップS903で処理対象描画命令cur_instの値をグラフィック描画命令501に設定する。そして、ステップS904で直前描画命令prev_instがNULLであると判定し、ステップS907に進む。ステップS907で直前描画命令prev_instの値を、処理対象描画命令cur_instに格納したグラフィック描画命令501に設定する。グラフィック描画命令501についての処理が終了すると、フローはステップS902に戻る。
イメージ描画命令502についての処理においては、ステップS902でイメージ描画命令502が次の描画命令であると判定し、ステップS903で処理対象命令cur_instの値をイメージ描画命令502に設定する。この時点で、処理対象命令cur_instの値がイメージ描画命令502となり、直前描画命令prev_instの値がグラフィック描画命令501となる。そして、ステップS904で直前描画命令prev_instがNULLではないと判定し、ステップS905に進む。ステップS905で直前描画命令prev_instの描画領域が処理対象命令cur_instの描画領域に含まれることから、直前描画命令prev_instに格納したグラフィック描画命令501を背面の描画命令と特定し、ステップS906に進む。ステップS906では、直前描画命令prev_instに格納したグラフィック描画命令501を一時キューtmp_queに追加する。そして、ステップS907では、直前描画命令prev_instの値を、処理対象描画命令cur_instに格納したイメージ描画命令502に設定する。イメージ描画命令502についての処理が終了すると、フローはステップS902に戻る。
グラフィック描画命令503についての処理においては、ステップS902でグラフィック描画命令503が次の描画命令であると判定し、ステップS903で処理対象命令cur_instの値をグラフィック描画命令503に設定する。この時点で、処理対象命令cur_instの値がグラフィック描画命令503となり、直前描画命令prev_instの値がイメージ描画命令502となる。そして、ステップS904で直前描画命令prev_instがNULLではないと判定し、ステップS905に進む。ステップS905で直前描画命令prev_instの描画領域が処理対象命令cur_instの描画領域に含まれないことから、直前描画命令prev_instに格納したイメージ描画命令502を最前面の描画命令と特定し、ステップS908に進む。ステップS908で直前描画命令prev_inst(イメージ描画命令502)の描画ルールが交差ルールではなく中心ルールであると判定する。そして、ステップS909で前景キューfg_queが空であると判定し、ステップS913に進む。ステップS913では、イメージ描画命令502についての処理において一時キューtmp_queに追加されたグラフィック描画命令501を背景キューbg_queの最後に追加する。ステップS914で一時キューtmp_queをクリアし、ステップS915で直前描画命令prev_instに格納したイメージ描画命令502を前景キューfg_queに追加する。さらに、ステップS907では、直前描画命令prev_instの値を、処理対象命令cur_instに格納したグラフィック描画命令503に設定する。グラフィック描画命令503についての処理が終了すると、フローはステップS902に戻る。
次に、イメージ描画命令504についての処理により、グラフィック描画命令503が一時キューtmp_queに追加され、直前描画命令prev_instの値がイメージ描画命令504となる。
グラフィック描画命令505についての処理により、グラフィック描画命令503が背景キューbg_queに追加され、グラフィック描画命令505が前景キューfg_queに追加され、直前描画命令prev_instの値がイメージ描画命令504となる。
イメージ描画命令506についての処理により、グラフィック描画命令505が一時キューtmp_queに追加され、直前描画命令prev_instの値がイメージ描画命令506となる。
グラフィック描画命令507についての処理により、グラフィック描画命令505が背景キューbg_que追加され、イメージ描画命令506が前景キューfg_queに追加され、直前描画命令prev_instの値がグラフィック描画命令507となる。
イメージ描画命令508についての処理により、グラフィック描画命令507が一時キューtmp_queに追加され、直前描画命令prev_instの値がイメージ描画命令508となる。なお、この時点で、背景キューbg_queにはグラフィック描画命令501、503、505が格納されており、前景キューfg_queにはイメージ描画命令502、504、506が格納されている。
イメージ描画命令508についての処理が終了すると、フローはステップS902に戻る。ステップS902では、次の描画命令がないと判定し、ステップS916からステップS919までの処理に進む。ステップS916では、背景キューbg_queに格納したグラフィック描画命令501、503、505が順に実行され、ステップS917では、tmp_queに格納したグラフィック描画命令507が実行される。そして、ステップS918では、前景キューfg_queに格納したイメージ描画命令502、504、506が順に実行され、ステップS919では、直前描画命令prev_instに格納したイメージ描画命令508が実行される。
以上の処理により、オブジェクト画像の分割処理に起因する画像不正が発生しうる条件を判定する。境界部分に画像不正が発生しうる描画領域について、描画命令の実行順序を、背面の描画命令をまとめて実行した後に、最前面の描画命令をまとめて実行するように変更する。それによって、描画領域の境界部分の画素において最前面の描画命令を用いて描画を行うことを確保することができ、ユーザが所望する画像を生成することができる。また、一連の連続する描画命令の中で、隣接する最前面の描画命令をまとめて実行することにより、最前面の描画命令が全て隣接する一連の描画命令の最大の単位に処理を適用することができ、描画命令の一体性の判定の精度を向上することができる。
(実施例2)
以下、発明を実施するための形態のうち、実施例2に特有の処理について説明する。なお、実施例2は、オブジェクト画像の分割処理に起因する画像不正が発生しうる条件を判定し、背景の描画命令の実行をスキップすることにより、ユーザが所望する画像を生成する。特に言及しない限り、実施例1と同様の処理については説明を省略する。
<画像形成装置100の描画処理>
図10は、本実施例における画像形成装置100の描画処理を示すフローチャートである。
図10の描画処理では、変数として、処理対象描画命令cur_inst、直前描画命令prev_inst、および終了フラグdoTerminateProcessを使用する。また、キューとして、一時キューtmp_que、前景キューfg_queを使用する。フラグとして、終了フラグdoTerminateProcessを使用する。処理対象描画命令cur_instは現在処理対象としている最新の描画命令を格納し、直前描画命令prev_instは直前に処理した描画命令を格納する。終了フラグdoTerminateProcessは、描画処理を終了するか否かの状態を管理するためのフラグであり、ページ内に次の描画命令がない場合にTRUEに設定される。一時キューtmp_queは描画命令を一時的にスプールするキューであり、最前面の描画命令が見つかるまでの間、描画命令をスプールするように使用される。前景キューfg_queは、最前面の描画命令をスプールするキューであり、最前面の描画命令が継続して隣接している間に限り、最前面の描画命令をスプールするように使用される。
図10のフローチャートの処理は、RAM116に格納されたプログラムを実行したCPU112によって実行される。描画処理はページごとに実行される。
以下、描画処理の各ステップの処理について説明する。
ステップS1001では、CPU112が、以降の処理で使用する変数およびキュー等を初期化する。すなわち、直前描画命令prev_instをNULLで初期化し、一時キューtmp_que、前景キューfg_queをクリアして空にし、終了フラグdoTerminateProcessをFALSEに設定する。
ステップS1002では、CPU112が、次の描画命令があるか否か判定する。次の描画命令がある(YES)と判定した場合は、次の描画命令を読み込んで、ステップS1003に進む。次の描画命令がない(NO)と判定した場合はステップS1017に進む。
ステップS1003、S1004、S1005、S1006、S1007の処理は、それぞれステップS903、S904、S905、S906、S907の処理と同様であるため説明を省略する。
ステップS1008では、CPU112が、直前描画命令prev_instの描画ルールが交差ルールであるか否かを判定する。本ステップの詳細は、ステップS908と同様であるため省略する。最前面の描画命令の描画ルールが交差ルールである場合には、当該最前面の描画命令と直前の最前面の描画命令との境界部分における画素は、必ず当該最前面の描画命令で塗りつぶされることになるため、画像不正は生じない。そのため、当該最前面の描画領域に含まれる背面の描画命令の実行をスキップしなくてもよい。本ステップでは、交差ルールである(YES)と判定した場合にステップS1011に進み、交差ルールでない(NO)と判定した場合にステップS1009に進む。
ステップS1009では、CPU112が、前景キューfg_queが空であるか否かを判定する。空である(YES)と判定した場合、ステップS1011に進む。空でない(NO)と判定した場合、ステップS1010に進む。
ステップS1010では、CPU112が、直前描画命令prev_instの描画領域が、前景キューfg_queに格納された描画命令の描画領域に隣接するか否かを判定する。本ステップの詳細は、ステップS910と同様であるため省略する。本ステップの処理により、ステップS1005で特定した最前面の描画命令が互いに隣接するか否かを判定することができる。最前面の描画命令が隣接していない場合に、オブジェクト画像の分割処理に起因する画像不正が発生することはないため、当該最前面の描画領域に含まれる背面の描画命令の実行をスキップしなくてもよい。本ステップでは、隣接する(YES)と判定した場合にステップS1013に進み、隣接していない(NO)と判定した場合にステップS1011に進む。具体的には、最前面の描画命令が互いに隣接していないと判定した場合に、ステップS1011の処理で、スプールした背面の描画命令(当該最前面の描画命令の描画領域に含まれる背面の描画命令)を実行する。また、ステップS1012の処理で、スプールした隣接する最前面の描画命令をクリアする。最前面の描画命令が互いに隣接すると判定した場合に、ステップS1013以降の処理で、スプールした背面の描画命令を実行せずにクリアする。
ステップS1011では、CPU112が、一時キューtmp_queの描画命令を実行する。ここで、CPU112は、一時キューtmp_queに格納した順に描画命令を実行する。
ステップS1012では、CPU112が、前景キューfg_queの描画命令をクリアして空にする。
ステップS1013では、CPU112が、直前描画命令prev_instに格納した描画命令を実行する。
ステップS1014では、CPU112が、終了フラグdoTerminateProcessがTRUEであるか否かを判定する。TRUEである(YES)と判定した場合、描画処理を終了する。FALSEである(NO)と判定した場合、ステップS1015に進む。
ステップS1015では、CPU112が、一時キューtmp_queの描画命令をクリアして空にする。
ステップS1016では、CPU112が、直前描画命令prev_instに格納した描画命令を前景キューfg_queに追加する。
ステップS1008からステップS1016までの処理により、背面の描画命令を即座に実行せず、一時キューtmp_queに格納することができる。そして、最前面の描画命令の隣接性を判定し、最前面の描画命令が隣接している場合には、オブジェクト画像の分割処理に起因する画像不正が発生しうると判定し、一時キューtmp_queに格納された背面の描画命令を実行することなくクリアすることができる。最前面の描画命令が隣接していない場合には、オブジェクト画像の分割処理に起因する画像不正が発生することはないため、通常通り一時キューtmp_queに格納された背面の描画命令を実行することができる。
ステップS1002で次の描画命令がないと判定した場合に、処理はステップS1017に進む。ステップS1017では、CPU112が、終了フラグdoTerminateProcessをTRUEに設定する。本ステップの処理が終了するとステップS1008に進む。そして、ステップS1008からステップS1013の処理を実行してから、ステップS1014で終了フラグdoTerminateProcessがTRUEと判定し、描画処理を終了する。
本実施例の描画処理フローで図5のグラフィック描画命令を処理することにより、画像不正のないオブジェクト画像を生成することができる。
グラフィック描画命令501についての処理において、ステップS1007で直前描画命令prev_instの値をグラフィック描画命令501に設定する。
イメージ描画命令502についての処理において、ステップS1005で特定した背面の描画命令(グラフィック描画命令501)を一時キューtmp_queに格納する。また、ステップS1007で直前描画命令prev_instの値をイメージ描画命令502に設定する。
グラフィック描画命令503についての処理において、ステップS1005でイメージ描画命令502を最前面の描画命令と特定し、ステップS1008からステップS1010の判定処理に進む。前景キューfg_queが空であるため、処理はステップS1011に進む。ステップS1010で、通常通り一時キューtmp_queに格納された背面の描画命令(グラフィック描画命令501)を実行する。そして、ステップS1013では、直前描画命令prev_instに格納した最前面の描画命令(イメージ描画命令502)を実行する。さらに、ステップS1015では、実行された背面の描画命令(グラフィック描画命令501)を格納した一時キューtmp_queをクリアする。ステップS1016では、イメージ描画命令502を前景キューfg_queに追加し、当該前景キューfg_queは最前面の描画命令の隣接性を判定するために用いられる。
イメージ描画命令504についての処理は、イメージ描画命令502についての処理と類似である。イメージ描画命令504についての処理において、ステップS1005で特定した背面の描画命令(グラフィック描画命令503)を一時キューtmp_queに格納する。また、ステップS1007で直前描画命令prev_instの値をイメージ描画命令504に設定する。
グラフィック描画命令505についての処理において、ステップS1005でイメージ描画命令504を最前面の描画命令と特定し、ステップS1008からステップS1010の判定処理に進む。最前面の描画命令が隣接していると判定され、一時キューtmp_queに格納された背面の描画命令(グラフィック描画命令505)の実行をスキップし、ステップS1013以降の処理に進む。ステップS1013では、直前描画命令prev_instに格納した最前面の描画命令(イメージ描画命令504)を実行する。ステップS1015では、背面の描画命令を格納した一時キューtmp_queをクリアする。ステップS1016では、イメージ描画命令504を前景キューfg_queに追加する。
イメージ描画命令506についての処理は、イメージ描画命令502、504についての処理と類似である。イメージ描画命令506についての処理において、ステップS1005で特定した背面の描画命令(グラフィック描画命令505)を一時キューtmp_queに格納する。また、ステップS1007で直前描画命令prev_instの値をイメージ描画命令506に設定する。
グラフィック描画命令507についての処理は、グラフィック描画命令505についての処理と類似である。グラフィック描画命令507についての処理では、一時キューtmp_queに格納された背面の描画命令(グラフィック描画命令505)の実行をスキップする。また、直前描画命令prev_instに格納した最前面の描画命令(イメージ描画命令506)を実行し、背面の描画命令を格納した一時キューtmp_queをクリアし、イメージ描画命令506を前景キューfg_queに追加する。
イメージ描画命令508についての処理は、イメージ描画命令502、504、506についての処理と類似である。イメージ描画命令508についての処理において、ステップS1005で特定した背面の描画命令(グラフィック描画命令507)を一時キューtmp_queに格納する。また、ステップS1007で直前描画命令prev_instの値をイメージ描画命令508に設定する。
イメージ描画命令508についての処理が終了すると、フローはステップS1002に戻る。そして、ステップS1002で次の描画命令がないと判定し、ステップS1017に進む。ステップS1017で終了フラグdoTerminateProcessをTRUEに設定し、ステップS1008以降の処理に進む。ステップS1013では、直前描画命令prev_instに格納した最前面の描画命令(イメージ描画命令508)を実行する。そして、ステップS1014で終了フラグdoTerminateProcessがTRUEであると判定し、描画処理を終了する。
以上の処理により、オブジェクト画像の分割処理に起因する画像不正が発生しうる条件を判定し、境界部分に画像不正が発生しうる描画領域について、背景の描画命令の実行をスキップする。それによって、描画領域の境界部分の画素において最前面の描画命令を用いて描画を行うことを確保することができ、ユーザが所望する画像を生成することができる。
(実施例3)
以下、発明を実施するための形態のうち、実施例3に特有の処理について説明する。なお、実施例3は、オブジェクト画像の分割処理に起因する画像不正が発生しうる条件を判定し、画像不正が発生した可能性のある画素を最前面の描画命令の色で補間することにより、ユーザが所望する画像を生成する。特に言及しない限り、実施例1、2と同様の処理については説明を省略する。
<画像形成装置100の描画処理>
図11は、本実施例における画像形成装置100の描画処理を示すフローチャートである。
図11の描画処理では、変数として、処理対象描画命令cur_inst、直前描画命令prev_inst、描画済前景輪郭fg_borders、および終了フラグdoTerminateProcessを使用する。処理対象描画命令cur_inst、直前描画命令prev_inst、終了フラグdoTerminateProcessについては、実施例2と同様であるため説明を省略する。描画済前景輪郭fg_bordersは、最前面の描画命令の輪郭の座標を記憶するためのバッファであり、最前面の描画命令が継続して隣接している間、最前面の描画命令の描画領域を記憶するために使用される。
図10のフローチャートの処理は、RAM116に格納されたプログラムを実行したCPU112によって実行される。描画処理はページごとに実行される。
以下、描画処理の各ステップの処理について説明する。
ステップS1101では、CPU112が、以降の処理で使用する変数等を初期化する。すなわち、直前描画命令prev_instをNULLで初期化し、描画済前景輪郭fg_bordersをクリアして空にし、終了フラグdoTerminateProcessをFALSEに設定する。
ステップS1102では、CPU112が、次の描画命令があるか否か判定する。次の描画命令がある(YES)と判定した場合は、次の描画命令を読み込んで、ステップS1103に進む。次の描画命令がない(NO)と判定した場合はステップS1115に進む。
ステップS1103、S1104の処理は、ステップS903、S904の処理と同様であるため説明を省略する。
ステップS1105では、CPU112が、直前描画命令prev_instに格納した描画命令を実行する。
ステップS1106では、CPU112が、直前描画命令prev_instの描画領域が、処理対象描画命令cur_instの描画領域に含まれるか否かを判定する。本ステップの処理の詳細はステップS905、S1005と同様であるため省略する。含まれる(YES)と判定した場合は、直前描画命令prev_instに格納した描画命令が最前面の描画命令と特定することができ、ステップS1107に進む。含まれない(NO)と判定した場合は、直前描画命令prev_instに格納した描画命令が背面の描画命令と特定することができ、ステップS1108に進む。
ステップS1107の処理は、ステップS907の処理と同様であるため説明を省略する。
ステップS1108では、直前描画命令prev_instの描画ルールが交差ルールであるか否かを判定する。本ステップの詳細は、ステップS908と同様であるため省略する。最前面の描画命令の描画ルールが交差ルールである場合には、当該最前面の描画命令と直前の最前面の描画命令との境界部分における画素は、必ず当該最前面の描画命令で塗りつぶされることになるため、画像不正は生じない。そのため、後述のステップS1111における補間処理は行わなくてもよい。本ステップでは、交差ルールである(YES)と判定した場合にステップS1112に進み、交差ルールでない(NO)と判定した場合にステップS1109に進む。
ステップS1109では、CPU112が、描画済前景輪郭fg_bordersが空であるか否かを判定する。空である(YES)と判定した場合、ステップS1113に進む。空でない(NO)と判定した場合、ステップS1110に進む。
ステップS1110では、CPU112が、直前描画命令prev_instの描画領域の輪郭の一部が、描画済前景輪郭fg_bordersの一部と一致するか否かを判定する。本ステップの処理で一致すると判定された場合、直前描画命令prev_instの描画領域は、過去に描画された最前面の描画命令と隣接しているとみなすことができる。本ステップの処理により、ステップS1106で特定した最前面の描画命令が互いに隣接するか否かを判定することができる。最前面の描画命令が隣接していない場合に、オブジェクト画像の分割処理に起因する画像不正が発生することはないため、後述のステップS1111における補間処理は行わなくてもよい。本ステップでは、一致する(YES)と判定した場合に、ステップS1111に進み、一致しない(NO)と判定した場合に、ステップS1112に進む。具体的には、最前面の描画命令が互いに隣接すると判定した場合に、ステップS1111で、隣接する境界線上の画素について、直前描画命令prev_instの該当する座標の輪郭色で塗りつぶす処理(補間処理)を行う。最前面の描画命令が互いに隣接しないと判定した場合に、補間処理を行わず、ステップS1112で、最前面の描画命令の輪郭の座標を記憶するバッファである描画済前景輪郭fg_bordersをクリアする処理を行う。
ステップS1111では、CPU112が、一致した描画済前景輪郭fg_borders上の画素を、直前描画命令prev_instの該当する座標の輪郭色で塗りつぶす。この処理は、隣接する境界線上の画素について、直前描画命令prev_instの描画ルールを変更して塗りつぶす処理とみなすことができる。本ステップの処理により、画像不正が発生した可能性のある画素を最前面の描画命令の色で補間し、画像不正のないオブジェクト画像を生成することができる。本ステップの処理が終了するとステップS1113に進む。
ステップS1112では、CPU112が、描画済前景輪郭fg_bordersをクリアして空にする。本ステップの処理が終了するとステップS1113に進む。
ステップS1113では、CPU112が、終了フラグdoTerminateProcessがTRUEであるか否かを判定する。TRUEである(YES)と判定した場合、描画処理を終了する。FALSEである(NO)と判定した場合、ステップS1114に進む。
ステップS1114では、CPU112が、直前描画命令prev_instの輪郭の座標を描画済前景輪郭fg_bordersに追加する。ここで、描画済前景輪郭fg_bordersに追加される情報は、輪郭の画素の座標でもよいし、輪郭の端点の座標でもよい。また、実施例1、2と同様に、前景の描画命令を格納するようにして、ステップS1110の処理では描画領域の輪郭から隣接性を判定するようにしてもよい。
ステップS1108からステップS1114までの処理により、最前面の描画命令の隣接性を判定し、最前面の描画命令が隣接している場合には、画像不正が発生した可能性のある画素を最前面の描画命令で塗りつぶすことができる。
ステップS1002で次の描画命令がないと判定した場合に、処理はステップS1115に進む。ステップS1115では、CPU112が、終了フラグdoTerminateProcessをTRUEに設定し、ステップS1116に進む。
ステップS1116では、CPU112が、直前描画命令prev_instに格納した描画命令を実行する。本ステップの処理が終了するとステップS1108以降の処理に進む。ステップS1113で終了フラグdoTerminateProcessがTRUEと判定し、描画処理を終了する。
本実施例の描画処理フローで図5のグラフィック描画命令を処理することにより、画像不正のないオブジェクト画像を生成することができる。
グラフィック描画命令501についての処理において、ステップS1107で直前描画命令prev_instの値をグラフィック描画命令501に設定する。
イメージ描画命令502についての処理において、まず、直前描画命令prev_instに格納した描画命令(グラフィック描画命令501)を実行する。そして、ステップS1106で当該描画命令(グラフィック描画命令501)を背面の描画命令と特定し、ステップS1107に進む。ステップS1107で直前描画命令prev_instの値をイメージ描画命令502に設定する。
グラフィック描画命令503についての処理において、まず、直前描画命令prev_instに格納した描画命令(イメージ描画命令502)を実行する。そして、ステップS1106で当該描画命令(イメージ描画命令502)が最前面の描画命令と特定し、ステップS1108、S1109、S1110の判定処理に進む。描画済前景輪郭fg_bordersが空であるため、補間処理を行わず、ステップS1113以降の処理に進む。ステップS1114で最前面の描画命令(イメージ描画命令502)の輪郭の座標を描画済前景輪郭fg_bordersに追加する。ステップS1107で直前描画命令prev_instの値をグラフィック描画命令503に設定する。
イメージ描画命令504についての処理は、イメージ描画命令502についての処理と類似である。イメージ描画命令504についての処理において、まず、直前描画命令prev_instに格納した描画命令(グラフィック描画命令503)を実行する。そして、ステップS1106で当該描画命令(グラフィック描画命令503)を背面の描画命令と特定し、ステップS1107に進む。ステップS1107で直前描画命令prev_instの値をイメージ描画命令504に設定する。
グラフィック描画命令505についての処理において、まず、直前描画命令prev_instに格納した描画命令(イメージ描画命令504)を実行する。そして、ステップS1106で当該描画命令(イメージ描画命令504)を最前面の描画命令と特定し、ステップS1108、S1109、S1110の判定処理に進む。イメージ描画命令504の輪郭の一部が、描画済前景輪郭fg_bordersに記憶されているイメージ描画命令502)の輪郭の一部と一致するため、最前面の描画命令が隣接していると判定され、ステップS1111に進む。ステップS1111では、隣接する境界線上の画素について、最前面の描画命令(イメージ描画命令504)の該当する座標の輪郭色で塗りつぶす処理(補間処理)を行う。そして、ステップS1114で最前面の描画命令(イメージ描画命令504)の輪郭の座標を描画済前景輪郭fg_bordersに追加する。ステップS1107で直前描画命令prev_instの値をグラフィック描画命令505に設定する。
イメージ描画命令506についての処理は、イメージ描画命令502、504についての処理と類似である。イメージ描画命令506についての処理において、まず、直前描画命令prev_instに格納した描画命令(グラフィック描画命令505)を実行する。そして、ステップS1106で当該描画命令(グラフィック描画命令505)を背面の描画命令と特定し、ステップS1107に進む。ステップS1107で直前描画命令prev_instの値をイメージ描画命令506に設定する。
グラフィック描画命令507についての処理は、グラフィック描画命令505についての処理と類似である。グラフィック描画命令507についての処理において、直前描画命令prev_instに格納した描画命令(イメージ描画命令506)を実行する。ステップS1111では、隣接する境界線上の画素について、最前面の描画命令(イメージ描画命令506)の該当する座標の輪郭色で塗りつぶす処理(補間処理)を行う。ステップS1114で最前面の描画命令(イメージ描画命令506)の輪郭の座標を描画済前景輪郭fg_bordersに追加する。ステップS1107で直前描画命令prev_instの値をグラフィック描画命令507に設定する。
イメージ描画命令508についての処理は、イメージ描画命令502、504、506についての処理と類似である。イメージ描画命令504についての処理において、まず、直前描画命令prev_instに格納した描画命令(グラフィック描画命令507)を実行する。そして、ステップS1106で当該描画命令(グラフィック描画命令507)を背面の描画命令と特定し、ステップS1107に進む。ステップS1107で直前描画命令prev_instの値をイメージ描画命令508に設定する。
イメージ描画命令508についての処理が終了すると、フローはステップS1102に戻る。そして、ステップS1102で次の描画命令がないと判定し、ステップS1115に進む。ステップS1115で終了フラグdoTerminateProcessをTRUEに設定し、ステップS1116に進む。ステップS1116では、直前描画命令prev_instに格納した描画命令(イメージ描画命令508)を実行し、ステップS1108以降の処理に進む。ステップS1111では、隣接する境界線上の画素について、最前面の描画命令(イメージ描画命令508)の該当する座標の輪郭色で塗りつぶす処理(補間処理)を行う。そして、ステップS1113で終了フラグdoTerminateProcessがTRUEであると判定し、描画処理を終了する。
以上の処理により、オブジェクト画像の分割処理に起因する画像不正が発生しうる条件を判定し、画像不正が発生した可能性のある画素を最前面の描画命令の色で補間する。それによって、描画領域の境界部分の画素において最前面の描画命令を用いて描画を行うことを確保することができ、ユーザが所望する画像を生成することができる。
(その他の実施例)
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。