(57)【特許請求の範囲】
【請求項１】
印刷データを解釈する解釈部と前記解釈部による解釈に基づいて前記印刷データの中間データを生成可能な生成部と、前記解釈部での解釈済みのページ数を保持する第一の保持部とをそれぞれ有する複数の解釈手段と、
中間データを生成すべきページ番号を前記複数の解釈手段のうちの対応する解釈手段に通知する通知手段と
を有する印刷データ処理装置であって、
前記解釈手段は、
前記第一の保持部とは異なる種別のページ数を保持する第二の保持部と、
これまで解釈した内容を無効化するコマンドを検知した場合、前記無効化するコマンドを検知した時点において前記第一の保持部に保持しているページ数を前記第二の保持部に保持しているページ数に加算することで前記第二の保持部に保持しているページ数を更新し、前記第一の保持部に保持している前記解釈済みのページ数をリセットする第一の処理部と、
前記第一の保持部に保持しているページ数と前記第二の保持部に保持しているページ数との和が、前記通知手段によって通知されたページ番号と一致する場合、前記生成部に前記中間データの生成を実行させる第二の処理部と
をさらに有することを特徴とする印刷データ処理装置。
【請求項２】
印刷データを解釈する解釈部と、前記解釈部による解釈に基づいて前記印刷データの中間データを生成可能な生成部と、前記解釈部での解釈済みのページ数を保持する第一の保持部とをそれぞれ有する複数の解釈手段と、
中間データを生成すべきページ番号を前記複数の解釈手段のうちの対応する解釈手段に通知する通知手段と
を有する印刷データ処理装置であって、
前記解釈手段は、
前記解釈部での解釈済みの総ページ数を保持する第二の保持部と、
これまで解釈した内容を無効化するコマンドを検知した場合、前記第一の保持部に保持している前記解釈済みのページ数をリセットする第一の処理部と、
前記第二の保持部に保持しているページ数が、前記通知手段によって通知されたページ番号と一致する場合、前記生成部に前記中間データの生成を実行させる第二の処理部とをさらに有することを特徴とする印刷データ処理装置。
【請求項３】
前記第二の保持部に保持されているページ数は、前記無効化するコマンドを検知した場合にリセットされないことを特徴とする請求項１または２に記載の印刷データ処理装置。
【請求項４】
印刷データを解釈する解釈部と、前記解釈部による解釈に基づいて前記印刷データの中間データを生成可能な生成部と、前記解釈部での解釈済みのページ数を保持する第一の保持部とをそれぞれ有する複数の解釈手段と、
中間データを生成すべきページ番号を前記複数の解釈手段のうちの対応する解釈手段に通知する通知手段と
を有する印刷データ処理装置であって、
前記解釈手段は、
これまで解釈した内容を無効化するコマンドを検知した場合、前記第一の保持部に保持している前記解釈済みのページ数を前記通知手段に通知し、リセットする第一の処理部と、前記第一の保持部に保持しているページ数が、前記通知手段によって通知されたページ番号と一致する場合、前記生成部に前記中間データの生成を実行させる第二の処理部とをさらに有し、
前記通知手段は、前記解釈手段から通知されたページ数を、中間データを生成すべきページ番号から差し引いた値を前記解釈手段に通知する第三の処理部を有することを特徴とする印刷データ処理装置。
【請求項５】
前記生成部は、前記第一の保持部に保持されている解釈済みページ数を、対応するページのページ番号として出力する中間データを生成することを特徴とする請求項１から４のいずれか一項に記載の印刷データ処理装置。
【請求項６】
前記通知手段は、前記複数の解釈手段に対してそれぞれ異なるページ番号を通知することを特徴とする請求項１から５のいずれか一項に記載の印刷データ処理装置。
【請求項７】
前記解釈手段は、前記解釈部に前記印刷データの全てのページのデータを解釈させることを特徴とする請求項１から６のいずれか一項に記載の印刷データ処理装置。
【請求項８】
前記印刷データは、ページ非独立な言語のＰＤＬデータであることを特徴とする請求項１から７のいずれか一項に記載の印刷データ処理装置。
【請求項９】
前記ページ非独立な言語はＰｏｓｔＳｃｒｉｐｔであり、前記無効化するコマンドは、ｓｔａｒｔｊｏｂコマンドまたはｅｘｉｔｓｅｒｖｅｒコマンドであることを特徴とする請求項８に記載の印刷データ処理装置。
【請求項１０】
前記解釈手段および前記通知手段は、スレッドとして起動されることを特徴とする請求項１から９のいずれか一項に記載の印刷データ処理装置。
【請求項１１】
印刷データを解釈する解釈部と、前記解釈部による解釈に基づいて前記印刷データの中間データを生成可能な生成部と、前記解釈部での解釈済みのページ数を保持する第一の保持部と、前記第一の保持部とは異なる種別のページ数を保持する第二の保持部とをそれぞれ有する複数の解釈手段と、
中間データを生成すべきページ番号を前記複数の解釈手段のうちの対応する解釈手段に通知する通知手段と
を有する印刷データ処理装置における印刷データ処理方法であって、
前記解釈手段に、
これまで解釈した内容を無効化するコマンドを検知した場合、前記無効化するコマンドを検知した時点において前記第一の保持部に保持しているページ数を前記第二の保持部に保持しているページ数に加算することで前記第二の保持部に保持しているページ数を更新し、前記第一の保持部に保持している前記解釈済みのページ数をリセットする第一の処理ステップと、
前記第一の保持部に保持しているページ数と前記第二の保持部に保持しているページ数との和が、前記通知手段によって通知されたページ番号と一致する場合、前記生成部に前記中間データの生成を実行させる第二の処理ステップと
を実行することを特徴とする印刷データ処理方法。
【請求項１２】
印刷データを解釈する解釈部と、
前記解釈部による解釈に基づいて前記印刷データの中間データを生成可能な生成部と、
前記解釈部での解釈済みのページ数を保持する第一の保持部と、前記解釈部での解釈済みの総ページ数を保持する第二の保持部とをそれぞれ有する複数の解釈手段と、
中間データを生成すべきページ番号を前記複数の解釈手段のうちの対応する解釈手段に通知する通知手段と
を有する印刷データ処理装置における印刷データ処理方法であって、
前記解釈手段は、
これまで解釈した内容を無効化するコマンドを検知した場合、前記第一の保持部に保持している前記解釈済みのページ数をリセットする第一の処理ステップと、
前記第二の保持部に保持しているページ数が、前記通知手段によって通知されたページ番号と一致する場合、前記生成部に前記中間データの生成を実行させる第二の処理ステップと
を実行することを特徴とする印刷データ処理方法。
【請求項１３】
印刷データを解釈する解釈部と、
前記解釈部による解釈に基づいて前記印刷データの中間データを生成可能な生成部と、前記解釈部での解釈済みのページ数を保持する第一の保持部とをそれぞれ有する複数の解釈手段と、
中間データを生成すべきページ番号を前記複数の解釈手段のうちの対応する解釈手段に通知する通知手段と
を有する印刷データ処理装置における印刷データ処理方法であって、
前記解釈手段は、
これまで解釈した内容を無効化するコマンドを検知した場合、前記第一の保持部に保持している前記解釈済みのページ数を前記通知手段に通知し、リセットする第一の処理ステップと、
前記第一の保持部に保持しているページ数が、前記通知手段によって通知されたページ番号と一致する場合、前記生成部に前記中間データの生成を実行させる第二の処理ステップと
を実行し、
前記通知手段は、前記解釈手段から通知されたページ数を、中間データを生成すべきページ番号から差し引いた値を前記解釈手段に通知する第三の処理ステップを実行することを特徴とする印刷データ処理方法。
【請求項１４】
コンピュータを、請求項１から１０のいずれか一項に記載の印刷データ処理装置の各手段として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、印刷データを解釈する処理に関する。
【背景技術】
【０００２】
印刷装置は、ページ記述言語（ＰＤＬ）で記述された印刷データ（ＰＤＬデータ）を解釈し、その解釈結果に基づいて中間データを一旦生成する。そして、その中間データから画像を生成し、生成した画像を印刷する。特許文献１は、印刷データにおける別々のページを並列に解釈して中間データを生成する印刷装置を開示する。
【０００３】
印刷データにおける別々のページを並列に解釈する場合、ページを並列に解釈する複数の解釈部と、それら複数の解釈部に対して中間データを生成すべきページを通知する制御部とが利用される。具体的には、印刷ジョブの開始に伴い、各解釈部はそれぞれ、印刷データを先頭のページから順に解釈し始め、解釈済みのページ数を管理する。一方、制御部は、中間データを生成すべきページの番号（ページ番号）を印刷ジョブの開始から１、２、３．．．と順にインクリメントしながら、各解釈部に対して、中間データを生成すべき別々のページ番号を通知する。例えば制御部は、ある解釈部にページ番号「１」を通知すると、次の解釈部にはページ番号「２」を通知する。そして各解釈部は、あるページの解釈を完了したときに、自身が管理する解釈済みページ数と、通知されたページ番号とが一致する場合に、そのページの中間データを生成する。そして中間データが生成されたページが印刷される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１３−１４０３９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
印刷データには、印刷ジョブの途中においても、解釈部において管理されている解釈済みページ数を０にリセットするコマンドが存在する。ＰｏｓｔＳｃｒｉｐｔ（登録商標）における、ｓｔａｒｔｊｏｂのようなコマンドである。このようなコマンドはページリセットコマンドと呼ばれ、解釈部はページリセットコマンドを検知（解釈）すると、自身が管理する解釈済みページ数を「０」にリセットする。ここで言う、解釈済みページ数とは解釈部内のページカウンタであり、このページカウンタの値は印刷装置の設定に応じてページ数の印字などに用いられる。例えばページ数をリセットすることで、同一印刷ジョブ内の別々のページであっても、同一のページ番号を割り当てることが可能になる。例えば印刷データの２ページ目にページリセットコマンドを含めることで、印刷データの１ページ目と、ページリセットコマンドを含むページ（つまり印刷データの２ページ目）とに、ページ番号「１」を割り当てることが可能になる。
【０００６】
上記のページリセットコマンドが印刷データに含まれる場合に、従来の解釈部と制御部とを用いた印刷装置では、ページリセットコマンドが含まれるページが印刷されなくなるという課題が生じる。従来の解釈部では、ページリセットコマンドが含まれるページを解釈すると、解釈部で管理する解釈済みページ数が「０」にリセットされるが、制御部はそのことを把握せずに、中間データを生成すべきページ番号を解釈部に通知する。この結果、制御部がある解釈部に中間データを生成すべきことを意図して通知したページ番号と、解釈部が自身で管理する解釈済みページ数との間でズレが生じてしまい、結果として、ページリセットコマンドが含まれるページが印刷されなくなってしまう。例えば制御部は、印刷データの２ページ目の中間データの生成を解釈部Ｘに行わせるべく、ページ番号「２」を解釈部Ｘに通知する。ここで印刷データの２ページ目にページリセットコマンドが含まれていると、解釈部Ｘが管理する解釈済みページ数は、ページリセットコマンド検知時には「０」にリセットされる。そして解釈部Ｘは、このページリセットコマンドに引き続く印刷データの２ページ目の解釈を開始することになる。ところが、解釈部Ｘが管理する解釈済みページ数がリセットされているため、印刷データの２ページ目の解釈完了時には解釈部Ｘが管理する解釈済みページ数は「２」ではなく「１」となっている。そのため、解釈完了済みページ数「１」は、制御部が通知した通知ページ番号「２」と一致せず、印刷データの２ページ目の中間データが生成されない。その結果、印刷データの２ページ目が印刷されなくなってしまう。
【課題を解決するための手段】
【０００７】
本発明に係る印刷データ処理装置は、印刷データを解釈する解釈部と、前記解釈部による解釈に基づいて前記印刷データの中間データを生成可能な生成部と、前記解釈部での解釈済みのページ数を保持する第一の保持部とをそれぞれ有する複数の解釈手段と、中間データを生成すべきページ番号を前記複数の解釈手段のうちの対応する解釈手段に通知する通知手段とを有する印刷データ処理装置であって、前記解釈手段は、前記第一の保持部とは異なる種別のページ数を保持する第二の保持部と、これまで解釈した内容を無効化するコマンドを検知した場合、前記無効化するコマンドを検知した時点において前記第一の保持部に保持しているページ数を第二の保持部に保持しているページ数に加算することで前記第二の保持部に保持しているページ数を更新し、前記第一の保持部に保持している前記解釈済みのページ数をリセットする第一の処理部と、前記第一の保持部に保持しているページ数と前記第二の保持部に保持しているページ数との和が、前記通知手段によって通知されたページ番号と一致する場合、前記生成部に前記中間データの生成を実行させる第二の処理部とをさらに有することを特徴とする。
【発明の効果】
【０００８】
印刷データのページを並列に解釈する印刷データ処理装置を用いた処理において、印刷データに解釈済みページ数をリセットするコマンドが含まれていても、ページの抜けがない印刷結果を出力することができる。
【図面の簡単な説明】
【０００９】
【図１】実施例１の説明で用いる、画像形成装置のハードウェア構成図である。
【図２】実施例１の説明で用いる、画像形成装置のソフトウェア構成図である。
【図３】実施例１の説明で用いる、印刷データの記述例と描画内容である。
【図４】実施例１の説明で用いる、ページスキップ処理とページ描画処理を説明する図である。
【図５】実施例１の説明で用いる、ページ並列処理の簡易シーケンス図である。
【図６】従来技術におけるページ並列処理の簡易シーケンス図である。
【図７】実施例１におけるページ並列制御処理の簡易シーケンス図である。
【図８】実施例１におけるページ並列制御部のフローチャートである。
【図９】実施例１におけるインタプリタのフローチャートである。
【図１０】実施例２におけるページ並列処理の簡易シーケンス図である。
【図１１】実施例２におけるインタプリタのフローチャートである。
【発明を実施するための形態】
【００１０】
以下、本発明を実施するための形態について図面を用いて説明する。ただし、この実施形態に記載されている図面はあくまで例示であり、この発明の範囲をそれらにのみ限定する主旨のものではない。
＜実施例１＞
以下、実施例１を説明する。なお、本実施例では印刷データを記述するＰＤＬとしてページ非独立なＰＤＬを用いる例を説明する。ページ非独立なＰＤＬとは、印刷処理のための情報を、印刷データのあらゆる箇所に、ページを跨いで記述可能なＰＤＬである。従って、ページ非独立なＰＤＬを、複数の解釈部を用いて並列処理して解釈する際には、それぞれの解釈部が中間データを生成する対象のページのみならず、印刷データの先頭からのページを各解釈部が解釈する必要がある。本実施例においては、ページ非独立なＰＤＬの例として、Ｐｏｓｔｓｃｒｉｐｔ（登録商標）（以下、ＰＳという）を例に挙げて説明する。なお、ページ非独立なＰＤＬとしては、ＰＳに限られるものではなく、ＰＣＬなど他のＰＤＬであってもよい。
【００１１】
＜画像形成装置のハードウェアブロック図＞
図１は本実施例の画像形成装置の構成を説明するハードウェアブロック図である。図１の画像形成装置は、コントローラユニット１００を有する。コントローラユニット１００は、画像信号やデバイス情報の入出力を制御する。なお、画像形成装置のことを、印刷データ処理装置と呼んでもよいし、コントローラユニット１００を印刷データ処理装置と呼んでもよい。
【００１２】
中央演算装置１０１は補助記憶装置１０３に記憶されたプログラムを主記憶装置１０２に読み出し、実行する。さらに、システムバス１０９に接続される各デバイスを中央演算装置１０１が統括的に制御する。本実施例における中央演算装置１０１は並列処理を実現する。並列処理を実現するために、中央演算装置１０１はハードウェアとしてプロセッサを複数有するマルチコアシステムを採用する。あるいは、マイクロプロセッサとして、複数のプロセッサコアを備えているものでもよい。さらには、ハイパースレッディングのようなプロセッサ内のレジスタやパイプラインの空き時間を有効利用して1つのプロセッサをあたかも複数のプロセッサであるかのように見せる技術が利用出来るものを用いても良い。
【００１３】
主記憶装置１０２は、中央演算装置１０１の主メモリ、ワークメモリとして機能する。
【００１４】
補助記憶装置１０３は大容量データを一時的あるいは長期的に保持する目的でも使用される。本実施例においては、パイプライン並列を実施する際にバッファ領域にデータが保存される。主記憶装置１０２または補助記憶装置１０３は、このバッファ領域を提供する。
【００１５】
ＮｅｔｗｏｒｋＩ／Ｆ１０４はネットワーク１０５に接続し、画像形成装置外部との間で印刷データやデバイス情報の入出力を担う。
【００１６】
ＲＩＰ１０６は中間データであるＤＬ（Ｄｉｓｐｌａｙ  Ｌｉｓｔ）をラスタイメージ（画像データ）に展開する。ＲＩＰ１０６は、中央演算装置１０１により主記憶装置１０２および補助記憶装置１０３上に生成されたＤＬを高速かつ、中央演算装置１０１の実行と並列に、処理するものである。
【００１７】
デバイスＩ／Ｆ１０７は中央演算装置１０１の指示に基づき、画像信号の送出、デバイス動作指示、デバイス情報の受信を行う。コントローラユニット１００はデバイスＩ／Ｆ１０７を介して、プリンタエンジン１０８に接続される。
【００１８】
プリンタエンジン１０８はコントローラユニット１００からの画像信号に基づいて画像を記録媒体上に出力する出力機であり、電子写真方式、インクジェット方式の何れでも構わない。
【００１９】
＜画像形成装置のソフトウェアモジュール図＞
図２は本実施例における画像形成装置のソフトウェアモジュール構成図である。図２に記載した各ソフトウェアモジュールは、プログラムとして補助記憶装置１０３に格納され、主記憶装置１０２にロードされ中央演算装置１０１により実行されるものである。
【００２０】
ページ並列制御部２００は、ＰＳインタプリタ２０１を複数スレッド立ち上げ、スレッド制御する。印刷処理を並列処理するために、ページ並列制御部２００は、印刷データをページ単位に区切り、各スレッドへ処理対象とするページを割り当てる処理部を有する。尚、本実施例では並列処理を実行するスレッドを２つ立ち上げたものを想定しているため、ＰＳインタプリタ２０１が２つ存在する例を示している。しかしながらこれに限られるものではなく、中央演算装置１０１のプロセッサコアが並列制御できる数だけスレッドを立ち上げ、ＰＳインタプリタ２０１を割り当ててもよい。
【００２１】
ＰＳインタプリタ２０１はＰＤＬ言語解釈部２０２と、ＤＬ生成部２０３とを有し、印刷データを解釈して、中間データとしてＤＬ（Ｄｉｓｐｌａｙ  Ｌｉｓｔ）を生成する。
【００２２】
ＰＤＬ言語解釈部２０２は、ページ記述言語（ＰＤＬ）により記述されている印刷データの記述内容を解釈するデータ解釈部である。本実施例では、ＰｏｓｔＳｃｒｉｐｔ（登録商標、以下ＰＳと略すことがある）を言語解釈することを想定している。また、ＰＤＬ言語解釈部２０２は、自身が解釈済みのページ数をカウントするページカウンタを保持する保持部をそれぞれ有する。また、ＰＳインタプリタ２０１は、ＰＤＬ言語解釈部２０２の解釈結果に基づいて、リセット処理を行なったりページカウンタの値をリセットする処理部を有する。
【００２３】
ＤＬ生成部２０３は、ＰＤＬ言語解釈部２０２により解釈された結果に基づいて中間データとしてＤＬを生成可能である。なお、ＤＬ生成部２０３は、ＤＬを生成する場合としない場合とがある。詳細は後述する。
【００２４】
バッファ２０４は、複数のＰＳインタプリタ２０１から生成されるＤＬをバッファリングする。ページ並列技術を採用すると、各スレッドが処理を完了する順番はページ順にはならず、あるページより後のページの処理が先に完了する場合がある。記述内容が多かったり複雑なページではＤＬ生成に時間を要する一方で、記述内容が少ないページではＤＬ生成に時間を要さない場合があるからである。印刷データはページ順にＲＩＰ１０６に出力する必要があるため、未処理のページが完了するまでのバッファ領域として、バッファ２０４を使用する。バッファ領域は主記憶装置１０２の一部を確保して使用するが、バッファリングできるほどの領域がない場合は、補助記憶装置１０３の一部を代替として用いても良い。
【００２５】
レンダリング部２０５は、バッファ２０４に格納されたＤＬを図１のＲＩＰ１０６に送る。
【００２６】
＜印刷データの記述例と描画内容＞
図３（ａ）（ｂ）は、印刷データに記述される描画オブジェクトの記述例とその描画内容とを示している。図３（ａ）はＰｏｓｔＳｃｒｉｐｔ（登録商標）を用いた印刷データの記述例の一例である。Ｐａｇｅ１の部分では、斜めの線分を定義している。Ｐａｇｅ２では、「Ｉ  ａｍ  ｓｔｒｉｎｇ．」という文字列を定義している。Ｐａｇｅ３では、市松模様のパターンオブジェクトを定義している。Ｐａｇｅ４では、Ｐａｇｅ２と同様に「Ｉ  ａｍ  ｓｔｒｉｎｇ．」という文字列を定義している。ＰｏｓｔＳｃｒｉｐｔのページの区切れ目には「ｓｈｏｗｐａｇｅ」コマンド（オペレーター）が用いられる。解釈済みのページ数をリセットするＰＤＬコマンドは、図３（ａ）ではＰＳの「ｓｔａｒｔｊｏｂ」コマンドであり、Ｐａｇｅ１の「ｓｈｏｗｐａｇｅ」コマンドに続いて記述されている。従って、形式的にはＰａｇｅ２の冒頭にｓｔａｒｔｊｏｂが記述されていることになる。なお、このｓｔａｒｔｊｏｂコマンドは、これまでのジョブの内容をリセットして、ｓｔａｒｔｊｏｂコマンド以降の記述から新たなジョブを開始させるコマンドである。つまり、ページ非独立な言語では、現在解釈しているページのみならず、これまでに解釈したページに記述された内容が蓄積された形で解釈が行なわれることになるが、この蓄積した内容を一旦リセットするコマンドとなる。図３（ａ）の例では、ページリセットコマンドを除いた箇所が、印刷データの２ページ目の実質的な記述内容となる。なお、ｓｔａｒｔｊｏｂの記述仕様については、公開ドキュメントであるＰｏｓｔＳｃｒｉｐｔ（登録商標）リファレンスマニュアルを参考されたい。
【００２７】
図３（ｂ）は図３（ａ）で記述された描画オブジェクトの描画内容を示している。データの内容としては、４ページ分記述されているが、前述の通り、Ｐａｇｅ１とＰａｇｅ２の間にｓｔａｒｔｊｏｂが記述されているため、内部的にＰＤＬ言語解釈部２０２の解釈済みページ数はｓｔａｒｔｊｏｂを検知（解釈）した時点でリセットされる。
【００２８】
なお、説明を簡便にする趣旨で、以下で説明する例は図３に示すように、論理ページの１ページが物理ページの１ページに対応する例に基づいて説明することにする。なお、論理ページのＮページが物理ページの１ページに対応するＮｕｐ印刷を行なう場合には、各ＰＤＬ言語解釈部２０２が管理するページカウンタでカウントする解釈済みページ数は、論理ページの数である。
【００２９】
図３（ｂ）の例では、印刷データのページ数は４ページであり、この印刷データを全体として見た場合、図３（ｂ）に示すようなページ番号の割り振りとなる。一方、ページリセットコマンドを検知（解釈）したＰＤＬ言語解釈部２０２から見ると、図３（ｂ）のＰａｇｅ１とＰａｇｅ２は、どちらもページ番号としては１ページ目と解釈することになる。このように、印刷データを全体として見た場合のページ番号と、ＰＤＬ言語解釈部２０２から見た場合のページ番号とを区別する趣旨で、以下では全体として見た場合のページ番号を、印刷データの３ページ目などと表現する。一方、ＰＤＬ言語解釈部２０２から見た場合のページ番号のことを、解釈中（または解釈済み）の３ページ目などと表現する。
【００３０】
＜ページ並列処理のシーケンス＞
本実施例は、印刷データのページ記述言語としてページ非独立な記述が可能なＰＳを採用した時のページ並列処理を対象としている。ＰＳは印刷処理のための情報を、印刷データのあらゆる箇所に、ページを跨いで記述可能である。その為、ＰＳの印刷処理に対してページ並列技術を採用する場合、マルチスレッド処理する各スレッドのＰＤＬ言語解釈部２０２は、データの先頭からデータを言語解釈していく必要がある。
【００３１】
本実施例では、図４に示す通り、ＰＳインタプリタ２０１は２つの動作モードで処理を進める。１つ目はページスキップ処理である。ページスキップ処理においてＰＳインタプリタ２０１は、ＰＤＬ言語解釈部２０２を用いた言語解釈処理を行う。もう一つはページ描画処理である。ページ描画処理においてＰＳインタプリタ２０１は、ＰＤＬ言語解釈部２０２を用いた言語解釈処理と、ＤＬ生成部２０３を用いたＤＬ生成処理との両方の処理を行う。ページスキップ処理は、ＤＬ生成処理を行わない分処理が早く進むため、生成対象とするページの直前のページまでは、ページスキップ処理で処理を進める。一方、ＤＬ生成対象のページについては、ＰＳインタプリタ２０１はページ描画処理で処理をする。ページスキップ処理もページ描画処理も言語解釈処理を行うため、データの先頭からＤＬ生成ページまで言語解釈処理は必ず行われるので、該ＤＬ生成ページに必要な情報が不足することはなく、正常に印刷処理をすることができる。
【００３２】
ページスキップ処理、ページ描画処理ともに処理が完了すると、解釈済みのページ数を示すページカウンタ（以下、ＰａｇｅＣｏｕｎｔ）で解釈済みのページ数がそれぞれのＰＳインタプリタ２０１においてカウントされる。ＰａｇｅＣｏｕｎｔの値は言語解釈処理が始まる前の初期値は「０」であるが、言語解釈処理が問題なく完了するとインクリメントされ「１」となる。例えば、図３の例で印刷ページのＰａｇｅ１の「ｓｈｏｗｐａｇｅ」コマンドで示すようなページ区切りコマンドの解釈が完了すると、ＰａｇｅＣｏｕｎｔの値がインクリメントされて「１」となる。
【００３３】
図５は、ページ並列処理の簡易シーケンス図を示している。なお、図５の例は、印刷データには前述のページリセットコマンドが含まれていない、一般的な印刷データを処理するの場合の例を示している。
【００３４】
スレッドＡとして立ち上がっているページ並列制御部２００により、スレッドＢ１、スレッドＢ２が立ち上げられ、スレッドＢ１、Ｂ２にそれぞれＰＳインタプリタ２０１が割り当てられる。処理が開始されると、ＰＳインタプリタ２０１はページ並列制御部２００へ処理対象とするページ番号を問い合わせる。このとき、各ＰＳインタプリタ２０１のＰａｇｅＣｏｕｎｔは言語解釈処理が始まる前なので「０」である。
【００３５】
ページ並列制御部２００は、各スレッドの並列性を考慮して、それぞれのスレッドへ割り当てるＤＬ生成対象のページ番号を通知する。図５の例では、スレッドＢ１にまず２ページ目を、スレッドＢ２に１ページ目を処理するように指示している。図５の例では、ページ並列制御部２００は、ＤＬ生成対象のページ番号をＯｕｔｐｕｔＰａｇｅのパラメータで管理しており、各ＰＳインタプリタ２０１にＯｕｔｐｕｔＰａｇｅの値を通知するこことで生成対象のページ番号を通知している。ページ並列制御部２００からＯｕｔｐｕｔＰａｇｅが通知されると、ＰＳインタプリタ２０１はＯｕｔｐｕｔＰａｇｅが示す値のページ番号までのページに対してページスキップ処理を行う。そして、ＯｕｔｐｕｔＰａｇｅが示すページ番号のページに対してページ描画処理を行う。つまり、ＰＳインタプリタ２０１は、ＰａｇｅＣｏｕｎｔが示す解釈済みのページ数とＯｕｔｐｕｔＰａｇｅが示すページ番号とが一致するページに対してページ描画処理を行い、一致しないページに対してはページスキップ処理を行なう。
【００３６】
スレッドＢ２に通知されるＯｕｔｐｕｔＰａｇｅが示すページ番号は、１ページ目である。従って、スレッドＢ２は、１ページ目のページに対してページ描画処理を行う。具体的には、言語解釈処理が完了すると、スレッドＢ２のＰＳインタプリタ２０１は自身が管理するＰａｇｅＣｏｕｎｔを「１」へインクリメントする。その後、ページ並列制御部２００から通知されたＯｕｔｐｕｔＰａｇｅとＰａｇｅＣｏｕｎｔとを比較する。そして比較した結果、同値である場合、引き続きそのＯｕｔｐｕｔＰａｇｅが示すページ番号のページのＤＬ生成処理を実行する。このように、言語解釈処理が完了した際のＰａｇｅＣｏｕｎｔとＯｕｔｐｕｔＰａｇｅとの比較結果に応じて、言語解釈処理だけで処理が終了するページスキップ処理か、ＤＬ生成処理まで行なうページ描画処理であるのかの処理が切り替えられることになる。
【００３７】
一方、スレッドＢ１に通知されるＯｕｔｐｕｔＰａｇｅが示すページ番号は２ページ目である。従って、スレッドＢ１は、１ページ目に対してはページスキップ処理を行ない、２ページ目に対してはページ描画処理を行う。この処理を詳細に説明する。スレッドＢ１では、１ページ目のページスキップ処理の言語解釈処理が完了すると、スレッドＢ１のＰＳインタプリタ２０１は自身が管理するＰａｇｅＣｏｕｎｔを「１」へインクリメントする。そして、ＰＳインタプリタ２０１は、ページ並列制御部２００から通知されたＯｕｔｐｕｔＰａｇｅとＰａｇｅＣｏｕｎｔとを比較する。１ページ目の言語解釈が終了した時点では、ＯｕｔｐｕｔＰａｇｅとＰａｇｅＣｏｕｎｔとは異なる値であるため、スレッドＢ１のＰＳインタプリタ２０１は、ＤＬ生成処理は行わず、続けて次のページの言語解釈処理を開始する。２ページ目のページ描画処理の言語解釈処理が完了すると、スレッドＢ１のＰＳインタプリタ２０１は、ＰａｇｅＣｏｕｎｔを「２」へインクリメントし、再度ＯｕｔｐｕｔＰａｇｅとＰａｇｅＣｏｕｎｔとを比較する。２ページ目の言語解釈が終了した時点ではＯｕｔｐｕｔＰａｇｅとＰａｇｅＣｏｕｎｔとは同値となるため、スレッドＢ１のＰＳインタプリタ２０１は、直近で解釈を完了したページ（ここでは２ページ目）のＤＬ生成処理を実行する。
【００３８】
その後、スレッドＢ２は１ページ目のページ描画処理が終わると、ページ並列制御部２００へＤＬ生成完了を通知して、次の処理対象とするページ番号を問い合わせる。ページ並列制御部２００は、図５の例では、このスレッドＢ２からの問い合わせを受けたタイミングではまだ３ページ目の処理を指示していない。従って、３ページ目を示すページ番号をＯｕｔｐｕｔＰａｇｅとしてスレッドＢ２へ通知する。以下、同様にＰＳインタプリタ２０１はスレッドＢ１、Ｂ２のそれぞれにおいて、ページ並列制御部２００へ生成ページの問い合わせ、言語解釈処理、ＰａｇｅＣｏｕｎｔ値のインクリメント、ＯｕｔｐｕｔＰａｇｅとの比較を行い、ＤＬ生成判定を繰り返す。これにより、ページスキップ処理、ページ描画処理を切り替えながら最終ページになるまで処理を継続し、ページ並列処理を実現する。
【００３９】
図６は、図３に示したような、ｓｔａｒｔｊｏｂが１ページ目と２ページ目の間に含まれる場合の、従来技術におけるページ並列処理の簡易シーケンス図を示している。図５の場合と同様に、ページ並列制御部２００により、スレッドＢ１、スレッドＢ２が立ち上げられ、各スレッドにＰＳインタプリタ２０１が割り当てられる。各スレッドにはページ並列制御部２００から順番にＯｕｔｐｕｔＰａｇｅが通知されるが、図６の例では、図３に示す印刷データのように、ｓｔａｒｔｊｏｂが１ページ目の「Ｓｈｏｗｐａｇｅ」の後、すなわち、２ページ目の冒頭に存在する。ＰＳインタプリタ２０１は、このｓｔａｒｔｊｏｂのようなページリセットコマンドを検知（解釈）すると、それぞれで管理しているＰａｇｅＣｏｕｎｔを「０」へリセットする。一方で、ページ並列制御部２００はＰＳインタプリタ２０１でのＰａｇｅＣｏｕｎｔのリセットしたことを把握できていないので、ＰＳインタプリタ２０１に対しては、リセットを考慮していないＯｕｔｐｕｔＰａｇｅの値をそのまま通知してしまう。
【００４０】
図６の例では、スレッドＢ１はジョブを開始すると、ページ並列制御部２００からページ番号として「２」を示すＯｕｔｐｕｔＰａｇｅが通知される。従って、１ページ目の処理をページスキップ処理で進め、ＰａｇｅＣｏｕｎｔを「１」にインクリメントする。その後、２ページ目の言語解釈処理でｓｔａｒｔｊｏｂを検知するため、スレッドＢ１のＰＳインタプリタ２０１は、自身が管理するＰａｇｅＣｏｕｎｔを「０」へリセットする。前述のように、ｓｔａｒｔｊｏｂは、これまでのジョブで定義していた内容などを初期化して無効化するコマンドであるので、スレッドＢ１のＰＳインタプリタ２０１は、最初のページの処理と同様の動作をする。すなわち、スレッドＢ１のＰＳインタプリタ２０１は、ページ並列制御部２００に処理対象のページを問い合わせる。しかしながら、ページ並列制御部２００はリセットを考慮していない。このため、ページ並列制御部２００は、スレッドＢ１に対して通知したＯｕｔｐｕｔＰａｇｅ「２」の生成完了の通知を受けていないので、スレッドＢ１に対してＯｕｔｐｕｔＰａｇｅとして「２」を再度通知する。スレッドＢ１では、印刷データの２ページ目の処理においては、言語解釈処理が終了した時点でのＰａｇｅＣｏｕｎｔは「１」であり、ＯｕｔｐｕｔＰａｇｅの「２」とは一致しない。従って、スレッドＢ１では印刷データの２ページ目に対してはページスキップ処理がされることになり、ＤＬ生成がされないことになる。
【００４１】
次に、他方のスレッドＢ２について処理を説明する。スレッドＢ２ではジョブを開始すると、ページ並列制御部２００からＯｕｔｐｕｔＰａｇｅとして「１」が通知される。このため、１ページ目はページ描画処理を行い、ＰａｇｅＣｏｕｎｔは「１」にインクリメントされた状態である。その後、ページ並列制御部２００へＯｕｔｐｕｔＰａｇｅを問い合わせると、「３」が通知される。そこで、スレッドＢ２は、３ページ目のページ描画処理を行なうために未解釈のページである印刷データの２ページ目のページスキップ処理を開始する。この２ページ目の先頭でｓｔａｒｔｊｏｂを検知するのでスレッドＢ２のＰＳインタプリタ２０１は、自身の管理するＰａｇｅＣｏｕｎｔを「０」へリセットする。その後、再度ページ並列制御部２００へＯｕｔｐｕｔＰａｇｅを問い合わせる。このとき、ページ並列制御部２００ではリセットを考慮していない。そこで、ページ並列制御部２００は、スレッドＢ２に対して通知した「３」ページのＤＬ生成完了通知を受け取っていないので、スレッドＢ２に対してＯｕｔｐｕｔＰａｇｅとして、「３」が再度通知される。この結果、スレッドＢ２においても、印刷データの２ページ目の処理においては、ＰａｇｅＣｏｕｎｔとＯｕｔｐｕｔＰａｇｅとが一致せず、印刷データの２ページ目の処理はページスキップ処理され、ＤＬ生成がされないことになる。従って、印刷データの２ページ目が印刷用紙へ出力されなくなってしまう。
【００４２】
なお、その後の処理では、図６に示すように、処理対象のページ番号でズレが生じた状態でＤＬが生成される。なお、ページリセットコマンドを含むページ（本例では印刷データ２ページ）より後のページ（印刷データの３ページ目以降）は、処理を行なうＰＳインタプリタがズレるだけで、ＤＬ自体は生成される。従って、結果としては、ページリセットコマンドを含むページの印刷が抜け落ちてしまう現象が発生するのである。このように、図６の例では、ｓｔａｒｔｊｏｂのページリセットコマンドの処理に起因する、ＰａｇｅＣｏｕｎｔとＯｕｔｐｕｔＰａｇｅの値のズレに起因して２ページ目が抜けた状況で処理が進んでしまう。そこで、本実施例ではＰＳインタプリタ２０１において、このズレの辻褄合わせを行うことで、ｓｔａｒｔｊｏｂが含まれる印刷データにおいても、正常に出力結果が得られることを可能にする。
【００４３】
図７は図３に示したような、ｓｔａｒｔｊｏｂが１ページ目と２ページ目の間に含まれる場合の、本実施例におけるページ並列処理の簡易シーケンス図を示している。ここでは、ＰＳインタプリタ２０１はＰａｇｅＣｏｕｎｔだけでなく、ＣａｃｈｅＰａｇｅというページカウンタ値を保持する。ＣａｃｈｅＰａｇｅはｓｔａｒｔｊｏｂが検知された際の、言語解釈済みのページ数を保持するカウンタ値である。つまり、ＣａｃｈｅＰａｇｅはＰａｇｅＣｏｕｎｔとは異なる種別のページ数を保持するカウンタ値である。また、このＣａｃｈｅＰａｇｅは前述のページリセットコマンドを検知した場合であってもリセットされない。ｓｔａｒｔｊｏｂが検知された後、ページ並列制御部２００がリセットを考慮できないことに起因する、ＯｕｔｐｕｔＰａｇｅとのページ数差異を、このＣａｃｈｅＰａｇｅによって辻褄合わせする。図６の処理ではＤＬ生成するかをＰＳインタプリタ２０１において判定する際に、ＯｕｔｐｕｔＰａｇｅとＰａｇｅＣｏｕｎｔとを比較していたが、本実施例ではこの処理を変更する。具体的には、本実施例のＰＳインタプリタ２０１は、ＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和と、ＯｕｔｐｕｔＰａｇｅとを比較する。そして、この両値が同値である場合にＤＬ生成処理する。
【００４４】
図７の処理においては、印刷データの１ページ目のスレッドＢ１およびＢ２の処理は、図６の１ページ目の処理と同様である。印刷データの２ページ目の言語解釈処理を開始し、ｓｔａｒｔｊｏｂを検知すると、スレッドＢ１およびスレッドＢ２は、ＣａｃｈｅＰａｇｅへＰａｇｅＣｏｕｎｔの値を設定してから、ＰａｇｅＣｏｕｎｔを「０」へリセットする。図７の例では、ｓｔａｒｔｊｏｂを検知したタイミングでは、ＣａｃｈｅＰａｇｅへは「１」が設定される。
【００４５】
スレッドＢ１では、ｓｔａｒｔｊｏｂを検知する、印刷データの２ページ目の処理時には、ページ並列制御部２００からＯｕｔｐｕｔＰａｇｅとして再度「２」が通知される。図７の処理では、ＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和を用いる処理を行なう。印刷データの２ページ目の言語解釈処理後はＰａｇｅＣｏｕｎｔがインクリメントされるので、この結果、ＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和は、「１」＋「１」＝「２」となり、ＯｕｔｐｕｔＰａｇｅと同値となる。よって、スレッドＢ１は、印刷データの２ページ目のＤＬ生成処理を実行することになる。この結果、印刷データの２ページ目が記録用紙に出力されることになる。
【００４６】
一方の、スレッドＢ２の処理を検討する。スレッドＢ２では、ｓｔａｒｔｊｏｂを検知する印刷データの２ページ目の処理時は、ページ並列制御部２００からはＯｕｔｐｕｔＰａｇｅとして再度「３」が通知される。スレッドＢ２における、印刷データの２ページ目の言語解釈処理後ではやはりＰａｇｅＣｏｕｎｔがインクリメントされるので、ＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和は「１」＋「１」＝「２」となり、ＯｕｔｐｕｔＰａｇｅとは等しくない。よって、スレッドＢ２では、印刷データの２ページ目のＤＬ生成処理は行わず、ページスキップ処理する。スレッドＢ２では、続いて印刷データの３ページ目の処理を継続し、言語解釈処理が終了すると、ＰａｇｅＣｏｕｎｔは「２」となり、ＣａｃｈｅＰａｇｅとの和は「２」＋「１」＝「３」となり、ＯｕｔｐｕｔＰａｇｅと等しくなる。よって、ＤＬ生成処理を実行する。このように、ＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅの和がＯｕｔｐｕｔＰａｇｅと等しくなる場合をＤＬ生成処理の実行条件することで、ＯｕｔｐｕｔＰａｇｅとＰａｇｅＣｏｕｎｔとの値の差異をなくし、正常にページ並列処理を実行することができる。
【００４７】
＜ページ並列制御部の制御フロー＞
次に図８を用いて、ページ並列制御部２００における、ページ並列処理のページ制御について説明する。ページ並列制御部２００は、ページ制御のためのページカウンタ値としてＯｕｔｐｕｔＰａｇｅをページ並列制御部２００自身で管理している。このＯｕｔｐｕｔＰａｇｅはＰＳインタプリタにＤＬ生成を実行させる処理対象のページ番号を通知するために用いられる。このＯｕｔｐｕｔＰａｇｅの値は、印刷データのページ番号を示した値であり、ページリセットコマンドがあった場合でもその値を保持しているので、いわばオリジナルのページ番号とも言える。印刷データがＮｅｔｗｏｒｋＩ／Ｆ１０４において受信されると、中央演算装置１０１により、図８に示す処理が開始される。図８に示す処理は、主記憶装置１０２に展開されたプログラムを中央演算装置１０１が実行することで実現される。中央演算装置１０１は、プログラムの実行に従って、ページ並列制御部２００として機能する。
【００４８】
まず、ステップＳ８００においてページ並列制御部２００は、印刷データを受信する。
【００４９】
次に、ステップＳ８０１においてページ並列制御部２００は、初期化処理としてＯｕｔｐｕｔＰａｇｅに０を設定する。
【００５０】
次にステップＳ８０２においてページ並列制御部２００は、ＰＳインタプリタとして機能するＰＳインタプリタスレッドを起動する。ここでは、図７で示すように、スレッドＢ１、Ｂ２をＰＳインタプリタ２０１として起動する。
【００５１】
次にステップＳ８０３においてページ並列制御部２００は、ステップＳ８０２にて起動したＰＳインタプリタ２０１からの通信を待つ。ここでは、ＰＳインタプリタ２０１からの生成ページの問い合わせか、ＤＬ生成完了通知のどちらかの通信を待っている。このどちらかの通信をＰＳインタプリタ２０１のスレッドから受信すると、ステップＳ８０４へ処理を進める。
【００５２】
次にステップＳ８０４においてページ並列制御部２００は、ステップＳ８０３においてＰＳインタプリタ２０１から受信した通信が、ＤＬ生成の処理対象ページの問い合わせか否かを判定する。ＤＬ生成の処理対象ページの問い合わせの場合は、ステップＳ８０５へ処理を進める。処理対象ページの問い合わせではなかった場合は、ステップＳ８０８へ処理を進める。
【００５３】
次に、ステップＳ８０５においてページ並列制御部２００は、問い合わせを受けたスレッドに対して通知したＯｕｔｐｕｔＰａｇｅのＤＬ生成処理が完了しているか否かを判定する。ページ並列制御部２００は、スレッドごとにＤＬ生成の処理対象ページを割り当てており、どのスレッドにどの処理対象ページを割り当てたかを管理している。具体的には、問い合わせを受けたスレッドと、そのスレッドに対して通知したＯｕｔｐｕｔＰａｇｅの値とを関連付けて管理している。問い合わせを受けたスレッドに対して通知したＯｕｔｐｕｔＰａｇｅに対するＤＬ生成完了通知をそのスレッドから受け取っていない場合には、ステップＳ８０７に進む。問い合わせを受けたスレッドに対して通知したＯｕｔｐｕｔＰａｇｅに対するＤＬ生成完了通知をそのスレッドから受け取っている場合には、ステップＳ８０６に進む。なお、このステップＳ８０５の処理は、スレッドに対して割り当てたＯｕｔｐｕｔＰａｇｅがない場合、すなわち、最初のページの処理の場合には、Ｓ８０６に進むものとする。
【００５４】
ステップＳ８０６において、ページ並列制御部２００は、ＯｕｔｐｕｔＰａｇｅに１を加算し、次のＤＬ生成の処理対象ページとして通知する値を更新する。
【００５５】
ステップＳ８０７においてページ並列制御部２００は、処理対象ページの問い合わせを受けたＰＳインタプリタ２０１へ、ＯｕｔｐｕｔＰａｇｅの値を通知する。その後、ステップＳ８０３へ処理を戻す。
【００５６】
ステップＳ８０４において処理対象ページの問い合わせではないと判定した場合、ステップＳ８０８においてページ並列制御部２００は、ステップＳ８０３においてＰＳインタプリタ２０１から受信した通信が、ＤＬ生成完了通知であるかどうかを判定する。ＤＬ生成完了通知だった場合は、ステップＳ８０９へ処理をすすめる。ＤＬ生成完了通知でなかった場合はステップＳ８０３へ戻り処理を繰り返す。
【００５７】
次にステップＳ８０９において、ページ並列制御部２００は、生成されたＤＬをバッファ２０４のバッファ領域にスプールする。各スレッドによってＤＬ生成がなされる順序が前後することがあるので、生成されたＤＬを一旦バッファ領域にスプールする。
【００５８】
次に、ステップＳ８１０においてページ並列制御部２００は、ステップＳ８０３においてＰＳインタプリタ２０１から受信したＤＬ生成完了通知のページ番号までの全ＤＬ生成が完了しているか、判定する。全ＤＬ生成が完了している場合は、ステップＳ８１１へ処理を進める。全ＤＬ生成が完了していない場合は、ステップＳ８０３へ戻り、処理を繰り返す。
【００５９】
次にステップＳ８１１において、ページ並列制御部２００は、バッファ２０４にスプールされている全ＤＬをページ順に従い、レンダリング部２０５へ転送する。
【００６０】
次にステップＳ８１２においてページ並列制御部２００は、印刷データに含まれる全ページ分のＤＬを転送したか判定する。この判定は、例えばステップＳ８０２で立ち上げたスレッドＢ１およびＢ２の両方が停止しているか否かで判定することが可能である。印刷データに含まれる全ページ分のＤＬを転送した場合は、ステップＳ８１３へ進む。印刷データに含まれる全ページ分のＤＬを転送できていない場合は、ステップＳ８０３へ戻り、処理を繰り返す。
【００６１】
次にステップＳ８１３においてページ並列制御部２００は、自身のスレッドであるスレッドＡを停止し、本処理を終了する。
【００６２】
以上の処理により、ページ並列制御部２００による、ページ並列処理のページ制御が実施される。
【００６３】
＜ＰＳインタプリタの並列ＤＬ生成制御のフロー＞
次に図９のフローチャートを用いて、ＰＳインタプリタ２０１のスレッドＢ１、Ｂ２における並列ＤＬ生成制御のフローについて説明する。これらのスレッドは、図８のステップＳ８０２の処理においてページ並列制御部２００によって起動されるスレッドであり、図９の処理は、ページ並列制御部２００によってＰＳインタプリタ２０１としてスレッドが起動された後の各スレッドの処理である。まず、図９の処理の全体的な概要を説明する。
【００６４】
ＰＳインタプリタ２０１は自身が管理するページカウンタとして、ＰａｇｅＣｏｕｎｔ、ＣａｃｈｅＰａｇｅ、ｍｙＯｕｔｐｕｔＰａｇｅの３つのカウンタ値を持っている。ＰａｇｅＣｏｕｎｔは既に説明したように、ＰＳインタプリタ２０１が言語解釈を完了したページ数を示す値を格納するカウンタである。ＣａｃｈｅＰａｇｅはｓｔａｒｔｊｏｂなどのＰａｇｅＣｏｕｎｔをリセットするＰＤＬコマンドを検知した時点の言語解釈済みのページ数の値（すなわち、その時点のＰａｇｅＣｏｕｎｔの値）を格納するカウンタ値である。なお、より具体的には、ＣａｃｈｅＰａｇｅに格納されている値にＰａｇｅＣｏｕｎｔの値を加算することで、ＣａｃｈｅＰａｇｅに格納されている値を更新するカウンタである。ｍｙＯｕｔｐｕｔＰａｇｅは図８で説明したＯｕｔｐｕｔＰａｇｅがページ並列制御部２００から通知された時にＯｕｔｐｕｔＰａｇｅが示す値を内部的に格納するカウンタ値である。これらのカウンタのうち、ＣａｃｈｅＰａｇｅはページリセットコマンドを検知した場合であってもその値を保持し続けるカウンタである。
【００６５】
ＰＳインタプリタ２０１はページ並列制御部２００から処理対象とするページ番号（ＯｕｔｐｕｔＰａｇｅ）を受け取ると、ｍｙＯｕｔｐｕｔＰａｇｅにその値を格納して、処理を開始する。そして、ＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和がｍｙＯｕｔｐｕｔＰａｇｅよりも小さい間は、ＰａｇｅＣｏｕｎｔをカウントアップしながら、言語解釈処理のみ（すなわちページスキップ処理）を進める。ＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和がｍｙＯｕｔｐｕｔＰａｇｅと等しくなったとき、言語解釈とＤＬ生成（すなわちページ描画処理）を実行する。ＤＬ生成が終わると、ページ並列制御部２００へＤＬ生成したページ番号とともに完了通知を行い、次の処理対象となるページ番号をページ並列制御部２００へ問い合わせる。
【００６６】
ＰＳインタプリタ２０１は、ｓｔａｒｔｊｏｂを検知すると、ＣａｃｈｅＰａｇｅへＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和を設定し、ＰａｇｅＣｏｕｎｔの値を「０」へリセットする。その後、ページ並列制御部２００へ再度、処理対象ページ番号を問い合わせ、処理を繰り返す。ＰａｇｅＣｏｕｎｔの値はｓｔａｒｔｊｏｂが検知されるとリセットされてしまうが、リセット前のＰａｇｅＣｏｕｎｔの値はＣａｃｈｅＰａｇｅで保持されている。従って、ＰＳインタプリタ２０１は、処理中のページをＤＬ生成するかを判定する際に、ＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和を用いることでページ辻褄合わせが可能となる。
【００６７】
以下、図９のフローチャートの説明を行なう。図５のステップＳ８０２にて、ページ並列制御部２００からスレッドＢ１、Ｂ２が立ち上げられると、本処理が開始される。
【００６８】
まずステップＳ９０１において、ＰＳインタプリタ２０１は、初期化処理として、ページカウンタ値のＣａｃｈｅＰａｇｅを０に設定する。ステップＳ９０２において、ＰＳインタプリタ２０１は、初期化処理として、ページカウンタ値のｍｙＯｕｔｐｕｔＰａｇｅを０に設定する。ステップＳ９０３において、ＰＳインタプリタ２０１は、初期化処理として、ページカウンタ値のＰａｇｅＣｏｕｎｔを０に設定する。
【００６９】
次にステップＳ９０４において、ＰＳインタプリタ２０１は、ページ並列制御部２００にＤＬ生成の処理対象ページのページ番号を問い合わせる。ページ並列制御部２００から、処理対象ページのページ番号（ＯｕｔｐｕｔＰａｇｅ）が通知されると、ステップＳ９０５へ処理を進める。
【００７０】
次にステップＳ９０５においてＰＳインタプリタ２０１は、内部ページカウンタ値のｍｙＯｕｔｐｕｔＰａｇｅに、ステップＳ９０４で通知された生成ページのページ番号の値を格納する。
【００７１】
次にステップＳ９０６においてＰＳインタプリタ２０１は、ＰＤＬ言語解釈部２０２により印刷データの言語解釈処理を実行する。この言語解釈処理は、ページリセットコマンドまたはページ区切りコマンドを検知するまで実行する。
【００７２】
次にステップＳ９０７においてＰＳインタプリタ２０１は、ステップＳ９０６において、言語解釈した結果、ｓｔａｒｔｊｏｂなどのＰａｇｅＣｏｕｎｔをリセットするページリセットコマンドを検知したか判定する。検知していない場合はステップＳ９０９へ処理を進める。検知した場合は、ステップＳ９０８へ処理を進める。
【００７３】
次にステップＳ９０８においてＰＳインタプリタ２０１は、ＣａｃｈｅＰａｇｅの値を更新する。前述の通り、ｓｔａｒｔｊｏｂを検知すると内部的なページ数制御値であるＰａｇｅＣｏｕｎｔはリセットしなければならない。本実施例では、このリセットを考慮して、ここでリセット前のＰａｇｅＣｏｕｎｔの値をＣａｃｈｅＰａｇｅへ格納しておくことで、ページ並列制御部２００において管理しているＯｕｔｐｕｔＰａｇｅの値との差異を無くす。なお、ページリセットコマンドが印刷データの中に複数回含まれている場合もあるので、ステップＳ９０８の処理では、それまでのＣａｃｈｅＰａｇｅの値にＰａｇｅＣｏｕｎｔの値を加算した値をＣａｃｈｅＰａｇｅの値として更新する処理を行なう。そして、ステップＳ９０２に処理を戻す。
【００７４】
一方、ステップＳ９０９においてＰＳインタプリタ２０１は、言語解釈した結果、ページ区切りコマンドを検知したか判定する。ページ区切りコマンドとは、ＰＳではｓｈｏｗｐａｇｅやｅｒａｓｅｐａｇｅ、ｃｏｐｙｐａｇｅなどのコマンド（オペレーター）が該当する。ページ区切りコマンドを検知した場合は、ステップＳ９１０へ処理を進める。ページ区切りコマンドを検知しなかった場合、ＰＤＬデータの終端に達したことになるため、処理を終了する。
【００７５】
ステップＳ９１０においてＰＳインタプリタ２０１は、ＰａｇｅＣｏｕｎｔの値に１を加算して、カウンタ値を更新する。
【００７６】
ステップＳ９１１においてＰＳインタプリタ２０１は、ｍｙＯｕｔｐｕｔＰａｇｅの値がＰａｇｅＣｏｕｎｔとＣａｃｈｅＰａｇｅとの和と等しいか判定する。このステップＳ９１１の処理では、ステップＳ９０６の処理を通じて言語解釈が終了したページがページ並列制御部２００から通知されたＤＬ生成の処理対象ページ（ＯｕｔｐｕｔＰａｇｅ）であるかを判定している。等しい場合は、ステップＳ９０６の処理で言語解釈が終了したページはＤＬ生成の処理対象ページであるとして、ステップＳ９１２へ処理を進める。等しくない場合は、ステップＳ９０６へ戻り、処理を繰り返す。
【００７７】
次にステップＳ９１２においてＰＳインタプリタ２０１は、ＤＬ生成部２０３を用いてステップＳ９０６の処理で言語解釈が終了したページのＤＬ生成処理を実行する。
【００７８】
次にステップＳ９１３においてＰＳインタプリタ２０１は、ページ並列制御部２００にｍｙＯｕｔｐｕｔＰａｇｅのＤＬ生成処理が完了したことを通知する。
【００７９】
以上の処理により、ＰＳインタプリタ２０１による、スレッドＢ１、Ｂ２における並列ＤＬ生成制御が実施される。
【００８０】
以上、これまで説明したように、本実施例におけるマルチコアシステムを採用した中央演算装置１０１を備える画像形成装置は、マルチスレッドで印刷処理を実行する。この印刷処理の実行時にページリセットを指示するＰＤＬコマンドを検知すると、内部のキャッシュ値へリセット前のページカウンタ値を格納して、以後の処理を継続する。内部ページカウンタ値リセット後、ＤＬ生成するか判定する際に、このキャッシュ値を判定処理に利用することで、ページ並列制御部２００とＰＳインタプリタ２０１との内部ページカウンタ値の差異を無くすことができる。これにより、ページリセットコマンドを含む印刷データを処理する場合に、ページ制御の不整合を回避することができる。また、内部ページカウンタ値自体は、ページリセットコマンドに応じてリセットされるので、例えば同一ジョブ内で同じページ番号を複数用いて印刷するようなケースにも対応することができる。
【００８１】
＜変形例＞
なお、実施例１では、ＣａｃｈｅＰａｇｅをＰＳインタプリタ２０１がそれぞれ保持し、ページ数の辻褄合わせをしている例を説明した。変形例としては、このＣａｃｈＰａｇｅに相当するカウンタ値をページ並列制御部２００が保持し、ページ並列制御部２００側の制御によって辻褄合わせをしてもよい。その場合は、ＰＳインタプリタ２０１がｓｔａｒｔｊｏｂを検知した時点のＰａｇｅＣｏｕｎｔの値をページ並列制御部２００に通知する。そして、ページ並列制御部２００では、ＰＳインタプリタ２０１から通知されたＰａｇｅＣｏｕｎｔの値をページ並列制御部２００自身が管理するＣａｃｈｅＰａｇｅに設定する。その際、ページ並列制御部２００は、ＰａｇｅＣｏｕｎｔの値の通知元のＰＳインタプリタ２０１に対して通知していたＯｕｔｐｕｔＰａｇｅをリセットする。すなわち、ＰａｇｅＣｏｕｎｔの値の通知元のＰＳインタプリタ２０１からの再度の処理対象ページの問い合わせの処理を受け取ると、ページ並列制御部２００は、ＯｕｔｐｕｔＰａｇｅの値からＣａｃｈｅＰａｇｅの値を引いた値を通知する。ＰＳインタプリタ２０１側では、ＰＳインタプリタ２０１がｓｔａｒｔｊｏｂを検知した時点のＰａｇｅＣｏｕｎｔの値をページ並列制御部２００に通知する処理を行なうだけでよい。すなわち、ＰＳインタプリタ２０１側では、ＰａｇｅＣｏｕｎｔ値とＯｕｔｐｕｔＰａｇｅとを比較して一致したページに対してＤＬ生成処理を行なうという処理をすればよい。このように、ページ並列制御部２００側の制御によってもページ並列制御を行なった際の不整合を回避することが可能である。
【００８２】
＜実施例２＞
実施例１はページリセットコマンドを検知した場合に生じるページ並列制御部２００とＰＤＬ言語解釈部２０２と内部ページカウンタ値の差異そのものをキャッシュ値として保持しておく例を説明した。そして、ページ並列制御部２００または、ＰＤＬ言語解釈部２０２で辻褄合わせをする処理を説明した。本実施例では、両者のページカウンタ値の差異ではなく、ページリセットコマンドの指定を無視して、総ページ数をカウントするページカウンタ値を設け、その値をＤＬ生成するか否かの判定に用いる処理を説明する。すなわち、実施例２においては、キャッシュ値ではなく、ページリセットコマンドの指定に影響されない、総ページ数をカウントするページカウンタを用いる例を説明する。この総ページ数をカウントするカウンタ値をＴｏｔａｌＰａｇｅとして説明する。
【００８３】
＜ページ並列処理のシーケンス＞
図１０は、実施例２における簡易シーケンス図である。本実施例でも図３で説明したような印刷データと同様に、ｓｔａｒｔｊｏｂが１ページ目と２ページ目の間に含まれている例を用いて説明する。スレッドＢ１、Ｂ２へは、それぞれページ並列制御部２００から、「２」「１」がＯｕｔｐｕｔＰａｇｅとして通知される。各スレッドのＰＳインタプリタ２０１はそれぞれＯｕｔｐｕｔＰａｇｅで指定されたページのＤＬ生成を行うまで、言語解釈処理を進める。本実施例においては、現在処理中のページのＤＬ生成をするか否かを判定する際は、ＯｕｔｐｕｔＰａｇｅに対してＰＳインタプリタが自身が管理するＴｏｔａｌＰａｇｅを比較して、等しい場合にＤＬ生成をＰＳインタプリタが実行する。ＴｏｔａｌＰａｇｅはＰａｇｅＣｏｕｎｔと同様、言語解釈処理が完了する度にインクリメントされるが、ｓｔａｒｔｊｏｂなどのページリセットコマンドが検知されても、カウンタ値はリセットされない。
【００８４】
スレッドＢ１では、ページ並列制御部２００からＯｕｔｐｕｔＰａｇｅが「２」で通知される。１ページ目の言語解釈処理が終わると、ＴｏｔａｌＰａｇｅとＰａｇｅＣｏｕｎｔとの両方ともをインクリメントして、それぞれ「１」「１」とする。ＤＬ生成するか否か判定するため、ＯｕｔｐｕｔＰａｇｅとＴｏｔａｌＰａｇｅとを比較すると、同値ではないため、スレッドＢ１は１ページ目のＤＬ生成は行わない。ｓｔａｒｔｊｏｂは１ページ目と２ページ目の間に存在するため、スレッドＢ１は、２ページ目の処理を開始する前に、ＰａｇｅＣｏｕｎｔの値をリセットするが、ＴｏｔａｌＰａｇｅの値はリセットしない。そして、２ページ目の言語解釈処理を進め、ＰａｇｅＣｏｕｎｔとＴｏｔａｌＰａｇｅをインクリメントして、それぞれ「１」、「２」とする。このとき、ページ並列制御部２００からは再度「２」が通知され、スレッドＢ１では、ＴｏｔａｌＰａｇｅが「２」であり、同値であるので、ＤＬ生成処理を行う。
【００８５】
一方のスレッドＢ２では、ページ並列制御部２００からＯｕｔｐｕｔＰａｇｅが「１」で通知される。１ページ目の言語解釈処理が終わると、ＴｏｔａｌＰａｇｅとＰａｇｅＣｏｕｎｔをインクリメントして、それぞれ「１」「１」とする。ＤＬ生成するか判定するため、ＯｕｔｐｕｔＰａｇｅとＴｏｔａｌＰａｇｅを比較すると、同値であるため1ページ目のＤＬ生成を実行する。ｓｔａｒｔｊｏｂは１ページ目と２ページ目の間に存在するため、２ページ目の処理を開始する前に、スレッドＢ２においてもＰａｇｅＣｏｕｎｔの値をリセットするが、ＴｏｔａｌＰａｇｅの値はリセットしない。そして、２ページ目の言語解釈処理を進め、ＰａｇｅＣｏｕｎｔとＴｏｔａｌＰａｇｅをインクリメントして、それぞれ「１」、「２」とする。このとき、ページ並列制御部２００からは「３」が通知されているが、ＴｏｔａｌＰａｇｅは「２」であり、ＯｕｔｐｕｔＰａｇｅと同値とならない為、ＤＬ生成は行わない（ページスキップ処理）。続けて、３ページ目の言語解釈処理を開始する。３ページ目の言語解釈処理が完了すると、ＴｏｔａｌＰａｇｅとＰａｇｅＣｏｕｎｔの値をともにインクリメントして、それぞれ「２」、「３」とする。ここでＯｕｔｐｕｔＰａｇｅとＴｏｔａｌＰａｇｅを比較すると同値となるため、ＤＬ生成を実行する。
【００８６】
このようにページリセットコマンドに影響されないＴｏｔａｌＰａｇｅの値がＯｕｔｐｕｔＰａｇｅと等しくなる場合をＤＬ生成処理の実行条件することで、正常にページ並列処理を実行することができる。
【００８７】
＜ＰＳインタプリタの並列ＤＬ生成制御のフロー＞
次に図１１のフローチャートを用いて、実施例２のＰＳインタプリタ２０１のスレッドＢ１、Ｂ２における並列ＤＬ生成制御のフローについて説明する。
【００８８】
ＰＳインタプリタ２０１は内部ページカウンタとして、ＰａｇｅＣｏｕｎｔ、ＴｏｔａｌＰａｇｅ、ｍｙＯｕｔｐｕｔＰａｇｅの３つのカウンタ値を持っている。ＰａｇｅＣｏｕｎｔとＭｙＯｕｔｐｕｔＰａｇｅは実施例１と同様である。ＴｏｔａｌＰａｇｅはｓｔａｒｔｊｏｂなどのＰａｇｅＣｏｕｎｔをリセットするＰＤＬコマンドに影響されない、言語解釈済みの総ページ数の値を格納するカウンタ値である。
【００８９】
ＰＳインタプリタ２０１はページ並列制御部２００から処理対象とするページ数を受け取ると、ｍｙＯｕｔｐｕｔＰａｇｅに値を格納して、処理を開始する。ＴｏｔａｌＰａｇｅがｍｙＯｕｔｐｕｔＰａｇｅよりも小さい間は、ＰａｇｅＣｏｕｎｔとＴｏｔａｌＰａｇｅをカウントアップしながら、言語解釈処理のみ（ページスキップ処理）を進める。ＴｏｔａｌＰａｇｅがｍｙＯｕｔｐｕｔＰａｇｅと等しくなったとき言語解釈とＤＬ生成（ページ描画処理）を実行する。ＤＬ生成が終わると、ページ並列制御部２００へＤＬ生成したページ番号とともに完了通知を行い、次の処理対象となるページ番号をページ並列制御部２００へ問い合わせる。
【００９０】
ｓｔａｒｔｊｏｂを検知すると、ＰａｇｅＣｏｕｎｔの値は「０」へリセットするが、ＴｏｔａｌＰａｇｅはそのままの値を保持する。その後、ページ並列制御部２００へ再度生成ページ数を問い合わせ、処理を繰り返す。ＰａｇｅＣｏｕｎｔの値はｓｔａｒｔｊｏｂが検知されるとリセットされてしまうが、このリセット処理に関係なく総ページ数をＴｏｔａｌＰａｇｅで管理している。そのため、処理中のページをＤＬ生成するか判定する際に、ＴｏｔａｌＰａｇｅの値を用いることでリセット処理に影響を受けないページ制御が可能となる。図１１の処理も実施例１で説明したＰＳインタプリタの処理と同様に、図５のステップＳ８０２にて、ページ並列制御部２００からスレッドＢ１、Ｂ２が起動されると、処理が開始される。
【００９１】
まずステップＳ１１０１においてＰＳインタプリタ２０１は、初期化処理として、内部ページカウンタ値のＴｏｔａｌＰａｇｅを０に設定する。ステップＳ１１０２においてＰＳインタプリタ２０１は、初期化処理として、内部ページカウンタ値のｍｙＯｕｔｐｕｔＰａｇｅを０に設定する。ステップＳ１１０３においてＰＳインタプリタ２０１は、初期化処理として、内部ページカウンタ値のＰａｇｅＣｏｕｎｔを０に設定する。
【００９２】
その後、ステップＳ１１０４からステップＳ１１０７までの処理は、図９のステップＳ９０４からステップＳ９０７までの処理と同様である。
【００９３】
次にステップＳ１１０７においてＰＳインタプリタ２０１は、ステップＳ１１０６において、言語解釈した結果、ｓｔａｒｔｊｏｂなどのＰａｇｅＣｏｕｎｔをリセットするコマンドを検知したか判定する。検知していない場合はステップＳ１１０８へ処理を進める。検知した場合は、ステップＳ１１０２へ戻り、処理を繰り返す。
【００９４】
次にステップＳ１１０８においてＰＳインタプリタ２０１は、言語解釈した結果、ページ区切りコマンドを検知したか判定する。ページ区切りコマンドを検知した場合は、ステップＳ１１０９へ処理を進める。ページ区切りコマンドを検知しなかった場合、ＰＤＬデータの終端に達したことになるため、処理を終了する。
【００９５】
次にステップＳ１１０９においてＰＳインタプリタ２０１は、ＴｏｔａｌＰａｇｅの値に１を加算して、カウンタ値を更新する。
【００９６】
次にステップＳ１１１０においてＰＳインタプリタ２０１は、ＰａｇｅＣｏｕｎｔの値に１を加算して、カウンタ値を更新する。
【００９７】
次にステップＳ１１１１においてＰＳインタプリタ２０１は、ｍｙＯｕｔｐｕｔＰａｇｅの値がＴｏｔａｌＰａｇｅの値と等しいか判定する。等しい場合は、ステップＳ１１０６で言語解釈をした処理中のページはＤＬ生成の処理対象ページであるとして、ステップＳ１１１２へ処理を進める。等しくない場合は、ステップＳ１１０４へ戻り、処理を繰り返す。
【００９８】
次にステップＳ１１１２とＳ１１１３の処理は、図９のステップＳ９１２とＳ９１３と同じ処理であるので、説明を省略する。
【００９９】
以上の処理により、ＰＳインタプリタ２０１による、スレッドＢ１、Ｂ２における並列ＤＬ生成制御が実施される。
【０１００】
以上、本実施例においては、マルチスレッドで印刷処理を実行時にページリセットを指示するＰＤＬコマンドを検知した場合、内部のページカウンタ値をリセットする。一方で、総ページ数は別のカウンタ値で保持し、以後の処理を継続する。ＤＬ生成するか判定する際に、この総ページ数のカウンタ値を用いて判定処理することで、ページ並列制御部２００とＰＤＬ言語解釈部２０２の内部ページカウンタ値の差異を気にすることなく処理を継続することができる。従って、印刷データの不整合を回避することができる。
【０１０１】
＜その他の実施例＞
なお、上記の各実施例では、ページリセットコマンドとして、ＰＳのｓｔａｒｔｊｏｂオペレーターを例として挙げた。しかし、本発明の適用範囲は、このオペレーターに限定されるものではなく、例えば、ＰＳのｅｘｉｔｓｅｒｖｅｒコマンド（オペレーター）でもよい。また、他のＰＤＬで同様の意味をもつコマンドに対しても適用可能である。
【０１０２】
また、上記の各実施例では、ページ並列制御部２００とＰＳインタプリタ２０１とを区別する形態を説明したが、いずれかのＰＳインタプリタ内にページ並列制御部が行なっている機能を持たせることも可能である。
【０１０３】
本発明は、上述の実施形態の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける１つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【図１】
0006666036.tif 000002
【図２】
0006666036.tif 000003
【図３】
0006666036.tif 000004
【図４】
0006666036.tif 000005
【図５】
0006666036.tif 000006
【図６】
0006666036.tif 000007
【図７】
0006666036.tif 000008
【図８】
0006666036.tif 000009
【図９】
0006666036.tif 000010
【図１０】
0006666036.tif 000011
【図１１】
0006666036.tif 000012