(57)【要約】【課題】ＰＣ等から取得した描画コマンドを中間言語に変換する処理を並列処理にて実行し、処理の高速化を図る。【解決手段】ページ記述言語で記述された描画コマンドおよび印刷データを取得し、中間言語コードに変換する中間言語コード生成部１２０と、この中間言語コード生成部１２０により生成された中間言語コードを処理してラスタ・データを生成する中間言語処理部１３０と、この中間言語処理部１３０により生成されたラスタ・データに基づいて印刷処理を行う印刷機構２００とを備える。この中間言語コード生成部１２０は、描画コマンドを、画像を指定する描画オペレータと画像を描画するための設定を指定するグラフィック・ステート・オペレータとの組であるブロック単位で、オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って中間言語コードを生成する。【選択図】図３
2010244359.tif 000002
【特許請求の範囲】
【請求項１】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置において、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得し、中間言語コードに変換する中間言語生成部と、
前記中間言語生成部により生成された前記中間言語コードを処理してラスタ・データを生成する中間言語処理部と、
前記中間言語処理部により生成された前記ラスタ・データに基づいて印刷処理を行う印刷機構とを備え、
前記中間言語生成部は、前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位で、当該オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って前記中間言語コードを生成する、装置。
【請求項２】
前記中間言語生成部は、連続する２つの前記ブロックに関して、
後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に持つオペレータでない場合に、当該２つのブロックを分割せずに逐次処理し、
その他の場合には当該２つのブロックを分割して並列処理する、請求項１に記載の装置。
【請求項３】
前記中間言語生成部は、１つの前記ブロックのオペレータを処理する場合に、当該ブロックに先行するブロックにおける前記グラフィック・ステート・オペレータを処理した後に、当該ブロックのオペレータを処理する、請求項１または請求項２に記載の装置。
【請求項４】
前記中間言語生成部は、並列処理される複数の前記ブロックのうち、特定のブロックの処理に要する時間が他の連続する複数のブロックの処理に要する時間よりも長いと推定される場合、当該他の連続する複数のブロックを分割せずに逐次処理する、請求項１乃至請求項３のいずれかに記載の装置。
【請求項５】
前記中間言語生成部は、複数の前記ブロックを並列処理するために必要と推定されるメモリ使用量が物理メモリの空き容量を基準とする閾値よりも大きい場合に、並列処理を行うブロック数を減らす、請求項１乃至請求項４のいずれかに記載の装置。
【請求項６】
前記中間言語生成部は、並列処理により生成された複数の中間言語コード群を、元の描画コマンドにおける各ブロックの順番に対応付ける対応情報を生成し、
前記中間言語処理部は、前記対応情報に基づき、元の描画コマンドの順番で前記中間言語コードを処理する、請求項１乃至請求項５のいずれかに記載の装置。
【請求項７】
前記中間言語生成部は、複数のＣＰＵを備えるマルチ・プロセッサにより実現され、前記ブロックを各ＣＰＵに割り当てて、並列処理を行う、請求項１に記載の装置。
【請求項８】
前記中間言語生成部は、１つのＣＰＵに複数のプロセッサ・コアを備えたマルチコア・プロセッサにより実現され、前記ブロックを各プロセッサ・コアに割り当てて、並列処理を行う、請求項１に記載の装置。
【請求項９】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置において、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得し、中間言語コードに変換する中間言語生成部と、
前記中間言語生成部により生成された前記中間言語コードを処理してラスタ・データを生成する中間言語処理部と、
前記中間言語処理部により生成された前記ラスタ・データに基づいて印刷処理を行う印刷機構とを備え、
前記中間言語生成部は、
前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位に分け、
連続する２つの前記ブロックに関して、後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に与えるオペレータでない場合に、当該２つのブロックを分割せずに逐次処理し、その他の場合には当該２つのブロックを分割して並列処理し、
並列処理される複数の前記ブロックのうち、特定のブロックの処理に要する時間が他の連続する複数のブロックの処理に要する時間よりも長いと推定される場合、当該他の連続する複数のブロックを分割せずに逐次処理し、
複数の前記ブロックを並列処理するために必要と推定されるメモリ使用量が物理メモリの空き容量を基準とする閾値よりも大きい場合に、並列処理を行うブロック数を減らし、
１つの前記ブロックのオペレータを処理する場合に、当該ブロックに先行するブロックにおける前記グラフィック・ステート・オペレータを処理した後に、当該ブロックのオペレータを処理することによって中間言語コードを生成し、
並列処理により生成された複数の中間言語コード群を、元の描画コマンドにおける各ブロックの順番に対応付ける対応情報を生成し、
前記中間言語処理部は、前記対応情報に基づき、元の描画コマンドの順番で前記中間言語コードを処理する、装置。
【請求項１０】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置の制御装置において、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得し、中間言語コードに変換する中間言語生成部と、
前記中間言語生成部により生成された前記中間言語コードを、印刷処理に用いるラスタ・データに変換する中間言語処理部とを備え、
前記中間言語生成部は、前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位で、当該オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って前記中間言語コードを生成する、装置。
【請求項１１】
前記中間言語生成部は、連続する２つの前記ブロックに関して、
後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に与えるオペレータでない場合に、当該２つのブロックを分割せずに逐次処理し、
その他の場合には当該２つのブロックを分割して並列処理する、請求項１０に記載の装置。
【請求項１２】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置の制御方法において、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得するステップと、
取得した前記描画コマンドおよび前記印刷データを中間言語コードに変換するステップと、
生成された前記中間言語コードを処理してラスタ・データを生成するステップと、
生成された前記ラスタ・データに基づいて印刷機構を制御し、印刷処理を行うステップとを含み、
前記中間言語コードに変換するステップは、
前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位で、当該オペレータのブロック間での依存関係に基づいて分割するステップと、
分割されたブロックごとに並列処理を行って前記中間言語コードを生成するステップと、
を含む、方法。
【請求項１３】
前記描画コマンドを分割するステップでは、連続する２つの前記ブロックに関して、
後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に与えるオペレータでない場合に、当該２つのブロックを分割せずに逐次処理し、
その他の場合には当該２つのブロックを分割して並列処理する、請求項１２に記載の方法。
【請求項１４】
描画コマンドおよび印刷データを受け付けて印刷出力する印刷装置を制御するコンピュータを、
ページ記述言語で記述された前記描画コマンドおよび前記印刷データを取得し、中間言語コードに変換する中間言語生成手段と、
前記中間言語生成手段により生成された前記中間言語コードを処理してラスタ・データを生成する中間言語処理手段と、
前記中間言語処理手段により生成された前記ラスタ・データに基づいて印刷機構を制御し、印刷処理を行う印刷制御手段として機能させ、
前記中間言語生成手段は、前記描画コマンドを、画像を指定する描画オペレータと当該描画オペレータ以外のオペレータであるグラフィック・ステート・オペレータとの組であるブロック単位で、当該オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って前記中間言語コードを生成する、プログラム。
【請求項１５】
前記中間言語生成手段は、連続する２つの前記ブロックに関して、
後のブロックにおける前記グラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、当該後のブロックにおける先頭の前記描画オペレータが座標を引数に与えるオペレータでない場合に、当該２つのブロックを分割せずに逐次処理し、
その他の場合には当該２つのブロックを分割して並列処理する、請求項１４に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、描画コマンドおよび印刷データから中間言語コードを生成し、中間言語コードからラスタ・データを生成して印刷出力を行う印刷装置および制御方法に関する。
【背景技術】
【０００２】
印刷装置（プリンタ）や印刷機能を備えた複合機（Multifunction peripheral）は、ハードウェア性能の向上等によって、印刷を行うエンジンにおいても、印刷データ等のデータ処理においても、相当の高速化が図られている。しかし、事務用途などでは、大量部数の印刷ジョブが実行される機会も多く、さらなる高速化が望まれている。
【０００３】
データ処理を高速化するための手段としては、ＣＰＵの高速化、マルチプロセッサやマルチコア・プロセッサを用いて実現される並列処理による高速化などが考えられる。並列処理においては、並列に実行する処理の選択、処理単位の設定および割り当てが、処理速度の向上のために、非常に重要である。
【０００４】
印刷装置の描画処理は、通常、次の２ステップで実行される。
（１）ＰＣ等から取得した描画コマンドを中間言語に変換するステップ
（２）中間言語を最終的な描画データ（ラスタ・データ）に変換するステップ
特許文献１に記載の技術は、フレームバッファへの描画の順序を保証しながら、高速処理を実現し、最終的な出力データを得るものである。上記（２）のステップに関する並列処理の技術である。
【０００５】
特許文献２に記載の技術は、画像データの位置や画素値に依存する画像処理か否かに基づいて並列処理可能か否かを判断し、判断結果に応じてハードウェアを再構成して、並列処理にて画像処理を実行するものである。上記（１）、（２）のステップに関わらず、ＰＤＬ（ページ記述言語）で記述されたデータから描画データを作成する処理全体を対象とする技術である。
【０００６】
特許文献３に記載の技術は、複数の送信元から送信された印刷データを個別に並列処理し、個別の中間言語データに変換して、１ページ単位で、中間言語データが得られたものから順に画像を印刷するものである。上記（１）のステップに関して、ジョブ単位で並列処理を行う技術である。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平８−１５４１７１号公報
【特許文献２】特開平１０−３３７９３２号公報
【特許文献３】特開平１０−１００５１２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記の印刷装置の描画処理における２つのステップのうち、（１）のステップの処理は、描画コマンドの順序における前後のコマンドの依存度が高いため、並列処理にて実現することが容易ではない。上記特許文献１の技術は、（２）のステップの処理を対象として並列処理を行っており、（１）のステップの処理の並列化は考慮されていない。上記特許文献２の技術は、ＰＤＬで記述されたデータから描画データを作成する処理全体を対象としており、（１）のステップに対応する部分も含まれているが、実現のために特別のハードウェアを必要としており、コストの増大を招来する。上記特許文献３の技術は、（１）のステップを対象としているが、複数のジョブの実行要求がなされた場合に、これらを並列に実行するものであり、適用できる状況が極めて限定されている。
【０００９】
本発明は、上記（１）のステップの処理である、ＰＣ等から取得した描画コマンドを中間言語に変換する処理を対象として、１つ以上のジョブにおけるコマンドを並列処理にて実行することにより、処理の高速化を図ることを目的とする。
【課題を解決するための手段】
【００１０】
上記の目的を達成するため、本発明は、次のような装置として構成される。この装置は、ページ記述言語で記述された描画コマンドおよび印刷データを取得し、中間言語コードに変換する中間言語生成部と、この中間言語生成部により生成された中間言語コードを処理してラスタ・データを生成する中間言語処理部と、この中間言語処理部により生成されたラスタ・データに基づいて印刷処理を行う印刷機構とを備える。この中間言語生成部は、描画コマンドを、描画オペレータとグラフィック・ステート・オペレータとの組であるブロック単位で、オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って中間言語コードを生成する。
【００１１】
より詳細には、中間言語生成部は、連続する２つのブロックに関して、後のブロックにおけるグラフィック・ステート・オペレータに、座標を設定するオペレータが含まれておらず、かつ、後のブロックにおける先頭の描画オペレータが座標を引数に持つオペレータでない場合に、この２つのブロックを分割せずに逐次処理し、その他の場合には、この２つのブロックを分割して並列処理する。
また、中間言語生成部は、１つのブロックのオペレータを処理する場合に、このブロックに先行するブロックにおけるグラフィック・ステート・オペレータを処理した後に、このブロックのオペレータを処理する。
【００１２】
また、好ましくは、中間言語生成部は、並列処理される複数のブロックのうち、特定のブロックの処理に要する時間が他の連続する複数のブロックの処理に要する時間よりも長いと推定される場合、当該他の連続する複数のブロックを分割せずに逐次処理する。
さらに好ましくは、中間言語生成部は、複数のブロックを並列処理するために必要と推定されるメモリ使用量が物理メモリの空き容量を基準とする閾値よりも大きい場合に、並列処理を行うブロック数を減らす。
さらに詳細には、中間言語生成部は、並列処理により生成された複数の中間言語コード群を、元の描画コマンドにおける各ブロックの順番に対応付ける対応情報を生成する。そして中間言語処理部は、対応情報に基づき、元の描画コマンドの順番で中間言語コードを処理する。
【００１３】
また、本発明は、印刷装置の制御装置としても実現される。この装置は、ページ記述言語で記述された描画コマンドおよび印刷データを取得し、中間言語コードに変換する中間言語生成部と、この中間言語生成部により生成された中間言語コードを、印刷処理に用いるラスタ・データに変換する中間言語処理部とを備える。この中間言語生成部は、描画コマンドを、描画オペレータとグラフィック・ステート・オペレータとの組であるブロック単位で、オペレータのブロック間での依存関係に基づいて分割し、分割されたブロックごとに並列処理を行って中間言語コードを生成する。
【００１４】
また、本発明は、印刷装置の制御方法としても実現される。この方法は、ページ記述言語で記述された描画コマンドおよび印刷データを取得するステップと、取得した描画コマンドおよび印刷データを中間言語コードに変換するステップと、生成された中間言語コードを処理してラスタ・データを生成するステップと、生成されたラスタ・データに基づいて印刷機構を制御し、印刷処理を行うステップとを含む。中間言語コードに変換するステップは、描画コマンドを、描画オペレータとグラフィック・ステート・オペレータとの組であるブロック単位で、オペレータのブロック間での依存関係に基づいて分割するステップと、分割されたブロックごとに並列処理を行って中間言語コードを生成するステップと、を含む。
【００１５】
さらに本発明は、コンピュータを制御して上記の制御装置の機能を実現するプログラム、あるいは、コンピュータに上記の制御方法の各ステップに対応する処理を実行させるプログラムとしても実現される。
【発明の効果】
【００１６】
以上のように構成された本発明によれば、ＰＣ等から取得した描画コマンドを中間言語に変換する処理を対象として、１つ以上のジョブにおけるコマンドを並列処理にて実行することが可能となり、処理の高速化を図ることができる。
【図面の簡単な説明】
【００１７】
【図１】本実施形態の印刷装置の構成例を示す図である。
【図２】描画コマンドの構成例を示す図である。
【図３】本実施形態の制御部の機能構成を示す図である。
【図４】本実施形態における描画コマンドにおけるブロックの構成例を示す図である。
【図５】メモリ使用量を考慮したブロックの割り当ての手順の概略を示すフローチャートである。
【図６】図４に示した描画コマンドにおけるオペレータごとの必要メモリ・サイズと、ブロックごとの予想メモリ使用量とを示す図である。
【図７】本実施形態のポインタ・テーブルの構成例を示す図である。
【図８−１】本実施形態の制御部の動作の全体的な流れを示すフローチャートである。
【図８−２】本実施形態の制御部の動作の全体的な流れを示すフローチャートである。
【図９】図８−１のステップ８０２、８０４、８０８、８１２に示す、１ブロック読み込み処理の手順を示すフローチャートである。
【図１０】図９のステップ９０１に示す、描画オペレータ受信処理の手順を示すフローチャートである。
【図１１】図９のステップ９０３に示す、ＧＳオペレータ受信処理の手順を示すフローチャートである。
【図１２】図９のステップ９０５に示す、分割位置チェック処理の手順を示すフローチャートである。
【図１３】図８−１のステップ８０３、８０５、８０９、８１３に示す、メモリ使用量予想処理の手順を示すフローチャートである。
【図１４】本実施形態の使用メモリ予想テーブルの構成例を示す図である。
【図１５】図８−２のステップ８３１に示す、中間言語描画処理の手順を示すフローチャートである。
【発明を実施するための形態】
【００１８】
以下、添付図面を参照して、本発明の実施形態について詳細に説明する。
＜システム構成＞
図１は、本実施形態の印刷装置の構成例を示す図である。
図１に示すように、本実施形態の印刷装置は、装置の動作制御を行う制御部１００と、トナーやインク等の画像形成材を用いて印刷媒体である用紙等に画像を形成する印刷機構２００と、パーソナル・コンピュータ等の外部装置とデータ交換を行うためのＩ／Ｏインターフェイス３００とを備える。
【００１９】
制御部１００は、ＣＰＵ、ＣＰＵが実行するプログラムを格納したＲＯＭ、作業用メモリであるＲＡＭ等で実現される。本実施形態の制御部１００は、ＣＰＵを複数設けたマルチプロセッサとする。この制御部１００は、予めインストールされたプログラムおよび各種設定に基づき、印刷機構２００の動作制御、Ｉ／Ｏインターフェイス３００を介して行われるデータ交換等、各種処理の制御を行う。また、制御部１００は、Ｉ／Ｏインターフェイス３００を介して受信した描画コマンドおよび印刷データに基づき印刷画像を生成する画像処理を行う。
【００２０】
印刷機構２００は、制御部１００により生成された文書画像を、トナーやインク等の画像形成材を用いて、用紙等の印刷媒体上に形成（印刷）する。本実施形態では、印刷方式については限定しない。すなわち、電子写真方式や、インクジェット方式、サーマル方式等、種々の方式の印刷手段により本実施形態の印刷機構２００を構成し得る。
【００２１】
Ｉ／Ｏインターフェイス３００は、ネットワーク等を介して、パーソナル・コンピュータ等の外部装置と接続する。そして、接続された外部装置から、ＰＣＬ−ＸＬ等のＰＤＬ（Page Description Language, ページ記述言語）で記述された描画コマンドおよび印刷データを受信し、制御部１００へ送る。
【００２２】
＜描画コマンドの構成＞
ここで、描画コマンドの構成について説明する。本実施形態で扱われる描画コマンドは、ＰＣＬ−ＸＬ等の既存のＰＤＬで記述されており、本実施形態のための特殊な構成は有していない。
図２は、描画コマンドの構成例を示す図である。図２（ａ）は、１つのジョブを構成する描画コマンド全体の構成の概略を示し、図２（ｂ）は、１ページ分の描画コマンドの構成を示している。
【００２３】
図２（ａ）に示すように、描画コマンドは、ストリーム・ヘッダ（Ｓｔｒｅａｍ  Ｈｅａｄｅｒ）とストリーム・ボディ（Ｓｔｒｅａｍ  Ｂｏｄｙ）とで構成される。ストリーム・ボディは、セッション（Ｓｅｓｓｉｏｎ）ごとに区分されており、各セッションはページ（Ｐａｇｅ）ごとに区分されている。
【００２４】
図２（ｂ）に示すように、各ページの描画コマンドは、スタート・ページ（Ｓｔａｒｔ  Ｐａｇｅ）、描画オペレータ、グラフィック・ステート（ＧＳ）オペレータ、エンド・ページ（Ｅｎｄ  Ｐａｇｅ）というコマンドで構成されている。スタート・ページは、ページの初期設定を行うためのコマンドである。描画オペレータおよびＧＳオペレータは、描画を行うためのコマンドである。エンド・ページ（Ｅｎｄ  Ｐａｇｅ）は、ページの終端を示すコマンドである。以下、描画コマンドを構成する個々のコマンドを、コマンド群全体を示す「描画コマンド」と区別するため、「オペレータ」と呼ぶ。なお、「オペレータ」はＰＣＬ−ＸＬで用いられる用語であるが、本実施形態の適用対象は、ＰＣＬ−ＸＬのみに限定されない。ここでは単に、コマンド群全体と個々のコマンドとを区別するために、文言上、呼び分けるに過ぎない。
【００２５】
描画を行うためのオペレータのうち、描画オペレータは、線、図形、テキスト等の具体的な描画の内容（画像）を指定するオペレータである。また、描画オペレータ以外のオペレータをまとめてグラフィック・ステート（ＧＳ）オペレータと呼ぶ。このＧＳオペレータには、グラフィック・ステートと呼ばれる、描画するための設定（ペン、ブラシ、テキストのフォント等）を指定するオペレータが含まれる。
【００２６】
上記の各ページの描画コマンドのうち、ＧＳオペレータと描画オペレータとの組によって描画内容が記述される。本実施形態では、このＧＳオペレータと描画オペレータの組をブロックとして、このブロック単位で複数のＣＰＵへの割り当てを行い、描画コマンドの並列処理を実行する。並列処理を行うためのブロックの分割および各ＣＰＵへの割り当ての手順については、後述する。
【００２７】
＜制御部１００の機能構成＞
図３は、制御部１００の機能構成を示す図である。
図３に示すように、制御部１００は、データ解読部１１０と、中間言語コード生成部１２０と、中間言語処理部１３０と、印刷制御部１４０とを備える。これらの各機能は、例えば、ＲＯＭに格納されたプログラムをＣＰＵが読み込んで実行することにより実現される。メモリ１５０は、例えば上述したＲＡＭで実現され、データ受信バッファ、中間言語用バッファ、ラスタ・データ用バッファ、として使用される。また本実施形態において、メモリ１５０のその他の作業領域（ワーク・エリア）には、後述するポインタ・テーブル１５１が保持される。さらに、ＲＯＭ１６０には、後述する使用メモリ予想テーブル１６１が保持される。
【００２８】
データ解読部１１０は、Ｉ／Ｏインターフェイス３００を介して受信され、データ受信バッファ（メモリ１５０）に保持された描画コマンドを解読し、個々のオペレータの列に分解する。そして、データ解読部１１０は、個々のオペレータ・レベルに分解された描画コマンドを中間言語コード生成部１２０に送る。
【００２９】
中間言語コード生成部１２０は、データ解読部１１０から描画コマンドを受け取り、並列処理が可能なオペレータの組であるブロックごとに分ける。そして、各ブロックを複数のＣＰＵに割り当て、各ＣＰＵで割り当てられたブロックのオペレータから中間言語によるコード列（以下、中間言語コード）を生成する。生成された中間言語コードは、中間言語用バッファ（メモリ１５０）に格納される。描画コマンドをブロック化し、ＣＰＵに割り当てる処理の詳細については後述する。個々のブロックのオペレータから中間言語コードを生成する処理は、既存の印刷装置における中間言語を生成する処理と同様である。ただし、本実施形態では、中間言語コードは、並列処理により生成されるため、ブロックごとに分割されている。そこで、中間言語コード生成部１２０は、元の描画コマンドにおける各ブロックの順番を管理するためのポインタ・テーブル１５１を作成し、メモリ１５０に格納する。ポインタ・テーブル１５１の詳細については後述する。
【００３０】
中間言語処理部１３０は、ポインタ・テーブル１５１により指定された順番で中間言語用バッファから中間言語コードを読み出し、ラスタ・データに変換する。生成されたラスタ・データは、ラスタ・データ用バッファ（メモリ１５０）に格納される。
【００３１】
印刷制御部１４０は、ラスタ・データ用バッファからラスタ・データを読み出す。そして、印刷機構２００を制御し、用紙等の印刷媒体上に、読み出したラスタ・データに基づく画像を形成する。
【００３２】
＜中間言語コード生成部１２０の動作＞
次に、中間言語コード生成部１２０による処理の並列化について詳細に説明する。
図４は、描画コマンドにおけるブロックの構成例を示す図である。
図４に示すように、描画コマンドにおいて、連続する１対のＧＳオペレータと描画オペレータによってブロックが構成されている。図４の例では、４つのブロック（第１ブロック〜第４ブロック）が記載されている。第１ブロックはＧＳオペレータＧＳ１および描画オペレータＤ１で、第２ブロックはＧＳオペレータＧＳ２および描画オペレータＤ２で、第３ブロックはＧＳオペレータＧＳ３および描画オペレータＤ３で、第４ブロックはＧＳオペレータＧＳ４および描画オペレータＤ４で、それぞれ構成されている。
【００３３】
中間言語コード生成部１２０は、原則として、描画コマンドを上記のブロック単位に分割する。そして、このブロックごとに、中間言語コードを生成する処理を各ＣＰＵに割り当てて並列処理を行う。しかし、描画オペレータの多くは、直前のオペレータ終了時点の座標値を使用する。このようなオペレータは、並列に処理することができず、シーケンシャルに処理しなければならない。そこで、本実施形態の中間言語コード生成部１２０は、座標値の設定箇所に着目し、座標を新規に設定している箇所を分割位置として、描画コマンドを分割する。以下、描画コマンドの分割方法を詳細に説明する。
【００３４】
まず、ブロック単位の分割について説明する。描画コマンドがブロックごとに分割された場合、異なるブロックの描画オペレータは、並列に処理される。ただし、上述したように、描画するための座標の設定に関しては以前のオペレータの実行結果に依存するため、各ＣＰＵが各ブロックの描画オペレータを実行する場合に、実行しようとするブロックよりも前のブロックのＧＳオペレータを全て実行する必要がある。例えば、図４に示した描画コマンドを４個のＣＰＵで並列処理する場合を考える。このとき、描画オペレータＤ１を実行するＣＰＵは、ＧＳオペレータＧＳ１を実行する。また、描画オペレータＤ２を実行するＣＰＵは、ＧＳオペレータＧＳ１、ＧＳ２を実行する。また、描画オペレータＤ３を実行するＣＰＵは、ＧＳオペレータＧＳ１、ＧＳ２、ＧＳ３を実行する。また、描画オペレータＤ４を実行するＣＰＵは、ＧＳオペレータＧＳ１、ＧＳ２、ＧＳ３、ＧＳ４を全て実行する。
【００３５】
ここで、図４の描画コマンドに関して、上記のように並列処理する場合と、単一のＣＰＵで逐次処理する場合とにおける処理ステップ数を比較する。なお、図示の通り、ＧＳオペレータＧＳ１を実行する場合の処理ステップ数は４、描画オペレータＤ１を実行する場合の処理ステップ数は３、ＧＳオペレータＧＳ２を実行する場合の処理ステップ数は６、描画オペレータＤ２を実行する場合の処理ステップ数は１６、ＧＳオペレータＧＳ３を実行する場合の処理ステップ数は２、描画オペレータＤ３を実行する場合の処理ステップ数は４、ＧＳオペレータＧＳ４を実行する場合の処理ステップ数は２、描画オペレータＤ４を実行する場合の処理ステップ数は１０である。
【００３６】
４個のＣＰＵで並列処理の場合、描画コマンドＤ１を実行するＣＰＵでは、処理ステップ数が７（＝ＧＳ１＋Ｄ１）である。描画コマンドＤ２を実行するＣＰＵでは、処理ステップ数が２６（＝ＧＳ１＋ＧＳ２＋Ｄ２）である。描画コマンドＤ３を実行するＣＰＵでは、処理ステップ数が１６（＝ＧＳ１＋ＧＳ２＋ＧＳ３＋Ｄ３）である。描画コマンドＤ４を実行するＣＰＵでは、処理ステップ数が２４（＝ＧＳ１＋ＧＳ２＋ＧＳ３＋ＧＳ４＋Ｄ４）である。したがって、上記のうちで最大の処理ステップ数２６が、図４の描画コマンドを並列処理する場合の処理ステップ数となる。
【００３７】
一方、逐次処理する場合、ＧＳオペレータＧＳ１〜ＧＳ４および描画オペレータＤ１〜Ｄ４を実行する場合の処理ステップ数を単純に加算することになるので、４７である。したがって、４個のＣＰＵで並列処理する方が、各ＣＰＵにおいて処理対象のブロック以前の全てのブロックにおけるＧＳオペレータを実行するとしても、逐次処理よりも少ない処理ステップ数で完了する。なお、ここでは単純に処理ステップ数のみを比較したが、実際の処理においては、ＧＳオペレータより描画オペレータの方が、個々のオペレータの処理に要する時間が長い。そのため、並列処理する場合の処理に要する時間の短縮は、さらに顕著である。
【００３８】
さて、上記のようにして、全てのブロックを並列処理することが望ましいが、描画オペレータが他のブロックにおける描画オペレータの実行結果に依存するために、その２つのブロックを並列処理できない場合がある。この場合、上述したブロックごとの分割位置を修正し、並列処理できない複数のブロックをまとめて１個のＣＰＵに割り当てる必要がある。このような観点からブロックを並列処理できるか否かを判断するため、本実施形態では、ブロックを構成するＧＳオペレータおよび描画オペレータを、完結型描画オペレータ、通常描画オペレータ、座標設定ＧＳオペレータ、通常ＧＳオペレータの４つの種類に分類する。
【００３９】
完結型描画オペレータは、描画オペレータのうち、座標をオペレータのオペランド（引数）に与えるものである。直前のオペレータの処理には依存しない。例えば、ＰＣＬ−ＸＬでは、Ｐｉｅ、Ｒｅｃｔａｎｇｌｅ、ＲｏｕｎｄＲｅｃｔａｎｇｌｅ、Ｃｈｏｒｄ、Ｅｌｌｉｐｓｅ等の描画オペレータが該当する。
【００４０】
通常描画オペレータは、完結型描画オペレータではない通常の描画オペレータである。座標値は、「オペレータ実行直前の値」を用いる。そのため、直前のオペレータの処理が終了をするまで次の描画オペレータは実行できない。
【００４１】
座標設定ＧＳオペレータは、ＧＳオペレータのうち、座標を設定しているものである。例えば、ＰＣＬ−ＸＬでは、ＮｅｗＰａｔｈ、ＳｅｔＣｕｒｓｏｒ等のＧＳオペレータが該当する。
【００４２】
通常ＧＳオペレータは、座標設定ＧＳオペレータ以外の全てのＧＳオペレータである。すなわち、通常ＧＳオペレータによって、座標以外の種々の設定が行われる。
【００４３】
図４に示した描画コマンドにおいて、例えば、ＧＳオペレータＧＳ２に上記の座標設定ＧＳオペレータが存在せず、かつ描画オペレータＤ２の先頭が上記の完結型描画オペレータでない場合を考える。この場合、描画オペレータＤ２の先頭のオペレータによる描画開始座標は、ＧＳオペレータＧＳ１、描画オペレータＤ１、ＧＳオペレータＧＳ２の全てに依存する。すなわち、描画オペレータＤ２による描画は、描画オペレータＤ１による描画が終わった後でなければ実行できず、これらを並列処理することはできない。したがって、この場合、中間言語コード生成部１２０は、第１ブロックと第２ブロックをまとめて１個のＣＰＵに割り当てる。ＣＰＵは、この第１ブロックと第２ブロックのオペレータをシーケンシャルに実行する。分割位置が修正されて、複数のブロックが１個のＣＰＵに割り当てられた場合は、その後の処理において、この１個のＣＰＵに同時に割り当てられた複数のブロックを１ブロックとして扱って良い。
【００４４】
＜処理に要する時間を考慮したオペレータの割り当ての改善方法＞
上記のようにして、ページごとの中間言語コードの生成を並列処理にて行うことが可能となった。以下、オペレータの割り当てを改善し、中間言語コードの生成処理をさらに効率良く実行する方法を考える。
【００４５】
まず、処理に要する時間を考慮して、ブロックをＣＰＵに割り当てる方法を説明する。
実際の処理において、ＧＳオペレータより描画オペレータの方が、個々のオペレータの処理に要する時間が長いことを上述した。そこで、本実施形態は、ブロックにおけるオペレータの種類に基づいて処理に要する時間を予想し、処理時間が増加しない範囲で、処理の並列化を緩和する。
【００４６】
個々のオペレータの実行に要する時間は、同じ種類のオペレータであれば、完全に同一ではないが、それほど大きく変わらない。そこで、オペレータの種類ごとに予め平均処理時間を測定し、処理時間テーブルを作成しておく。この処理時間テーブルは、予めＲＯＭ１６０に保存しておく。中間言語コード生成部１２０は、データ解読部１１０により解読された個々のオペレータに関して、この処理時間テーブルを参照して平均処理時間を求め、ブロックの予想処理時間を計算する（ブロック内のオペレータの平均処理時間を加算する）。
【００４７】
図４に示した描画コマンドで、上述したように、第１ブロックと第２ブロックを１個のＣＰＵに割り当てた場合を考える。この場合、この２つのブロック（以下、第１〜第２ブロックと記す）のオペレータを実行するために要する予想処理時間は、第３ブロックおよび第４ブロックの各々の予想処理時間と比べて非常に長くなる。そこで、第３ブロックの予想処理時間と第４ブロックの予想処理時間の合計が、第１〜第２ブロックの予想処理時間よりも長い場合は、第３ブロックと第４ブロックをまとめて、１個のＣＰＵに割り当てる。このようにすれば、全体の予想処理時間を増やすことなく、第１ブロックから第４ブロックまでを２個のＣＰＵに割り当てることができた。４個のＣＰＵを持つ制御部１００であれば、２個のＣＰＵが余るので、これらのＣＰＵを用いて当該ページの後続のブロックや後続のページのブロックを割り当てて処理させることができる。
【００４８】
＜メモリの使用量を考慮したオペレータの割り当ての改善方法＞
次に、中間言語コード生成部１２０が処理を行う際のメモリ使用量を考慮して、ブロックをＣＰＵに割り当てる方法を説明する。
描画コマンドのオペレータを中間言語コードに変換する処理自体は、上記のように複数のＣＰＵに割り当てて並列処理することにより、処理に要する時間を短縮することが可能である。しかし、処理に要するメモリ・サイズが制御部１００のメモリ１５０の空き容量を超える場合、メモリ１５０に記憶されているデータを圧縮したり、磁気ディスク等へ退避させたりすることにより空き領域を拡大しなければならない。この空き領域を拡大する処理を行うことにより、中間言語コード生成部１２０の処理効率が低下する。そこで、本実施形態は、中間言語コード生成部１２０の処理に要するメモリ・サイズを予測し、このメモリ・サイズがメモリ１５０の空き容量を超えないように、ＣＰＵへのブロックの割り当てを行うこととする。
【００４９】
ブロックのうち、ＧＳオペレータが記載された部分は、記載されたＧＳオペレータの数に関わらず、メモリ使用量の最大値（上限）は固定である。これは、ＧＳオペレータに関しては、メモリ使用量は、その構造体のサイズにより定まるためである。したがって、ＧＳオペレータ部分のメモリ使用量は正確に計算することができる。
【００５０】
一方、描画オペレータが記載された部分は、記載された描画オペレータの数に応じて必要なメモリ・サイズが変わる（オペレータの数が増えると必要なメモリ・サイズも増加する）。また、オペレータの種類によって実行に必要なメモリ・サイズが異なる。同じ種類のオペレータの必要メモリ・サイズは、完全に同一ではないが、それほど大きく変わらない。そこで、オペレータの種類ごとに必要メモリ・サイズの平均値を算出し、使用メモリ予想テーブル１６１を作成しておく、この使用メモリ予想テーブル１６１は、予めＲＯＭ１６０に保存しておく。中間言語コード生成部１２０は、データ解読部１１０により解読された個々のオペレータに関して、使用メモリ予想テーブル１６１を参照して必要メモリ・サイズの平均値を求め、ブロックの描画オペレータ部分のメモリ使用量を計算する（ブロック内の各描画オペレータに関して、実行に必要なメモリ・サイズの平均値を加算する）。この描画オペレータ部分のメモリ使用量と上記ＧＳオペレータ部分のメモリ使用量とを加算して、ブロックの予想メモリ使用量が得られる。なお、ＧＳオペレータ部分のメモリ使用量は、描画オペレータの必要メモリ・サイズと共に使用メモリ予想テーブル１６１に保持させておいても良い。
【００５１】
図５は、メモリ使用量を考慮したブロックの割り当ての手順の概略を示すフローチャートである。
まず、中間言語コード生成部１２０は、割り当ての対象として、ｎ個のブロックに着目する（ステップ５０１）。ここで、ｎはＣＰＵの数である。ｎ個のブロックの先頭から順に、第１ブロック、第２ブロック、・・・、第ｎブロックとする。次に、中間言語コード生成部１２０は、使用メモリ予想テーブル１６１を参照し、各ブロックの予想メモリ使用量を算出する（ステップ５０２）。
【００５２】
次に、中間言語コード生成部１２０は、各ブロックの予想メモリ使用量を第１ブロックから順に加算し（ステップ５０３）、
式（１）：
（現在のメモリ残量）×０．８≧（ｍ個のブロックの予想メモリ使用量の合計）
を満たす最大のｍを求める（ステップ５０４）。すなわち、並列処理が可能な予想メモリ使用量の閾値として、現在のメモリ残量を基準とする動的な値（この例では０．８を乗じた値）が設定される。ここで、メモリ残量とは、メモリ１５０の空き容量である。また、ｍ≦ｎである。メモリが十分ある場合はｍ＝ｎとなる。予想メモリ使用量の合計が最大のときでもメモリ残量に余裕を持たせるために、メモリ残量に０．８を乗じている。この予想メモリ使用量の閾値を設定するための、メモリ残量に乗ずる値は自由に設定して良い。例えば、メモリ不足に対応するための処理（オーバーヘッド）を頻繁に起こさないようにするためには、値を小さくすれば良い。
【００５３】
この後、求めたｍの値に基づき、ｍ個のブロックをｍ個のＣＰＵに割り当て（ステップ５０５）、並列処理にて中間言語コードを生成する処理を実行する。そして、後続のブロックに着目し（ステップ５０６）、処理中のページを構成するブロックを全て処理するまで、ステップ５０１以降の処理を繰り返す（ステップ５０７）。
【００５４】
図４に示した描画コマンドを例として、メモリ使用量を考慮したブロックの割り当てについて具体的に説明する。
図６は、図４に示した描画コマンドにおけるオペレータごとの必要メモリ・サイズと、ブロックごとの予想メモリ使用量とを示す図である。なお、図６に示すメモリ・サイズの値は、各オペレータ間の相対的な値を示しており、特定の単位（バイト等）を示すものではない。
【００５５】
図６に示す例では、ＧＳオペレータ部分のメモリ使用量を１００としている。各描画オペレータの必要メモリ・サイズの値は、上記の使用メモリ予想テーブル１６１を参照して得られた値である。各オペレータの必要メモリ・サイズを加算して得られる、各ブロックの予想メモリ使用量は、第１ブロックが１１２０、第２ブロックが８２０、第３ブロックが１６０、第４ブロックが１５２０である。したがって、第１ブロックから第４ブロックまでの予想メモリ使用量の合計は３６２０、第１ブロックから第３ブロックまでの予想メモリ使用量の合計は２１００である。
【００５６】
ここで、メモリ１５０の空き容量が３０００であるとする。すると、
３０００×０．８＜３６２０
で、第１ブロックから第４ブロックまでの予想メモリ使用量の合計は、メモリ１５０の空き容量を超えてしまう。一方、
３０００×０．８＞２１００
で、第１ブロックから第３ブロックまでの予想メモリ使用量の合計は、メモリ１５０の空き容量以内に収まる。したがって、メモリ不足に対応するための処理（オーバーヘッド）を回避するためには、第１ブロックから第３ブロックまでを３個のＣＰＵに割り当てて、並列処理を行う。このとき、１個のＣＰＵはアイドル状態となり、次のブロックが割り当てられるのを待つ。
【００５７】
＜ポインタ・テーブル＞
以上のようにして、描画コマンドの各ページを構成するブロックが複数のＣＰＵに割り当てられ、並列処理にて中間言語コードが生成される。生成された中間言語コードは、中間言語用バッファ（メモリ１５０）に格納される。ここで、中間言語コードは、上記のようにブロックごとの並列処理により生成されるため、ブロックごとに分割されている。そこで、本実施形態では、中間言語コード生成部１２０は、元の描画コマンドにおける各ブロックの順番を管理するためのポインタ・テーブル１５１を作成する。すなわち、ポインタ・テーブル１５１は、並列処理により同時に生成された複数の中間言語コード群を、元の描画コマンドにおける各ブロックの順番に対応付ける対応情報を保持する。
【００５８】
ポインタ・テーブル１５１は、上記の手順で生成したブロックごとの中間言語コードと共に、中間言語バッファ（メモリ１５０）に格納される。なお、実際には、上記のように描画コマンドの分割位置が修正されて１個のＣＰＵに複数のブロックが割り当てられている場合があるが、この場合は、１個のＣＰＵに割り当てられたブロック全体で１ブロックとしてポインタ・テーブル１５１に登録される。
【００５９】
図７は、ポインタ・テーブル１５１の構成例を示す図である。
図７に示すように、ポインタ・テーブル１５１は、通し番号とブロックごとの中間言語コード群へのポインタとを関連づけている。この通し番号を各中間言語コードの元の描画コマンドにおける順番に対応づけて、テーブルにポインタを登録する。このようにすれば、中間言語処理部１３０は、ポインタ・テーブル１５１の通し番号順に、ポインタにて指定される中間言語コード群を中間言語用バッファから読み出すことで、元の描画コマンドにおける順番通りに中間言語コードを取得することができる。
【００６０】
＜制御部１００の動作の流れ＞
次に、制御部１００の動作の全体的な流れを説明する。
図８−１、２は、制御部１００の動作の全体的な流れを示すフローチャートである。
ここでは、並列処理を行うＣＰＵが４個である場合を例として説明する。また、図８−１、２には、印刷対象の描画コマンドのうち、１ページ分の描画コマンドを処理して印刷出力する動作が示されている。なお、ストリーム・ヘッダや、各ページのスタート・ページに基づく処理は、既存の印刷装置の制御手段による処理と同様であるため、説明を省略している。
【００６１】
制御部１００の中間言語コード生成部１２０は、まず変数ＢＬＯＣＫＮＵＭおよび変数ＣＰＵ＿Ｎを初期化する（ステップ８０１）。ここで、変数ＢＬＯＣＫＮＵＭは、現在処理中のブロックの通し番号を保存する変数である。また、変数ＣＰＵ＿Ｎは、いくつのＣＰＵが使用されたか、言い換えれば、いくつのブロックが中間言語用バッファに書き込まれたか、を示す変数である。このＣＰＵ＿Ｎは、全てのＣＰＵから共通にアクセスできる１つの変数である。
【００６２】
次に、制御部１００の中間言語コード生成部１２０は、現在の処理対象となっているページの先頭のブロックから順に、データ解読部１１０を介してデータ受信バッファ（メモリ１５０）に保持されている描画コマンドのオペレータを読み込んで、ＣＰＵへの割り当てを行う。本動作例では、ＣＰＵを４個としているので、最大で４ブロック分の描画コマンドを並列処理することができる。そこで、最大で４ブロック分の描画コマンドを順次読み込んで、処理を行う。以下、１サイクルの処理で中間言語コード生成部１２０が読み込み得る４ブロックを、順に、ブロック＃１、ブロック＃２、ブロック＃３、ブロック＃４とする。また、制御部１００を構成する４個のＣＰＵを、ＣＰＵ１０１、ＣＰＵ１０２、ＣＰＵ１０３、ＣＰＵ１０４とする。
【００６３】
図８−１を参照すると、中間言語コード生成部１２０は、まず１ブロック読み込み処理によりブロック＃１を読み込む（ステップ８０２）。そして、読み込んだブロック＃１に関してメモリ使用量予想処理を行う（ステップ８０３）。１ブロック読み込み処理およびメモリ使用量予想処理の詳細な手順については後述する。
【００６４】
次に、中間言語コード生成部１２０は、１ブロック読み込み処理によりブロック＃２を読み込み（ステップ８０４）、続いて、読み込んだブロック＃２に関してメモリ使用量予想処理を行う（ステップ８０５）。そして、中間言語コード生成部１２０は、ブロック＃１、＃２の予想メモリ使用量の合計が、図５を参照して説明した式（１）を満たすか否かを判断する。ここで、ステップ８０２およびステップ８０４で２つのブロックが読み込まれているので、式（１）におけるｍの値は２である。ブロック＃１、＃２の予想メモリ使用量の合計が式（１）を満たさない場合（ステップ８０６でＮｏ）、中間言語コード生成部１２０は、ステップ８０４で読み込んだブロック＃２のデータをデータ受信バッファに戻す（ステップ８０７）。これ以降、このサイクルでは、中間言語コード生成部１２０は、１ブロック（ブロック＃１）を対象として処理を行う。
【００６５】
ブロック＃１、＃２の予想メモリ使用量の合計が式（１）を満たす場合（ステップ８０６でＹｅｓ）、次に、中間言語コード生成部１２０は、１ブロック読み込み処理によりブロック＃３を読み込み（ステップ８０８）、続いて、読み込んだブロック＃３に関してメモリ使用量予想処理を行う（ステップ８０９）。そして、中間言語コード生成部１２０は、ブロック＃１〜＃３の予想メモリ使用量の合計が、図５を参照して説明した式（１）を満たすか否かを判断する。ここでは、ステップ８０８で、さらに１ブロックが読み込まれているので、式（１）におけるｍの値は３である。ブロック＃１〜＃３の予想メモリ使用量の合計が式（１）を満たさない場合（ステップ８１０でＮｏ）、中間言語コード生成部１２０は、ステップ８０８で読み込んだブロック＃３のデータをデータ受信バッファに戻す（ステップ８１１）。これ以降、このサイクルでは、中間言語コード生成部１２０は、２ブロック（ブロック＃１、＃２）を対象として処理を行う。
【００６６】
ブロック＃１〜＃３の予想メモリ使用量の合計が式（１）を満たす場合（ステップ８１０でＹｅｓ）、次に、中間言語コード生成部１２０は、１ブロック読み込み処理によりブロック＃４を読み込み（ステップ８１２）、続いて、読み込んだブロック＃４に関してメモリ使用量予想処理を行う（ステップ８１３）。そして、中間言語コード生成部１２０は、ブロック＃１〜＃４の予想メモリ使用量の合計が、図５を参照して説明した式（１）を満たすか否かを判断する。ここでは、ステップ８１２で、さらに１ブロックが読み込まれているので、式（１）におけるｍの値は４である。ブロック＃１〜＃４の予想メモリ使用量の合計が式（１）を満たさない場合（ステップ８１４でＮｏ）、中間言語コード生成部１２０は、ステップ８１２で読み込んだブロック＃４のデータをデータ受信バッファに戻す（ステップ８１５）。これ以降、このサイクルでは、中間言語コード生成部１２０は、３ブロック（ブロック＃１〜＃３）を対象として処理を行う。一方、ブロック＃１〜＃４の予想メモリ使用量の合計が式（１）を満たす場合（ステップ８１４でＹｅｓ）、中間言語コード生成部１２０は、読み込んだ４ブロック（ブロック＃１〜＃４）の全てを対象として処理を行う。
【００６７】
以上の動作において、ブロックを読み込む、ブロックのデータをデータ受信バッファに戻す、等の記載で表現される動作の実現方法は特に限定しない。すなわち、これらの動作において、必ずしもメモリ１５０内のデータ移動やコピーが行われるわけではない。例えば、メモリ１５０に保持されている一連の描画コマンドのどこまで読んだかを示すポインタを用意し、このポインタを操作する、といった動作によって実現しても良い。
【００６８】
次に、図８−２を参照すると、ブロック＃１のみが処理対象である場合（ステップ８０６でＮｏ、ステップ８０７の後）、中間言語コード生成部１２０は、ＣＰＵ１０１にブロック＃１を割り当て、このブロック＃１のオペレータに対応する中間言語コードを生成する（ステップ８１６）。そして、生成した中間言語コード群を中間言語用バッファ（メモリ１５０）に格納する。また、ポインタ・テーブル１５１の通し番号「ＢＬＯＣＫＮＵＭ＋１」のエントリに、格納した中間言語コード群へのポインタを書き込む（ステップ８１７）。この後、中間言語コード生成部１２０は、変数ＣＰＵ＿Ｎの値に１を加算して新たな変数ＣＰＵ＿Ｎとする（ステップ８１８）。
【００６９】
次に、ブロック＃１、＃２が処理対象である場合（ステップ８１０でＮｏ、ステップ８１１の後）、中間言語コード生成部１２０は、ＣＰＵ１０１にブロック＃１を割り当て、ＣＰＵ１０２にブロック＃２を割り当てて、並列処理により、このブロック＃１、＃２のオペレータに対応する中間言語コードを生成する（ステップ８１９）。そして、生成した中間言語コード群を中間言語用バッファ（メモリ１５０）に格納する。また、ポインタ・テーブル１５１の通し番号「ＢＬＯＣＫＮＵＭ＋１」のエントリに、ブロック＃１のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「ＢＬＯＣＫＮＵＭ＋２」のエントリに、ブロック＃２のオペレータに対応する中間言語コード群へのポインタを書き込む（ステップ８２０）。この後、中間言語コード生成部１２０は、変数ＣＰＵ＿Ｎの値に２を加算して新たな変数ＣＰＵ＿Ｎとする（ステップ８２１）。
【００７０】
次に、ブロック＃１〜＃３が処理対象である場合（ステップ８１４でＮｏ、ステップ８１５の後）、中間言語コード生成部１２０は、ＣＰＵ１０１にブロック＃１を割り当て、ＣＰＵ１０２にブロック＃２を割り当て、ＣＰＵ１０３にブロック＃３を割り当てて、並列処理により、このブロック＃１〜＃３のオペレータに対応する中間言語コードを生成する（ステップ８２２）。そして、生成した中間言語コード群を中間言語用バッファ（メモリ１５０）に格納する。また、ポインタ・テーブル１５１の通し番号「ＢＬＯＣＫＮＵＭ＋１」のエントリに、ブロック＃１のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「ＢＬＯＣＫＮＵＭ＋２」のエントリに、ブロック＃２のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「ＢＬＯＣＫＮＵＭ＋３」のエントリに、ブロック＃３のオペレータに対応する中間言語コード群へのポインタを書き込む（ステップ８２３）。この後、中間言語コード生成部１２０は、変数ＣＰＵ＿Ｎの値に３を加算して新たな変数ＣＰＵ＿Ｎとする（ステップ８２４）。
【００７１】
次に、ブロック＃１〜＃４が処理対象である場合（ステップ８１４でＹｅｓ）、中間言語コード生成部１２０は、ＣＰＵ１０１にブロック＃１を割り当て、ＣＰＵ１０２にブロック＃２を割り当て、ＣＰＵ１０３にブロック＃３を割り当て、ＣＰＵ１０４にブロック＃４を割り当てて、並列処理により、このブロック＃１〜＃４のオペレータに対応する中間言語コードを生成する（ステップ８２５）。そして、生成した中間言語コード群を中間言語用バッファ（メモリ１５０）に格納する。また、ポインタ・テーブル１５１の通し番号「ＢＬＯＣＫＮＵＭ＋１」のエントリに、ブロック＃１のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「ＢＬＯＣＫＮＵＭ＋２」のエントリに、ブロック＃２のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「ＢＬＯＣＫＮＵＭ＋３」のエントリに、ブロック＃３のオペレータに対応する中間言語コード群へのポインタを書き込み、通し番号「ＢＬＯＣＫＮＵＭ＋４」のエントリに、ブロック＃４のオペレータに対応する中間言語コード群へのポインタを書き込む（ステップ８２６）。この後、中間言語コード生成部１２０は、変数ＣＰＵ＿Ｎの値に４を加算して新たな変数ＣＰＵ＿Ｎとする（ステップ８２７）。
【００７２】
ステップ８１８、８２１、８２４、８２７のいずれかで、変数ＣＰＵ＿Ｎが更新された後、中間言語コード生成部１２０は、変数ＢＬＯＣＫＮＵＭの値に更新された変数ＣＰＵ＿Ｎの値を加算して新たな変数ＢＬＯＣＫＮＵＭとし（ステップ８２８）、変数ＣＰＵ＿Ｎを初期化する（ステップ８２９）。そして、中間言語コード生成部１２０は、１ページ分の処理が完了したか否かを判断する。完了していない場合（ステップ８３０でＮｏ）、中間言語コード生成部１２０は、ステップ８０２に戻り、上記の処理を繰り返す。
【００７３】
１ページ分の処理が完了したならば（ステップ８３０でＹｅｓ）、次に、制御部１００の中間言語処理部１３０が、中間言語コード群からラスタ・データを生成する中間言語描画処理を実行する（ステップ８３１）。中間言語描画処理の手順については後述する。中間言語描画処理により生成されたラスタ・データは、ラスタ・データ用バッファ（メモリ１５０）に格納される。
【００７４】
次に、制御部１００の印刷制御部１４０が、ラスタ・データ用バッファから１ページ分の画像のラスタ・データを読み出し、印刷機構２００を制御して、用紙等の印刷媒体上に画像を形成して印刷出力する（ステップ８３２）。印刷対象の文書が複数ページにわたる場合は、以上の処理がページ数分だけ繰り返される。
【００７５】
＜１ブロック読み込み処理＞
図９は、図８−１のステップ８０２、８０４、８０８、８１２に示す、１ブロック読み込み処理の手順を示すフローチャートである。
図９を参照すると、１ブロック読み込み処理において中間言語コード生成部１２０は、まずＧＳオペレータ受信処理を実行し（ステップ９０１）、データ受信バッファにオペレータが残っているかを判断する。オペレータが残っているならば（ステップ９０２でＹｅｓ）、次に、中間言語コード生成部１２０は、描画オペレータ受信処理を実行し（ステップ９０３）、データ受信バッファにオペレータが残っているかを判断する。オペレータが残っているならば（ステップ９０４でＹｅｓ）、次に、中間言語コード生成部１２０は、分割位置チェック処理を実行する（ステップ９０５）。以上の、ＧＳオペレータ受信処理、描画オペレータ受信処理、分割位置チェック処理の手順については後述する。
【００７６】
ＧＳオペレータ受信処理または描画オペレータ受信処理の後にオペレータが残っていない場合（（ステップ９０２でＮｏ、またはステップ９０４でＮｏ）、中間言語コード生成部１２０は、１ブロック読み込み処理を終了する。分割位置チェック処理の結果、分割位置の修正が必要ない場合も（ステップ９０６でＮｏ）、中間言語コード生成部１２０は、１ブロック読み込み処理を終了する。一方、分割位置の修正が必要ならば（ステップ９０６でＹｅｓ）、中間言語コード生成部１２０は、ステップ９０１に戻って、以上の動作を繰り返す。
【００７７】
＜描画オペレータ受信処理＞
図１０は、図９のステップ９０１に示す、描画オペレータ受信処理の手順を示すフローチャートである。
図１０を参照すると、描画オペレータ受信処理において中間言語コード生成部１２０は、まずデータ解読部１１０に、次のオペレータの情報を要求する（ステップ１００１）。次のオペレータが存在する場合（ステップ１００２でＹｅｓ）、そのオペレータが描画オペレータであれば（ステップ１００３でＹｅｓ）、中間言語コード生成部１２０は、データ解読部１１０からそのオペレータを１つ受信し、メモリ１５０の作業領域に格納する（ステップ１００４）。そして、ステップ１００１に戻り、処理を繰り返す。
【００７８】
次のオペレータが存在しない場合（ステップ１００２でＮｏ）、および次のオペレータが存在するが描画オペレータでない（ＧＳオペレータである）場合（ステップ１００３でＮｏ）は、中間言語コード生成部１２０は、描画オペレータ受信処理を終了する。なお、以上の処理において、オペレータの種類の判断は、予めオペレータを分類したテーブルをＲＯＭ１６０等に保持しておき、参照して行えば良い。
【００７９】
＜ＧＳオペレータ受信処理＞
図１１は、図９のステップ９０３に示す、ＧＳオペレータ受信処理の手順を示すフローチャートである。
図１１を参照すると、描画オペレータ受信処理において中間言語コード生成部１２０は、まずデータ解読部１１０に、次のオペレータの情報を要求する（ステップ１１０１）。次のオペレータが存在する場合（ステップ１１０２でＹｅｓ）、そのオペレータがＧＳオペレータであれば（ステップ１１０３でＹｅｓ）、中間言語コード生成部１２０は、データ解読部１１０からそのオペレータを１つ受信し、メモリ１５０の作業領域に保持する（ステップ１１０４）。そして、ステップ１１０１に戻り、処理を繰り返す。
【００８０】
次のオペレータが存在しない場合（ステップ１１０２でＮｏ）、および次のオペレータが存在するがＧＳオペレータでない（描画オペレータである）場合（ステップ１１０３でＮｏ）は、中間言語コード生成部１２０は、ＧＳオペレータ受信処理を終了する。なお、以上の処理において、オペレータの種類の判断は、予めオペレータを分類したテーブルをＲＯＭ１６０等に保持しておき、参照して行えば良い。
【００８１】
＜分割位置チェック処理＞
図１２は、図９のステップ９０５に示す、分割位置チェック処理の手順を示すフローチャートである。
図１２を参照すると、分割位置チェック処理において中間言語コード生成部１２０は、まず、次のブロックの先頭のオペレータを指示する次ブロック先頭ポインタを、処理中のオペレータの位置を指示する値に書き換える（ステップ１２０１）。そして、分割位置修正フラグの値を、修正を要することを示す値（図１２では「１」）とする（ステップ１２０２）。
【００８２】
次に、中間言語コード生成部１２０は、ＧＳオペレータ受信処理を行う（ステップ１２０３）。そして、読み込んだＧＳオペレータ中に、座標設定オペレータが存在するか否かを判断する。座標設定オペレータが存在する場合（ステップ１２０４でＹｅｓ）、着目している次のブロックは、現在処理中（読み込み中）のブロックと並列に処理することができるので、分割位置修正フラグの値を、修正を要しないことを示す値（図１２では「０」）とする（ステップ１２０５）。これにより、現在処理中のブロックと次のブロックとは分割され、並列に処理されることとなる。次に、中間言語コード生成部１２０は、現在処理中のオペレータの位置に、次ブロック先頭ポインタの値を書き換えて、分割位置チェック処理を終了する（ステップ１２０８）。次ブロック先頭ポインタの値を現在処理中のオペレータの位置に戻すことは、分割位置チェック処理においてデータを読み込んだために進んだカウンタを元に戻すことを意味している。
【００８３】
読み込んだＧＳオペレータ中に、座標設定オペレータが存在しない場合（ステップ１２０４でＮｏ）、中間言語コード生成部１２０は、データ解読部１１０に、さらに次のオペレータの情報を要求する（ステップ１２０６）。次のオペレータが存在し、かつそのオペレータが完結型描画オペレータである場合（ステップ１２０７でＹｅｓ）、着目している次のブロックは、現在処理中のブロックと並列に処理することができるので、分割位置修正フラグの値を「０」とする（ステップ１２０５）。これにより、現在処理中のブロックと次のブロックとは分割され、並列に処理されることとなる。次に、中間言語コード生成部１２０は、現在処理中のオペレータの位置に、次ブロック先頭ポインタの値を書き換えて、分割位置チェック処理を終了する（ステップ１２０８）。
【００８４】
次のブロックにおいて、ＧＳオペレータ中に座標設定オペレータが存在せず（ステップ１２０４でＮｏ）、かつその次に完結型描画オペレータが存在しない場合（ステップ１２０７でＮｏ）、次のブロックの描画オペレータは、現在処理中のブロックの描画オペレータの実行結果に依存するため、現在処理中のブロックと次のブロックとを並列に処理することができない。したがって、分割位置修正フラグの値は変更されず、ステップ１２０２で設定された「１」のままである。これにより、現在処理中のブロックと次のブロックとは分割されず、図９に示した１ブロック読み込み処理で一緒に読み込まれ、逐次処理されることとなる。この後、中間言語コード生成部１２０は、現在処理中のオペレータの位置に、次ブロック先頭ポインタの値を書き換えて、分割位置チェック処理を終了する（ステップ１２０８）。
【００８５】
＜メモリ使用量予想処理＞
図１３は、図８−１のステップ８０３、８０５、８０９、８１３に示す、メモリ使用量予想処理の手順を示すフローチャートである。
図１３を参照すると、メモリ使用量予想処理において中間言語コード生成部１２０は、まずＧＳオペレータのメモリ使用量を使用メモリ予想テーブル１６１から読み出す（ステップ１３０１）。次に、中間言語コード生成部１２０は、処理中のブロック内の全ての描画オペレータを抽出する（ステップ１３０２）。このとき、抽出するのはオペレータ本体のみであり、オペレータに付随する描画データは無視する。
【００８６】
次に、中間言語コード生成部１２０は、使用メモリ予想テーブル１６１から、ステップ１３０２で抽出した描画オペレータの必要メモリ・サイズの平均値を読み出す（ステップ１３０３）。そして、ステップ１３０１で取得したＧＳオペレータ部分のメモリ使用量と、ステップ１３０３で取得した各描画オペレータの必要メモリ・サイズの平均値とを合計し、ブロック全体の予想メモリ使用量を算出する（ステップ１３０４）。
【００８７】
図１４は、使用メモリ予想テーブル１６１の構成例を示す図である。
図１４に示すように、使用メモリ予想テーブル１６１は、１ブロックにおけるＧＳオペレータ部分のメモリ使用量と、個々の描画オペレータの予想メモリ使用量（必要メモリ・サイズの平均値）とを登録している。中間言語コード生成部１２０は、この使用メモリ予想テーブル１６１を参照して、上記ステップ１３０１およびステップ１３０３で必要な情報を取得する。
【００８８】
＜中間言語描画処理＞
図１５は、図８−２のステップ８３１に示す、中間言語描画処理の手順を示すフローチャートである。
図１５を参照すると、中間言語描画処理において中間言語処理部１３０は、まずメモリ１５０に保持されているポインタ・テーブル１５１を参照し、未処理のポインタのうちで通し番号が最も若いポインタに着目する（ステップ１５０１）。そして、ステップ１５０１で着目したポインタが指示する中間言語コード群を中間言語用バッファ（メモリ１５０）から読み出し、描画処理（ラスタ・データの生成）を行う（ステップ１５０２）。以上の処理を、中間言語用バッファに保持されている全ての中間言語コード群に対して順次行い、中間言語用バッファが空になったならば、中間言語処理部１３０は、中間言語描画処理を終了する（ステップ１５０３）。
【００８９】
以上、本実施形態について説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。例えば、上記の実施形態では、制御部１００を４個のＣＰＵで構成したが、ＣＰＵの個数は上記の構成例に限定されない。また、１個のＣＰＵに複数のプロセッサ・コアを搭載したマルチコア・プロセッサを用いても良い。この場合、マルチコア・プロセッサにおける個々のプロセッサ・コアを、上記の実施形態における個々のＣＰＵと同等に扱う。すなわち、ブロック単位に分割された描画コマンドを、各プロセッサ・コアに割り当てて、各プロセッサ・コアによる並列処理により中間言語コードに変換する。その他、上記実施形態に、種々の変更または改良を加えたものも、本発明の技術的範囲に含まれることは、特許請求の範囲の記載から明らかである。
【符号の説明】
【００９０】
１００…制御部、１１０…データ解読部、１２０…中間言語コード生成部、１３０…中間言語処理部、１４０…印刷制御部、１５０…メモリ、１６０…ＲＯＭ、２００…印刷機構、３００…Ｉ／Ｏインターフェイス
【図１】
2010244359.tif 000003
【図２】
2010244359.tif 000004
【図３】
2010244359.tif 000005
【図４】
2010244359.tif 000006
【図５】
2010244359.tif 000007
【図６】
2010244359.tif 000008
【図７】
2010244359.tif 000009
【図８−１】
2010244359.tif 000010
【図８−２】
2010244359.tif 000011
【図９】
2010244359.tif 000012
【図１０】
2010244359.tif 000013
【図１１】
2010244359.tif 000014
【図１２】
2010244359.tif 000015
【図１３】
2010244359.tif 000016
【図１４】
2010244359.tif 000017
【図１５】
2010244359.tif 000018