(57)【要約】【課題】スキャナ処理、プリンタ処理を実行できる画像処理装置において、実行している処理を中断して優先度の高い他の処理へ動的に切り替えた場合に、画像を矩形分割する大きさをローカルメモリの残容量によって切り替える。【解決手段】実行中のスレッドを中断して他のスレッドを実行開始する際に、ＤＭＡプロセッサ２は、中断されたスレッドにより実行済みのループ処理の数をループ計算回路１６内部に入力する。そしてＤＭＡプロセッサ２はループ計算回路１６から、残りメモリ容量に応じたブロックサイズを得る。後のスレッドは、そのブロックサイズのデータをローカルメモリ３に転送して、その処理をすべく実行される。【選択図】図１
2006252154.tif 000002
【特許請求の範囲】
【請求項１】
命令メモリに記録された命令コードに従ってデータを転送するＤＭＡプロセッサと、
前記ＤＭＡプロセッサから転送される画像データに対して画像処理を施す複数の処理部を含む画像処理手段と、
前記複数の処理部により共有される共有メモリと、
前記共有メモリの使用量を示す情報に基づいて、前記共有メモリに転送できる画像データのブロックサイズを決定するブロックサイズ決定手段とを備え、
前記ＤＭＡプロセッサは、前記複数の処理部の一処理部による処理途中に他の処理部による処理を行う場合に、前記一の処理部による前記共有メモリの使用量を前記ブロックサイズ決定手段に与えてブロックサイズを決定させ、前記他の処理部による利用に供することを特徴とする画像処理装置。
【請求項２】
前記一の処理部はプリンタにより画像を出力するためのプリンタ処理部であり、前記他の処理部はスキャナにより入力した画像を処理するためのスキャナ処理部であることを特徴とする請求項１に記載の画像処理装置。
【請求項３】
請求項１または２に記載の画像処理装置と、
前記画像処理装置に対して画像データを入力するために接続された画像スキャナ部と、
前記画像処理装置からの画像データを出力するために接続されたプリンタ部とを備え、
画像処理装置は、前記画像スキャナ部により入力された画像データと、前記プリンタ部により出力しようとする画像データとを処理することを特徴とする画像入出力装置。
【請求項４】
命令を解釈し、解釈した命令に従ってデータを転送できるＤＭＡプロセッサと、
前記ＤＭＡプロセッサが実行している処理を、優先度に応じて動的に切り替える為のトリガを発生させるトリガ手段と、
プリンタ出力のための画像処理を行うプリンタ処理手段と、
スキャナ入力のための画像処理を行うスキャナ処理手段と、
前記プリンタ処理手段と前記スキャナ処理手段とにより共有される共有ローカルメモリと、
前記共有ローカルメモリの空き容量から転送する画像のライン数と画素数とを計算する計算手段とを備え、
前記ＤＭＡプロセッサは、前記トリガ手段により処理の切り替えのトリガが生じた際には、新たに開始される処理のために割り当てる前記共有ローカルメモリの容量を、中断される処理により使用されていたメモリの残量に基づいて前記計算手段により計算させることを特徴とする画像処理装置。
【請求項５】
命令メモリに記録された命令コードに従ってデータを転送するＤＭＡプロセッサと、前記ＤＭＡプロセッサから転送される画像データに対して画像処理を施す複数の処理部を含む画像処理手段と、前記複数の処理部により共有される共有メモリと、前記共有メモリの使用量を示す情報に基づいて、前記共有メモリに転送できる画像データのブロックサイズを決定するブロックサイズ決定手段とを備えた画像処理装置の制御方法であって、
前記複数の処理部の一処理部による処理途中に他の処理部による処理を行う場合に、前記一の処理部による処理を中断させ、
前記一の処理部により使用されているメモリの使用量を示す情報をブロックサイズ決定手段に入力して、前記前記他の処理部による処理のために割り当てる前記共有メモリの容量を決定させ、
前記共有メモリに、前記ブロックサイズ決定手段により決定された容量ずつ画像データをロードし、
前記共有メモリにロードした画像データを前記他の処理部に入力して処理を行わせることを特徴とする画像処理装置の制御方法。
【請求項６】
命令メモリに記録された命令コードに従ってデータを転送するＤＭＡプロセッサと、前記ＤＭＡプロセッサから転送される画像データに対して画像処理を施す複数の処理部を含む画像処理手段と、前記複数の処理部により共有される共有メモリと、前記共有メモリの使用量を示す情報に基づいて、前記共有メモリに転送できる画像データのブロックサイズを決定するブロックサイズ決定手段とを備えた画像処理装置において、前記ＤＭＡプロセッサにより実行するためのプログラムであって、該プログラムは、
前記複数の処理部の一処理部による処理途中に他の処理部による処理を行う場合に、前記一の処理部による処理を中断させ、
前記一の処理部により使用されているメモリの使用量を示す情報をブロックサイズ決定手段に入力して、前記前記他の処理部による処理のために割り当てる前記共有メモリの容量を決定させ、
前記共有メモリに、前記ブロックサイズ決定手段により決定された容量ずつ画像データをロードし、
前記共有メモリにロードした画像データを前記他の処理部に入力して処理を行わせることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、たとえば画像処理のために用いるメモリを、スキャナ処理とプリンタ処理とで共有する画像処理装置に関する。
【背景技術】
【０００２】
複写機のように、スキャナとプリンタとを合わせ持った画像処理装置がある。この画像処理装置は、プリンタの画像処理を行うためのプリンタ処理部と、スキャナの画像処理を行うためのスキャナ処理部とは、それぞれ独立したローカルメモリを具備している（特許文献１等参照）。しかしながら、これらのローカルメモリは必ずしも同時に使用されるわけではないので、スキャナ処理部とプリンタ処理部とが共通のローカルメモリを利用するように構成することで、メモリの利用効率が向上する。その結果、スキャナ処理部とプリンタ処理部それぞれのローカルメモリの容量の合計値よりも、共有されるメモリの容量を小さくできることが期待される。
【特許文献１】特開平０９−３２６９０９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
画像処理においては、画像を矩形ブロックに分割して矩形ブロック単位で処理が行われることがある。従来の構成では、画像の矩形ブロックの大きさは処理に先だって設定され、最初に設定した矩形サイズの大きさを処理の途中で変更することができなかった。プリンタ処理部とスキャナ処理部とがそれぞれ独立したローカルメモリを備えている場合には、それぞれの処理部のためにメモリ容量を独立して確保できるので、処理途中でサイズの変更が出来なくても大きな問題とはならなかった。
【０００４】
しかしながら、プリンタ処理部とスキャナ処理部とが共通のローカルメモリを用いる場合には、それぞれの処理部は、処理時における空容量しか利用できない。たとえばプリンタ処理中にプリンタ処理を中断してスキャナ処理を行いたい場合など、プリンタ処理により使用されているメモリ容量の残りを用いてスキャナ処理が行われる。そのため、ローカルメモリに矩形ブロック単位で転送して処理を行う場合、この矩形ブロックサイズはメモリの残量により上限が決められる。
【０００５】
このように、ローカルメモリをスキャン処理とプリンタ処理とで共有すると、各処理により使用可能なメモリサイズは必ずしも一定でない。また、処理途中でブロックサイズは変更できなかった。そのために、各処理部で利用可能な最小のメモリサイズを共有メモリに確保しておき、その最小のメモリサイズに合わせてブロックサイズを決めておく必要があった。このため、メモリを複数の処理部で共有してもメモリの有効利用に必ずしもつながらなかった。
【０００６】
また、ブロックサイズの固定化は以下の理由によっても望ましくない。それは、ブロックサイズは大きい方が処理効率が上がり、処理時間を短縮できるからである。すなわち、画像をブロックごとに矩形分割すると図３のようになる。矩形ブロックを処理する際には、ブロック内の画素だけで処理を行うとブロック間の境界が不連続になる場合があるため、ブロック周辺の画素（これをのり代と呼ぶ。）も必要である。糊代は隣接するブロック間で重複する画素を含んでいる。このため、画像を小さく矩形分割すればその分だけ転送するブロック数が多くなり、転送するのり代が多くなる。逆に、ブロックサイズが大きい方が転送するブロック数が少なくなるので、転送するのり代は少なくなる。このことから、処理性能を上げる為にはブロックのサイズは大きな方が望ましい。
【０００７】
このように、相異なる処理部によりメモリを共有するためのブロックサイズの制約（空き容量のみ利用でき、かつ処理中はサイズ変更不可。）と、処理効率を向上させるためのブロックサイズの条件（大きい方が効率が良い。）とを両立させることが困難であった。すなわち、メモリを共有してもメモリの利用効率およびそのメモリを用いた処理効率を上げることが困難であり、逆に処理効率を上げようとすればメモリ容量の削減が困難であった。
【０００８】
本発明は上記従来例に鑑みてなされたもので、スキャナ処理とプリント処理とでローカルメモリを共有し、各処理により利用可能なメモリの容量に応じて画像の処理単位である矩形ブロックのサイズを変えることができる画像処理装置およびその制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の上記従来例に鑑みてなされたもので、以下の構成を備える。すなわち、命令メモリに記録された命令コードに従ってデータを転送するＤＭＡプロセッサと、
前記ＤＭＡプロセッサから転送される画像データに対して画像処理を施す複数の処理部を含む画像処理手段と、
前記複数の処理部により共有される共有メモリと、
前記共有メモリの使用量を示す情報に基づいて、前記共有メモリに転送できる画像データのブロックサイズを決定するブロックサイズ決定手段とを備え、
前記ＤＭＡプロセッサは、前記複数の処理部の一処理部による処理途中に他の処理部による処理を行う場合に、前記一の処理部による前記共有メモリの使用量を前記ブロックサイズ決定手段に与えてブロックサイズを決定させ、前記他の処理部による利用に供することを特徴とする。
【００１０】
あるいは、画像処理装置であって、命令を解釈し、解釈した命令に従ってデータを転送できるＤＭＡプロセッサと、
前記ＤＭＡプロセッサが実行している処理を、優先度に応じて動的に切り替える為のトリガを発生させるトリガ手段と、
プリンタ出力のための画像処理を行うプリンタ処理手段と、
スキャナ入力のための画像処理を行うスキャナ処理手段と、
前記プリンタ処理手段と前記スキャナ処理手段とにより共有される共有ローカルメモリと、
前記共有ローカルメモリの空き容量から転送する画像のライン数と画素数とを計算する計算手段とを備え、
前記ＤＭＡプロセッサは、前記トリガ手段により処理の切り替えのトリガが生じた際には、新たに開始される処理のために割り当てる前記共有ローカルメモリの容量を、中断される処理により使用されていたメモリの残量に基づいて前記計算手段により計算させることを特徴とする。
【発明の効果】
【００１１】
本発明によれば、たとえばプリンタ処理部とスキャナ処理部など複数の処理部によりメモリを共有でき、しかも、処理主体を動的に切り替えるときに、共有されているメモリの空き容量に応じて新たに開始される処理部に割り当てるメモリ容量を変えることができ、メモリの利用効率を上げることができるという効果を奏する。またその共有メモリを用いた処理効率をあげることができるという効果を奏する。
【発明を実施するための最良の形態】
【００１２】
＜画像処理装置の構成＞
本発明における一実施形態を図面を用いて説明する。図１１Ａは、画像スキャナおよびプリンタを組み合わせて構成され、スキャン、プリント、コピーという３つの動作モード（処理モード）で動作可能なディジタル複合機の構成を示すブロック図である。図１１Ａにおいて、画像スキャナ１１０２は、ＣＣＤ等の画像センサにより原稿画像を光学的に走査して、スキャナＩＦ１１０２を介して、ディジタル画像データを制御部１１０１に入力する。プリンタ部１１０５は、制御部１１０１から出力されるディジタル画像データをプリンタＩＦ１１０４を介して受信し、画像データに基づいて、シート等の印刷媒体上に画像を形成する。操作部１１０６は利用者に対する画面やキーボード等のユーザインターフェースを提供し、利用者によりたとえばスキャン、プリント、コピーといった処理モードが入力される。なおこれらモードは、ネットワークインターフェース（不図示）を介して他の端末等から入力することもできる。制御部１１０１は、入力された処理モードに応じて画像スキャナ１１０１およびプリンタ１１０５を制御する。処理モードがスキャンモードであれば、画像スキャナ１１０２によって画像を読み取り、読み取った画像に対して一定の入力画像処理を施した後に、メモリの与えられたアドレスにその画像データを保存する。また、プリントモードであれば、入力された画像データに対して一定の出力画像処理を施した後、プリンタ１１０５によりその画像データに基づく画像を出力させる。コピーモードであれば、画像スキャナ１１０２によって画像を読み取り、読み取った画像に対して一定の入力画像処理を施した後に、さらにその画像データに対して一定の出力画像処理を施した後、プリンタ１１０５によりその画像データに基づく画像を、指定された部数出力させる。それら画像処理のために、制御部１１０１には画像処理部１７が内蔵されている。
【００１３】
図１は本発明に係る画像処理部１７の構成の一例を示した図である。図１で示しているように、スキャナシステム（入力画像処理部）１４はシェーディング回路９、ガンマ補正回路１０、拡大縮小回路１１を備え、それら回路により画像データの処理を行う。プリントシステム（出力画像処理部）１５は、γ補正回路１２、２値化処理回路１３を備え、それら回路により画像データの処理を行う。ここで、マスキング処理回路７は、スキャナシステム１４とプリントシステム１５で共有されている。マスキング処理回路７は、入力画像処理（スキャン処理）においては、ＣＣＤ等の光電変換素子の分光特性及び光源および反射傘の分光特性を補正する処理を行う。また、出力画像処理（プリント処理）においては、ＹＭＣ表色系のカラー画像データを、プリントに用いるトナーやインク特性に応じて色変換する処理などを行う。いずれにしても係数マトリクスと画像データとの行列演算を行うことで、それらの入力マスキング処理や出力マスキング処理を行うことができる。係数記憶部８は、マスキング処理回路７で使用する係数を記憶する。
【００１４】
プロセッサ１は、ＤＭＡプロセッサインターフェース６を通してＤＭＡプロセッサ２が読み込むインストラクションメモリ２１を書き換えることができる。インストラクションメモリ２１は書き替え可能なメモリであり、ＤＭＡプロセッサ２が解釈実行可能なプログラムが格納される。
【００１５】
ＤＭＡプロセッサインターフェース６はＤＭＡプロセッサ２と接続されているとともに、アドレスバスおよびデータバス経由でプロセッサ１から読み書き可能なレジスタ６１を持つ。プロセッサ１はこのレジスタ６１を書き換えることによってＤＭＡプロセッサ２のリセット状態の制御およびＤＭＡプロセッサ２内のインストラクションメモリ２１の書き換えを行うことができる。
【００１６】
ＤＭＡプロセッサ２は、アドレスバスおよびデータバスに接続されているローカルメモリ３と、メモリコントローラ４を介して接続されたメインメモリ５との間のデータ転送を行うとともに、内部のインストラクションメモリ２１に保持している命令列を読み込み、それを解釈及び実行する。インストラクションメモリ２１は３２ビットを１ワードとし、１２８ワードの命令列を格納することができる。個々のワードには０〜１２７のアドレスが割り振られており、基本的には０番地から順に命令列を実行する。
【００１７】
また、ＤＭＡプロセッサ２には出力ポート、入力ポートが複数あり、外部の回路へデータを出力したり、データを入力したりすることができる。図１の構成では、ＤＭＡプロセッサ２の入出力ポートは、シェーディング回路９、γ補正回路１０、拡大縮小回路１１、係数記憶部８、マスキング処理回路７、γ補正回路１２、２値化処理回路１３と接続している。
【００１８】
具体的なＤＭＡプロセッサ２と画像処理回路１７との接続は図４のようになっている。メモリコントローラ４はアドレスバス及びデータバスからメインメモリ５にアクセスするための制御を行う。プロセッサ１、ＤＭＡプロセッサ２、ローカルメモリ３、メモリコントローラ４はそれぞれクロスバー接続されている。図２にクロスバー接続された構成の一例を示す。プロセッサ１とＤＭＡプロセッサ２とはＤＭＡプロセッサインターフェース６を介して接続されており、ＤＭＡプロセッサ２には画像処理モジュール１８が図４のように接続されている。プロセッサ１およびＤＭＡプロセッサのデータバスおよびアドレスバスはクロスバースイッチ１００を介してローカルメモリ３と、メモリコントローラ４を介してメインメモリ５とに接続されている。この構成により、ＤＭＡプロセッサ２は、メインメモリ５またはローカルメモリ３に格納された画像データを画像処理モジュール１７に転送して各種の画像処理を施させ、処理後の画像データを再びメインメモリ５またはローカルメモリ３に保存することができる。またプロセッサ１もローカルメモリ３またはメインメモリ５にアクセスでき、画像処理に供する画像データをローカルメモリ３またはメインメモリ５に格納したり、あるいは画像処理後の画像データにアクセスすることができる。
【００１９】
ループ計算回路（ブロックサイズ決定手段）１６は、ローカルメモリ３の残容量を計算するための回路である。ループ計算回路１６は、ＤＭＡプロセッサ２により、ローカルメモリ３を用いた一の処理、たとえばプリンタシステム１５による処理を中断して、他の処理、たとえばスキャナシステム１４による処理を行う場合などに、後者の処理が利用可能なローカルメモリ５の残容量を計算する。ループ計算回路１６は、たとえばプリントシステム１５による処理ループの数をパラメータとして与えられると、その値からローカルメモリ３において格納可能な画像データのブロックサイズを出力する。ループ計算回路１６は、ブロックサイズを、画像データブロックのライン数、ラインあたりの画素数の２倍の値、ラインあたりの画素数により出力する。
【００２０】
図５はプロセッサ１及びＤＭＡプロセッサ２において有効なメモリのアドレスマップである。プロセッサ１及びＤＭＡプロセッサ２のアドレス空間には、ＲＯＭ領域５１、ＤＭＡプロセサインターフェース６のレジスタ６１、ローカルメモリ３，メインメモリ５がマッピングされている。ローカルメモリ３は、低レイテンシでアクセス可能であるが小容量のＳＲＡＭで構成されている。メインメモリ５は、アクセスには多くのレイテンシを必要とするが容量を大きくすることが可能なＤＲＡＭで構成されている。ＤＭＡプロセッサインターフェース６はプロセッサ１から読み書き可能なレジスタである。ＲＯＭ領域５１は、プロセッサ１のブート、及びプログラム格納用になっている。メインメモリ５には本実施形態で用いる入力画像処理用の係数マトリクスおよび出力画像処理用の係数マトリクスを含み、いずれかを選択的に読み出し可能に構成された係数記憶領域３０１が確保されている。なお、係数マトリクスが固定的に与えられる場合には、係数記憶領域３０１はＲＯＭ３１に設けても良い。
【００２１】
図６は、プロセッサ１からアクセス可能なＤＭＡプロセッサインターフェースのレジスタ６１のレジスタマップである。０ｘｅ０００００００番地（先頭の０ｘは１６進表記であることを意味する。以下同じ。）はリセットレジスタである。リセットレジスタに１を書き込むとＤＭＡプロセッサ２がリセット状態となり、０を書き込むとリセット解除状態となる。初期値は１である。０ｘｅ００００００４番地はトリガエミットレジスタである。トリガエミットレジスタに１を書き込むとＤＭＡプロセッサ２に対してトリガイベントを発生させることができる。ＤＭＡプロセッサ２はこのトリガイベントを専用の命令を実行することによって検知することができる。０ｘｅ００００００８番地はトリガステータスレジスタである。０ｘｅ００００００ｃ番地はモードレジスタである。モードレジスタに１を書き込むと、ＤＭＡプロセッサ２が停止状態となり、インストラクションメモリ２１を書き換え可能となる。０ｘｅ０００００１０番地はＩＭＥＭアドレスレジスタである。ＤＭＡプロセッサ２が停止状態にあってインストラクションメモリ２１を書き換え可能なときに、インストラクションメモリ２１の書き換え対象のアドレスをＩＭＥＭアドレスレジスタに書き込むことで、書き換え対象のアドレスが指定される。０ｘｅ０００００１４番地はＩＭＥＭデータレジスタである。ＤＭＡプロセッサ２が停止状態にあってインストラクションメモリ２１を書き換え可能なときに、ＩＭＥＭデータレジスタに値を書き込むことで、その値を、ＩＭＥＭアドレスレジスタで指定されたインストラクションメモリ２１の番地にＤＭＡプロセッサ２の命令として書き込むことができる。このようにして、プロセッサ１はこのＤＭＡプロセッサインターフェース６のレジスタの値を書き換えることにより、ＤＭＡプロセッサ２の命令を入れ替えることができる。この様な構成を備えることで、ＤＭＡプロセッサ２により実行される命令コードを格納したインストラクションメモリ２１の内容を、プロセッサ１により動的に書き替えることができる。
【００２２】
＜マスキング処理＞
カラー画像データのスキャナ時に行うマスキング処理（入力マスキング処理）の内容を図７（Ａ）に示す。図７（Ａ）において、Ｒ，Ｇ，Ｂは読み取ったカラー画像データを表し、Ｒ′，Ｇ′，Ｂ′はマスキング処理後のカラー画像データを示している。また、Ａ１１，Ａ１２，Ａ１３，Ａ２１，Ａ２２，Ａ２３，Ａ３１，Ａ３２，Ａ３３は３×３の係数マトリクスであり、読み取った画像データとの積和演算に用いられる。つまり、原稿のカラー画像データ（輝度データ）Ｒ，Ｇ，Ｂと前記３×３のマトリクス演算によってマスキング後のカラー画像データＲ′，Ｇ′，Ｂ′を得る。
【００２３】
また、カラー画像データのプリント時に行うマスキング処理（出力マスキング処理）の内容を図７（Ｂ）に示す。図７（Ｂ）において、Ｃ，Ｍ，Ｙは輝度濃度変換後のカラー画像データであり、Ｃ′，Ｍ′，Ｙ′はマスキング処理後のカラー画像データを示している。また、Ｂ１１，Ｂ１２，Ｂ１３，Ｂ２１，Ｂ２２，Ｂ２３，Ｂ３１，Ｂ３２，Ｂ３３は３×３の係数である。つまり、輝度濃度変換後のカラー画像データ（濃度データ）と前記３×３係数によるマトリクス演算によって、濃度のカラー画像データのインク特性を考慮したマスキング処理後のカラー画像データＣ′，Ｍ′，Ｙ′を得ることが出来る。
【００２４】
ここで、係数記憶部８には、スキャナ処理時（すなわちスキャン処理モードの場合）には、Ａ１１，Ａ１２，Ａ１３，Ａ２１，Ａ２２，Ａ２３，Ａ３１，Ａ３２，Ａ３３から成る係数マトリクス５０１が設定（格納）される。プリント処理時（すなわちプリント処理モードの場合）には、Ｂ１１，Ｂ１２，Ｂ１３，Ｂ２１，Ｂ２２，Ｂ２３，Ｂ３１，Ｂ３２，Ｂ３３から成る係数マトリクス５０２が設定（格納）される。コピー処理時（すなわちコピー処理モードの場合）には、スキャナ処理前にＡ１１，Ａ１２，Ａ１３，Ａ２１，Ａ２２，Ａ２３，Ａ３１，Ａ３２，Ａ３３の係数を設定（格納）する。スキャナ処理後にはＢ１１，Ｂ１２，Ｂ１３，Ｂ２１，Ｂ２２，Ｂ２３，Ｂ３１，Ｂ３２，Ｂ３３の係数を設定してプリント処理を行う。マスキング回路７は、係数記憶部８に記憶された係数マトリクスを用いて行列演算を実行する。
【００２５】
マスキング処理回路７は、スキャナシステム１４とプリントシステム１５とで共有しているので、スキャナ処理が行われる時は係数記憶部８にスキャナ処理用の係数を設定してから、たとえばシェーディング回路９、マスキング処理回路７、γ補正回路１０、拡大縮小回路１１の順番で画像データの処理を行う。プリンタ処理を行う場合には、係数記憶部８にプリント処理用の係数を設定してから、マスキング処理回路７、γ補正回路１２、２値化回路１３の順番に画像データの処理を行う。このように、処理モードに応じてデータパスの切り替えを行うことにより、マスキング処理回路７の共有を実現することができる。
【００２６】
＜拡大縮小処理＞
次に拡大縮小回路１１について説明する。拡大縮小回路１１は、２ライン（主走査方向の画素列）を用いて画像の線形補間を行う。図８は、線形補間における変換前の点と変換後の点の関係を示す。点Ａ、Ｂ、Ｃ、Ｄは変換前の点、点Ｐは変換後の点である。点Ｐの位置は、点Ａ、Ｂ間の長さを２５６、点Ａ、Ｃ間の長さを２５６とした平面で表される。主走査方向をＸ方向、副走査方向をＹ方向とし、点Ａを原点とすると、点Ａの座標は（０，０）、点Ｄの座標は（２５５，２５５）となる。点Ａ、Ｂ、Ｃ、Ｄ、Ｐの画素値をそれぞれａ，ｂ，ｃ，ｄ，ｐとする。Ｐの主走査方向の位置は点ＡＢ間を２５６とした場合の原点Ａからの距離で表し、Ｌａとする。Ｐの副走査方向の位置はＡＣ間を２５６とした場合の原点Ａからの距離で表し、Ｋａとする。点Ｐの画素値は、
p = {a・(256-La)・(256-Ka)+b・La・(256-Ka)+c・(256-La)・Ka+d・La・Ka}/(256・256)
で表される。この計算を縮小後の画素（点Ｐ）毎に行うことで縮小された画像データが生成される。すなわち拡大縮小回路７は、ラスタ形式の画像データについて少なくとも２画素×２画素の画像データが入力されれば、指定された変倍率で変倍した画像データを出力することができる。
【００２７】
ここで、変換前の画素間の長さを２５６とすると、変倍率は、変倍率を２５６／ｎと表した場合のｎの値（すなわち画素間隔）で指定する。例えば、等倍の変倍率は２５６／ｎ＝１であるから、ｎ＝２５６が等倍を指定する値である。同様に、５０％縮小の変倍率は２５６／ｎ＝０．５であるから、ｎ＝５１２がその変倍率を指定する値である。２００％拡大の変倍率は２５６／ｎ＝２であるから、ｎ＝１２８がその変倍率を指定する値である。この倍率設定が、主走査方向および副走査方向について行われる。各方向についての倍率は、たとえば操作部１１０６から入力され、プロセッサ１によってメインメモリ５に保存される。
【００２８】
ここで、変倍率ｎに２５６以上の値が設定された場合には、拡大縮小回路１１は、その変倍率と画像データとをＤＭＡプロセサ２から受け取って、画像データに対して指定された倍率の縮小処理を行う。画像を縮小する場合には、図９のような線形補間を行う。図９において、変換前の点を白丸で、変換後の点を黒丸で表す。拡大縮小回路７は、変換後の画素（黒丸）を、図８に示したようにその近傍にある変換前の画素（白丸）４点で補間することで生成する。図９の例は、縦横（主走査・副走査方向）とも５０パーセントの縮小を示す。なお、縮小率が２分の１、４分の１など２のべき乗分の１となる場合、すなわち倍率ｎが２５６の倍数となる場合には、補間処理を行わず、ｎ／２５６画素毎に画素を残し、他の画素を間引くことでも縮小を実現できる。このような線形補間により、縮小時は画素数が少なくなる。
【００２９】
逆に、拡大する場合は図１０のように線形補間を行っていき、画素数を多くする。補間される画素値を生成する要領は図８で説明したとおりであるが、拡大処理においては、元画像データにおける同一の４画素から複数の画素が生成される。図１０の例では、横（主走査方向）は４分の７倍（すなわちｎ＝１４６）、縦（副走査方向）は３分の４倍（すなわちｎ＝１９２）となっている。
【００３０】
拡大縮小回路１１は、このように正方４画素に基づいて補間画素を生成するが、ＬａおよびＫａの値については、変倍率と画素の位置に従って独自に保持している。たとえば初期値をＬａ０＝０、Ｋａ０＝０とし（初期値は２５６以内であれば適当でよい。）、画素が進む毎にＬａにｎの値を積算した値Ｌａ０を保持し、ラインが進む毎にＫａにｎの値を積算した値Ｋａ０を拡大縮小回路１１により保持して、それぞれの値について２５６を法とする剰余を求める。この剰余値が求めるＬａ，Ｋａとなる。また、Ｌａ０、Ｋａ０の値の２５６による商が、補間に用いるべき元画像の画素の位置を示す値となる。たとえばこの商がＬａ０について２００、Ｋａ０について１００であれば、第１００ラインの第２００番目の画素を図５の画素Ａとした正方４画素により、画素の補間が行われる。Ｌａ、Ｋａの保持の仕方についてはこれは一例に過ぎない。他の方法も取り得ることはいうまでもない。
【００３１】
＜２値化処理＞
次に２値化処理回路１３について説明する。誤差拡散法による２値化は、注目しているピクセルの値が０〜１２７の場合には結果に０を、１２８〜２５５の場合には１を出力する。それと同時に結果に０を出力した場合にはピクセル値を、結果に１を出力した場合にはピクセル値から１２７を引いた値を誤差値とし、その誤差値に係数（総和が１となるような係数）をかけて後に処理するピクセル値に加算する。本例では、対象としているピクセルの座標を（ｘ，ｙ）とすると誤差の配分は、座標（ｘ＋１，ｙ）のピクセルに誤差値の１／２、座標（ｘ−１，ｙ＋１）のピクセルに誤差値の１／４、座標（ｘ，ｙ＋１）のピクセルに誤差値の１／８と誤差値を８で割った余り、座標（ｘ＋１，ｙ＋１）のピクセルに誤差値の１／８とする。このように、２値化処理回路１３においても、着目画像データブロックから、それに隣接する画像データブロックへと誤差が分散されるために、ブロック間で受け渡される誤差値をためておくためなどにローカルメモリが必要となる。
【００３２】
＜画像処理全体の手順＞
図１１Ｂに図１１Ａの画像処理装置における処理手順の概略を示す。操作部１１０６から、あるいは不図示のネットワークインターフェースから処理開始の指示が与えられると図１１Ｂの手順が制御部１１０１、具体的には後述するプロセッサ１により実行される。この手順はメインメモリ５などに格納されたプログラムの実行により実現される。
【００３３】
まず、処理内容がスキャン又はコピーか、それともそれらのいずれでもないか（すなわちプリントか）が判定される（ステップＳ１１１１）。プリントであれば、入力インターフェースからプリント対象の画像データが制御部１１０１に入力される（ステップＳ１１１３）。スキャン又はコピーであれば、画像スキャナ１１０２が駆動されて画像データが読み取られて制御部１１０１に入力される（ステップＳ１１１２）。
【００３４】
入力された画像データはメインメモリ５に保存されて（ステップＳ１１１４）、画像処理部１７によるデータ処理（画像処理）が実行される（ステップＳ１１１６）。
【００３５】
データ処理が終了すると、指定された処理内容がプリント又はコピーか、それともスキャンか判定される（ステップＳ１１１７）。スキャンであれば、出力インターフェース（不図示）から画像処理後の画像データを出力するか、あるいはメモリやハードディスク等に保存しておく。指定された処理がプリント又はコピーであれば、処理後の画像データをプリンタ１１０５に送信して印刷を行わせる（ステップＳ１１１８）。
【００３６】
ステップＳ１１１６におけるデータ処理は、処理モードに応じて行われる。処理モードには、スキャナ処理モード、プリント処理モード、コピー処理モードの３通りのモードが考えられる。プロセッサ１は、処理モードがスキャナ処理か、プリント処理か判定し、いずれでもなければコピー処理と判定する。こうして処理モードを判断して、ＤＭＡプロセッサ２が読み込むインストラクションメモリに、各処理モードにおいてＤＭＡプロセッサ２が実行すべき命令を書き込む。このようにして、処理に応じて命令を切り替える。ＤＭＡプロセッサ２は設定されたインストラクションメモリから命令を読み込む。ＤＭＡプロセッサ２はスキャナ処理の場合には図１２、プリント処理の場合には図１３のような処理手順で動作する。なお、処理モードは、操作部１１０６やあるいは不図示のインターフェースから入力された処理モードを示す値に基づいて判定できる。
【００３７】
図１２より、スキャナ処理モードの処理順序は、係数記憶部８にスキャナ処理用の係数を設定してから、シェーディング回路９、マスキング処理回路７、γ補正回路１０、拡大縮小回路１１の順番で処理を行うことが示されている。図１３より、プリント処理モードの処理順序は、係数記憶部８にプリント処理用の係数を設定してから、マスキング処理回路７、γ補正回路１２、２値化処理回路１３の順番に処理を行うことが示されている。
【００３８】
図１２は、スキャナ処理モードの場合に画像処理部１６により実行される処理（Ｓ１１１６）の手順を示す。最初に、係数記憶部８にスキャナ処理用のマスキング係数を設定する（ステップＳ１２０１）。このマスキング係数はローカルメモリの係数記憶領域から読み出される。そして、画像が格納されているメインメモリ５から、データを順次シェーディング回路９へデータを転送する（ステップＳ１２２１）。シェーディング回路９、マスキング処理回路７、γ補正回路１０、拡大縮小回路１１の順番にデータを渡して処理させ（ステップＳ１２２２〜Ｓ１２２４）、最終的にメインメモリ５へデータを転送する（ステップＳ１２３０）。ここでステップＳ１２２１〜Ｓ１２２４は、画像処理部１７により行われる。ステップＳ１２１０、Ｓ１２３０はＤＭＡプロセサ２によって行われる。
【００３９】
図１３は、プリント処理モードの場合に画像処理部１６により実行される処理（Ｓ１１１６）の手順を示す。最初に、係数記憶部８にプリント処理用のマトリクス係数を設定する（ステップＳ１３１０）。次に、画像が格納されたメインメモリ５からデータを順次、マスキング処理回路７へデータを転送する（ステップＳ１３２１）。マスキング処理回路７、γ補正回路１２、２値化回路１３の順番に処理した後に、最終的にメインメモリ５へデータを転送する（ステップＳ１３２２〜Ｓ１３２３）。最後に処理済みの画像データをメモリに保存する（ステップＳ１３３０）。ここでステップＳ１３２１〜Ｓ１３２３は、画像処理部１７により行われる。ステップＳ１３１０、Ｓ１３３０はＤＭＡプロセサ２によって行われる。
【００４０】
ここで、ある画像データのために図１１ＢのステップＳ１１１６が実行されている場合に、それを中断して、それと異なる画像データのためのステップＳ１１１６の処理を実行することも必要となる。たとえば、プリンタシステム１５によるプリンタ用画像処理中に、スキャナシステム１４によるスキャナ用画像処理が割り込み的に優先して実行される場合もある。図１２，１３で説明すると、図１３のステップＳ１３２０実行中に、図１２の処理が割り込み実行される。以下、本実施形態では、プリント処理中にその処理を中断して、スキャナ処理を行い、スキャナ処理終了後にプリント処理を再開する方法について説明する。
【００４１】
＜マルチスレッドによるＤＭＡ処理＞
このような優先処理を実施する為には、ＤＭＡプロセッサ２がスキャナ処理を行うスレッドとプリント処理を行うスレッドを用意し、スキャナスレッドが処理している間にプリントスレッドを停止させ、処理が終わったら停止していたプリントスレッドを再開させることが必要である。本実施形態では、二つのスレッドにおいて、一方のスレッドの処理を停止させて再開する方法について説明する。
【００４２】
プリント処理とスキャナ処理を動的に切り替える為に、ＤＭＡプロセッサ２が二つのスレッドの命令を交互に実行する。例えば、スキャナ処理用のスレッド、プリンタ処理用のスレッドを用意し、スキャナ処理とプリント処理を交互に実行していく。つまり、図１４のように、スレッド１の命令１−１、スレッド２の命令２−１、スレッド１命令１−２、スレッド２の命令２−２、という具合に各スレッドの命令を交互に実行していく。この複数スレッドを使うプログラムには、図１５の機能がある。つまり、スレッド２の命令を実行してスレッド１を停止させ、スレッド２の処理が終了すると、その最後に、停止させていたスレッド１の命令を再開させる。つまり、スレッド１の命令１−１を実行した後に、スレッド２においてスレッド１をサスペンドするサスペンド（ｓｕｓｐｅｎｄ）命令１５０１を実行する。そうすると、スレッド１の処理は中断する。その間に、スレッド２の命令２−１から命令２−３までを行う。その最後に、スレッド１を再開させるレジューム（ｒｅｓｕｍｅ）命令１５０２を実行する。それによって、スレッド１は処理を再開し、命令１−２から処理を順番に実行していく。スレッド２は自分のスレッドが終了する命令を実行する。このことにより、スレッド２は消える。
【００４３】
また、プロセッサ１はＤＭＡプロセッサインタフェース６のトリガエミットレジスタに値を書き込むことにより、何種類かのトリガ信号を発生させることができる。ＤＭＡプロセッサ２は種類ごとにトリガ信号を検知することができる。ＤＭＡプロセッサ２にはトリガ信号を検知するまで待つ命令が定義されている。その命令を各スレッドで実行することで、各スレッドはトリガ信号が来るまでは動作を停止している。このことから、プロセッサ１の判断によって、スレッドごとに命令実行の開始時間を変えることができる。
【００４４】
ここで、これらの機能を合わせると図１６のようにスレッドを制御することができる。図１６では、スレッド２の、トリガ信号を待機するためのウエイトトリガ（ｗａｉｔｔｒｉｇｇｅｒ）命令１６０１をＤＭＡプロセッサ２が実行することで、スレッド２はトリガ信号が検知されるまで停止（ウエイトトリガ命令を繰返し実行）している。その間に、ＤＭＡプロセッサ２はスレッド１の命令１−１から命令１−３の処理を行う。ここで、ＤＭＡプロセッサ２はトリガ信号１６０２を検知するとスレッド２の処理を開始する。ウエイトトリガ命令の次の命令はサスペンド命令なので、それを実行することでスレッド１を停止させる。その間に、ＤＭＡプロセッサ２はスレッド２の処理を命令２−１から行う。スレッド２の処理の最後はレジューム命令１６０３なので、それを実行することで停止させていたスレッド１の実行を再開させる。ＤＭＡプロセッサ２は、中断直後のスレッド１の命令１−４から順番に処理していく。一方スレッド２においては、スレッドが終了する命令を実行する。このことにより、スレッド２は消える。
【００４５】
ここで、プリント処理の途中でスキャナ処理に切り替わった場合におけるローカルメモリ３の使用方法について説明する。ローカルメモリ３には図１７のように、スキャナ処理で最低使用する容量１７０３が確保されている。スキャナ処理で使用できる容量は、これを最低値としてプリント処理で使用する容量１７０１によって変わる。もし、図１８のようにプリント処理で殆どメモリ容量を使わなかったら、スキャナ処理時に多くの容量１８０２を使うことができる。この時、画像の矩形サイズの大きさはたとえば図１９のように１６分割したサイズとなる。逆に図２０のようにプリント処理で多くのメモリ容量２００１を使用すると、スキャナ処理用の容量２００２はあまり大きくできない。この時、画像の矩形サイズの大きさはたとえば図２１のように３６分割したサイズになる。ここで、たとえば図１９の場合には、１６分割した各ブロックをローカルメモリに格納して処理が行われる。すなわち、画像データの矩形ブロックは１６回転送される。一方、たとえば図２１の場合には、３６分割した各ブロックをローカルメモリに格納して処理が行われる。すなわち、画像データの矩形ブロックは３６回転送される。この為、図１９のように大きく画像を矩形分割した方が、転送するのり代部分が少なくなる。図２１のように転送すると、矩形画像が小さい為に重なるのり代部分が多くなる。この為、転送量が増大し、処理性能が落ちてしまう。このことから、ローカルメモリの容量に応じて画像を矩形分割したほうが良い。
【００４６】
＜ローカルメモリの残量（あるいはブロックサイズ）の決定＞
次に、ローカルメモリ３の残容量の計算方法を説明する。これは、図１におけるループ計算回路１６で計算する。まず、プリント処理におけるループ処理の回数をカウントしているループレジスタの値をループ計算回路１６へ転送する。１回のループでローカルメモリに送られて保存される画素数は決められているので、ループ回数によりローカルメモリの容量が分かる。この事実に基づいて、ループ計算回路１６では、与えられたループレジスタの値からスキャナスレッドによる処理対象のブロックサイズを決定する。
【００４７】
ループ計算回路１６によるブロックサイズ決定のフローチャートは、図２２（Ａ）である。まず、図２２（Ａ）における変数ｌｐはプリント処理のループした回数をカウントした値で、ＤＭＡプロセッサ２から渡される。ｘは所定の数（図２２では１３２４８）からプリント処理でループした回数ｌｐを引いたものとする（ステップＳ２２０１）。この所定の回数は、一定サイズの画像データを全て処理するために必要なループの回数である。たとえば１回のループで１ライン分の画像データについて処理が行われるとすれば、前記所定回数は処理対象画像データのライン数である。また、処理された画素データがローカルメモリに保存されるとすれば、ループカウンタｌｐは、プリンタスレッドにより使用されているローカルメモリの容量の指標となる。逆に、前記所定数からループカウンタｌｐの値を差し引いた値は、ローカルメモリ３の空き容量の指標となる。ローカルメモリ全体の容量はあらかじめ与えられているから、ループカウンタｌｐの値に応じてローカルメモリ３の空き容量の具体値も明らかである。
【００４８】
そこで、ｘの値に応じて、矩形画像のライン数と、矩形画像の１ライン分の画素数を指定する。たとえばｘが８０００以上であるか判定する（ステップＳ２２０２）。そうであれば４６ライン×２８８画素を１ブロックとするために、ライン数４６を変数ｌｉｎｅに、１ラインの画素数２８８を変数ｐｉｘｅｌに代入する（ステップＳ２２０３）。またステップＳ２２０２で条件が満たされなければ次にたとえばｘが２０００以上であるか判定する（ステップＳ２２０４）。そうであれば４０ライン×２４０画素を１ブロックとする。そのために、ライン数４０を変数ｌｉｎｅに、１ラインの画素数２４０を変数ｐｉｘｅｌに代入する（ステップＳ２２０５）。またステップＳ２２０４で条件が満たされなければ次にたとえばｘが１０００以上であるか判定する（ステップＳ２２０６）。そうであれば３５ライン×２００画素を１ブロックとする。そのために、ライン数３５を変数ｌｉｎｅに、１ラインの画素数２００を変数ｐｉｘｅｌに代入する（ステップＳ２２０７）。またステップＳ２２０６で条件が満たされなければ次にたとえばｘが５００以上であるか判定する（ステップＳ２２０８）。そうであれば３０ライン×１８０画素を１ブロックとする。そのために、ライン数３０を変数ｌｉｎｅに、１ラインの画素数１８０を変数ｐｉｘｅｌに代入する（ステップＳ２２０９）。またステップＳ２２０８で条件が満たされなければ、２４ライン×１６０画素を１ブロックとする。そのために、ライン数２４を変数ｌｉｎｅに、１ラインの画素数１６０を変数ｐｉｘｅｌに代入する（ステップＳ２２１０）。このようにして、画像の矩形分割の大きさをローカルメモリ３の空き容量に応じて変えていく。
【００４９】
図２２（Ｂ）は、図２２（Ａ）の手順で決定したブロックサイズをＤＭＡプロセッサ２に渡す際の手順である。ループ計算回路１６は、ＤＭＡプロセッサから出力要求を受けると、３つのパラメータを１回の要求に対して１つずつ、ＤＭＡプロセッサ２に順次渡す。図２２（Ｂ）は出力要求を受けた際のループ計算回路１６による手順である。まずローカル変数ｃｔが０であるか判定し（ステップＳ２２１１）、０ならば変数ｌｉｎｅの値を指定されたレジスタに書き込む（ステップＳ２２１２）。ローカル変数ｃｔが１であるか判定し（ステップＳ２２１３）、１ならば変数ｐｉｘｅｌの２倍の値を指定されたレジスタに書き込む（ステップＳ２２１４）。次にローカル変数ｃｔが０でも１でもなければ変数ｐｉｘｅｌの値を指定されたレジスタに書き込む（ステップＳ２２１５）。最後にローカル変数ｃｔに、２を法として１加算する（ステップＳ２２１６）。もちろんこの手順はハードウエア回路によって実行されてもよい。
【００５０】
＜スキャナ処理を優先した画像処理の一例＞
本実施形態では前述したとおり、プリント処理とスキャナ処理を動的に切り替える際に、ローカルメモリの空き容量によって画像の矩形分割の大きさを変えることができる。その処理手順の例を図２３に示す。プリント処理スレッドはトリガ１を待ち、スキャナ処理スレッドはトリガ２を待って実行開始される。プロセッサ１はＤＭＡプロセッサインタフェース６を操作してトリガ１を発生させる。ＤＭＡプロセッサ２はトリガ１を検知して、プリント処理を開始する。まず、係数記憶部８にプリント処理用係数を設定する（ステップＳ２３０１）。その後、プリント処理を実行していく（ステップＳ２３２０）。ここで、スキャナ処理へ動的に切り替える場合には、プロセッサ１はＤＭＡプロセッサインタフェース６を操作して、トリガ２を発生させる。ＤＭＡプロセッサ２はトリガ２を検知する。検知したらスキャナ処理のスレッドが起動し、サスペンド処理を実行してプリント処理スレッドを停止させる（ステップＳ２３１０）。スキャナ処理スレッドがプリント処理を中断させると、スキャナ処理スレッドの命令が実行されていく。まず、プリント処理スレッドで用いたループレジスタの値をループ計算回路１６へ転送する（ステップＳ２３１１）。ループ計算回路１６によりループ数を計算させて、ＤＭＡプロセッサ２はその結果を受け取り、レジスタに設定する（ステップＳ２３１２）。ＤＭＡプロセッサ２は、つづけて係数記憶部８にスキャナ処理用係数を設定する（ステップＳ２３１３）。その後、画像処理部１７を用いたスキャナ処理を実行していく（ステップＳ２３１４）。スキャナ処理が終了したら、係数記憶部８にプリント処理用係数を再設定する（ステップＳ２３１６）。再設定後に、ＤＭＡプロセッサ２はレジューム命令を実行して停止していたプリント処理スレッドを再開させる。このことにより、プリント処理が再開する。
【００５１】
一方、プリンタスレッドはステップＳ２３０２で中断し、ステップＳ２３０３から再開される。
【００５２】
具体的なＤＭＡプロセッサ２のプログラムを図２４〜図２６に示す。図中プログラムコードの「；」以降はコメント文である。ここで、このプログラムにおける「ｏｕｔ」は外部の画像処理回路１７と接続している出力ポートのレジスタ番号である。「ｉｎ」は外部の画像処理回路１７と接続している入力ポートのレジスタ番号である。具体的には図４のようにｏｕｔ０はγ補正回路１０、ｏｕｔ１は拡大縮小回路１１、ｏｕｔ２はシェーディング回路９、ｏｕｔ３は係数記憶部８、ｏｕｔ４はマスキング処理回路７、ｏｕｔ５は２値化処理回路１３、ｏｕｔ６はループ計算回路１６、ｉｎ０はγ補正回路１０、ｉｎ１は拡大縮小回路１１、ｉｎ２はマスキング処理回路７、ｉｎ３はγ補正回路１２、ｉｎ４は２値化処理回路１３、ｉｎ５はループ計算回路１６と接続されている。たとえば以下のような命令の場合には、γ補正回路１０にｇｐｒ０レジスタの値が転送されることになる。
ｍｏｖｅ  ｇｐｒ０  ｏｕｔ０；
これはレジスタｇｐｒ０からγ補正回路１０へデータ転送を行うための命令である。
【００５３】
またたとえば以下のような命令の場合には、γ補正回路１０から出力されたデータがｇｐｒ０へ転送されることになる。
ｍｏｖｅ  ｉｎ０  ｇｐｒ０；
これはγ補正回路１０からレジスタｇｐｒ０へデータ転送を行うための命令である。
【００５４】
次に図２４〜図２６のプログラムにおける「ａｒ」はアドレスレジスタを表している。例えばａｒ０は、０番目のアドレスレジスタで、ａｒ１は１番目のアドレスレジスタである。また、［］はディジットを表す。たとえばａｒ０［０］に０ｘ３０が代入されると、ａｒ０レジスタの第０ディジットすなわちＬＳＤに０ｘ３０が代入されてａｒ０＝０ｘ００００００３０となる。ただし、アドレスは、バイトアドレスで示してある。このための命令は以下の通りである。
ｌｏａｄ  ０ｘ３０  ａｒ０［０］；
これは桁を指定した代入命令である。
【００５５】
ｌｏａｄ  ０ｘ３０  ａｒ０［１］という命令の場合は、ａｒ０［１］に０ｘ３０が代入されるので、ａｒ０＝０ｘ００００３０００となる。
【００５６】
ｌｏａｄ  ０ｘ３０  ａｒ０［２］という命令の場合は、ａｒ０［２］に０ｘ３０が代入されるので、ａｒ０＝０ｘ００３０００００となる。
【００５７】
ｌｏａｄ  ０ｘ３０  ａｒ０［３］という命令の場合は、ａｒ０［３］に０ｘ３０が代入されるので、ａｒ０＝０ｘ３０００００００となる。
【００５８】
以上から図２４〜図２６のプログラムは、次のような動作になる。まず以下の命令でアドレスレジスタであるａｒ０の値をクリアする（Ｓ２４０１）。
ｃｌｒ  ａｒ０  ；この命令でａｒ０の値をクリアする。ここでａｒ０はスキャナ処理用の画像が展開されるアドレスである。
【００５９】
次の命令で、アドレスレジスタにスキャナ処理用の画像が格納されているメインメモリのアドレス値を代入する（Ｓ２４０２）。
ｌｏａｄ  ０ｘ３０  ａｒ０［３］  ；この命令でａｒ０レジスタ＝０ｘ３０００００００とする。同じようにａｒ１をスキャナ処理した画像を出力するアドレス、ａｒ２をスキャナ処理用係数を展開するアドレス、ａｒ３をプリント処理用係数を展開するアドレス、ａｒ４をプリント処理用の画像が展開されるアドレス、ａｒ５をプリント処理した画像を出力するアドレス、ａｒ６を拡大縮小回路１１で使用するローカルメモリ３のアドレス、ａｒ７を２値化処理回路１３で使用するローカルメモリ３のアドレスとして、それぞれの初期値を設定していく（Ｓ２４０３まで）。
【００６０】
次に以下の命令で、プリントスレッドとスキャナスレッドを設定する。
ｌｏａｄ  ｐｒｉｎｔｅｒ  ｐｃ１  ；この命令でプリントスレッドの設定（０ｂ０００１に設定）を行う（Ｓ２４０４）。
ｌｏａｄ  ｓｃａｎｎｅｒ  ｐｃ２  ；この命令でスキャナスレッドの設定（０ｂ００１０に設定）を行う（Ｓ２４０５）。
【００６１】
これは、ｐｒｉｎｔｅｒ、ｓｃａｎｎｅｒというラベルがついたスレッドを、０ｂ０００１と０ｂ００１０という番号に設定している。この二つのスレッドは、交互に実行される。次の命令で、スレッドが有効化される。
ｅｎａｂｌｅ  ０ｂ００１０  ；スレッドを有効化する。
【００６２】
次の記述は、スキャナスレッドとプリントスレッドのラベルである。このラベルから、スレッドが始まる。
ｓｃａｎｎｅｒ：  ；スキャナスレッドラベル。
ｐｒｉｎｔｅｒ：  ；プリントスレッドラベル。
【００６３】
＜スキャナスレッド＞
ここで、スキャナスレッドとプリントスレッドの動作について、それぞれ説明する。最初にスキャナスレッドについて述べる。まず、ウエイト命令（Ｓ２４０６）でトリガ信号が検知されるまで待つ。つまり、プリント処理中にはプロセッサ１から指示があるまで、待機している。
ｗａｉｔ  Ｅ０ｂ１０  ；プロセッサからのｔｒｉｇｇｅｒイベントが来るまで停止する。
【００６４】
次にプロセッサ１からスキャナ処理をするように指示があった場合には、プリント処理を停止させる必要がある。サスペンド命令（Ｓ２４０７）で、プリントスレッドの動作を停止させる。０ｂ０００１はプリントスレッドの番号である。
ｓｕｓｐｅｎｄ  ０ｂ０００１  ；プリントスレッドを停止する。
このようにしてプリント処理を停止させて、スキャナ処理を実行していく。
【００６５】
その後、プリント処理時で使用したアドレレジスタａｒ７をスキャナ処理用のアドレスレジスタａｒ６に転送する（Ｓ２４０８）。
ｍｏｖｅ  ａｒ７  ａｒ６  ；プリント処理で使用したアドレスレジスタの値をスキャナ処理で用いる。
【００６６】
次の命令で、プリント処理時で使用したループレジスタｌｐ６をループ計算回路１６へ転送する（Ｓ２４０９、Ｓ２４１０）。
ｍｏｖｅ  ｌｐ６  ｇｐｒ０  ；ｇｐｒ０レジスタ＝ｌｐ６（プリント処理で使用しているループレジスタ。）。
ｍｏｖｅ  ｇｐｒ０  ｏｕｔ６  ；ループ計算回路１６へプリント処理で用いたループレジスタを転送する。
【００６７】
次に、ループ計算回路１６で得られた結果を、ＤＭＡプロセッサ２は次の命令で受け取る（Ｓ２４１１）。ループ計算回路１６から３つの値が得る。
ｍｏｖｅ  ｉｎ５  ｇｐｒ０  ；ループ計算回路１６で計算した値（ｌｉｎｅ）をｇｐｒ０レジスタに転送する。
ｍｏｖｅ  ｉｎ５  ｇｐｒ１  ；  ループ計算回路１６で計算した値（ｐｉｘｅｌ×２）をｇｐｒ１レジスタに転送する。
ｍｏｖｅ  ｉｎ５  ｇｐｒ２  ；  ループ計算回路１６で計算した値（ｐｉｘｅｌ）をｇｐｒ２レジスタに転送する。
得られた値を、それぞれループレジスタに設定していく（Ｓ２４１２）。ｌｐ１は矩形画像のライン数で、ｌｐ２は矩形画像の２ライン分の画素数で、ｌｐ３は矩形画像の１ラインの画素数である。
ｌｏａｄ  ｇｐｒ０  ｌｐ１  ；ループレジスタｌｐ１にループ数を設定する。
ｌｏａｄ  ｇｐｒ１  ｌｐ２  ；  ループレジスタｌｐ２にループ数を設定する。
ｌｏａｄ  ｇｐｒ２  ｌｐ３  ；  ループレジスタｌｐ３にループ数を設定する。
【００６８】
ａｒ２レジスタには、スキャナ処理用のマスキング処理用係数のアドレス値が格納されている。以下の命令で、係数を係数記憶部８へ転送する（Ｓ２４１３）。ここで、ｌｏｏｐはループ命令で、ｌｏｏｐ＿ｅｎｄというラベルまでの命令を３回行う。係数は１回で転送しきれないので、３回にわけて転送している。
ｌｏｏｐ  ０  ３  ｌｏｏｐ＿ｅｎｄ  ；係数記憶部８にマトリクス処理で用いる係数を設定する。
ｌｏａｄ  （ａｒ２，８）＋  ｇｐｒ０  ；ｇｐｒ０レジスタ＝  ａｒ２レジスタ値番地内容／ａｒ２レジスタに８加算する。
ｍｏｖｅ  ｇｐｒ０  ｏｕｔ３  ；ｏｕｔ３  レジスタ＝  ｇｐｒ０  レジスタ／係数記憶部８へデータ転送する。
ｌｏｏｐ＿ｅｎｄ：  ；ループのラベルである。
【００６９】
なおｌｏｏｐ命令の最初の引数は、ループカウンタを表している。たとえば１はループカウンタｌｐ１を表す。そして２番目の引数は、ループ回数またはループ終端アドレスである。これらはたとえば桁数により区別できる。２番目の引数がループ回数ならば、３番目の引数がループの終端アドレスを示す。ステップＳ２４１４の命令は、ｌｏｏｐ１＿ｅｎｄというラベルまでの命令を、ループカウンタ１すなわちループ計算回路１６で計算した矩形画像のライン数だけ繰り返し実行する。
ｌｏｏｐ  １  ｌｏｏｐ１＿ｅｎｄ  ；  矩形画像のライン数分処理を行う。
【００７０】
同じようにＳ２４１５では、２はｌｐ２を表していて、ｌｏｏｐ２＿ｅｎｄというラベルまでの命令を、ループ計算回路１６で計算した２ライン分の画素数だけ繰り返し実行する。
【００７１】
ａｒ０レジスタは、画像が格納されているメインメモリのアドレス値である。ステップＳ２４１６で、メインメモリ５から、シェーディング回路９へデータを転送する。
ｌｏａｄ  （ａｒ０，８）＋  ｇｐｒ０  ；ｇｐｒ０レジスタ＝  ａｒ０レジスタ値番地内容／ａｒ０レジスタに８加算する。
ｍｏｖｅ  ｇｐｒ０  ｏｕｔ２  ；ｏｕｔ２  レジスタ＝  ｇｐｒ０  レジスタ／シェーディング回路９へデータ転送する。
【００７２】
次にステップＳ２４１７で、マスキング処理回路７からデータを受け取る。
ｍｏｖｅ  ｉｎ２  ｇｐｒ０  ；  ｇｐｒ０  レジスタ＝  ｉｎ０  レジスタ／マスキング処理回路７からデータ受信する。
【００７３】
次にステップＳ２４１８で、γ補正回路１０へデータを転送する。
ｍｏｖｅ  ｇｐｒ０  ｏｕｔ０  ；ｏｕｔ１  レジスタ＝ｇｐｒ０レジスタ／γ補正回路１０へデータ転送する。
【００７４】
次にＳ２４１９で、γ補正回路１０からデータを受信してから、ＭＴＦ回路１１へデータを転送する。
ｍｏｖｅ  ｉｎ０  ｇｐｒ０  ；ｇｐｒ０  レジスタ＝  ｉｎ０  レジスタ／γ補正回路１０からデータ受信する。
【００７５】
ここで、次にデータ処理を行う拡大処理は２ｌｉｎｅ分のデータが必要なので、ステップＳ２４２０の命令でローカルメモリ３へとデータを転送する。
ｓｔｏｒｅ  ｇｐｒ０  （ａｒ６，８）＋  ；  ａｒ１レジスタ値番地内容＝  ｇｐｒ０レジスタ／  ａｒ１レジスタに８加算する。
【００７６】
ステップＳ２４２１の命令では、３はｌｐ３を表していて、ｌｏｏｐ３＿ｅｎｄというラベルまでの命令を、ループ計算回路１６で計算した矩形画像の１ライン分の画素数だけ繰り返し実行する。
ｌｏｏｐ  ３  ｌｏｏｐ３＿ｅｎｄ  ；  ２ｌｉｎｅ分のデータを転送する。
【００７７】
ステップＳ２４２２の命令で２ｌｉｎｅ分のデータを拡大縮小回路１１へ転送する。
ｌｏａｄ  （ａｒ６，８）＋  ｇｐｒ０  ；ｇｐｒ０レジスタ＝  ａｒ２レジスタ値番地内容／ａｒ２レジスタに８加算する。
ｌｏａｄ  （ａｒ６，１０１２）  ｇｐｒ１  ；ｇｐｒ１レジスタ＝  ａｒ２レジスタ値＋１０１２番地内容とする。
ｍｏｖｅ  ｇｐｒ０  ｏｕｔ１  ；ｏｕｔ１  レジスタ＝  ｇｐｒ０  レジスタ／拡大縮小回路１１へデータ転送（第１ライン）とする。
ｍｏｖｅ  ｇｐｒ１  ｏｕｔ１  ；ｏｕｔ１  レジスタ＝  ｇｐｒ１レジスタ／拡大縮小回路１１へデータ転送（第２ライン）とする。
【００７８】
ステップＳ２４２３の処理で、拡大縮小回路１１からデータを受信する。
ｍｏｖｅ  ｉｎ１  ｇｐｒ０  ；  ｇｐｒ０  レジスタ＝  ｉｎ１レジスタ／拡大縮小回路１１からデータ受信する。
【００７９】
最終的に、以下の命令でメインメモリ５へデータを転送する（Ｓ２４２４）。
ｓｔｏｒｅ  ｇｐｒ０  （ａｒ１，８）＋  ；  ａｒ１レジスタ値番地内容＝  ｇｐｒ０レジスタ／ａｒ１レジスタに８加算する。
【００８０】
次の命令で、アドレスを初期値に戻して、また最初のアドレスから始める（Ｓ２４２５）。
ｌｏａｄ  （ａｒ６，−１０１２）  ｇｐｒ０  ；ａｒ６の初期値に戻す。
【００８１】
このような処理を繰り返してスキャナ処理を実行していく。スキャナ処理が終わったら、今度はプリント処理を再開しなければならない。しかし、係数記憶部にはスキャナ処理用の係数が残っているので、次の命令でプリント処理用の係数に切り替える（Ｓ２４２６）。
ｌｏｏｐ  ４  ３  ｌｏｏｐ４＿ｅｎｄ  ；係数記憶部８にマスキング処理で用いる係数を設定する。
ｌｏａｄ  （ａｒ２，８）＋  ｇｐｒ０  ；ｇｐｒ０レジスタ＝  ａｒ２レジスタ値番地内容／ａｒ３レジスタに８加算する。
ｍｏｖｅ  ｇｐｒ０  ｏｕｔ３  ；ｏｕｔ３  レジスタ＝  ｇｐｒ０  レジスタ／係数記憶部８へデータ転送する。
ｌｏｏｐ４＿ｅｎｄ：  ；ループのラベル。
【００８２】
ここで、プリント処理を再開する為に、次の命令を実行する（Ｓ２４２７）。
ｒｅｓｕｍｅ  ０ｂ０００１  ；プリントスレッドを再開させる。
【００８３】
最後に、次の命令でスキャナ処理を終了する。０ｂ００１０はスキャナスレッドの番号である（Ｓ２４２８）。
ｄｉｓａｂｌｅ  ０ｂ００１０  ；スキャナスレッドを終了させる。
【００８４】
＜プリンタスレッド＞
次にプリントスレッドについて説明する。まず、以下の命令で、トリガ信号が検知されるまで待つ（Ｓ２６０１）。
ｗａｉｔ  Ｅ０ｂ０１  ；  ｔｒｉｇｇｅｒ  イベントが来るまで停止する。
【００８５】
ａｒ３レジスタはプリント処理用のマスキング処理を行う係数が格納されているアドレス値である。以下の命令で、係数を係数記憶部８へ転送する（Ｓ２６０２）。
ｌｏｏｐ  ５  ３  ｌｏｏｐ５＿ｅｎｄ  ；係数記憶部８にマスキング処理で用いる係数を設定する。
ｌｏａｄ  （ａｒ３，８）＋  ｇｐｒ３  ；ｇｐｒ３レジスタ＝  ａｒ３レジスタ値番地内容／ａｒ３レジスタに８加算する。
ｍｏｖｅ  ｇｐｒ３  ｏｕｔ３  ；ｏｕｔ３  レジスタ＝  ｇｐｒ０  レジスタ／係数記憶部８へデータ転送する。
ｌｏｏｐ５＿ｅｎｄ：  ；ループのラベル。
【００８６】
ここで、ａｒ３は初期値より２４進んでいるので、以下の命令で初期値に戻す（Ｓ２６０３）。
ｌｏａｄ  （ａｒ３，−２４）＋  ｇｐｒ３  ；  ａｒ３  レジスタ＝０ｘ３２００００００にする。
【００８７】
以下の命令（Ｓ２５０４〜Ｓ２５２０）を１ブロック内の画素数分繰り返して、メインメモリ５からデータを、マスキング処理回路７へ転送するとともに、プリンタ用の画像処理を実行する。本例ではプリンタ処理の１ブロックは２８８画素×４６ライン（あるいはその逆）である。この処理の繰返し回数がループカウンタｌｐ６によりカウントされる。このカウンタｌｐ６の値がスキャナスレッドによるローカルメモリの空き容量計算の基礎となる。
ｌｏａｄ  （ａｒ４，８）＋  ｇｐｒ３  ；ｇｐｒ３レジスタ＝  ａｒ４レジスタ値番地内容／ａｒ０レジスタに８加算する。
ｍｏｖｅ  ｇｐｒ３  ｏｕｔ４  ；ｏｕｔ４  レジスタ＝ｇｐｒ３レジスタ／マスキング処理回路７へデータ転送する。
次の命令で、γ補正回路１２からデータを受信する。
ｍｏｖｅ  ｉｎ３  ｇｐｒ３  ；ｇｐｒ３  レジスタ＝  ｉｎ３  レジスタ／γ補正回路１２からデータ受信する。
次の命令で、２値化処理回路１３へデータを転送する。
ｍｏｖｅ  ｇｐｒ３  ｏｕｔ５  ；ｏｕｔ５  レジスタ＝  ｇｐｒ３  レジスタ／２値化処理回路１３へデータ転送する。
次に、ローカルメモリ３にたまっている誤差拡散処理した値を読み出して、２値化処理回路１３へデータを転送する。
ｌｏａｄ  （ａｒ７，８）＋  ｇｐｒ４；ｇｐｒ４レジスタ＝  ａｒ７レジスタ値番地内容／ａｒ７レジスタに８加算する。
ｍｏｖｅ  ｇｐｒ４  ｏｕｔ５  ；ｏｕｔ５  レジスタ＝  ｇｐｒ４  レジスタ／２値化処理回路１３へデータ転送する。
次の命令で、２値化処理回路１３から２回データを受信する。
ｍｏｖｅ  ｉｎ４  ｇｐｒ３  ；ｇｐｒ３  レジスタ＝  ｉｎ４レジスタ／２値化処理回路１３からデータ受信する。
ｍｏｖｅ  ｉｎ４  ｇｐｒ４  ；ｇｐｒ４  レジスタ＝  ｉｎ４レジスタ／２値化処理回路１３からデータ受信する。
最初のデータはプリント処理した値なので、次の命令で２値化処理回路１３からのデータをメインメモリ５へ転送する。
ｓｔｏｒｅ  ｇｐｒ３  （ａｒ５，８）＋  ；ａｒ５レジスタ値番地内容＝  ｇｐｒ３レジスタ／  ａｒ５レジスタに８加算する。
次の命令で、誤差拡散処理した値を、ローカルメモリ３へ転送する。
ｓｔｏｒｅ  ｇｐｒ４  （ａｒ７，８）＋  ；ａｒ７レジスタ値番地内容＝  ｇｐｒ４レジスタ／  ａｒ７レジスタに８加算する。
【００８８】
以上の手順によりＤＭＡプロセッサ２を用いた構成によりローカルメモリを共有することができ、プリンタ処理中にプリンタ処理を中断してスキャナ処理に切り替えた場合に、ローカルメモリの空き容量によって画像の矩形分割の大きさを変えることができる。このため、高価なローカルメモリの利用効率を向上させ、しかも、画像処理速度の向上を図ることが出来る。
【００８９】
なお、本発明は、複数の機器（例えばホストコンピュータ、インタフェイス機器、リーダ、プリンタなど）から構成されるシステムに適用しても、一つの機器からなる装置（例えば、複写機、ファクシミリ装置など）に適用してもよい。また、本発明の目的は、前述した実施形態の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体（または記録媒体）を、システムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ（またはＣＰＵやＭＰＵ）が記憶媒体に格納されたプログラムコードを読み出し実行することによっても達成される。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコード自体およびプログラムコードを記憶した記憶媒体は本発明を構成することになる。
【００９０】
また、コンピュータが読み出したプログラムコードを実行することにより、前述した実施形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているオペレーティングシステム（ＯＳ）などが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれる。さらに、記憶媒体から読み出されたプログラムコードが、コンピュータに挿入された機能拡張カードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれた後、そのプログラムコードの指示に基づき、その機能拡張カードや機能拡張ユニットに備わるＣＰＵなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれる。
【図面の簡単な説明】
【００９１】
【図１】実施形態の画像処理装置の制御部の構成図である。
【図２】実施形態の画像処理装置の制御部の構成図である。
【図３】画像の矩形分割方法の一例を示す図である。
【図４】ＤＭＡプロセッサの出力ポート、入力ポートの一例を示す図である。
【図５】メモリマップの一例を示す図である。
【図６】ＤＭＡプロセッサインターフェースレジスタマップの一例を示す図である。
【図７】スキャナ処理用マスキング処理の一例を示す図である。
【図８】線形補間における変換前の点と変換後の点の一例を示す図である。
【図９】線形補間における縮小時の変換前の点と変換後の点の一例を示す図である。
【図１０】線形補間における拡大時の変換前の点と変換後の点の一例を示す図である。
【図１１Ａ】実施形態の画像入出力装置全体の構成図である。
【図１１Ｂ】実施形態の画像入出力装置による画像処理手順の一例を示す図である。
【図１２】スキャナ処理時のＤＭＡプロセッサの処理順序の一例を示す図である。
【図１３】プリント処理時のＤＭＡプロセッサの処理順序の一例を示す図である。
【図１４】ＤＭＡプロセッサの複数スレッドの一例を示す図である。
【図１５】スレッドの停止と再開の一例を示す図である。
【図１６】スレッドの停止、再開、待機の一例を示す図である。
【図１７】ローカルメモリにおけるプリント処理とスキャナ処理で使う容量の一例を示す図である。
【図１８】プリント処理で使用したローカルメモリの容量が少なかった場合の一例を示す図である。
【図１９】画像を大きく矩形分割するの一例を示す図である。
【図２０】プリント処理で使用したローカルメモリの容量が多い場合の一例を示す図である。
【図２１】画像を小さく矩形分割するの一例を示す図である。
【図２２】ループ計算回路の処理のフローチャートの一例を示す図である。
【図２３】プリント処理とスキャナ処理の流れの一例を示す図である。
【図２４】ＤＭＡプロセッサ２に与えるプログラムの一例を示す図である。
【図２５】ＤＭＡプロセッサ２に与えるプログラムの一例を示す図である。
【図２６】ＤＭＡプロセッサ２に与えるプログラムの一例を示す図である。
【図１】
2006252154.tif 000003
【図２】
2006252154.tif 000004
【図３】
2006252154.tif 000005
【図４】
2006252154.tif 000006
【図５】
2006252154.tif 000007
【図６】
2006252154.tif 000008
【図７】
2006252154.tif 000009
【図８】
2006252154.tif 000010
【図９】
2006252154.tif 000011
【図１０】
2006252154.tif 000012
【図１１Ａ】
2006252154.tif 000013
【図１１Ｂ】
2006252154.tif 000014
【図１２】
2006252154.tif 000015
【図１３】
2006252154.tif 000016
【図１４】
2006252154.tif 000017
【図１５】
2006252154.tif 000018
【図１６】
2006252154.tif 000019
【図１７】
2006252154.tif 000020
【図１８】
2006252154.tif 000021
【図１９】
2006252154.tif 000022
【図２０】
2006252154.tif 000023
【図２１】
2006252154.tif 000024
【図２２】
2006252154.tif 000025
【図２３】
2006252154.tif 000026
【図２４】
2006252154.tif 000027
【図２５】
2006252154.tif 000028
【図２６】
2006252154.tif 000029