以下、添付図面を参照して本発明の好適な実施の形態を詳しく説明する。尚、以下の実施の形態は特許請求の範囲に係る本発明を限定するものでなく、また本実施の形態で説明されている特徴の組み合わせの全てが本発明の解決手段に必須のものとは限らない。
[画像形成装置]
図1は、本発明の実施の形態に係るカラー画像形成装置(多機能装置)100の構成を説明するブロック図である。
この画像形成装置100は、例えば、複数種類の機能を実現する複合機である多機能処理装置(MFP:Multi Function Peripheral)で実現される。またこの画像形成装置100は、ネットワークI/F108を介してネットワークに接続され、このネットワークを利用して、ネットワークに接続された外部機器との間で画像データや各種情報をやりとりすることができる。
図1において、原稿台とオートドキュメントフィーダ(ADF)を含む画像読取部105は、原稿台上の束状或は1枚の原稿画像を光源で照射し、その原稿からの反射像をレンズで固体撮像素子(不図示)に結像する。これにより画像読取部105は、その固体撮像素子からラスタ状の画像信号を基に、所定密度(例えば、600dpi)のページ単位のラスタ画像を得ることができる。尚、本実施の形態では画像読取部105で読み取られる原稿として、紙文書を例に挙げて説明するが、紙以外の記録媒体(例えば、OHPシート、フィルム等の透過原稿、布等)等の印刷物を画像読取部105の読取対象としても良い。
また画像形成装置100は、画像読取部105で読み取った画像信号に対応する画像を印刷部107で記録媒体に印刷する複写機能を有する。特に、原稿を1部複写する場合には、この画像信号をデータ処理部101で画像処理して印刷データを生成し、これを印刷部107に出力して記録媒体に印刷させる。一方、原稿を複数部複写する場合には、HD等の記憶部106に一旦、印刷データを記憶させた後、これを指定された部数分繰り返し印刷部107に出力して記録媒体上に印刷させる。尚、印刷部107を用いる各種印刷制御は、プリンタコントローラ103(画像処理装置)によって実現される。印刷部107は、この実施の形態では、例えばタンデム方式のレーザプリンタのプリンタエンジンを含むものとする。
画像形成装置100への操作者の指示は、画像形成装置100に装備された操作部104から行われ、これら一連の動作はデータ処理部101内の制御部(図2のCPU308)で制御される。また、操作部104における入力状態の表示及び処理中の画像データの表示等は表示部102に表示される。尚、この画像形成装置100では、後述する各種処理を実行するための各種操作及び表示をユーザに提供するユーザインターフェースを、表示部102及び操作部104によって実現している。
次に、プリンタコントローラ103の詳細構成について図2を用いて説明する。
図2は、本発明の実施の形態に係るプリンタコントローラ103の詳細構成を示すブロック図である。
このプリンタコントローラ103はホストI/F部302を有する。このホストI/F部302には、データ処理部101から送出された印刷データや、この画像形成装置100の動作を指示する設定を入力する入力バッファ(不図示)が設けられている。またホストI/F部302には、データ処理部101へ送出する信号や機器情報データを含む出力データを一時的に保持する出力バッファ(不図示)が設けられている。またホストI/F部302は、データ処理部101との間で送受信される信号や通信パケットの入出力部を構成するとともに、データ処理部101との間の通信制御を行う。
ホストI/F部302を介して入力された印刷データは、画像データ発生部303に与えられる。ここで、入力される印刷データは、例えば、PDL(ページ記述言語)データで構成される。画像データ発生部303は、予め定められている解析部により、入力された印刷データの解析(例えば、PDL解析処理)を行う。そして、その解析結果から中間言語を生成し、更に印刷部(プリンタエンジン)107が処理可能なビットマップデータを生成する。
具体的には、印刷データの解析とその解析による中間言語情報の作成を行うとともに、その中間言語情報の作成と並行してラスタライズ処理を行う。このラスタライズ処理では、印刷データに含まれる表示色RGB(加法混色)から印刷部107が処理可能なYMCK(減法混色)への変換が含まれる。またこの処理には、印刷データに含まれる文字コードから予め格納されているビットパターン、アウトラインフォント等のフォントデータへの変換等の処理が含まれる。その後、ラスタライズ処理では、ページ単位或はバンド単位でビットマップデータを作成し、このビットマップデータに対してディザパターンを用いる疑似階調処理を施し、印刷部107において印刷処理が可能なビットマップデータを生成する。こうして作成されたビットマップデータは、少なくとも複数ライン分の画像データを記憶できる画像メモリ304に格納される。この画像メモリ304に格納されているビットマップデータの読み出しは、DMAコントローラ305で制御されている。このDMAコントローラ305による画像メモリ304からのビットマップデータの読み出しに対する制御は、CPU308からの指示に基づき行なわれる。
画像メモリ304から読み出されたビットマップデータは、後述するブレンド処理を行うブレンド処理部306で処理され、エンジンI/F部307を介してビデオ信号として印刷部107に転送される。エンジンI/F部307は、印刷部107へ転送する印刷データ(ビデオ信号)を一時的に保持する出力バッファ(不図示)と、印刷部107から送出された信号を一時的に保持する入力バッファ(不図示)とが設けられている。またエンジンI/F部307は、印刷部107との間で送受信される信号の入出力部を構成するとともに、印刷部107との間の通信制御をも司っている。
また操作部104におけるユーザの操作入力によって出力されるモード設定に関する指示等の各種指示は、操作部I/F部301を介して入力される。この操作部I/F部301は、操作部104とCPU308との間のインターフェースを構成する。CPU308は、操作部104もしくはデータ処理部101から指示されたモードに応じて、上述の各部に対する制御を行う。この制御はROM309に格納されている制御プログラムに基づいて実行される。このROM309に格納されている制御プログラムは、システムクロックによってタスクと称されるロードモジュール単位に時分割制御を行うためのOSを含んでいる。またこの制御プログラムには、このOSによって機能単位に実行制御される複数のロードモジュールが含まれる。CPU308による演算処理の作業領域としては、RAM310が使用される。CPU308を含む各部は、システムバス311に接続されている。このシステムバス311は、アドレスバスとデータバス及び制御信号バスとを有している。
次に、DMAコントローラ305の詳細構成について図3を用いて説明する。
図3は、本発明の実施の形態に係るプリンタコントローラ103のDMAコントローラ305の詳細構成を示すブロック図である。
レジスタ部501は、複数のレジスタ(不図示)で構成される。DMAコントローラ305に対するCPU308からの指示は、CPU308がレジスタ部501の各レジスタに適切な値を書き込むことで行なわれる。アドレス生成部502は、画像メモリ304に記憶されるビットマップデータを読み出すためのアドレスをレジスタ部501の各レジスタの内容を参照して生成する。このアドレス生成部502は、アドレス信号(addr)と、そのアドレスから読み出すデータ長(データ量)を示すレングス信号(length)をバスインターフェース503に出力する。これらアドレス信号とレングス(読出しデータ長)信号は、要求信号(req)と共にバスインターフェース503に出力される。さらに、走査ライン上のどの有効なデータを読み出したかを示すスコアボード信号(score_board)をバスインターフェース503に出力する。
バスインターフェース503は、アドレス生成部502からのアドレス信号とレングス信号を入力すると、システムバス311に対して画像メモリ304のリードトランザクションを発行する。例えば、システムバス311のデータバス幅が32ビットであれば、そのリード要求を32ビット単位を何回連続リードするかを示すバースト長(バースト転送長)を指定してリードトランザクションを発行する。一組のアドレス信号とレングス信号に対するリード処理が完了すると、バスインターフェース503は応答信号(ack)により読み出し完了をアドレス生成部502に伝える。この応答信号を受けたアドレス生成部502は、次のアドレス信号とレングス信号の組をバスインターフェース503に出力して、画像メモリ304に対する次のリード要求を発行できる。
画像メモリ304から読み出されたビットマップデータは、一時的にバスインターフェース503内のバッファ503aに格納され、即座に出力可能なデータはバッファ503aからFIFO(データ格納部)504に送られて記憶される。DMAコントローラ305は、ブレンド処理部306が一時的にデータを入力できない期間が発生しても、画像メモリ304からビットマップデータを読み出してFIFO504に記憶する。これにより、ブレンド処理部306がデータ入力可能となった時に、直ちに、FIFO504からブレンド処理部306にビットマップデータ(data)を供給することができる。
バスインターフェース503は、FIFO504から出力される、FIFO504にデータを書き込むべき空きがないことを示すFIFOフル信号(full)を監視している。こうしてフル信号が出力されてFIFO504がフル状態を示している場合には、リードトランザクションを発行せずに、フル状態が解除されるのを待つ。
ブレンド処理部インターフェース505は、このFIFO504に蓄えられたビットマップデータをブレンド処理部306に送る。ブレンド処理部インターフェース505はFIFO504から出力される、FIFO504に蓄えられたデータがないことを示すFIFOエンプティ信号(empty)を監視する。ブレンド処理部インターフェース505は、FIFO504がエンプティ状態でなく、かつブレンド処理部306がデータを入力できる状態であれば、FIFO504からビットマップデータをリードし、そのデータをブレンド処理部306へ送り出す。
[レジストレーションずれ補正の原理]
次に、レジストレーションずれ補正の原理について、図4と図5を用いて説明する。
図4(A)(B)及び図5(A)〜(D)は、本発明の実施の形態に係るレジストレーションずれ補正の原理を説明するための図である。
図4(A)は、レジストレーションずれの原因となる、画像形成時の走査ラインの曲がりを説明する図である。図において、横軸は走査ラインの主走査方向(ライン方向)を示し、縦軸は副走査方向を示している。図4(B)は、この走査ラインの曲がりに合わせて、各走査ラインに対応するラインデータに切り換えながら、ビットマップデータを印刷部107へ送り出す様子を示している。ここで、nラインが、本来印刷すべき印刷対象の走査ラインを示している。図4(B)において、黒い部分がnラインの印刷時に印刷部107へ送り出されるラインデータを示している。このように図4(A)に示す走査ラインの曲がりに合わせて、印刷部107に出力するデータのラインを切り換えることにより、露光走査に曲がりが生じても、感光ドラム等の像担持体上に生成された静電潜像は歪みのないものにできる。
図5(A)は、このようなレジストレーションずれの原因となる、曲がりが生じた走査ラインの一部を拡大して示す図である。図5(B)は、この走査ラインの曲がりに合わせてデータを切り換えながら、ビットマップデータを印刷部107へ送り出す様子を示す図である。但し、図5(A)のように、単に、ビットマップデータのラインデータを切り換えて印刷部107に送ると、その切り換え部分に不自然な段差を生じてしまう。従って図5(B)に示すように、その切り換え部分のドットサイズを変更し、かつ2つのラインが重複するようにドットを形成することにより、この不自然な段差を解消して画像の平滑化を図っている。こうしてラインの切り換え部分の前後で隣接する2ライン分のデータに階調を付けて(ブレンド処理)段差を目立たなくしている。尚、このようなブレンド処理は、ブレンド処理部306で実施される。
本実施の形態に係るDMAコントローラ305は、ラインバッファを削減するために走査ラインの曲がりに合わせて、ラインデータを切り換えるようにアドレスを生成する。即ち、ライン切り換え前の第1ラインと、ライン切り換え後の第2ラインからバースト転送にて画像データが読み出されるように、第2ラインから画像データを読み出すための第2の読み出し開始アドレスを、そのライン切り換えアドレスに基づいて生成する。このブレンド処理に必要となるビットマップデータは、1ライン前のデータのみを参照することに注目し、ブレンド処理部306では、最大1ライン分のバッファのみを有することにより、ブレンド処理が可能となる。
[実施の形態1]
次に本発明の実施の形態1に係るDMAコントローラ305の動作について図6と図7を参照して説明する。
図6は、本発明の実施の形態1に係るDMAコントローラ305に走査ラインの曲がりとバースト転送を説明するための図である。尚、ここではビットマップデータの一走査ラインを等分に分割して考える。以下、この分割された一つをセグメントと呼ぶことにする。尚以下の説明において、セグメント長、各セグメントが基準ラインに対して何ラインのずれ量かを示す乗り換え情報、各種アドレス、データ長等の英字で示す名称は、レジスタ部501に含まれるレジスタ名を示している。前述のようにCPU308は、これらレジスタ部501の各レジスタに値を書き込むことによりDMAコントローラ305に対して動作を指示する。
各セグメントの長さを設定するレジスタRegSegLenを、DMAコントローラ305のレジスタ部501に設ける。また走査ラインの曲がりに合わせて、各セグメントが基準ラインに対するずれ量を指示するレジスタ群RegSegPosi[i]を必要な数だけ設ける。尚、変数i(=0〜N)は、出現するセグメントの境界が何番目であるか、即ち,セグメントの番号を示す。尚、本実施の形態1では、1走査ラインにおいて、セグメント長RegSegLenの値は固定としている。
図において、600は、nラインを基準として副走査方向に走査ラインがずれた状態を示している。601はnラインのデータを最大バースト長(fuu_burst_length)で読み取った状態を示す。602は、(n+1)ラインのデータを最大バースト長で読み取った状態を示す。同様に603は、(n+1)ラインのデータを最大バースト長で読み取った状態、そして604は(n+2)ラインのデータを最大バースト長で読み取った状態をそれぞれ示している。
DMAコントローラ305のレジスタ部501には、更に、画像メモリ304に記憶されるビットマップデータの先頭アドレスを指定するレジスタRegStartAddr、ビットマップデータのライン長を示すレジスタRegLineLenを含む。更に、ビットマップデータの隣り合うラインのアドレスのオフセット値RegLineOffset、ブレンド処理部306へ送るべきライン数を指定するRegBeamsを含む。更にDMAコントローラ305のレジスタ部501には、上記各レジスタ加えて、CPU308が上記のレジスタの設定を完了した後に、DMA動作を開始させるための起動レジスタ(不図示)を含んでいる。
図7は、本発明の実施の形態1に係るDMAコントローラ305のアドレス生成部502(生成手段)の動作を示すフローチャートである。尚、以下の説明では、説明を簡単にするために各データなどの名称を各対応するレジスタ名で代用する。
まずステップS100で、CPU308の指示によりDMA動作が開始されると、各走査ラインの開始アドレスline_start_addrを、ビットマップデータの先頭アドレスRegStartAddrの値で初期化する。またブレンド処理部306へ送ったライン数をカウントするline_cntを「0」で初期化する。次にステップS101に進み、各走査ライン毎の初期化を行う。ここでは読み出しアドレスポインタaddr_pointを、走査ラインの開始アドレスline_start_addrの値で初期化する。また、この走査ライン上のどのセグメントを有効にしてブレンド処理部306へデータを転送したかを示すscore_board[0],score_board[1],...,score_board[N]の各々を「0」で初期化する。尚、score_board[i]が「0」となっている場合は、i番目のセグメントのデータが有効な画像データとして読み出されていないことを示している。またscore_board[i]が「1」となっている場合は、i番目のセグメントのデータが有効な画像データとして読み出されていることを示す。また、参照すべきレジスタ群RegSegPosi[i]の変数i(index)を「0」で初期化する。
次にステップS102で、読み出し要求毎の初期化を行う。ここではバスインターフェース503へ要求すべきアドレスとレングス信号(addrとlength)をそれぞれ、読み出しアドレスポインタaddr_pointと、最大バースト長full_burst_lengthで初期化する。この最大バースト長は、複数のセグメント長を含む長さである。これらの信号は以降のステップで変更されることがある。また開始アドレスに相当するセグメントのラインずれ量seg_posiにレジスタRegSegPosi[i]の値をセットする。
次にステップS103に進み、バースト転送が有効に行えないようなライン切り替えが発生する場合においても、読み出したデータをバースト転送可能なように、addrの下位ビットをマスクする。これにより、full_burst_lengthでのバースト転送が可能なアドレスとなるようにaddrを変換する。これは例えば図6の602で、データの読出し開始アドレスが「0x4048」の場合、このアドレスの下位ビットをマスクして、例えばアドレス「0x4040」に変換する。これにより、最大バースト長でのデータ転送が可能なアドレスに変換する。本実施の形態では、セグメントの切り替わるアドレスが、バースト転送で、きりの良いアドレスになるとは限らないので、最大バースト長full_burst_lengthで効率良くバースト転送するために、このようなアドレス変換を行っている。尚、1回のバースト転送で複数のセグメントのデータが読み出される場合、各セグメントごとに、そのデータが有効であるかどうかを判断して、有効なセグメントのscore_board[i]に「1」を設定する。
例えば図6の(n+1)ラインのデータに着目すると、最大バースト長で読み出すと、2番目のセグメント(ReggSegPosi[1])と4番目のセグメントに対応するscore_board[3]がともに「1」となる。尚、この(n+1)ラインのデータを読み出す際、3番目のセグメントには有効データがないため、score_board[2]は「0」のままとなる。
次にステップS104に進み、アドレスaddrと読出しデータ長length(ここでは最大バースト長)をバスインターフェース503へ出力して画像メモリ304からのビットマップデータの読み出し要求を行う。次にステップS105で、読み出されたビットマップデータから、score_borad[i]の値が「1」を示すセグメントのデータを、セグメントの順にバスインターフェース503のバッファ503aに一時的に格納する。ここで、このバッファ503aの容量は、最大バースト長で読み出されるデータを記憶できる容量である。こうしてバッファ503aに格納されたデータは、セグメント順(走査ラインの左側から順)にFIFO504へ出力される。但し、ステップS105では、例えば図6の602で読み出したデータは、2番目と4番目のセグメントのデータを含んでいる。しかし、その間の3番目のセグメントのデータの読出しが完了していないので、4番目のセグメントのデータは、603で(n+2)ラインのデータを読み出した後にバッファ503aに格納する。従って図6に示すように、FIFO504には、この走査ラインで記録される画像データがセグメント順に格納される。
次にステップS106に進み、バスインターフェース503からackを受信すると、読み出しアドレスポインタaddr_pointと変数iとを更新するために、走査ラインの読み出されていないデータの位置をscore_boardの値に基づいて判定する。そして、次の読み出しアドレスがいくつ先のセグメントであるかを算出し、その算出分(M)、変数iを+Mしてアドレスaddr_pointを(+RegSegLen×M)に設定する
ここでaddr_pointは、最初は走査ラインの開始アドレスline_start_addrで初期化されているので、図6の601でnラインのデータを読み出す際は0x3000となっている。nラインのデータを読み出した時点でのscore_board[0]は「1」であるが、score_board[1],score_board[2]はともに「0」のままである。そこで、score_boardの値から読み出されていないデータの位置として、次に2番目のセグメント(RegSegPosi[1])を特定する。そして、addr_pointを1つ先のセグメントに進めるために、RegSegLen×1をaddr_pointに加算する。
次にステップS107で、次のRegSegPosi[i]と、前のRegSegPosi[i-M]とを比較し、切り替え情報の差分を算出する。この切り替え情報の差分とは、何ライン分の切り替えを行うかを示すものである。例えば、601で示すデータから、602で示すデータに切り替える場合は、nラインから(n+1)ラインへの切替なので、そのライン数L=1となる。ここで切り替え情報の差分が負の場合はステップS108へ進む。一方、切り替え情報の差分Lが正の場合はステップS109へ進む。また切り替え情報の差分が「0」のときステップS110へ進む。ステップS108では、図6の600で上側のラインへの切り替えを意味するためアドレスポインタaddr_pointから、上述したラインオフセットRegLineOffset×L分を減じる。一方、ステップS109では、図6の600の下側のラインへの切り替えを意味するためアドレスポインタaddr_pointに、RegLineOffset×Lを加算する。こうしてステップS108或はステップS109を実行するとステップS110に進む。
ステップS110では、走査ライン上のどの有効なデータを読み出したかを示すscore_boardを参照し、その走査ラインで記録するデータを全て読み出したかどうかを判断する。ここでは、score_board[0],score_board[1],...,score_board[N]は、各セグメントから有効データが読み出されると「1」が設定される。図6の例では、601と602でデータを読み出した時点では、score_board[0],score_board[1],score_board[3]が「1」となる。そしてscore_board[2]を含む他のscore_boardの値は「0」のままである。そして603で示すデータを読み出した時点で、score_board[2]が「1」となる。同様に604で示すデータを読み出すと、core_board[4]が「1」となる。こうして、この1走査ライン分のscore_board[0],score_board[1]〜score_board[N]が全て「1」になるとステップS110からステップS111に進むことになる。ここで、走査ライン上で読み出し完了していない場合はステップS102に戻り、前述の読み出し処理を繰り返す。
そしてステップS111、次のラインデータを処理するために各データを更新する。ここでは各ラインの開始アドレスline_start_addrに、ビットマップデータの隣り合うラインのアドレスのオフセット値RegLineOffsetを加えて、次のラインの先頭アドレスを設定する。また、ブレンド処理部306へ出力したライン数line_cntを+1する。次にステップS112で、出力したライン数line_cntと、ブレンド処理部306へ送るべきライン数RegBeamsとを比較する。ここで出力済みのライン数line_cntが、送るべき全ライン数RegBeams未満であれば、まだ処理すべきラインデータが残っているのでステップS101に戻り、前述のラインの処理を繰り返す。そうでないときは、1ページのデータの処理が終了したのでDMA動作を終了する。尚、DMAコントローラ305はDMA動作を終了した時に割り込み信号(不図示)によりCPU308に伝える。CPU308はこの割り込みを検出することで、DMA転送を終了したことを検知する。
以上のように、DMAコントローラ305は、複数のデータセグメントで構成される1走査ラインの画像データを読み出して画像メモリ304から印刷部107へ転送する。そして、印刷部107は、感光体ドラム(像担持体)を1走査ラインの画像データに基づいてレーザ光にて走査して、感光ドラム上に1走査ラインの静電潜像を形成する。ここで、静電潜像とは、所定の電位に帯電された感光体ドラムをレーザ光を照射(走査)することで、感光ドラム上に生成される画像データに応じた電位差のある像をいう。そして、印刷部107は、静電潜像に対してトナーを付着させることで、電位差に応じたトナー像が感光体ドラム上に形成し、更にトナー像を用紙上に転写することでシート上に画像を形成する。
尚、上記説明では、本実施の形態に係るデータ転送の制御をDMAコントローラ305で実現した例で説明したが、CPU308の処理時間に余裕があればCPU308により制御しても良い。また或は、CPU308以外の別のCPUや、DSP(デジタルシグナルプロセッサ)等の制御の下に実現されても良い。更に、カラー画像形成装置において、複数色(CYMK)の各色に対応する像形成ユニットを有する場合には、各色の像形成ユニット毎に本実施の形態に係るデータ転送方式を実施することで、各色毎のレジストレーションずれによる色ずれを防ぐことができる。これは以下に説明する各実施の形態においても同様である。
以上説明したように本実施の形態1によれば、各色毎に走査ラインの曲がりが発生している場合でも、各色毎のレジストレーションずれ量に応じた数のラインバッファを設けなくても、それらレジストレーションずれによる色ずれを防ぐことができる。また各ラインの切り換え時に、そのライン切り換えによる段差を目立たなくするためのブレンド処理を、1ライン分のラインバッファを設けることで実現することができる。
[実施の形態2]
次に本発明の実施の形態2に係るDMAコントローラ305の動作について図8と図9を用いて説明する。尚、この実施の形態2に係る画像形成装置のハードウェア構成は、前述の実施の形態1と同様であるため、その説明を省略する。この実施の形態2では、1走査ラインにおいて、セグメント長RegSegLenの値は可変としている。
図8は、本発明の実施の形態2に係るDMAコントローラ305に走査ラインの曲がりを指定する方法を説明するための図である。
ここでは走査ラインの曲がりに合わせて、ラインの切り換え位置までの長さ(セグメント長)を指定するレジスタ郡RegSegLen[i]を設ける。従って、各セグメントの長さは一定ではなく、各セグメントの境界がライン切替えが発生する位置となる。更に、各セグメントが基準ラインに対するずれ量を指示するレジスタ群RegSegPosi[i]を必要な数だけDMAコントローラ305のレジスタ部501に設ける。このDMAコントローラ305のレジスタ部501は更に、画像メモリ304に記憶されるビットマップデータの先頭アドレスRegStartAddr、ビットマップデータの各走査ラインの長さRegLineLenがセットされる。またレジスタ部501には、ビットマップデータの隣り合うラインデータ同士のアドレスのオフセット値RegLineOffset、ブレンド処理部306へ送るべきライン数RegBeamsがセットされる。更に、DMAコントローラ305のレジスタ部501は、CPU308が上記レジスタの値の設定を完了した後に、DMA動作を開始させるための起動レジスタ(不図示)も含んでいる。
図9は、本発明の実施の形態2に係るDMAコントローラ305のアドレス生成部502の動作を示すフローチャートである。
まずステップS200で、CPU308の指示によりDMA動作が開始されると、走査ラインの開始アドレスline_start_addrを、画像メモリ304のビットマップデータの先頭アドレスRegStartAddrの値で初期化する。また、ブレンド処理部306へ送ったライン数line_cntを「0」で初期化する。次にステップS201で、ライン毎の初期化を行う。読み出し開始アドレスaddr_pointを、走査ラインの開始アドレスline_start_addrの値で初期化する。この走査ライン上のどの有効なデータをブレンド処理部306へ転送したかを示すscore_boardを初期化する。また、参照すべきレジスタ郡RegSegLen[i]とRegSegPosi[i]のインデックスを示す変数iを「0」で初期化する。
次にステップS202に進み、読み出し要求毎の初期化を行う。バスインターフェース503へ要求すべきアドレスaddrとデータ長lengthをそれぞれ、読み出しアドレスポインタaddr_pointと、最大バースト長full_burst_lengthで初期化する。これらの信号は以降のステップで変更される。読み出し開始アドレスに相当するセグメントのラインずれ量seg_posiにレジスタRegSegPosi[i]の値を設定する。
次にステップS203に進み、ステップS103と同様に、addrの下位ビットをマスクすることによりバースト転送が可能なアドレス境界に設定する。ここでRegSegLen[i]に対応するscore_board[i]を「1」に設定する。
次にステップS204に進み、アドレスaddrとデータ長length(バースト長)をバスインターフェース503へ出力して画像メモリ304からのビットマップデータの読み出し要求を行う。次にステップS205で、前述の図7のS105と同様に、読み出されたビットマップデータから、score_boradの「1」に対応するデータを順に抽出してバスインターフェースが持つデータバッファ503aに一時的に格納する。こうしてデータバッファ503aに格納されたデータは走査ライン順にFIFO504に出力される。ここで、上述するデータバッファ503aの容量は最大バースト長で読み出されるデータを格納できる容量である。
ここで、この実施の形態2では、各セグメントの長さは可変長であるため、最大バースト長full_burst_lengthがセグメント長RegSegLen[i]に対して短い場合がある。このとき、一つのセグメント長に対して、複数回のトランザクション要求を行う必要がある。ステップS206では、addr、lengthを参照し、前記読み出し要求が1セグメント分RegSegLen[i]処理したかを判断する。そのセグメントで読み出しが完了していない場合、ステップS207において、バスインターフェース503からackを受信すると、アドレスaddrをデータ長length分足した値に更新する。こうして読み出しが完了していないビットマップデータを読み出せるようにする。各セグメントの読出しが完了した場合、ステップS208に進む。
ステップS208では、バスインターフェース503からackを受信すると、読み出しアドレスポインタaddr_pointと変数iを更新するために、score_boardの値から読み出されていないセグメントの位置を判定する。そして、そのセグメントの先頭を次の読み出しアドレスaddr_pointに設定する。
次にステップS209に進み、現セグメント(RegSegPosi[i])と、次のセグメントRegSegPosi[i+1]との差分)×RegLineOffsetをaddr_pointに加える。そして変数iに1を加えて、次の読み出しラインの切り替えを行う。
図8の例で説明すると、nラインのデータを読み出す場合、最大バースト長の2倍がRegSegLen[0]に等しいとする。これによりscore_board[0]は「1」となるが、1度の読み出し要求ではセグメント0の半分のデータがバッファ503aに格納される。次にセグメント0のデータを全て読み出すために、アドレスをバースト長分足した値に更新する(S207)。次にセグメント1のデータを読み出すために、(RegSegPosi[0]と次のセグメントRegSegPosi[1]との差分)×RegLineOffsetによりセグメント1の先頭アドレスを求める。
次にステップS210に進み、図7のステップS110と同様に、走査ライン上のどの有効なデータを読み出したかを示すscore_boardを参照し、そのラインのデータを全て読み出し済みかどうかを判断する。その走査ラインで読み出し完了していない場合、ステップS202に戻り、前述の読み出し処理を繰り返す。一方、その走査ラインの読出しを完了したときはステップS211に進み、次のラインデータを処理するために各データを更新する。ここでは各ラインの開始アドレスline_start_addrに、ビットマップデータの隣り合うラインのアドレスのオフセット値RegLineOffsetを加えて、次のラインの先頭アドレスを設定する。また、ブレンド処理部306へ出力したライン数line_cntを+1する。次にステップS212で、出力したライン数line_cntと、ブレンド処理部306へ送るべきライン数RegBeamsとを比較する。ここで出力済みのライン数line_cntが、送るべき全ライン数RegBeams未満であれば、まだ処理すべきラインデータが残っているのでステップS201に戻り、前述のラインの処理を繰り返す。そうでないときは、1ページのデータの処理が終了したのでDMA動作を終了する。尚、DMAコントローラ305はDMA動作を終了した時に割り込み信号(不図示)によりCPU308に伝える。CPU308はこの割り込みを検出することで、DMA転送を終了したことを検知する。
以上説明したように本実施の形態2によれば、前述の実施の形態1の効果に加えて、走査線の曲がりに応じて各セグメントの長さを可変にして、各色毎のレジストレーションずれによる色ずれを防ぐことができる。
[実施の形態3]
本発明の実施の形態3に係るDMAコントローラ305の動作について、図10(A)(B)、図11及び図12を用いて説明する。尚、この実施の形態3に係る画像形成装置のハードウェア構成は、DMAコントローラ305以外は前述の実施の形態1と同様であるため、その説明を省略する。
図10(A)は、本発明の実施の形態3に係るDMAコントローラ305に対して走査ラインの曲がりを指定する方法を説明するための図である。ここでは前述の実施の形態1と同様に、ビットマップデータの1ラインを等分に分割する場合を考える。各セグメントの長さRegSegLenを、DMAコントローラ305のレジスタ部501に設定する。ここでは実施の形態1と異なり、走査ラインの曲がりに合わせて、各セグメントが基準ラインに対して何ラインのずれ量かを示す乗り換え情報SegPosi[i]を用いる。ここで変数iは、セグメントの境界の順番を示す。
図10(B)は、この情報SegPosi[i]を、画像メモリ304或はRAM310にテーブルとして格納した状態を示している。
このテーブルの先頭アドレスRegTableStartAddrを、DMAコントローラ305のレジスタ部501にセットする。このDMAコントローラ305のレジスタ部501には、更に、画像メモリ304に記憶されるビットマップデータの先頭アドレスRegStartAddr、ビットマップデータのライン長RegLineLenがセットされる。更に、ビットマップデータの隣り合うラインのアドレスのオフセット値RegLineOffset、ブレンド処理部306へ送るべきライン数RegBeamsを含んでいる。更にDMAコントローラ305のレジスタ部501には、CPU308が上記のレジスタ値の設定を完了した後に、DMA動作を開始させるための起動レジスタ(不図示)を含んでいる。
図11は、本発明の実施の形態3に係るDMAコントローラ305の構成を示すブロック図で、前述の図3と共通する部分は同じ記号で示している。
レジスタ部501は、複数のレジスタ(不図示)で構成される。DMAコントローラ305に対するCPU308からの指示はレジスタ部501の各レジスタに適切な値を書き込むことで行なわれる。アドレス生成部502'は、画像メモリ304に記憶されるビットマップデータを読み出すためのアドレスを、レジスタ部501の各レジスタの内容を参照して生成する。また画像メモリ304のライン切り替え情報のテーブルをリードするためのアドレスも生成する。
アドレス生成部502'は、アドレスaddrと、そのアドレスから読み出すデータ量を示す読み出しデータ長lengthにより、バスインターフェース503へ画像メモリ304からのデータ読み出しを要求する。画像メモリ304からビットマップデータを読み出す場合は、要求信号reqを用いて要求し、テーブルのデータを読み出す場合には要求信号req_tableを用いて要求する。
バスインターフェース503'は、アドレス生成部502'からのアドレスとデータ長を受け、バス311に対して画像メモリ304のリードトランザクションを発行する。例えば、バス311のデータバス幅が32ビットであれば、アドレスとデータ長から複数の32ビット単位を何回連続リードするかを示すバースト長を指定し、リードトランザクションを発行する。バスインターフェース503'は、1組のアドレスとデータ長に対する処理が完了すれば、応答信号ackを用いて、処理完了をアドレス生成部502'に伝える。この応答信号ackを受けた生成部502'は、次のアドレスとデータ長をバスインターフェース503'に要求できる。バスインターフェース503'は、画像メモリ304から読み出したデータを受け取り、それがビットマップデータであればFIFO504に書き込む。一方、テーブルのデータであれば、その読み出したテーブルデータをアドレス生成部502'へ送る。
こうして読み出されたビットマップデータから、score_boradの「1」に対応するデータを、一時的にバスインターフェース503'内のデータバッファ503aに格納する。そしてデータはデータバッファ503aからFIFO504に記憶される。DMAコントローラ305は、ブレンド処理部306が一時的にデータを入力できない期間が発生しても、ビットマップデータをFIFO504に記憶できる。これにより、ブレンド処理部306がデータ入力可能となった時に、即座にFIFO504からブレンド処理部306にビットマップデータを供給することができる。
バスインターフェース503'は、FIFO504から出力される、FIFO504にデータを書き込むべき空きがないことを示すFIFOフル信号fullを監視している。そして、FIFO504がフル状態を示している場合は、リードトランザクションを発行せずに、フル状態が解除されるのを待つ。またブレンド処理部インターフェース505は、FIFO504に蓄えられたビットマップデータをブレンド処理部306に送る。ブレンド処理部インターフェース505は、FIFO504から出力される、FIFO504にデータが無いないことを示すFIFOエンプティ信号emptyを監視する。そしてブレンド処理部インターフェース505は、FIFO504がエンプティ状態でなく、かつブレンド処理部306がデータを入力できる状態であれば、FIFO504からビットマップデータを読み出してブレンド処理部306へ送り出す。
図12は、本発明の実施の形態3に係るDMAコントローラ305のアドレス生成部502'の動作を示すフローチャートである。尚、この図12のフローチャートは、ずれ量をテーブルに記憶しているための処理が異なる以外は、前述の図7のフローチャートと同様である。
まずステップS300で、CPU308の指示により、DMA動作が開始されると、各ラインの開始アドレスline_start_addrを、ビットマップデータの先頭アドレスRegStartAddrの値で初期化する。また、ブレンド処理部306へ送ったライン数を記憶するline_cntを「0」で初期化する。次にステップS301で、ライン毎の初期化を行う。読出しアドレスポインタaddr_pointを、ライン開始アドレスline_start_addrで初期化する。この走査ライン上のどの有効なデータをブレンド処理部306へ転送したかを示すscore_boardを初期化する。また参照すべきライン切り替え情報SegPosi[i]のテーブルのアドレスtable_addrを、テーブルの先頭アドレスRegTableStartAddの値で初期化する。
次にステップS302で、読出し要求毎の初期化を行う。バスインターフェース503'へ要求すべきアドレスaddrと、読み出しデータ長lengthをそれぞれ、読出しアドレスポインタaddr_pointと、最大バースト長の値で初期化する。ここで、望ましくは最大バースト長は複数のセグメント長を含む長さである。これらの信号は以降のステップで変更されることがある。
ステップS303で、図7のステップS103と同様に、addrの下位ビットをマスクすることによりバースト転送可能なアドレス境界に設定する。次にステップS304に進み、テーブルアドレスtable_addrで、図10(B)に示すテーブルデータを読み出すためにバスインターフェース503'へ要求する。このとき、上述したaddrに設定したアドレス境界から最大バースト長の範囲に含まれるセグメントの分のテーブルデータを要求する。そして、その読み出したテーブルデータからSegPosi[i]の値を、読出し開始アドレスに相当するセグメントのラインずれ量seg_posiに設定する。更に、addrに設定したアドレス境界から最大バースト長の範囲において、seg_posiと同じラインずれ量(SegPosi[i])をもつセグメントに対応するデータがあるかを判断する。その判断に該当するデータに対応するscore_boardを「1」に設定する。ここで、該当するデータが含まれる長さのバースト長にlengthを更新する。
ステップS305で、アドレスaddrとデータ長lengthとで、バスインターフェース503'を介して画像メモリ304よりビットマップデータを読み出す。次にステップS306で、読み出されたビットマップデータから、score_boradの値が「1」の対応するデータを、バスインターフェースが持つデータバッファ503aに一時的に格納する。こうしてデータバッファ503aに格納されたデータは、走査ライン順にFIFO504へ出力される。ここで、上述するデータバッファ503aの容量は、最大バースト長で読み出されるデータの容量を有する。
次にステップS307に進み、バスインターフェース503'からackを受信すると、読み出しアドレスポインタaddr_pointと変数iを更新するために、score_boardの値から読み出されていないデータの位置を判定する。そして次の読み出しアドレスがいくつ先のセグメントかを算出する。その算出分(M)、変数iに+Mし、アドレスaddr_pointを(RegSegLen×M)に設定する。次にステップS308で、次のSegPosi[i]と前のSegPosi[i-M]とを比較し、切り替え情報の差分Lを算出する。ここで切り替え情報の差分Lが負の場合はステップS309へ進む。一方、切り替え情報の差分Lが正の場合はステップS310へ進む。また切り替え情報の差分Lが「0」のときステップS311へ分岐する。
ステップS309では、下のラインへの切り替えるため、アドレスポインタaddr_pointから、上述したラインオフセット(RegLineOffset×L)を減じる。またステップS310では、上のラインへの切り替えるため、アドレスポインタaddr_pointに(RegLineOffset×L)を加える。そしてステップS311に進み、走査ライン上のどの有効なデータを読み出したかを示すscore_boardを参照して、その走査ラインのデータを全て読み出したかを判断する。ここで、走査ライン上で読出し完了していないデータがある場合、ステップS302に戻り、前述の読出し処理を繰り返す。
次にステップS312に進み、次のラインの処理のために各データを更新する。ここでは各ラインの開始アドレスline_start_addrに、上記オフセット値RegLineOffsetを加えて、次のラインの先頭アドレスにする。またブレンド処理部306へ送ったライン数line_cntを+1する。そしてステップS313で、ブレンド処理部306へ送ったライン数line_cntと、ブレンド処理部306へ送るべきライン数RegBeamsの値を比較して、1ページ分のデータ処理が終了したかを判断する。ここでライン数line_cntの値が、RegBeamsの値未満であれば、まだ処理すべきラインが残っているのでステップS301に戻り、次のラインの処理を繰り返す。そうでないときはDMA動作を終了する。DMAコントローラ305は、DMA動作を終了した時に割り込み信号をCPU308に送る。CPU308はこの割り込み信号を検出して、DMAが終了したことを検知する。これらステップS307〜S313の処理は、前述の図7のステップS106〜S112の処理と同じである。
以上説明したように本実施の形態3によれば、前述の実施の形態1の効果に加えて、各セグメントの長さを一定にしながら、走査線の曲がりに応じて各セグメントごとにラインを上或は下にずらすか、ずらさないかを指定することができる。これによりセグメント長を一定にしながらも、走査線の曲がりに応じたレジストレーションずれによる色ずれを防ぐことができる。
[実施の形態4]
本発明の実施形態4に係るDMAコントローラ305の動作について、図13と図14を用いて説明する。尚、この実施の形態4に係る画像形成装置のハードウェア構成は、前述の実施の形態3と同様であるため、その説明を省略する。
図13(A)(B)は、本発明の実施の形態4に係るDMAコントローラ305に走査ラインの曲がりを指定する方法を説明するための図である。ここで1ラインにおけるセグメント長を可変とし、各セグメントごとに、基準ラインに対するずれ量を設定できるものとする。
ここでは前述の実施の形態2,3と異なり、走査ラインの曲がりに合わせて、ライン切り換え位置までの長さ(セグメント長)SegLen[i]と、基準ラインに対するずれ量SegPosi[i]を変更している。図13(B)は、セグメント長SegLen[i]と、各セグメントにおいて、基準ラインに対して何ラインずれているかを示すSegPosi[i]を格納しているテーブルデータの構成を示している。このテーブルは、画像メモリ304或はRAM310に格納されている。このテーブル読み出し時には、この読み出し開始アドレスRegTableStartAddrを、DMAコントローラ305のレジスタ部501にセットする。この実施の形態4においても、ビットマップデータの先頭アドレスRegStartAddr、ビットマップデータのライン長RegLineLenがセットされる。またビットマップデータの隣り合うラインのアドレスのオフセット値RegLineOffset、ブレンド処理部306へ送るべきライン数RegBeamsもレジスタ部501にセットされる。更に、DMAコントローラ305のレジスタ部501には、CPU308が上記の各レジスタ値の設定を完了した後に、DMA動作を開始させるための起動レジスタ(不図示)を含んでいる。
図14は、本発明の実施の形態4に係るDMAコントローラ305のアドレス生成部502'の動作を示すフローチャートである。尚、この図14のフローチャートは、ずれ量をテーブルに記憶しているための処理が異なる以外は、前述の図9フローチャートと同様である。
まずステップS400で、CPU308の指示によりDMA動作が開始されると、各ラインの開始アドレスline_start_addrを、ビットマップデータの先頭アドレスRegStartAddrで初期化する。またブレンド処理部306へ送ったライン数line_cntを「0」で初期化する。次にステップS401で、ライン毎の初期化を行う。ここでは読出しアドレスポインタaddr_pointを、ラインの開始アドレスline_start_addrで初期化する。この走査ライン上のどの有効なデータをブレンド処理部306へ転送したかを示すscore_boardを初期化する。また参照すべきセグメントの長さSegLen[i]と、ライン切り替え情報SegPosi[i]のテーブルのアドレスtable_addrを、テーブルの先頭アドレスRegTableStartAddrの値で初期化する。また変数iを「0」にする。
次にステップS402で、読出し要求毎の初期化を行う。ここではバスインターフェース503'へ要求すべきアドレスaddrを、読出しアドレスポインタaddr_pointで初期化する。また読み出しデータ長lengthを、最大バースト長で初期化する。これらの信号は以降のステップで変更される。
次にステップS403に進み、ステップS203と同様に、addrの下位ビットをマスクすることによりバースト転送が可能なアドレス境界に設定する。次にステップS404で、アドレスtable_addrからテーブルデータを読み出すために、バスインターフェース503'へデータの読み出し要求を発行する。そして、そのテーブルから読み出したデータに基づき、addr_pointに相当するセグメントのSegPosi[i]をseg_posiに設定する。更に、seg_posiに対応するscore_boardを「1」に設定する。
次にステップS405で、アドレスaddrと読み出しデータ長(バースト長)lengthとを基に、バスインターフェース503'へリード要求を行う。これにより画像メモリ304のアドレスaddrから、指定されたデータ長length分のビットマップデータが読み出される。次にステップS406で、読み出されたビットマップデータから、score_boardが「1」の対応するデータを、バスインターフェース503'が持つデータバッファ503aに一時格納する。データバッファ503aに格納されたデータは走査ライン順にFIFO504へ出力される。ここで上述したデータバッファ503aの容量は、最大バースト長で読み出されるデータを収容できる容量である。
次にステップS409に進み、バスインターフェース503'からackを受信すると、読み出しアドレスポインタaddr_pointと変数iを更新するために、score_boardの値を基に読み出されていないデータの位置を判定する。そして、その位置までの値を次の読出しアドレスポインタaddr_pointに設定する。次にステップS410に進み、(SegPosi[i]とSegPosi[i+1]との差分)×RegLineOffsetを、addr_pointに加える。また変数iに+1することにより、次の読み出しラインの切り替えを行う。
次にステップS411に進み、走査ライン上のどの有効なデータを読み出したかを示すscore_boardを参照し、その走査ラインのデータをすべて読み出し済みかどうかを判断する。ここで、走査ライン上で読み出し完了していない場合、ステップS402に戻り、前述の読み出し処理を繰り返す。そしてステップS411で、次のラインデータを処理するために各データを更新する。ここでは各ラインの開始アドレスline_start_addrに、ビットマップデータの隣り合うラインのアドレスのオフセット値RegLineOffsetを加えて、次のラインの先頭アドレスを設定する。また、ブレンド処理部306へ出力したライン数line_cntを+1する。次にステップS412で、出力したライン数line_cntと、ブレンド処理部306へ送るべきライン数RegBeamsとを比較する。ここで出力済みのライン数line_cntが、送るべき全ライン数RegBeams未満であれば、まだ処理すべきラインデータが残っているのでステップS401に戻り、前述のラインの処理を繰り返す。そうでないときは、1ページのデータの処理が終了したのでDMA動作を終了する。尚、DMAコントローラ305はDMA動作を終了した時に割り込み信号(不図示)によりCPU308に伝える。CPU308はこの割り込みを検出することで、DMA転送を終了したことを検知する。
以上説明したように本実施の形態4によれば、前述の実施の形態1の効果に加えて、各セグメントの長さを可変にしながら、走査線の曲がりに応じて各セグメントごとにラインを上或は下にずらすか、ずらさないかを指定することができる。これにより走査線の曲がりに応じたレジストレーションずれによる色ずれを防ぐことができる。
[実施の形態5]
本発明のDMAコントローラ305の動作について、図15、図16及び図17を用いて説明する。尚、この実施の形態5に係る画像形成装置のハードウェア構成は、前述の実施の形態3と同様であるため、その説明を省略する。
図15は、本発明の実施の形態5に係るDMAコントローラ305に有効画像領域を、メモリアドレスで指定する方法を説明するための図である。
このDMAコントローラ305のレジスタ部501には、ある走査ラインに相当するデータの読み出し開始位置RegBeamStartAddr、有効画像領域の先頭アドレスRegLowerAddrがセットされる。更に、有効画像領域の後端後のアドレスRegUpperAddr、1ページ内における全読み出し走査ライン数RegBeamLinesがセットされる。更に、ライン間のアドレスのオフセット値RegLineOffset、印刷有効領域外のデータRegFillDataが設定できる。
図16は、本発明の実施の形態5に係るDMAコントローラ305のアドレス生成部502'の動作を示すフローチャートである。
まずステップS501で、1ページのDMA処理に対して初期化を行う。ラインの開始アドレスline_start_addrに、走査ラインに相当するデータの読み出し開始位置RegBeamStartAddrを設定し、ページ内の処理済みライン数lines_cntに「0」をセットする。次にステップS502で、DMA開始アドレスが、画像の有効領域内のアドレスか否かを判定する。もし有効領域外の場合はステップS503に進み、ライン開始位置状態line_start_stateに有効領域外であることを示す値を入力する。一方ステップS502で有効領域内であればステップS504に進み、line_start_stateに有効領域内であることを示す値をセットする。
次にステップS505に進み、各ラインごとの処理の初期化を行う。ここではステップS505以降の処理を、このページのライン数分繰り返すことになる。ここでは読み出しアドレスポインタaddr_pointに、ラインの開始アドレスline_start_addr、読み出しデータ長lengthを最大バースト長にセットする。また状態stateには、上述のライン開始位置状態line_start_stateをセットし、テーブルアドレスtable_addrには、テーブルの先頭アドレスRegTableStartAddrをセットする。
次にステップS506に進み、バスインターフェース503'により、テーブルアドレスに基づいてテーブルから曲がり情報を読み出する。そしてステップS507に進み、その読み出したテーブルデータに基づいて、セグメント長seg_lenと、境界部分での上下ラインへの移動があるかを示す情報UpDown[i]をセットする。
次にステップS508に進み、前述の状態stateに基づいて、読み出しアドレスポインタが有効領域内であるか否かを判定する。ここで領域内であればステップS509に進み、バスインターフェース503'に対して読み出し要求を発行する。一方、領域外であればステップS510に進み、印刷有効領域外のデータRegFillDataのデータをセグメント長seg_len分、後段の画像処理ブロックに転送する。ここでステップS509においては、seg_lenが読み出しデータ長lengthに対して大きい場合、実施の形態3で示したS204,S205,S206,S207同様、複数回読み出し要求を行い、各セグメント長の読み出しを完了する。こうしてステップS509或はS510を実行した後ステップS511に進み、アドレスポインタaddr_pointを更新する。ここではアドレスポインタaddr_pointに、セグメント長seg_lenを加算し、テーブルアドレスtable_addrに+8する。そしてステップS512に進み、1ライン分の終了が終了したかどうかを判定する。この時、曲がり判定が終了していなければステップS513に進み、状態state、アドレスポインタaddr_point、上下ラインへの切り換え情報UpDownを更新してステップS506へ戻る。またステップS512で1ライン分の処理を終了している場合はステップS514に進む。
図17は、図16のステップS513における状態state及びアドレスの更新処理の詳細を示すフローチャートである。
まずステップS521で、上下ラインへの切り換え情報UpDownをチェックする。ここで曲がり情報が上ラインであればステップS522に進み、アドレスポインタaddr_pointから、ライン間のアドレスのオフセット値RegLineOffsetを差し引く。一方、曲がり情報が下ラインであればステップS528に進み、アドレスポインタaddr_pointに、このオフセット値RegLineOffsetを加算する。
上ラインの場合はステップS522からステップS523に進み、状態stateが有効領域内か、有効領域の上側、或は下側のいずれを示しているかを判定する。ここで有効領域の上側であれば、それよりも上のラインは有効領域外で、有効領域の上側のままであるため処理を終了する。状態stateがが有効領域内を示していればステップS524に進み、更新した上ラインのアドレスポインタaddr_pointと、有効画像領域の先頭アドレスRegLowerAddrとの大小関係をチェックする。ここで有効画像領域の先頭アドレスRegLowerAddrが、アドレスポインタaddr_pointより大きい場合は更新後の上ラインアドレスは有効領域であるためステップS525に進み、状態stateに有効範囲外であることを示す値をセットする。一方ステップS524で、先頭アドレスRegLowerAddrが、アドレスポインタaddr_pointに等しいか、或はアドレスポインタaddr_pointより小さい場合は有効領域のままであるため、状態stateを変更せずに処理を終了する。
またステップS523で、状態stateが有効領域の下側である場合はステップS526に進み、アドレスポインタaddr_pointと、有効画像領域の後端後のアドレスRegUpperAddrとの大小関係を判定する。ここで後端後のアドレスRegUpperAddrが、アドレスポインタaddr_pointより大きい場合は下ラインは有効領域内であるためステップS527に進み、状態stateを有効範囲内を示す値にセットする。一方、後端後のアドレスRegUpperAddrが、アドレスポインタaddr_pointより小さい場合は、その下ラインは有効領域の下のままであるため状態stateを変更せずに処理を終了する。
また一方、下方向の場合はステップS528からステップS529に進み、状態stateが有効領域内か、有効領域の上側か、下側かのいずれを示しているかをみる。有効領域の下側であれば、それよりも下のラインは無条件に有効領域外であるため、状態stateを変更せずに処理を終了する。一方、有効領域の上側の場合はステップS529からステップS532に進み、更新後のアドレスポインタaddr_pointと有効画像領域の先頭アドレスRegLowerAddrとの大小関係をチェックする。ここで先頭アドレスRegLowerAddrがアドレスポインタaddr_pointより大きい場合は、有効領域外であるため状態stateを変更せずに処理を終了する。またステップS532で、RegLowerAddrがアドレスポインタaddr_pointより小さい場合はステップS533に進み、状態stateを有効領域内を示す値に変更する。またステップS529で、状態stateが領域内を示していればステップS530に進み、アドレスポインタaddr_pointと、後端後のアドレスRegUpperAddrとの大小関係をチェックする。ここで後端後のアドレスRegUpperAddrがアドレスポインタaddr_pointより大きい場合は、状態stateを変更せずに処理を終了する。一方、後端後のアドレスRegUpperAddrがアドレスポインタaddr_pointより小さい場合は、状態stateに有効領域の下側であることを示す値をセットする。こうして状態stateを更新した後図16のステップS506に戻る。
再び図16に戻り、ステップS514では、次のライン処理へ移動するための処理として、ライン開始位置状況line_start_stateと、ラインの開始アドレスline_start_addrとを更新する。そしてステップS515に進み、ページの処理済みライン数lines_cntをカウントアップ(+1)する。そしてステップS516で、1ページの処理が終了したか否かを判定する。ここで1ページ分の処理が全て終了していれば処理を終了し、終了していない場合はステップS505へ戻って前述の処理を実行する。
以上説明したように本実施の形態5によれば、上述の実施の形態1に係る効果に加えて、DMAコントローラが走査ラインの曲がりを相殺するように曲がった画像を読み出し、有効領域外では、指定したデータを生成できる。これにより、例えばプリンタエンジンがマスク機能を有していないような、走査ラインに曲がりが発生する小型のプリンタ部でも高品位な出力を得ることができる。
[実施の形態6]
次に本発明の実施の形態に係るDMAコントローラ305の動作について、図18及び図19を用いて説明する。尚、この実施の形態6に係る画像形成装置のハードウェア構成は、前述の実施の形態3と同様であるため、その説明を省略する。
図18は、本発明の実施の形態6に係るDMAコントローラ305に有効画像領域を、メモリ上のアドレスで指定する方法を説明するための図である。
曲がり情報を格納するテーブルの先頭アドレスをRegTableStartAddrで、画像データが格納されるメモリの先頭アドレスをRegStartAddrで表す。また、ビームの開始位置を示すインデックスをRegStartLineIndex(本実施の形態6では、上下2ライン分の曲がりを例とし「−2」を設定している。「0」が有効領域の先頭ラインに対応している)としている。更に、1ページの走査ライン数をRegBeamLines、ライン間のアドレスオフセット値をRegLineOffset、印刷有効領域外のデータRegFillDataを設定可能である。
図19は、本発明の実施の形態6に係るDMAコントローラ305のアドレス生成部502'の動作を示すフローチャートである。
まずステップS601で、この処理のための初期化処理を行う。ここではラインの開始アドレスline_start_addrに、画像データが格納されるメモリの先頭アドレスRegStartAddrをセットする。開始ラインインデクスstart_line_indexに、1ページの開始位置を示すインデックスRegStartLineIndexをセットし、ページにおける処理済みライン数lines_cntに「0」を代入する。次にステップS602に進み、各ライン処理の初期化を行う。ここではアドレスaddrにライン開始アドレスline_start_addrをセットし、ライン数line_indexに、開始ラインインデクスstart_line_indexをセットする。またテーブルアドレスtable_addrに、曲がり情報を格納するテーブルの先頭アドレスRegTableStartAddrを代入する。
次にステップS603に進み、バスインターフェース503'に対してテーブルの読み出し要求を行う。次にステップS604に進み、ステップS603で読み出したテーブルデータから、セグメント長seg_len及び上下ラインへの切り換え情報up_down_infoを設定する。次にステップS605に進み、ライン数line_indexをチェックする。ここで現ラインのライン数が0以上でN(印刷有効領域のライン数)以内の場合は印刷有効領域にあるためステップS606に進み、バスインターフェース503'に対して画像データの読み出し要求を、図16のステップS509同様に行う。一方、ステップS605で、印刷有効領域内でないと判断するとステップS607に進み、セグメント長seg_len分のRegFillDataを後段の画像処理ブロックに対して転送する。これにより、印刷有効領域外では、特定のデータRegFillDataが出力されるため、後段の処理におけるマスク処理などが不要になる。
こうしてステップS606或はS607を実行した後ステップS608に進み、アドレスポインタaddr_pointにセグメント長seg_lenを加算し、テーブルアドレスtable_addrを+8する。そしてステップS609で、上下ラインへの切り換え情報up_down_infoをチェックする。ここで下ラインに切り換えるときはステップS610に進み、ライン数line_indexを−1する。そしてステップS611で、その結果が「0」以上であればステップS612に進み、アドレスaddrからライン間のオフセットアドレス値RegLineOffsetを差し引いてステップS603に進む。またステップS611で、ライン数ine_indexが「0」より小さければステップ603へ戻る。
一方、ステップS609で、上ラインへの切り換えの場合はステップS613に進み、ライン数line_indexに+1する。そしてステップS614に進み、その加算結果が印刷有効領域のライン数Nよりも小さければ有効領域内であるためステップS615に進む。ここでアドレスポインタaddr_pointにライン間のアドレスオフセット値RegLineOffsetを加算してステップS603に進む。またステップS614で、ライン数ine_indexがNより大きければ有効領域外であるためステップS603に戻る。またステップS609で、上下ラインへの切り換えがない場合はステップS616に進み、現ライン数start_line_indexが有効領域内であるか、即ち、0以上全ライン数N以下であるかを判定する。そうであればステップS617に進み、現ライン数line_start_addrに、ライン間のオフセットアドレス値RegLineOffsetを加算してステップS618へ進む。またステップS616で、有効領域外であると判定するとステップ618に進み、現ライン数start_line_index及び処理済みライン数lines_cntをそれぞれ+1する。そしてステップS619に進み、処理済みライン数linec_cntが1ページ分のライン数RegBeamLinesよりも大きいか否かで、1ページの処理が終了したか否かを判定する。こうして1ページの処理が終了していないときはステップS602に進むが、1ページの処理を終了したと判断すると、この処理を終了する。
以上説明したように本実施の形態6によれば、上述の実施の形態1に係る効果に加えて、DMAコントローラが走査ラインの曲がりを相殺するように曲がった画像を読み出し、有効領域外では、指定したデータを生成できる。これにより、例えばプリンタエンジンがマスク機能を有していないような、走査ラインに曲がりが発生する小型のプリンタ部でも高品位な出力を得ることができる。
[実施の形態7]
本発明の実施の形態7に係るDMAコントローラ305aの動作について、図20、図21、図22、図23、図24、図25を用いて説明する。
図20は、本発明の実施の形態7に係るプリンタコントローラ103aの詳細構成を示すブロック図で、前述の図2のブロック図と共通する部分は同じ記号で示し、それらの説明を省略する。
また図21は、本発明の実施の形態7に係るプリンタコントローラ103aのDMAコントローラ305aの詳細構成を示すブロック図で、前述の図3のブロック図と共通する部分は同じ記号で示し、それらの説明を省略する。尚、このDMAコントローラ305aは、アドレス生成部502aがリングバッファカウンタ320のカウント値のインクリメントやデクリメントを更に指示する点だけが、前述の図2のDMAコントローラ305と相違している。
図20では、前述した図2のプリンタコントローラ103に、更に、DMAコントローラ321,322及び画像処理部323、そしてリングバッファカウンタ320が追加されている。ここでDMAコントローラ322は、画像メモリ304に格納されているビットマップ画像データを画像処理部323に読み出す。またDMAコントローラ321は、画像処理部323で処理した画像データを画像メモリ304に書き込む。画像処理部323による処理は、具体的には回転処理や変倍処理等が含まれる。これらDMAコントローラ321,322に対する制御は、CPU308からの指示に基づき行われる。更にリングバッファカウンタ320が、DMAコントローラ321とDMAコントローラ305aとの間に接続されている。これによりDMAコントローラ305a,320がともにリングバッファカウンタ320の制御とその状態を参照することにより、画像メモリ304との間でリングバッファを用いたデータ転送が可能となる。このリングバッファカウンタ320は、リングバッファに対して書き込むDMAコントローラ321からインクリメント指示を受信すると内蔵カウンタ(不図示)をカウントアップする。またリングバッファからデータを読み出すDMAコントローラ305aからデクリメント指示を受信すると内蔵カウンタをカウントダウンする。DMAコントローラ305a,DMAコントローラ321はリングバッファカウンタ320のカウント値を基に動作することで、リングバッファを用いて画像メモリ304に1ページ分に満たない画像データを送出する。また、画像メモリ304の画像データのない領域を読み出すことなくDMAコントローラ321からDMAコントローラ305aへの画像データ転送が可能となる。
画像メモリ304からリングバッファを介して読み出されたビットマップデータは、ブレンド処理部306で処理され、エンジンI/F部307を介してビデオ信号として印刷部107に転送される。尚、DMAコントローラ321と本実施の形態7に係るDMAコントローラ305aとのリングバッファによるデータ転送の場合の構成について説明したが、CPU308とのリングバッファによるデータ転送も可能である。
図22(A)は、本発明の実施の形態7に係るDMAコントローラ305aに走査ラインの曲がりを指定する方法を説明するための図である。
図において、nライン(n line)は、本来の像形成の対象領域である走査ラインを示す。ここでは走査ラインの曲がりに合わせて、1走査ライン(長さRegLineLen)を複数のセグメントに分割している。そして各セグメントの長さはSegLen[i]に設定されている。ここで変数iは、1走査ラインにおけるセグメントの順番に対応している。また各ライン切り換え位置で、走査ラインの曲がりが上方向か下方向かを示すUpDown[i]が設定されている。ここでも変数iは、1走査ラインにおけるセグメントの順番に対応しており、UpDown[i]=0は上方向、UpDown[i]=1は下方向への切り換えを示している。
図22(B)は、走査ラインの曲がりに合わせて、ライン切り換え位置までの長さ(セグメント長)SegLen[i]と、上又は下のラインに切り替えるかを示すUpDown[i]を記憶しているテーブルを説明する図である。このテーブルは、画像メモリ304かRAM310上にテーブルとして格納される。
このテーブルの先頭アドレスRegTableStartAddrを、DMAコントローラ305aのレジスタ部501にセットする。ここでUpDown[i]のとり得る値は、上或は下の2通りであるため、上のラインに切り替える場合は「0」を、下のラインに切り替える場合は「1」を割り当てている。
またDMAコントローラ305aのレジスタ部501は、更にビットマップデータのライン長RegLineLenや、CPU308が上記のレジスタの設定を完了した後に、DMA動作を開始させるための起動レジスタ(不図示)を含む。
図23(A)〜(C)は、本実施の形態7に係るDMAコントローラ305aにリングバッファ領域を指定する方法を説明するための図である。
図23(A)は、Mラインのリングバッファを説明する図である。
レジスタ部501には、リングバッファ上のビットマップデータの隣り合うラインのアドレスのオフセット値RegLineOffsetがセットされる。更に、リングバッファの下限値RegRingBufferLowerAddr、リングバッファの上限値RegRingBufferUpperAddrがセットされる。更にレジスタ部501には、画像メモリ304に確保したリングバッファ領域の先頭アドレスRegStartAddr、リングバッファ領域のライン数RegLinesがセットされる。
図23(B)は、走査ラインの曲がりを説明する図である。
ここでは読出ラインの行頭から、上方向に切り替わる最大ライン数RegUpMaxと、読み出しラインの行頭から下方向に切り替わる最大ライン数RegDownMaxが規定されている。これらの値はレジスタ部501にセットされる。図23(B)の例では、RegUpMax=2,RegDownMax=3である。
図23(C)は、図23(B)に示すような走査ラインの曲がりが発生している場合、走査ラインが印刷有効領域内にあるか否かの判定を説明する図である。
ここでレジスタ部501は、リングバッファの先頭アドレスのある行に対して読み出し開始位置を示すRegStartLineIndexがセットされる。更に、ブレンド処理部306へ送るべきライン数RegBeamLines、印刷有効領域外を出力する際に使用するダミーデータRegFillDataもセットされる。図23(B)では、RegUpMaxが「2」で、RegDownMaxが「3」であるため、読み出し開始ラインRegStartLineIndexは、印刷有効領域の先頭ラインから−3ラインとなる。また読み出し終了ラインは、印刷有効領域の最終ラインから+2ラインとなる。
図24及び図25は、本実施の形態7に係るDMAコントローラ305aのアドレス生成部502aの動作を示すフローチャートである。
この処理は、DMAコントローラ321により画像メモリ304のリングバッファに、画像処理部323で処理されたビットマップデータが格納されて、リングバッファカウンタ320がカウントアップされるのと並行して実行される。
まずステップS701で、CPU308の指示によりDMA動作が開始されると、各ラインの開始アドレスline_start_addrを、リングバッファ領域の先頭アドレスRegStartAddrに初期化する。またブレンド処理部306へ送った処理済みのライン数line_cntを「0」で初期化する。更に、画像データの読み出し開始ラインstart_line_indexを、読み出し開始ラインRegStartLineIndex(図23の例では「−3」)で初期化する。次にステップS702に進み、ライン毎の初期化を行う。ここでは読み出し開始アドレスポインタaddr_pointを、ライン開始アドレスline_start_addrで初期化する。またライン中の処理済みのデータ量line_data_cntを「0」で初期化し、また現在の処理ライン位置line_indexsを、画像データの読み出し開始位置start_line_indexで初期化する。また、参照すべきセグメントの長さSegLen[i]と、ライン切り替え情報UpDown[i]のテーブルのアドレスを示すtable_addrを、テーブルの先頭アドレスRegTableStartAddで初期化する。
次にステップS703に進み、画像データの読み出し開始ラインstart_line_indexが、図23(C)に示す印刷有効領域に対してどのラインであるかを判定する。ステップS703で、有効領域の上側、例えば図23(C)のライン−3から2まではステップS704に進み、リングバッファに図23(C)のライン−3から2までのデータが格納されるのを待つ。具体的には、リングバッファカウンタRBCの値と、BH(=RegUpMax+RegDownMax+1)+1(この実施の形態7ではBH=6)と(start_line_index−1)との加算値とを比較する。こうしてリングバッファにライン−3からライン2までのデータが格納されるとステップS705に進み、1ライン処理を実行してステップS711に進む。この1ライン処理は図25を参照して後述する。ここで、ステップS704〜S705の処理は、図23(C)のエリアAで示すラインのデータ処理に該当している。
またステップS703で、画像データの読み出し開始ラインstart_line_indexが図23(C)に示す印刷有効領域内であればステップS706に進む。ここでリングバッファに、走査ラインの曲がりを考慮した6(BH)ライン分のイメージデータが格納されるのを待ってステップS707に進む。ステップS707では後述の1ライン処理を実行してステップS708に進み、リングバッファカウンタRBCを−1してステップS711に進む。ここで、ステップS706〜S707の処理は、図23(C)のエリアBで示すように、そのラインデータが全て印刷有効領域に含まれるラインのデータ処理に該当している。
またステップS703で、画像データの読み出し開始ラインstart_line_indexが図23(C)に示す印刷有効領域の下側でラインN−3からラインN+1までの間ではステップS709に進む。ここで後述の1ライン処理を実行してステップS710に進む。ステップS710ではリングバッファカウンタRBCを−1してステップS711に進む。ここで、ステップS709の処理は、図23(C)のエリアCで示すラインのデータ処理に該当している。
次に図25のフローチャートを参照して、ステップS705,S707,S709の1ラインの処理を説明する。
図25は、本実施の形態7に係る1ライン処理を説明するフローチャートである。
ステップS801では、テーブルアドレスをもとに、そのライン(start_line_indexで示されるライン)の曲がり情報を取得する。次にステップS80に進み、そのラインのセグメント長seg_lenと切り換え情報up_down_infoをレジスタにセットする。次にステップS803に進み、読み出し開始ラインline_indexが印刷有効領域内であるかを判定する。ステップS803で印刷有効領域内であればステップS804に進み、そのラインの該当するセグメントのデータを読み出す。ステップS803で印刷有効領域内でないときはステップS805に進み、そのラインの該当するセグメント長分のダミーデータRegFillDataを出力する。こうしてステップS804或はステップS805を実行した後ステップS806に進み、イメージデータの読み出しアドレスポインタaddr_point及びテーブルアドレスtable_addrを更新する。ここでは読み出しアドレスに、処理済みのセグメント長を加算したアドレスに更新し、テーブルアドレスは次のセグメントの曲がり情報を得るために+8される。
次にステップS807に進み、上下切り換え情報up_down_infoを調べる。ここで切り換え情報が「0」、即ち上下方向への切り換えでないときは、ラインを切り換えてラインデータを読み出す必要が無いため処理を終了する。また曲がりが発生しているラインであっても、最終のセグメントの後では切り換え情報up_down_infoが「0」であるため、処理を終了する。
一方ステップS807で、上方向の曲がりがあると判定するとステップS808に進み、読み出しライン番号line_indexを−1し、ステップS809で、その結果が負の値になったかをみる。負の値でなければステップS810に進み、読み出しアドレスポインタaddrから、リングバッファの1ラインのオフセットアドレスRegLineOffsetを差し引いて、一つ前のラインのアドレスに更新する。そしてステップS811で、そのアドレスがリングバッファの先頭アドレスRegRingBufferLowerAddr以下でないか、即ち、リングバッファ内のアドレスかどうかを判定する。リングバッファ内のアドレスであればステップS801に戻って前述の処理を実行する。しかしそうでないときはステップS812に進み、その読み出しアドレスポインタaddr_pointにリングバッファのメモリエリア(RegRingBufferUpperAddr−RegRingBufferLowerAddr)を加算する。そして読み出しアドレスポインタをリングバッファ内のアドレスに更新する。そしてステップS801に進む。
一方ステップS807で、下方向の曲がりがあると判定するとステップS813に進み、読み出しライン番号line_indexを+1し、ステップS814で、その結果がリングバッファのライン数Nを越えたかをみる。越えなければステップS815に進み、読み出しアドレスポインタaddrに、リングバッファの1ラインのオフセットアドレスRegLineOffsetを加算して次ラインのアドレスに更新する。そしてステップS816で、そのアドレスがリングバッファの最終アドレスRegRingBufferUpperAddr以上でないか、即ち、リングバッファ内のアドレスかどうかを判定する。リングバッファ内のアドレスであればステップS801に戻って前述の処理を実行するが、そうでないときはステップS817に進む。ここで、その読み出しアドレスポインタaddrから、リングバッファのメモリエリア(RegRingBufferUpperAddr−RegRingBufferLowerAddr)を差し引く。こうして読み出しアドレスをリングバッファ内のアドレスに更新する。そしてステップS801に進む。尚、ステップS809,S814で、計算結果が負或はN以上の時はステップS801に戻る。
このようにこの1ライン処理では、リングバッファに格納されている印刷有効領域に含まれるラインのセグメント単位でイメージデータを読み出すことができる。また印刷領域に入っていないセグメントでは、ダミーデータRegFillDataが読み出される。
次に図24に戻って、ステップS705,S708,S710のいずれかを実行した後ステップS711に進み、読み出しラインが印刷有効領域にあるか否かを判定する。印刷有効領域にあればステップS712に進み、読み出しラインアドレスにリングバッファの1ラインのオフセットアドレス(RegLineOffset)を加算して次ラインのアドレスに更新する。そしてステップS713で、その加算結果のアドレスポインタがリングバッファの最終アドレスRegRingBufferUpperAddr以上でないか、即ち、リングバッファ内のアドレスかどうかを判定する。ここでリングバッファ内のアドレスであればステップS715に進むが、そうでないときはステップS714で、その読み出しアドレスポインタをリングバッファの先頭アドレスに初期化してステップS715に進む。
ステップS711で、読み出しラインが印刷有効領域でないときはステップS715に進む。ステップS715では、読み出し回路ラインstart_line_indexを+1し、処理済みライン数line_cntを+1する。そしてステップS716で、その処理済みのライン数が、1ページのライン数RegBeamLinesになったか、即ち、1ページ分のイメージデータの処理が終了したかをみる。終了していれば、このDMA動作を終了するが、そうでないときはステップS702に進み、次の走査ラインに対する処理を実行する。ここでDMAコントローラ305aは、DMA動作を終了した時に、割り込み(不図示)をCPU308に送る。CPU308はこの割り込みを検出することで、このDMAを終了したことを検知する。
以上説明したように本実施の形態7によれば、DMACがリングバッファを使用して、走査ラインの曲がりを補正するようにライン間でのりかえを行いながら曲がった画像データを読み出すことができる。これにより、画像データの1ページ分よりも小さな容量のバッファを用いて、レーザビームの曲がりを補正できるという効果がある。