(57)【特許請求の範囲】
【請求項１】
グラフィックオブジェクトの塗りつぶしをアクティブ化する方法であって、
現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成する生成ステップと、
前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するアクティブ化ステップと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、
前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られる
ことを特徴とする方法。
【請求項２】
さらに、
前記現在の走査線に対して、前記オブジェクト内の一連の画素または１つの画素の全体に対する前記オブジェクトの塗りつぶしをアクティブ化するステップを有することを特徴とする請求項１に記載の方法。
【請求項３】
さらに、
１のエッジレコードが、前記分数データが前記現在の走査線内の前記エッジの最小位置を定義することを示すフラグを含むときに、第１のカウンタを増分するステップと、
１のエッジレコードが、前記分数データが前記現在の走査線内のエッジの最大位置を定義することを示す前記フラグ、を含むときに、前記第１のカウンタを減分するステップと、
前記第１のカウンタが０以外になるとき、前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または１つの画素の全体に対する前記オブジェクトの塗りつぶしをアクティブ化するステップと、
を有することを特徴とする請求項１に記載の方法。
【請求項４】
前記オブジェクト内の一連の画素または１つの画素の全体に対する塗りつぶしをアクティブ化するステップをさらに含み、
該ステップは、
前記現在の走査線に対する前記エッジレコードが、前記エッジの出口点を定義する分数データと、前記エッジが第１の方向を有することを示すフラグとを含むときに、塗りつぶしカウンタを増分するサブステップと、
前記現在の走査線に対する前記エッジレコードが、前記エッジの出口点を定義する分数データと、前記エッジが第２の方向を有することを示すフラグとを含むときに、塗りつぶしカウントを減分するサブステップと、
前記第１のカウンタが０になり、前記塗りつぶしカウンタが所定の状態にあるとき、
前記現在の走査線に対して、前記オブジェクト内の一連の画素または１つの画素の全体に対する前記オブジェクトの塗りつぶしをアクティブ化するサブステップと、
を含むことを特徴とする請求項３に記載の方法。
【請求項５】
前記オブジェクトの塗りつぶしはノンゼロワインディング塗りつぶしルールに基づいて行われ、前記塗りつぶしカウントが０以外で、かつ、前記第１のカウンタが０のときに、前記オブジェクトがアクティブ化されることを特徴とする請求項４に記載の方法。
【請求項６】
前記オブジェクトの塗りつぶしはオッドイーブン塗りつぶしルールに基づいて行われ、前記塗りつぶしカウントが奇数で、かつ、前記第１のカウンタが０のときに、前記オブジェクトがアクティブ化されることを特徴とする請求項４に記載の方法。
【請求項７】
前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置は、当該エッジの当該現在の走査線からの出口位置に対応し、
前記現在の走査線に対する前記エッジレコードは、前記最小位置を定義する分数データを含むエッジレコードと、前記最大位置を定義する分数データを含むエッジレコードとの２つのエッジレコードを含む
ことを特徴とする請求項１に記載の方法。
【請求項８】
前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置は、当該エッジの当該現在の走査線からの出口位置に対応し、
前記現在の走査線に対する前記エッジレコードは、前記最小位置を定義する分数データを含むエッジレコードと、前記最大位置を定義する分数データを含むエッジレコードとの計２つのエッジレコードを含む
ことを特徴とする請求項１に記載の方法。
【請求項９】
前記エッジの前記現在の走査線からの出口位置は、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの前記最大位置と、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの前記最小位置との間に位置し、
前記エッジレコードは、前記最小位置を定義する前記分数データを含む２つのエッジレコードと、前記出口位置を定義する前記分数データを含む１つのエッジレコードと、前記最大位置を定義する前記分数データを含む１つのエッジレコードとの計４つのエッジレコードを含む
ことを特徴とする請求項１に記載の方法。
【請求項１０】
前記エッジの前記現在の走査線からの出口位置は、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの前記最大位置と、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの前記最小位置との間に位置し、
前記エッジレコードは、前記最小位置を定義する前記分数データを含む１つのエッジレコードと、前記出口位置を定義する前記分数データを含む１つのエッジレコードと、前記最大位置を定義する前記分数データを含む１つのエッジレコードとの計３つのエッジレコードを含む
ことを特徴とする請求項１に記載の方法。
【請求項１１】
一の動作モードで、前記生成ステップと前記アクティブ化ステップとを実行し、
別の動作モードで、
現在の走査線に対して、前記エッジと関連付けられたエッジレコードを、先行する走査線に対してすでに生成された前記エッジレコードから生成するステップと、
前記現在の走査線に対して、前記出口点を定義する分数データの丸められた値に等しい走査線位置で開始される前記オブジェクト内の一連の画素または１つの画素の全体に対するオブジェクトの塗りつぶしをアクティブ化するステップと、
を実行し、
前記現在の走査線に対する前記エッジレコードが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記エッジの前記先行する走査線からの出口点を定義する分数データを含む
ことを特徴とする請求項１に記載の方法。
【請求項１２】
前記丸められた値は、前記出口点を定義する前記分数データを切り上げることによって得られることを特徴とする請求項１１に記載の方法。
【請求項１３】
前記丸められた値は、前記出口点を定義する前記分数データを切り捨てることによって得られることを特徴とする請求項１１に記載の方法。
【請求項１４】
前記最小画素位置は、フラグの第１の状態に応じて前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることによって得られ、
前記最大画素位置は、前記フラグの第２の状態に応じて前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることによって得られる
ことを特徴とする請求項１に記載の方法。
【請求項１５】
前記エッジの前記現在の走査線からの出口位置は、そのエッジの前記先行する走査線からの出口位置と、そのエッジの傾斜とから得られることを特徴とする請求項１に記載の方法。
【請求項１６】
前記エッジは、複数の直線セグメントから構成され、
前記エッジの前記現在の走査線からの出口位置は、そのエッジの前記先行する走査線からの出口位置と、１または２以上の前記直線セグメントを定義するデータとから得られることを特徴とする請求項１に記載の方法。
【請求項１７】
ページ記述言語が前記グラフィックオブジェクトを定義し、
そのページ記述言語が特定の種類である場合に、前記生成ステップと前記アクティブ化ステップとを実行し、
そのページ記述言語が他の種類である場合は、他のステップを実行する
ことを特徴とする請求項１に記載の方法。
【請求項１８】
グラフィックオブジェクトの塗りつぶしをアクティブ化する装置であって、
現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成するモジュールと、
前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するモジュールと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線からの前記エッジの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、
前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られる
ことを特徴とする装置。
【請求項１９】
グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコンピュータプログラムであって、
現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成するためのコードと、
前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコードと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線からの前記エッジの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、
前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られる
ことを特徴とするコンピュータプログラム。
【請求項２０】
グラフィックオブジェクトの塗りつぶしをアクティブ化する方法であって、
現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた２つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成する生成ステップと、
前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するアクティブ化ステップと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とする方法。
【請求項２１】
各エッジレコードは、前記切り捨てられた値および前記切り上げられた値を定義する前記エッジレコード間で区別するためのフラグを含むことを特徴とする請求項２０に記載の方法。
【請求項２２】
ページ記述言語が前記グラフィックオブジェクトを定義し、
そのページ記述言語が特定の種類である場合に、前記生成ステップと前記アクティブ化ステップとを実行し、
そのページ記述言語が他の種類である場合は、他のステップを実行する
ことを特徴とする請求項２０記載の方法。
【請求項２３】
グラフィックオブジェクトの塗りつぶしをアクティブ化する装置であって、
現在の走査線に対して前記オブジェクトのエッジと関連付けられた２つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成する手段と、
前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化する手段と、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とする装置。
【請求項２４】
グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコンピュータプログラムであって、
現在の走査線に対して前記オブジェクトのエッジと関連付けられた２つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成するコードと、
前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するコードと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【０００１】
（発明の分野）
本発明は、印刷および／または表示に関し、特に、グラフィックオブジェクトの塗りつぶしのアクティブ化に関する。
【０００２】
（背景）
印刷および／または表示のためにページをレンダリングするとき、PostScript（登録商標）やＰＣＬなどのページ記述言語で、すなわち、ＷｉｎｄｏｗｓのＧＤＩ又はＸ−１１などのグラフィックインタフェースに対する関数呼出しにおいて提供されるグラフィックスオブジェクトの１組の記述として、ページの中間記述が行なわれることが多い。ページ上のエッジの観点から記述されるオブジェクトのラスタライズのためのルールは、インタフェース又はページ記述言語の固有の特徴であり、使用されるインタフェース又はページ記述言語の種類によって異なる。ページは、通常、オブジェクトベースのグラフィックスシステムによりグラフィックインタフェースを介して印刷および／または表示のためのレンダリングが行なわれる。
【０００３】
これらのオブジェクトベースのグラフィックスシステムの多くは、続いて印刷および／または表示を行なうページまたは画面の画素ベースの画像を保持するのにフレームメモリまたはページバッファを利用する。通常、グラフィックオブジェクトの輪郭が計算され、塗りつぶされ、フレームメモリへと書き込まれる。２次元グラフィックスの場合、他のオブジェクトの前面に表示されるオブジェクトは、背景オブジェクトより後にフレームメモリへと書き込まれるだけであり、それにより、背景が画素単位で置き換えられる。これは、従来より「Painter's algorithm（画家アルゴリズム）」として広く知られている。オブジェクトは、最後尾のオブジェクトから先頭のオブジェクトに至るまで優先度の順序で考慮される。通常、各オブジェクトは走査線順でラスタライズされ、画素は各走査線に沿った順次の走行においてフレームメモリに書き込まれる。
【０００４】
この技術には、本質的に２つの問題がある。第１の問題は、フレームメモリ中の全ての画素に対して高速なランダムアクセスが必要とされることである。これは、考慮される各新規のオブジェクトがフレームメモリ中の任意の画素に影響を及ぼす可能性があるからである。このため、フレームメモリは、通常、半導体ランダムアクセスメモリ（ＲＡＭ）において保持される。高解像度のカラープリンタの場合、必要なＲＡＭの容量は非常に大きく、通常、１００メガバイトを超える。これではコストが高くつくし、高速で動作させることが困難である。第２の問題は、ペイント済（レンダリング済）の多数の画素が、後のオブジェクトにより過剰ペイント（再レンダリング）されることである。既にオブジェクトを有する画素をペイントするのは時間の浪費であった。
【０００５】
フレームメモリが大容量になる問題を克服する方法の１つは、「バンディング（banding）」の使用である。バンディングを使用すると、常に、フレームメモリの一部のみがメモリに存在するようになる。描画対象の全てのオブジェクトが「ディスプレイリスト」に保存される。画像全体は前述のようにレンダリングされるが、フレームメモリのうちの既に存在する部分以外をペイント（レンダリング）するべく試みる画素ペインティング（レンダリング）動作は「省略」される。全てのオブジェクトの描画が終了すると、フレームメモリの断片部がプリンタ（又は他の位置）に送信され、フレームメモリの別の部分が選択されて処理が繰り返される。この技術には幾つかの不利な点がある。例えば、描画されるオブジェクトは、考慮された後に何度も −バンドごとに１度− 再考慮しなければならない。バンドの数が増加すると、レンダリングを必要とするオブジェクトの検査を繰り返す回数も増加する。バンディングの技術では過剰ペイントのコストの問題は解決しない。
【０００６】
別のグラフィックシステムは走査線順で画像の処理にあたる。描画対象の全てのオブジェクトは、同様にディスプレイリストに保存される。各走査線上で、走査線と交わるオブジェクトが優先度順に考慮され、オブジェクトごとにオブジェクトエッジ交点間の画素のスパンがラインメモリに設定される。この技術も、フレームメモリの大容量の問題は克服するが、依然として過剰ペイントの問題を抱えている。
【０００７】
別のグラフィックシステムは、画素順次レンダリングを使用する。この画素順次レンダリングは、フレームメモリの大容量の問題および過剰ペイントの問題の双方を克服する。このシステムでは、各走査線が順次生成される。描画対象の全てのオブジェクトはディスプレイリストに保存される。各走査線上で、走査線と交わるオブジェクトのエッジが、走査線との交差の昇順で保存される。これらの交点、すなわち、エッジ交点は、順次考慮されてアクティブフィールドのアレイをトグルで切り換えるのに使用される。各オブジェクト優先度には、１つのアクティブフィールドがあり、これは、走査線上で注目されるフィールドである。考慮される各１対のエッジ間において、第１のエッジと次のエッジとの間にある画素ごとのカラーデータは、どの優先度が一番高いかを判定するためにアクティブフラグ上で優先度符号器を使用すると共に、２本のエッジ間のスパンの各画素に対する優先度と関連付けられる色を使用することによって生成される。次の走査線に備えて、各エッジの性質に従ってエッジの交点の座標が更新される。隣接するエッジは、この更新の結果、ソートが失敗してスワップされる。新規のエッジもエッジのリストにマージされる。
【０００８】
画素順次レンダリングを使用するこれらのグラフィックスシステムは、フレームメモリまたはラインメモリがなく、過剰ペイントがなく、オブジェクト優先度が順序Ｎ（Ｎは優先順位の数）の時間ではなく、一定の順序の時間で処理される点で重要な利点を有する。これらの画素順次レンダリンググラフィックシステムでは、オブジェクトのエッジは相互に無関係に追跡される。これらのシステムは、エッジ位置を丸めるための、グラフィックインタフェースまたはページ記述言語において固有のラスタライズ・ルールが、オブジェクトのアクティブ化および非アクティブ化に対しても同じである場合に、ページの確実な表現をレンダリングするであろう。
【０００９】
図２Ａを参照して説明する。ページ記述言語の典型的な従来のラスタライズ・ルールを説明するために、複数の画素（ボックスで表される）で構成される１本の画像の走査線２００ａ、および、オブジェクトの一例として２本のエッジ２０２ａ、２０３ａが描かれている。このラスタライズ・ルールでは、オブジェクトのアクティブ化および非アクティブ化のどちらに対しても、エッジ（例えば、２０２ａ、２０３ａ）のエッジ交点（例えば、２０４ａ、２０５ａ）の位置は、常に、次の画素の左上隅の位置へと数学的に切り上げられる。この例では、オブジェクトのアクティブ画素、すなわち、オブジェクトにより塗りつぶされる全ての画素は、斜線で塗りつぶされたボックスとして示されている。典型的な画素順次レンダリンググラフィックシステムは、オブジェクトがアクティブ化されるか非アクティブ化されるかに関わらず、各エッジに対して別々に適用することが可能であるので、このようなラスタライズ・ルールを実現することができる。しかし、エッジ位置を丸めるためのラスタライズ・ルールが、オブジェクトがアクティブ化されているか非アクティブ化されているかに依存するページ記述言語およびインタフェースもある。適切な例は、ページ記述言語PostScript（登録商標）の従来のラスタライズ・ルールである。このルールは、オブジェクトのエッジに接し、そのオブジェクトにより塗りつぶされる全ての画素を指定する。
【００１０】
ここで、図１を参照されたい。このようなラスタライズ・ルールを説明するために、それぞれが複数の画素（ボックスで表される）で構成される複数本の画像の走査線１００ａ、および、オブジェクトの一例として複数のエッジ１０２ａ、１０４ａ、１０６ａ、１０８ａが描かれている。オブジェクトのアクティブ画素、すなわち、オブジェクトにより塗りつぶされる全ての画素は、斜線で塗りつぶされたボックスとして示されている。図１において明らかなように、例示のオブジェクトのエッジ１０２ａ、１０４ａ、１０６ａ、１０８ａが接する全ての画素はアクティブである。このため、エッジの位置は、アクティブ化のためには切り捨てられ、非アクティブ化のためには切り上げられなければならない。
【００１１】
ここで図２Ｂを参照すると、ページ記述言語PostScript（登録商標）の従来のラスタライズ・ルールをより詳細に説明するために、複数の画素（ボックスで表される）で構成される１本の画像の走査線２１０ｂ、および、オブジェクト一例として２本のエッジ２１２ｂ、２１３ｂが描かれている。例示のオブジェクトの２本のエッジ２１２ｂ、２１３ｂはそれぞれ、入口点２１８ｂ、２１４ｂおよび出口点２２０ｂ、２１６ｂで走査線２１０ｂと交差する。ここでも、オブジェクトのアクティブ画素は、斜線で塗りつぶされたボックスとして示されている。図２Ｂにおいて明らかなように、例示のオブジェクトのエッジ２１２ｂ、２１３ｂが接する全ての画素はアクティブである。このため、アクティブ化のためには、エッジ２１２ｂの入口位置２１８ｂまたは出口位置２２０ｂの最小位置は、数学的に切り捨てられ、非アクティブ化のためには、エッジ２１３ｂの入口位置２１４ｂまたは出口位置２１６ｂの最大位置が数学的に切り上げられなければならない。
【００１２】
また、エッジが走査線を横切る際にいくつかの画素を通る場合があるので、かかる軌跡の範囲は、エッジの入口点および出口点にかかわらずアクティブ化されなければならない。しかし、通常の画素順次レンダリンググラフィックシステムは、オブジェクトがアクティブ化されるか非アクティブ化されるかにかかわらず、各エッジの丸めに同じラスタライズ・ルールを適用する。その結果、ページ記述言語およびグラフィックインタフェースに固有のエッジ位置を丸めるためのラスタライズ・ルールが、オブジェクトがアクティブ化されているか非アクティブ化されているかに依存する場合、画素順次レンダリンググラフィックシステムは、オブジェクトの不安定な描画をレンダリングしてしまう。
【００１３】
（概要）
本発明は、既存の構成の１つ以上の欠点を克服、あるいは、少なくとも改善することを目的とする。
【００１４】
本発明の一側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化する方法であって、現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成する生成ステップと、前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するアクティブ化ステップと、を有し、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られることを特徴とする方法が提供される。
【００１５】
本発明の別の側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化する装置であって、現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成するモジュールと、前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するモジュールと、を有し、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線からの前記エッジの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られることを特徴とする装置が提供される。
【００１６】
本発明の別の側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコンピュータプログラムであって、現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成するためのコードと、前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコードと、を有し、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線からの前記エッジの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られることを特徴とするコンピュータプログラムが提供される。
【００１７】
本発明の更に別の側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化する方法であって、現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた２つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成する生成ステップと、前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するアクティブ化ステップと、を有し、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とする方法が提供される。
【００１８】
本発明の更に別の側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化する装置であって、現在の走査線に対して前記オブジェクトのエッジと関連付けられた２つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成する手段と、前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化する手段と、を有し、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とする装置が提供される。
【００１９】
本発明の別の側面によると、グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコンピュータプログラムであって、現在の走査線に対して前記オブジェクトのエッジと関連付けられた２つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成するコードと、前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または１つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するコードと、を有し、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの１つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とするコンピュータプログラムが提供される。
【００２０】
本発明のその他の側面も開示される。
【００２１】
（ベストモードを含む詳細な説明）
添付のいずれか１つ以上の図面において、同じ符号を有するステップおよび／または特徴に言及する場合、特に明記されていない限り、以下の記述においては、これらのステップおよび／または特徴は、同じ機能または動作を有するものとする。
【００２２】
＜１．０  コンピュータグラフィックオブジェクト画像のレンダリングおよび描画のためのシステム＞
図３は、コンピュータグラフィックオブジェクト画像のレンダリングおよび描画のために構成されたコンピュータシステム１を概略的に示す図である。システムは、システムランダムアクセスメモリ（ＲＡＭ）３と関連付けられたホストプロセッサ２を含む。システムＲＡＭ３は、不揮発性ハードディスクドライブまたは同様の装置５と揮発性の半導体ＲＡＭ４とを含んでも良い。また、システム１は、通常は、半導体ＲＯＭ７に設置され、多くの場合、コンパクトディスク装置（ＣＤ−ＲＯＭ）８により補足されるシステム読出し専用メモリ（ＲＯＭ）６を含む。システム１は、ビデオ表示装置（ＶＤＵ）またはプリンタのような、ラスタ形式で動作する画像を表示するための何らかの手段１０を組み込んでも良い。
【００２３】
システム１の前述の構成要素は、バスシステム９を介して相互に接続され、ＩＢＭのＰＣ／ＡＴ型のパソコンおよびそれを進化させた構成、Sun Sparcstationなどの当該技術で良く知られたコンピュータシステムの通常の動作モードで動作可能である。
【００２４】
図３において明らかなように、画素順次レンダリング装置２０はバス９に接続する。好適な実施例においては、画素順次レンダリング装置２０は、システム１からバス９を介して命令およびデータを供給されるグラフィックオブジェクトベースの記述から得られる画素ベースの画像の順次レンダリングのために構成される。画素順次レンダリング装置２０は、通常、半導体ＲＡＭから形成される専用のレンダリング記憶装置３０を自身と関連付けているのが好ましいが、オブジェクト記述のレンダリングのためにシステムＲＡＭ３を利用しても良い。
【００２５】
＜１．１  第１のモードによるコンピュータシステム１の動作＞
コンピュータシステム１は、使用されているのがグラフィックインタフェースか、あるいは、ページ記述言語かによって２つ以上の動作モードで動作することができる。
【００２６】
グラフィックインタフェースまたはページ記述言語が、システムが最も近い整数値へのエッジの系統的な切り上げのためにラスタライズ・ルールを実現することを要求するとき、コンピュータシステム１は第１のモードで動作する。このラスタライズ・ルールは、端数の値を有する全てのエッジ位置（図２Ａを参照）を数学的に切り上げることによって、コンピュータシステム１において周知の方法で実現される。
【００２７】
グラフィックインタフェースまたはページ記述言語が、システムがオブジェクトのエッジに接する全ての画素を塗りつぶすためのラスタライズ・ルールを実現することを要求するとき、コンピュータシステム１は第２のモードで動作する。例えば、ページ記述言語がPostScript（登録商標）であるとき（図２Ｂを参照）、コンピュータシステムは第２のモードで動作することになる。
【００２８】
後者のラスタライズ・ルールは、本発明に従ってコンピュータシステム１において実現される。別の変形例では、コンピュータシステム１は、第２のモードと同等の１つのモードで動作する。その他のモードで実現されても良い丸めの変形例は、他にも多数存在する。例えば、コンピュータシステム１は、更に別のモードで動作しても良い。この更に別のモードでは、コンピュータシステム１は、最も近い整数値へのエッジの丸めのためのラスタライズ・ルールを実現する（例えば、ページ記述言語がＰＣＬのとき）。
【００２９】
このようにして、処理されるページ記述言語が、PostScript（登録商標）などの特定の種類の言語であるときには、本発明のプロセスが実行され、ページ記述言語がＰＣＬなどの別の種類の言語である場合は、別のプロセスが実行される。
【００３０】
コンピュータシステム１をより良く理解するために、最初に、第１の動作モードにおけるコンピュータシステム１の詳細な検討をこの第１．１節で行なう。次に、第２の動作モードにおけるコンピュータシステム１の詳細な検討を次の第１．２節で行なう。
【００３１】
図４に、好適な実施例の機能データ流れ図を示す。図４の機能流れ図は、ホストプロセッサ２により生成し、および／または、必要に応じて、システムＲＡＭ３内に格納するか、あるいは、システムＲＯＭ６から得るのに適した形式でグラフィックオブジェクトのパラメータを記述するのに使用されると共に、画素順次レンダリング装置２０により解釈され、そこから画素ベースの画像をレンダリングしても良いオブジェクトグラフィック記述１１で開始される。
【００３２】
例えば、オブジェクトグラフィック記述１１は、ディスプレイ上の１点から別の１点まで横断する直線のエッジ（単純ベクトル）を含む複数の形式において、あるいは、２次元オブジェクトが直交直線を含む複数のエッジにより定義される場合には直交のエッジの形式において、エッジを有するオブジェクトを組み込んでも良い。オブジェクトが連続的な曲線により定義される異なる形式も適切であり、乗算を実行する必要なしに２次曲線を１つの出力空間においてレンダリングできるようにする複数のパラメータによって１本の曲線が記述される場合には、２次多項式の断片を含むことができる。３次スプラインなどの更なるデータ形式を使用しても良い。オブジェクトは、多様な種類のエッジの組み合わせを含んでも良い。通常、全ての形式に共通であるのは、各線（直線または曲線を問わない）の始端および終端に対する識別子であり、これらは、走査線の本数により識別される。これにより、曲線がレンダリングされるであろう特定の出力空間が定義される。
【００３３】
例えば、図１８Ａは、セグメントを適切に記述しかつレンダリングするためには２つのセグメント６０１および６０２に分割される必要があるエッジ６００の従来のエッジ記述を示す。分割の必要があったのは、従来のエッジ記述は、２次式を介して簡単に計算されるものの、変曲点６０４に対応することができなかったからである。このため、エッジ６００は、端点６０３および６０４、端点６０４および６０５のそれぞれを有する２本の別々のエッジとして扱われる。
【００３４】
図１８Ｂは、端点６１１および６１２と制御点６１３および６１４により記述される３次スプライン６１０を示す。この形式は、レンダリングのために３次多項式の計算を必要とし、計算時間の点でコストがかかる。
【００３５】
図１８Ｃおよび図１８Ｄは、好適な実施例に適用可能なエッジの例を示す。好適な実施例において、エッジは１つのエンティティと見なされ、必要に応じて分割されてエッジの複数の区分が描かれる。この区分は、それぞれが異なる形式で記述されることもあり、その目的は、各区分の記述に対して最低レベルの複雑度を保証することである。
【００３６】
図１８Ｃにおいて、走査線Ａから走査線Ｍにまで及ぶ１本のエッジ６２０が描かれる。エッジは、ｓｔａｒｔ＿ｘ、ｓｔａｒｔ＿ｙ、エッジの次のセグメントをポイントするアドレスを含む１つ以上のセグメント記述、およびエッジを終結させるために使用される最終セグメントを含む複数のパラメータにより記述される。好適な実施例によると、エッジ６２０は、３つのステップセグメント、ベクトルセグメント、および２次セグメントを有するものとして記述されても良い。ステップセグメントは、単にｘステップ値およびｙステップ値を有するものとして定義される。図１８Ｃに描かれた３つのステップセグメントにおいて、セグメント記述は、[0,2]、[+2,2]、および[+2,0]である。ｘステップ値には符号が付されており、これにより、ステップの方向を示す。
【００３７】
一方、ｙステップ値には符号が付されておらず、常に、走査線値が増加するラスタ走査方向にある。次のセグメントは、通常、ｓｔａｒｔ＿ｘ（Ｘ）、ｓｔａｒｔ＿ｙ（Ｙ）、ｎｕｍ＿ｏｆ＿ｓｃａｎｌｉｎｅｓ（ＮＹ）およびｓｌｏｐｅ（ＤＸ）のパラメータを必要とするベクトルセグメントである。この例では、ベクトルセグメントはエッジ６２０の中間セグメントであるので、ｓｔａｒｔ＿ｘおよびｓｔａｒｔ＿ｙは省略されることもある。これらのパラメータは前のセグメントから得られるためである。パラメータｎｕｍ＿ｏｆ＿ｓｃａｎｌｉｎｅｓ（ＮＹ）は、ベクトルセグメントがまたがる走査線の本数を示す。ｓｌｏｐｅ値（ＤＸ）には符号が付されており、先行する走査線のｘ値に加えられることで現在の走査線のｘ値が得られる。図示する例では、ＤＸ＝＋１である。次のセグメントは、ベクトルセグメントに対応する構造を有すると共に、符号が付されておりセグメントのｓｌｏｐｅを変更するためにＤＸに加えられる２次値（ＤＤＸ）を有する２次セグメントである。
【００３８】
図１８Ｄは、好適な実施例による３次曲線の例を示す。この曲線は、符号付き３次値（ＤＤＤＸ）の付加を除いて２次セグメントに対応する記述を含む。符号付き３次値は、セグメントのｓｌｏｐｅの変化率を変更するためにＤＤＸに加えられる。数多くの他の次数で実現されても良い。
【００３９】
以上の説明から、エッジセグメントを記述する複数のデータ形式を扱う能力により、複雑で計算上コストがかかる数学的な演算に依存することなく、エッジ記述および評価を簡略化できることが明らかであろう。これとは対称的に、図１８Ａの従来のシステムでは、直交であるか、ベクトルであるか、あるいは、２次であるかに関わらず、全てのエッジは２次形式で記述される必要があった。
【００４０】
好適な実施例の動作を図１０に示す画像７８をレンダリングする簡単な例を参照して説明する。図１０は、２つのグラフィックオブジェクトを含む。特に、部分的に透明な青色の三角形８０は、最前面においてレンダリングされ、そのために、不透明な赤色の矩形９０が部分的に隠れている。図１０において明らかなように、矩形９０は、種々の画素位置（Ｘ）と走査線位置（Ｙ）との間で定義されたエッジ（side edges）９２、９４、９６、および９８を含む。エッジ９６および９８は、走査線上に形成されるので（従ってこれに平行である）、矩形９０の実際のオブジェクト記述は、図１１Ａにおいて明らかなように、エッジ９２および９４にのみ基づくことができる。これに関連して、エッジ９２は、画素位置(40,35)で開始し、画面をラスタ方向に下り、画素位置(40,105)で終結する。同様に、エッジ９４は、画素位置(160,35)から画素位置(160,105)まで伸びる。矩形のグラフィックオブジェクト９０の水平位置は、エッジ９２からエッジ９４までをラスタライズ様式で走査することのみで取得しても良い。
【００４１】
しかし、青色の三角形オブジェクト８０は、３本のオブジェクトエッジ８２、８４、および８６により定義される。各オブジェクトエッジは、三角形の頂点を定義するベクトルとして示される。エッジ８２および８４は、画素位置 (100,20)で開始し、それぞれ、画素位置(170,90)および画素位置(30,90)まで伸びる。エッジ８６は、この２つの画素位置間で左から右への従来のラスタライズ方向に伸びる。この例では、エッジ８６は、前述のエッジ９６および９８と同様に水平であるので、エッジ８６を定義することは必ずしも必要ではない。エッジ８２および８４を記述するのに使用される開始画素位置および終了画素位置に加えて、これらのエッジの各々は、ｓｌｏｐｅ値を自身と関連付ける。この場合、ｓｌｏｐｅ値は、それぞれ、＋１および−１である。
【００４２】
図４に戻って説明する。レンダリング対象のグラフィックオブジェクトを記述するのに必要なデータを識別すると、グラフィックシステム１は、ディスプレイリスト生成ステップ１２を実行する。
【００４３】
ディスプレイリスト生成１２は、付属のＲＯＭ６およびＲＡＭ３を伴ってホストプロセッサ２上で実行されるソフトウェアモジュールとして実現されるのが好ましい。ディスプレイリスト生成１２は、周知のグラフィック記述言語、グラフィックライブラリ呼出し、またはその他のアプリケーション特有の形式のいずれか１つ以上で表されたオブジェクトグラフィックス記述をディスプレイリストに変換する。ディスプレイリストは、通常、一般的にはＲＡＭ４内に形成されるが、代わりにレンダリング記憶装置３０内に形成されても良いディスプレイリスト記憶装置１３へと書き込まれる。
【００４４】
図５において明らかなように、ディスプレイリスト記憶装置１３は、複数の構成要素を含むことができる。その１つは命令ストリーム１４、別の１つはエッジ情報１５であり、必要に応じて、ラスタ画像画素データ１６も含むことができる。
【００４５】
命令ストリーム１４は、いずれの画像においても必要とされる特定のグラフィックオブジェクトをレンダリングするために、画素順次レンダリング装置２０により読まれる命令として解釈可能なコードを含むことができる。図１０に示す画像の例において、命令ストリーム１４は、以下の形態を取ることが可能であろう。すなわち、
（１）  走査線２０に対してレンダリングし（対象無し）、
（２）  走査線２０において２本の青色のエッジ８２および８４を加え、
（３）  走査線３５に対してレンダリングし、
（４）  走査線３５において２本の赤色のエッジ９２および９４を加え、
（５）  レンダリングを完了する。
【００４６】
同様に、図１０の例に対するエッジ情報１５は、以下の情報を含んでも良い。すなわち、
（i）  エッジ８４は画素位置１００で開始し、エッジ８２は画素位置１００で開始し、
（ii）  エッジ９２は画素位置４０で開始し、エッジ９４は画素位置１６０で開始し、
（iii）  エッジ８４は７０本の走査線にまたがり、エッジ８２は７０本の走査線にまたがり、
（iv）  エッジ８４はｓｌｏｐｅ＝−１を有し、エッジ８２はｓｌｏｐｅ＝＋１を有し、
（v）  エッジ９２はｓｌｏｐｅ＝０を有し、エッジ９４はｓｌｏｐｅ＝０を有し、
（vi）  エッジ９２および９４の各々は７０本の走査線にまたがる。
【００４７】
命令ストリーム１４およびエッジ情報１５の前述の例と各々が表される方法とから、図１０の画像７８において、画素位置（Ｘ）および走査線値（Ｙ）が、画像７８がレンダリングされる１つの出力空間を定義することが認識されるであろう。しかし、その他の出力空間構成も、本開示の原則を使用して実現することが可能である。
【００４８】
図１０は、ラスタ画像画素データを含まないので、ディスプレイリスト１３の記憶部分１６には何も格納する必要はない。この特徴については後述する。
【００４９】
ディスプレイリスト記憶装置１３は、画素順次レンダリング装置２０により読み出される。この画素順次レンダリング装置２０は、通常、集積回路として実現される。画素順次レンダリング装置２０は、例えば、プリンタ、ディスプレイまたはメモリ記憶装置のような別の装置に転送することが可能なラスタ画素１９のストリーム１９へとディスプレイリストを変換する。
【００５０】
好適な実施例では、画素順次レンダリング装置２０を集積回路として記述するが、ホストプロセッサ２などの汎用処理装置上で実行される同等のソフトウェアモジュールとして実現されても良い。
【００５１】
図５は、画素順次レンダリング装置２０、ディスプレイリスト記憶装置１３および一時レンダリング記憶装置３０の構成を示す。画素順次レンダリング装置２０の処理ステージ２２は、命令実行プログラム３００、エッジ処理モジュール４００、優先度判定モジュール５００、塗りつぶしカラー判定モジュール６００、画素合成モジュール７００、および画素出力モジュール８００を含む。処理動作は、前述のようにディスプレイリスト１３として同じ装置（例えば、磁気ディスクまたは半導体ＲＡＭ）を共有しても良く、あるいは、速度の最適化のために個別の記憶装置として実現されても良い一時記憶装置３０を使用する。
【００５２】
エッジ処理モジュール４００は、エッジレコード記憶装置３２を使用してエッジ情報を保持し、このエッジ情報は、走査線から走査線へと繰り越される。優先度判定モジュール５００は、優先性／状況テーブル３４を使用して各優先度に関する情報と走査線のレンダリング中のエッジ交差に対する各優先度の現在の状態とを保持する。塗りつぶしカラー判定モジュール６００は、塗りつぶしデータテーブル３６を使用して、ある位置における特定の優先度の塗りつぶしカラーを判定するのに必要な情報を保持する。画素合成モジュール７００は、値を判定するための複数の優先度から各色を必要とする出力画素を判定している間、画素合成スタック３８を使用して中間結果を保持する。
【００５３】
前述のディスプレイリスト記憶装置１３およびその他の記憶装置３２から３８は、ＲＡＭまたはその他の任意の記憶技術において実現されても良い。
【００５４】
図５の実施例で示される処理ステップは、処理パイプライン２２の形態を取る。この場合、パイプラインの各モジュールが、画像データのそれぞれ異なる部分で同時に並行して実行され、メッセージが後述するようにこれらのモジュール間で交わされても良い。別の実施例では、後述する各メッセージは、下流のモジュールに対する制御の同期転送の形態を取っても良い。上流の処理は、下流のモジュールがメッセージの処理を終了するまで中断される。
【００５５】
命令実行プログラム３００は、命令ストリーム１４からの命令を読んで処理し、その命令をメッセージの書式へと変換する。メッセージは、出力３９８を介してパイプライン２２内の他のモジュール４００、５００、６００、および７００へと転送される。好適な実施例では、命令ストリーム１４は、以下の命令を含んでも良い。
【００５６】
LOAD_PRIORITY_PROPERTIES：この命令は、優先性／状況テーブル３４へとロードされるデータ、およびデータがロードされるテーブル３４のアドレスと関連付けられる。命令実行プログラム３００によりこの命令が発行されるとき、命令実行プログラム３００は、優先性／状況テーブル３４の指定位置にデータを格納するためのメッセージを発行する。メッセージの発行は、このデータを含むメッセージの書式設定を行ない、処理パイプライン２２を介して格納動作を実行する優先度判定モジュール５００にメッセージを渡すことにより達成されても良い。
【００５７】
LOAD_FILL_DATA：この命令は、塗りつぶしデータテーブル３６へとロードされるデータ、およびデータがロードされるテーブル３６のアドレスと関連付けられる。命令実行プログラム３００によりこの命令が発行されるとき、命令実行プログラム３００は、塗りつぶしデータテーブル３６の指定アドレスにデータを格納するためのメッセージを発行する。メッセージの発行は、このデータを含むメッセージの書式設定を行ない、処理パイプライン２２を介して格納動作を実行する塗りつぶしデータ判定モジュールにメッセージを渡すことにより達成されても良い。
【００５８】
LOAD_NEW_EDGES_AND_RENDER：この命令は、次の走査線がレンダリングされるときにレンダリングプロセスへと導入される新規のエッジ１５のディスプレイリスト記憶装置１３のアドレスと関連付けられる。命令実行プログラム３００によりこの命令が発行されるとき、命令実行プログラム３００は、このデータを含むメッセージの書式設定を行ない、エッジ処理モジュール４００にメッセージを渡す。エッジ処理モジュール４００は、エッジレコード記憶装置３２に新規のエッジのアドレスを格納する。指定のアドレスにおけるエッジは、次の走査線がレンダリングされる前に初期走査線交点座標上でソートされる。一実施例において、エッジは、ディスプレイリスト生成プロセス１２によりソートされる。別の実施例では、画素順次レンダリング装置２０によりソートされる。
【００５９】
SET_SCANLINE_LENGTH：この命令は、各レンダリング済の走査線において生成される複数の画素と関連付けられる。命令実行プログラム３００によりこの命令が発行されるとき、命令実行プログラム３００は、エッジ処理モジュール４００および画素合成モジュール７００に値を渡す。
【００６０】
SET_OPACITY_MODE：この命令は、画素合成動作が不透明度チャネル（当該技術ではアルファチャネルとしても知られる）を使用するか否かを示すフラグと関連付けられる。命令実行プログラム３００によりこの命令が発行されるとき、命令実行プログラム３００は、画素合成モジュール７００中のフラグ値を渡す。
【００６１】
命令実行プログラム３００は、通常、命令をマッピングし、種々のモジュールへと渡すためにそれをパイプライン動作へと復号化するマイクロコード状態マシンにより形成される。対応するソフトウェアプロセスが代わりに使用されても良い。
【００６２】
走査線レンダリング走査中のエッジ処理モジュール４００の動作を図６を参照して説明する。走査線のレンダリングに対する初期条件は、エッジレコードの３つのリストが利用可能なことである。これらのリストのいずれか、あるいは、全てが空であっても良い。リストは、エッジ情報１５から得られ、LOAD_NEW_EDGES_AND_RENDER命令により設定された新規のエッジを含む新規のエッジリスト４０２、先行する走査線から繰り越されたエッジレコードを含むメインのエッジリスト４０４、および同じく先行する走査線から繰り越されたエッジレコードを含むあふれエッジリスト４０６である。
【００６３】
図１４Ａを参照すると、このようなエッジレコードの形式が示される。エッジレコードは以下の項目を含んでも良い。
（i）  現在の走査線交点座標（ここでは、Ｘ座標と呼ぶ）、
（ii）  このエッジの現在のセグメントがまたがる走査線の本数（実施例によっては、Ｙ限界として表されることもある）のカウント（ここでは、ＮＹと呼ぶ）、
（iii）  各走査線が終了する毎にこのエッジレコードのＸ座標に加えられる値（ここでは、ＤＸと呼ぶ）、
（iv）  優先度番号（Ｐ）または優先度番号のリストの索引（Ｐ）、
（v）  リストの次のエッジセグメントのアドレス（ａｄｄｒ）、および
（vi）  ｄ、ｃ、ｕ、ｏ、およびｐが付された１組のフラグ。このフラグについては、後でより詳細に説明する。
【００６４】
この形式は、ベクトルおよび直交するように構成されたエッジを含んでも良い。また、形式は、ＤＤＸと呼ぶ更なるパラメータを含んでも良い。ＤＤＸは、各走査線の終了後にこのエッジレコードのＤＸに加えられる値である。後者により、２次曲線から構成されるエッジのレンダリングが可能になる。ＤＤＤＸなどの更なるパラメータの追加により、このような構成は３次曲線を含むことが可能になるであろう。３次ベジェ曲線などの一部の適用例では、６次多項式（すなわち、最大ＤＤＤＤＤＤＸ）が要求されるかもしれない。フラグ（ｕ）は、巻数カウントをエッジにより増分すべきか、あるいは、減分すべきかを示す。巻数カウントは、塗りつぶしカウンタに格納され、現在走査中の画素が当該オブジェクトの内側にあるか、あるいは、外側にあるのかを判定するのに使用される。
【００６５】
図１０のエッジ８４および９２の例では、走査線２０における対応するエッジレコードは、表１に示すような値を示すであろう：
【００６６】
【表１】
0003797666.tif 000002
【００６７】
この記述では、レンダリングプロセスにより生成中であり、走査線に沿って１画素単位で刻まれる座標をＸ座標と呼び、１走査線単位で刻まれる座標をＹ座標と呼ぶ。各エッジリストは、メモリ中に連続的に配置された０個以上のレコードを含む。ポインタチェーンの使用を含むその他の記憶構成も利用可能である。３つのリスト４０２、４０４、および４０６の各々のレコードは、走査線の交差（Ｘ）座標の順に配置される。これは、通常、エッジ情報を含むメッセージを命令実行プログラム３００から受信するエッジ入力モジュール４０８により当初管理されるソートプロセスにより行なわれる。各走査線の交差座標の整数部分のみを重視するようにソートを緩和することが可能であるが、更に各走査線の交差座標を現在のレンダリングプロセスにより生成中の最小Ｘ座標および最大Ｘ座標に固定されているものと見なすことによってソートを緩和することも可能である。必要に応じて、エッジ入力モジュール４０８は、出力４９８を介してパイプライン２２の下流のモジュール５００、６００、および７００にメッセージを中継する。
【００６８】
エッジ入力モジュール４０８は、３つのリスト４０２、４０４、および４０６の各々への参照を維持すると共に、各リストからエッジデータを受信する。これらの参照の各々は、走査線の処理の開始時に各リストの第１のエッジを参照するように初期化される。その後、エッジ入力モジュール４０８は、選択されるエッジレコードが３つの参照されるエッジレコードの外側の最小Ｘ座標を有するエッジレコードであるように、３つのレコードのうちの１つからエッジレコードを選択する。Ｘレコードのうちの２つ以上が等しい場合、各レコードは、任意の順序で処理され、対応するエッジ交差は以下のように出力される。レコードを選択するのに使用された参照は、リストの次のレコードへと進められる。選択されたエッジは、メッセージの形式に設定され、エッジ更新モジュール４１０に送信される。また、エッジのある特定のフィールド、特に、現在のＸ、優先度番号、および方向フラグは、メッセージの形式に設定され、このメッセージがエッジ処理モジュール４００の出力４９８として優先度判定モジュール５００に転送される。ここで説明したリストより多いまたは少ないリストを使用する実施例も実現可能である。
【００６９】
エッジを受信すると、エッジ更新モジュール４１０は、現在のセグメントがまたがる走査線の数のカウントを減分する。カウントが０に達する場合、新規のセグメントが次のセグメントアドレスにより示されるアドレスから読み出される。セグメントは、以下の項目を指定するのが好ましい。
（i）  セグメントが読まれると直ちに現在のＸ座標に加えられる値、
（ii）  エッジに対する新規のＤＸ値、
（iii）  エッジに対する新規のＤＤＸ値、および
（iv）  新規のセグメントがまたがる走査線の本数の新規のカウント
【００７０】
示されたアドレスに次の利用可能なセグメントがない場合、そのエッジにおいて更なる処理は行なわれない。利用可能なセグメントがある場合、エッジ更新モジュール４１０は、エッジの次の走査線に対するＸ座標を計算する。この計算は、通常、現在のＸ座標を取り込み、それをＤＸ値に加えることを含むであろう。ＤＸは、処理中のエッジの種類に適するように、ＤＤＸ値を自身に加えるようにしても良い。続いて、エッジが、エッジプール４１２の利用可能な空きスロットへと書き込まれる。エッジプール４１２は、２つ以上のエッジレコードのアレイである。空きスロットがない場合、エッジ更新モジュール４１０は、スロットが利用可能になるまで待つ。エッジレコードがエッジプール４１２に書き込まれると、エッジ更新モジュール４１０は、新規のエッジがエッジプール４１２に加えられたことを線４１６を介してエッジ出力モジュール４１４に信号で伝える。
【００７１】
走査線のレンダリングの初期条件として、エッジ出力モジュール４１４は、次のメインのエッジリスト４０４’および次のあふれエッジリスト４０６’の各々に対する参照を有する。これらの参照の各々は、最初は空であるリスト４０４’および４０６’が作成された位置に初期化される。エッジがエッジプール４１２に加えられたことを示す信号４１６を受信すると、エッジ出力モジュール４１４は、加えられたエッジが次のメインのエッジリスト４０４’（存在する場合）に最後に書き込まれたエッジよりも小さいＸ座標を有するか否かを判定する。小さいＸ座標を有する場合、「あふれ」が生じたものとされるが、それは、配列基準を破らずにそのエッジをメインのエッジリスト４０４に付加することができないからである。あふれが発生すると、エッジは次のあふれエッジリスト４０６’に挿入される。ソートされた次のあふれエッジリスト４０６’を維持するように挿入されるのが好ましい。例えば、これは、ソフトウェア整列ルーチンを使用して達成されても良い。実施例によっては、Ｘ座標が過剰に大きいなどの他の条件がトリガとなってあふれが発生することもある。
【００７２】
エッジプール４１２に加えられたエッジが、次のメインのエッジリスト４０４’（存在する場合）に最後に書き込まれたエッジより大きいまたはそれに等しいＸ座標を有し、エッジプール４１２には利用可能な空きスロットがない場合、エッジ出力モジュール４１４は、エッジプール４１２から最小Ｘ座標を有するエッジを選択し、そのエッジを次のメインのエッジリスト４０４’に付加して処理中にリスト４０４’を拡張する。エッジにより占められていたエッジプール４１２のスロットは空きとなる。
【００７３】
エッジ入力モジュール４０８は、３つの入力リスト４０２、４０４、および４０６の全てから全エッジを読み出して転送すると、走査線の終端に到達したことを示すメッセージの形式を整え、それを優先度判定モジュール５００およびエッジ更新モジュール４１０の双方へと送信する。メッセージを受信すると、エッジ更新モジュール４１０は、現在実行中の処理が完了するのを待ってからメッセージをエッジ出力モジュール４１４へと送信する。メッセージを受信すると、エッジ出力モジュール４１４は、残る全てのエッジレコードをエッジプール４１２から次のメインのエッジリスト４０４’へとＸ順に書き込む。続いて、次のメインのエッジリスト４０４’およびメインのエッジリスト４０４への参照が、エッジ入力モジュール４０８とエッジ出力モジュール４１４との間で交換され、次のあふれエッジリスト４０６’およびあふれエッジリスト４０６に対して同様の交換が実行される。このようにして、以下の走査線に対する初期条件が確立される。
【００７４】
エッジレコードの挿入の際に、次のあふれエッジリスト４０６’をソートするのではなく、エッジレコードをリスト４０６’に加えるだけでも良い。走査線の終端に到達すると現在のあふれエッジリスト４０６への交換の前にソートされるリスト４０６’は、次の走査線のエッジラスタライズにおいてアクティブになる。
【００７５】
以上の説明から、エッジ交差メッセージが、走査線／画素順（すなわち、最初にＹ、次にＸにおいて順序付けされる）で優先度判定モジュール５００に送信され、各エッジ交差メッセージが、適用される優先度でラベル付けされることが推測可能である。
【００７６】
図１４Ａは、エッジのセグメントが受信されるときにエッジ処理モジュール４００により作成されるであろうアクティブエッジレコード４１８の構造を表す。エッジの第１のセグメントがステップ（直交）セグメントである場合、アクティブ化されたエッジのＸ位置を取得するために、エッジのＸ値が第１のセグメントに対する「Ｘｓｔｅｐ」と呼ばれる変数に加えられる。第１のセグメントがステップセグメントでない場合、エッジのＸ値が使用される。Ｘｓｔｅｐ値は、エッジのセグメントデータから得られ、次のセグメントに対するエッジレコードのＸ位置を取得するために次のセグメントのＸｅｄｇｅ値に１度追加される。これは、新規のエッジレコード中の各エッジがＸｅｄｇｅ＋Ｘｓｔｅｐによりソートされるであろうことを意味する。従って、第１のセグメントのＸｓｔｅｐは、各エッジの整列を簡略化するためには０となるべきである。
【００７７】
第１のセグメントのＹ値は、アクティブエッジレコード４１８のＮＹフィールドへとロードされる。アクティブエッジのＤＸフィールドは、ベクトルセグメントまたは２次セグメントのＤＸフィールド識別子からコピーされ、ステップセグメントに関しては０に設定される。セグメントが上向きである（図１５Ａに関する記述を参照）場合、図１４Ａに示すようなｕフラグが設定される。
【００７８】
エッジが、関連するクリッピングレベルなしに直接クリッピングオブジェクトとして使用され、閉曲線に適用可能な場合、ｄフラグが設定される。
【００７９】
セグメントの実際の優先度レベル、すなわち、レベルアドレスは、新規のエッジレコードの対応するフィールドからアクティブエッジレコード４１８のレベルフィールドへとコピーされる。セグメントリストの次のセグメントのアドレスは、新規のエッジレコードの対応するフィールドからアクティブエッジレコード４１８のセグメントアドレスフィールド（ｓｅｇｍｅｎｔ ａｄｄｒ）へとコピーされる。
【００８０】
セグメントアドレスは、エッジレコードの終結を示すのに使用されても良い。図１４Ａに示すエッジレコードの残るフィールドは、第２の動作モードを参照して後述する。
【００８１】
他のデータ構造も使用可能であり、例えば、多項式実現が使用される場合に必要であることが、図１４Ａから認識されるであろう。１つの代替データ構造において、セグメントが２次である場合、「ｓｅｇｍｅｎｔ ａｄｄｒ」フィールドは、セグメントリストの次のセグメントのアドレスであるか、あるいは、セグメントＤＤＸ値からコピーされるかのいずれかである。後者の場合、データ構造はｑフラグを有し、このｑフラグは、セグメントが２次セグメントである場合に設定され、２次セグメントでない場合にクリアされる。更なる変形例では、セグメントアドレスおよびＤＤＸフィールドは、別々のフィールドに分離されても良く、代替の実現例に適合するように追加のフラグが設けられても良い。
【００８２】
図１４Ｂは、好適な実施例において先に説明したエッジ処理モジュール４００で使用されるエッジレコードの構成を表す。エッジプール４１２は、新規のアクティブエッジレコード４２８、現在のアクティブエッジレコード４３０、およびあふれアクティブエッジレコード４３２により補足される。図１４Ｂにおいて明らかなように、レコード４０２、４０４、４０６、４０４’、および４０６’は、任意の１回でレンダリングされるエッジの本数により、サイズが動的に変動する。各レコードは限界値を含み、この限界値は、新規のエッジリスト４０２の場合にはLOAD_EDGES_AND_RENDER命令と共に取り入れられるＳＩＺＥ値により判定される。このような命令が発行されるときにはＳＩＺＥがチェックされ、０でない場合には、新規のエッジレコードのアドレスがロードされ、各リスト４０２、４０４、４０６、４０４’、および４０６’に対して限界サイズを判定する限界値が計算される。
【００８３】
好適な実施例では、エッジレコードの処理のためにアレイおよび関連するポインタを利用するが、連結リストなどのその他の実現例を使用しても良い。このような他の実現例は、ハードウェアベースまたはソフトウェアベースのものであっても良く、あるいは、それらの組み合わせであっても良い。
【００８４】
図１０に示す画像７８の特定のレンダリングを図１２に示す走査線３４、３５、および３６を参照して説明する。この例では、次の走査線に対する新規のＸ座標の計算は、明瞭にする目的で省略される。図１４Ｃから図１４Ｉは、エッジプール４１２のレジスタ４２８、４３０、および４３２のうちの１つから得られる出力エッジ交差を示す。
【００８５】
図１４Ｃは、走査線３４（半透明な青色の三角形８０の最上部）のレンダリング終了時の前述のリストの状態を示す。なお、走査線３４には新規のエッジはないため、リスト４０２は空である。
【００８６】
メインのエッジリスト４０４および次のメインのエッジリスト４０４’の各々は、エッジ８２および８４のみを含む。各リストは、走査線３４の完了後に対応するリストの次の空きレコードをポイントする対応ポインタ４３４、４３６、および４４０を含む。
【００８７】
また、各リストは、対応するリストの末尾をポイントするのに必要なアスタリスク（＊）で示される限界ポインタ４５０を含む。連結リストが使用される場合、このリストが対応する機能を実行するヌルポインタ終止符を含むときにはこれは必要とされないであろう。
【００８８】
前述のように、各走査線の開始時に、次のメインのエッジリスト４０４’およびメインのエッジリスト４０４はスワップされ、新規のエッジリスト４０２は新規のエッジを受け取る。残る各リストはクリアされ、各ポインタは各リストの第１のメンバに設定される。走査線３５の開始時に、構成は図１４Ｄに示すようになる。図１４Ｄから明らかなように、各レコードは４本のアクティブエッジを含み、このアクティブエッジは図１２から明らかなように、エッジ９２、９４、８４、および８２に対応する。
【００８９】
今度は、図１４Ｅを参照する。レンダリングが開始されると、新規のエッジレコード４０２の第１のセグメントがアクティブエッジレコード４２８へとロードされ、メインのエッジリスト４０４およびあふれエッジリスト４０６の第１のアクティブエッジレコードは、それぞれ、レコード４３０および４３２にコピーされる。この例では、あふれエッジリスト４０６は空であり、ローディングは行なわれない。レコード４２８、４３０、および４３２内のエッジのＸ位置が比較され、エッジ交差が、最小Ｘ位置のエッジに対して送出される。この場合、送出されたエッジは、優先度値と共に出力されるエッジ９２に対応するエッジである。続いて、ポインタ４３４、４３６、および４３８が更新され、リストの次のレコードをポイントする。
【００９０】
エッジ交差が送出されたエッジが更新され（この場合、位置にＤＸ＝０が加えられる）、エッジプール４１２にバッファリングされる。ここで、エッジプール４１２は、３つのエッジレコードを保存するようなサイズに設定されている。送出されるエッジが属していたリスト（この場合では、リスト４０２）の次のエントリが対応するレコード（この場合では、レコード４２８）へとロードされる。これは、図１４Ｆに示されている。
【００９１】
さらに、図１４Ｆから明らかなように、レジスタ４２８、４３０、および４３２間での比較により、最小Ｘ値のエッジが選択され、このエッジは、適切な次のエッジ交差（Ｘ＝８５、Ｐ＝２）として出力される。再度、選択された出力エッジが更新されてエッジプール４１２に加えられ、全ての適切なポインタが増分される。この場合、更新された値は、Ｘ←Ｘ＋ＤＸにより与えられる。この式は、８４＝８５−１として評価される。また、図１４Ｆから明らかなように、新規のエッジポインタ４３４が、この場合、新規のエッジレコード４０２の末尾に移動させられる。
【００９２】
図１４Ｇにおいて、最小の現在のＸ値と共に識別される次のエッジは、エッジ交差（Ｘ＝１１５、Ｐ＝２）として出力されるレジスタ４３０から得られるエッジである。エッジは再度更新され、その値は、図１４Ｇに示すようにエッジプール４１２に加えられる。このとき、エッジプール４１２が満杯になり、このエッジプール４１２から最小Ｘ値を伴うエッジが選択されて出力リスト４０４’へと送出され、対応する限定ポインタがそれに従って移動したことが図より明らかである。
【００９３】
図１４Ｈにおいて明らかなように、次の最小エッジ交差は、出力される（Ｘ＝１６０、Ｐ＝１）レジスタ４２８からのものである。エッジプール４１２は再度更新され、次の小さいＸ値が出力リスト４０４’へと送出される。
【００９４】
走査線３５の終端において、図１４Ｉにおいて明らかなように、エッジプール４１２の内容が最小Ｘ値の順に出力リスト４０４’に書き出される。図１４Ｊにおいて明らかなように、次のメインのエッジリスト４０４’およびメインのエッジリスト４０４は、次の走査線３６のレンダリングを見越して相互のポインタを交換することによりスワップされる。スワッピングの後、メインのエッジリスト４０４の内容がＸ位置の順で配置された走査線３６上に現在ある全てのエッジを含むことが図１４Ｊから明らかであり、このため、アクセスが便利になって高速レンダリングを容易に行なえるようになる。
【００９５】
通常、新規のエッジは、Ｘ位置の昇順にエッジ処理モジュール４００が受け取る。新規のエッジが到着するとその位置が更新され（レンダリング対象の次の走査線に対して計算される）、これにより、以下に示すように、更なる動作が決定される。
（ａ）  更新された位置がライン４３８上の最後のＸ位置出力より小さい場合、新規のエッジはメインのあふれエッジリスト４０６へと挿入ソートされ、対応する限界レジスタが更新され、
（ｂ）  更新された位置が最後のＸ位置出力より大きい場合で、空きがある場合は、エッジプール４１２に保存される。
【００９６】
前述の説明から明らかなように、エッジプール４１２は、ラスタライズ画像における次の走査線のレンダリングを見越して順序に従ってリスト更新を行なえるように支援する。更に、エッジプール４１２のサイズは、整列していないより多くの本数のエッジを収容するように変動させても良い。
【００９７】
しかし、このエッジプール４１２に事実上の限界があることは認識されるであろう。この限界は、通常、グラフィック処理システムにおける処理速度および使用可能なメモリに依存する。限定された意味において、エッジプール４１２は省略されても良いが、その場合、更新されたエッジが次の出力エッジリスト４０４’へと挿入ソートされる必要が通常生じるであろう。
【００９８】
しかし、好適な実施例では、この状況は、前述のあふれリストの使用により通常起こることとして回避される。あふれリストの提供により、実際的なサイズのエッジプールを伴う好適な実施例の実現が可能になり、ソフトウェア集約型の整列プロセスを用いることなしに、比較的複雑なエッジ交差を扱うことが可能になる。まれではあるが、エッジプールおよびあふれリストが複雑なエッジ交差を収容するのに不十分である場合には、整列方法を使用しても良い。
【００９９】
あふれリスト手順が利用される場合の例を、図１６Ａに示す。図１６Ａでは、３本の任意のエッジ６０、６１、および６３が、走査線ＡとＢとの間の相対的な位置で任意のエッジ６２と交わる。更に、走査線ＡおよびＢの各々に対する実際に表示される画素位置６４が、画素位置ＣからＪにまたがっているのが示される。エッジプール４１２が３つのエッジレコードを保存するようなサイズに設定される前述の例において、図１６Ａにおいて示されるように、この構成だけでは、隣接する走査線間で発生する３つのエッジ交差を収容するのに十分でないことが明らかであろう。
【０１００】
図１６Ｂは、走査線上のエッジ６０、６１、および６２をレンダリングした後のエッジレコードの状態を示す。エッジ交差Ｈは、ごく最近送出されたものであり、エッジプール４１２は、次の走査線である走査線Ｂにおいて、エッジ６０、６１、および６３のそれぞれに対して更新されたＸ値Ｅ、Ｇ、およびＩを有し、満杯である。エッジ６２が現在のアクティブエッジレコード４３０へとロードされ、エッジプール４１２が満杯であるので、エッジ６０に対応する最小Ｘ値は、出力エッジリスト４０４’に出力される。
【０１０１】
図１６Ｃにおいて、次のエッジ交差が送出され（エッジ６２に対してＸ＝Ｊ）、対応する更新された値が判定される。この場合、走査線Ｂに対してＸ＝Ｃである。新規の更新された値Ｘ＝Ｃは、出力リスト４０４’にコピーされた最新の値Ｘ＝Ｅよりも小さいので、現在のエッジレコードおよび対応する新規の更新された値は、直接出力あふれリスト４０６’へと転送される。
【０１０２】
図１６Ｄは、メインのリストおよび出力リストと、その対応するあふれ要素がスワップされた場合における走査線Ｂの開始時のエッジレコードの状態を示す。第１の送出されたエッジを判定するためには、エッジ６０は現在のアクティブエッジレジスタ４３０へとロードされ、エッジ６２は、あふれアクティブエッジレコード４３２へとロードされる。Ｘ値が比較され、最小Ｘ値（Ｘ＝Ｃ）を有するエッジ６２が送出され、更新されてエッジプール４１２へとロードされる。
【０１０３】
エッジの送出および更新は、メインのエッジリスト４０４の残るエッジに対して続けられ、走査線の終端に到達すると、エッジプール４１２がフラッシュされて図１６に示す状況を露呈し、この場合、エッジ６０から６３の各々は、次の走査線上でのレンダリングのために適切に順序付けされ、正確に送出されて走査線Ｂ上でレンダリングされる。
【０１０４】
前述の説明から明らかなように、あふれリストにより、複雑なエッジ交差状況が存在する際のエッジラスタライズ順序が維持される。更に、リストのサイズが動的に変動可能であることにより、エッジ交差の数および複雑度における大きな変動も、格別に複雑なエッジ交差以外の全てのエッジ交差において、整列手順を行なう必要なしに処理されるであろう。
【０１０５】
好適な実施例において、エッジプール４１２は、８つのエッジレコードを保存するようなサイズに設定され、リスト４０４および４０４’と関連するあふれリスト４０６および４０６’は、５１２バイトの基本（最小）サイズを有する。この基本サイズは動的に変動可能であり、複雑なエッジ交差条件を伴う大きな画像を扱うのに十分な範囲を取る。
【０１０６】
図７を参照して優先度判定モジュール５００の動作を説明する。エッジ処理モジュール４００からの入力メッセージ４９８は、優先度データ設定メッセージ、塗りつぶしデータ設定メッセージ、エッジ交差メッセージ、および走査線終端メッセージを含んでも良い。この入力メッセージ４９８が、優先度更新モジュール５０６により読まれる前に、最初に先入れ先出し（ＦＩＦＯ）バッファ５１８を通る。ＦＩＦＯ５１８は、エッジ処理モジュール４００の動作と優先度判定モジュール５００の動作とを分離するために動作する。
【０１０７】
前述のテーブル３４の一部を構成する優先度状態テーブル５０２は、各オブジェクトの優先度に関する情報を保持するのに使用される。ＦＩＦＯ５１８は、１回の動作でエッジ処理モジュール４００からの受信とエッジ交差の全走査線の優先度状態テーブル５０２への転送が可能なサイズに設定されるのが好ましい。これにより、優先度判定モジュール５００は、同じ画素（Ｘ）位置で複数のエッジ交差を正確に扱うことが可能になる。
【０１０８】
優先度状態テーブル５０２における各レコードは、以下の項目を記録するのが好ましい。
（i）  この優先度が、内側状態対外側状態をオッドイーブン塗りつぶしルール（odd-even fill rule）の適用により判定するか、あるいは、ノンゼロワインディング塗りつぶしルール（non-zero winding fill rule）の適用により判定するかを示す塗りつぶしルールフラグ、
（ii）  この優先度を実施するエッジが横断するたびに塗りつぶしルールにより示されるように修正される現在の塗りつぶしカウントを格納するための塗りつぶしカウンタ、
（iii）  この優先度がクリッピングに使用されるか、あるいは、塗りつぶしに使用されるかを示すクリッパフラグ、
（iv）  クリッパフラグが設定されているエッジに対して、クリッピングの型が「クリップイン」であるか「クリップアウト」であるかを記録するクリップ型フラグ、
（v）  この優先度を実施するクリップイン型のクリップ領域が入力／出力されるときに減分／増分され、この優先度を達成するクリップアウト型のクリップ領域が入力／出力されるときに増分／減分される現在のクリップカウントを格納するためのクリップカウンタ、
（vi）  この優先度が、それより下のレベルが最初に計算されることを要求するか否かを記録するフラグであり、「ニード・ビロウ（need−below）」フラグと呼ばれるフラグ
【０１０９】
クリッピングオブジェクトは公知であり、特定の新規のオブジェクトを表示するのではなく、画像中の別のオブジェクトの形状を修正するように動作する。また、クリッピングオブジェクトは、種々の視覚効果を達成するために、表示／非表示を行なうことが可能である。例えば、オブジェクト９０に作用してオブジェクト８０の下にあるオブジェクト９０の一部を除去するクリッピングオブジェクトとして図のオブジェクト８０を構成することが可能であろう。これには、オブジェクト９０の下のオブジェクトまたは画像、およびオブジェクト９０の不透明度により隠れるであろうクリッピングの範囲内のオブジェクトまたは画像を露出させる効果があっても良い。
【０１１０】
図１５Ａおよび図１５Ｂは、オブジェクトをアクティブ化するためのオッドイーブン・ルールおよびノンゼロワインディング・ルールの適用を実証する。ノンゼロワインディング塗りつぶしルールに関して、図１５Ａは、オブジェクト７０のエッジ７１および７２が、それぞれ、下向きであるか、あるいは、上向きであるかに従って、概念的な方向を割り当てられる様子を示す。閉じた境界を形成するために、エッジは境界の周囲に隙間なく連結される。塗りつぶしルール（適用および説明は後述）を行なうためにエッジに与えられる方向は、セグメントが定義される順序とは無関係である。各セグメントは、追跡される順序で定義され、レンダリング方向に対応する。
【０１１１】
図１５Ｂは、２本の下向きエッジ７３および７６と、３本の上向きのエッジ７４、７５、および７６を有する１つのオブジェクト（五角星形）を示す。オッドイーブン・ルールは、各エッジが当該走査線により横断されるときに、ブール値をトグルで切り換えるだけで動作し、それにより、効果的にオブジェクトの色を表示（アクティブ化）または非表示（非アクティブ化）にすることができる。ノンゼロワインディング・ルールは、横断されるエッジの方向によって、塗りつぶしカウンタに格納された値を増分／減分する。
【０１１２】
図１５Ｂにおいて、走査線と交わる最初の２本のエッジ７３および７６は下向きであり、これらのエッジの横断により、塗りつぶしカウンタは、それぞれ、＋１および＋２に増分される。走査線と交わる次の２本のエッジ７４および７７は上向きであるので、塗りつぶしカウンタは、それぞれ、＋１および０に減分される。
【０１１３】
ノンゼロワインディング・ルールは、塗りつぶしカウンタが０以外のときにオブジェクトの色を表示（アクティブ化）にし、塗りつぶしカウンタが０のときに非表示（非アクティブ化）にする。
【０１１４】
幾つかの実施例では、この情報の一部は、ディスプレイリスト１３および前述の種々のエッジリスト中のエッジと関連付けられ、エッジ交差メッセージの一部として優先度判定モジュール５００に転送される。特に、塗りつぶしルールフラグ、クリッパフラグ、クリップ型フラグ、およびニード・ビロウフラグは、このように扱っても良い。
【０１１５】
図７に戻って説明する。優先度更新モジュール５０６は、処理を完了した箇所までの走査線交差座標を記録するカウンタ５２４を維持する。これを優先度更新モジュール５０６の現在のＸと呼ぶ。走査線の開始時の初期値は０である。
【０１１６】
ＦＩＦＯ５１８の先頭で受信したエッジ交差メッセージを検査するときに、優先度更新モジュール５０６は、エッジ交差メッセージ中のＸ交差値を現在のＸと比較する。エッジ交差メッセージ中のＸ交差値が優先度更新モジュール５０６の現在のＸ以下である場合、エッジ交差メッセージは処理される。エッジ交差メッセージには２つの形態があり、エッジ交差メッセージ中の第１の優先度により示される優先度状態テーブル５０２中のレコードが、クリップ優先度でないことを示すクリッパフラグを有するときには「通常のエッジ処理」（後述）が使用され、クリップ優先度であることを示すクリッパフラグを有するときには「クリップエッジ処理」（後述）が実行される。
【０１１７】
優先度に対する塗りつぶしルールによると、その優先度に適用される境界エッジの内側に画素が存在する場合、優先度はその画素においてアクティブであり、優先度に対するクリップカウントは０である。優先度が最高のアクティブ優先度であるか、あるいは、その優先度より高い全てのアクティブ優先度の対応するニード・ビロウ・フラグが設定されている場合、優先度は公開される。このようにして、画素値は、公開された優先度の塗りつぶしデータのみを使用して生成されても良い。オブジェクトの優先度が、最後尾のオブジェクトから先頭のオブジェクトまでのオブジェクトの順でオブジェクトの位置（すなわち、レベル）を指定することに留意することが重要である。
【０１１８】
同じ塗りつぶし／合成動作を有し、連続シーケンスを形成する複数の非重複オブジェクトは、同じ優先度を有するものとして指定されるのが好ましい。これにより、塗りつぶしテーブル中のメモリ空間を効果的に節約できる。更に、オブジェクトの対応するエッジレコードは、対応する塗りつぶし／合成動作を参照するのに、対応する優先度を参照するだけで良い。加えて、本明細書を通して、「優先度（priority）」、「レベル（level）」、および「優先度レベル（priority level）」の各用語に言及する場合、これらの用語は、特に明記しない限りは本質的に同じことを意味するものとする。
【０１１９】
優先度に対するニード・ビロウ・フラグは、ディスプレイリストの情報内において定められ、このフラグが設定されない限り、当該優先度より低いいかなるアクティブ優先度も、レンダリング中の画素値に寄与しないことを画素生成システムに通知するのに使用される。必要以上の合成動作を防止するために必要に応じてフラグはクリアされる。クリアされない場合、フラグは最終的な画素値に対して何の寄与も行なわないであろう。
【０１２０】
「通常のエッジ処理」は、エッジ交差メッセージ中の優先度ごとに、その優先度により示される優先度状態テーブルレコードの各フィールドに関して、以下のステップを含む。
（i）  現在の優先度の現在の塗りつぶしカウントを記録するステップ、
（ii）  次のステップのいずれか、すなわち、
（ａ）  現在の優先度の塗りつぶしルールがオッドイーブン・ルールである場合、塗りつぶしカウントが現在０以外のときには塗りつぶしカウントを０に設定し、０のときには０以外の値に設定するステップ、もしくは、
（ｂ）  現在の優先度の塗りつぶしルールがノンゼロワインディング・ルールである場合、塗りつぶしカウントを増分または減分（エッジ方向フラグによる）するステップ、
（iii）  新規の塗りつぶしカウントを記録された塗りつぶしカウントと比較し、一方が０であると共に他方が０以外の場合、現在の優先度に対して「アクティブフラグ更新」（後述）動作を実行するステップ
【０１２１】
実施例によっては、各エッジ交差メッセージに複数の優先度を配置するのではなく、優先度毎に別個のエッジ交差メッセージを使用しても良い。
【０１２２】
アクティブフラグ更新動作は、最初に、現在の優先度に対して新規のアクティブフラグを確立することを含む。優先度状態テーブル５０２中の優先度に対する塗りつぶしカウントが０以外であり、優先度に対するクリップカウントが０である場合、アクティブフラグは０ではない。それ以外の場合は、アクティブフラグは０である。アクティブフラグ更新動作の第２のステップは、アクティブフラグアレイ５０８中の現在の優先度により示される位置に判定されたアクティブフラグを格納することである。現在の優先度に対する優先度状態テーブル中のニード・ビロウ・フラグが０の場合も、不透明アクティブフラグアレイ５１０中の現在の優先度により示される位置にアクティブフラグを格納する。
【０１２３】
「クリップエッジ処理」は、エッジ交差メッセージ中の第１の優先度により示される優先度状態テーブルレコードの各フィールドに関して、以下のステップを含む。
（i）  現在の優先度の現在の塗りつぶしカウントを記録するステップ、
（ii）  次のステップのいずれか、すなわち、
（ａ）  現在の優先度の塗りつぶしルールが奇偶ルールである場合、塗りつぶしカウントが現在０以外のときには塗りつぶしカウントを０に設定し、０のときには０以外の値に設定するステップ、もしくは、
（ｂ）  現在の優先度の塗りつぶしルールがノンゼロワインディングルールである場合、塗りつぶしカウントを増分または減分（エッジ方向フラグによる）するステップ、
（iii）  新規の塗りつぶしカウントを記録された塗りつぶしカウントと比較し、以下のクリップデルタ値うちのいずれかを判定するステップ：
（ａ）  新規の塗りつぶしカウントが０であると共に記録された塗りつぶしカウントが０である場合、または新規の塗りつぶしカウントが０以外であると共に記録された塗りつぶしカウントが０以外である場合には０、
（ｂ）  現在の優先度のクリップ型フラグがクリップアウトであると共に記録された塗りつぶしカウントが０以外の場合、または現在の優先度のクリップ型フラグがクリップインであると共に記録された塗りつぶしカウントが０である場合には＋１、
（ｃ）  それ以外の場合には、−１
（vi）  エッジ交差メッセージ中の第１の優先度に後続する全ての優先度に対して、後続の優先度により示される優先度状態テーブルのレコード中のクリップカウントに判定されたクリップデルタ値を加え、そのプロセスにおいて、クリップカウントが０以外の値から０へ、または０から０以外の値へと移った場合、その後続の優先度に対して前述のようなアクティブフラグ更新動作を実行するステップ
【０１２４】
なお、各クリップカウントの初期値は、前述のLOAD_PRIORITY_PROPERTIES命令により設定される。クリップカウントは、通常、各優先度に影響するクリップイン優先度の数に初期化される。
【０１２５】
実施例によっては、優先度をクリップと関連付けずに、エッジ交差メッセージ中において与えられた全ての優先度のクリップカウントを直接増分／減分する。この技術は、例えば、クリップの形状が単純であり、複雑な塗りつぶしルールの適用を必要としないときに使用することができる。この特定の適用例では、エッジにより制御されるレベルのクリップカウントは、上向きのエッジに対しては増分され、下向きのエッジに対しては減分される。反時計回りの単純な閉曲線は、クリップインとして動作し、一方、時計回りの単純な閉曲線は、クリップアウトとして動作する。
【０１２６】
エッジ交差メッセージ中のＸ交差値が、優先度更新モジュール５０６の現在のＸよりも大きい場合、優先度更新モジュール５０６は、いくつの画素を生成すべきかのカウントを形成する。このカウントは、エッジ交差メッセージ中のＸ交差値と現在のＸとの差分であり、優先度生成メッセージの形式に設定される。メッセージは、接続５２０を介して優先度生成モジュール５１６に送信される。優先度更新モジュール５０６は、優先度生成モジュール５１６から所定数の画素に対する処理が完了したことを示す信号５２２が送信されるのを待つ。信号５２２を受信すると、優先度更新モジュール５０６は、現在のＸをエッジ交差メッセージ中のＸ交差値に設定し、前述のように処理を続行する。
【０１２７】
優先度生成モジュール５１６は、テーブル３４内に形成された優先度データテーブル５０４に関して動作する。このテーブル５０４は、各優先度に関する情報を保持するのに使用される。優先度データテーブル５０４中の各レコードは、以下の項目を含んでも良い。
（i）  塗りつぶしテーブルアドレス、
（ii）  塗りつぶしの型、
（iii）  ラスタ・オペレーション・コード、
（iv）  アルファチャネル・オペレーション・コード、
（v）  「ソースポップ」フラグ
（vi）  「宛先ポップ」フラグ
（vi）  この優先度の色が所定のＹに対して一定であるか否かを記録するフラグで、ここでは、「x-independent」フラグと呼ばれるフラグ
【０１２８】
優先度生成メッセージ５２０を受信すると、優先度生成モジュール５１６は、供給されたカウントにより示される回数だけ「画素優先度生成オペレーション」（後述）を実行し、その上で、優先度更新モジュール５０６に対してオペレーションを完了したことを信号５２２により伝える。
【０１２９】
各画素優先度生成オペレーションは、最初に不透明アクティブフラグ配列５１０に対して優先度符号器５１４（４０９６ビットから１２ビットの優先度符号器など）を使用して最高の不透明アクティブフラグの優先度番号を判定することを含む。この優先度（存在する場合）は、優先度データテーブル５０４にインデックス付けするのに使用され、参照されるレコードの内容により、優先度生成モジュール５１６からの塗りつぶし優先度メッセージ出力が形成され、塗りつぶしカラー判定モジュール６００へと送信される。
【０１３０】
更に、優先度が前のステップにより判定されていた（すなわち、少なくとも１つの不透明アクティブフラグが設定されていた）場合、判定された優先度が保持され、「現在の優先度」とされる。優先度が判定されなかった場合、現在の優先度は０に設定されている。
【０１３１】
優先度生成モジュール５１６は、アクティブフラグ配列５０８に対して修正優先度符号器５１２を繰り返し使用して、現在の優先度よりも大きい最低アクティブフラグを判定する。判定された優先度（存在する場合）は、優先度データテーブル５０４にインデックス付けするのに使用され、参照されるレコードの内容により、塗りつぶし優先度メッセージが形成され、優先度判定モジュール５００へと送信５９８される。判定された優先度は、現在の優先度を更新するのに使用される。
【０１３２】
このステップは、判定される優先度がなくなる（すなわち、現在の優先度より大きく、フラグが立てられている優先度が、アクティブフラグ中にはない）まで繰り返し使用される。優先度生成モジュール５１６は、画素終端メッセージを形成し、それを塗りつぶしカラー判定モジュール６００へと送信する。
【０１３３】
前述の基本オペレーションよりも好適な特徴として、優先度生成モジュール５１６は、各メッセージのx-independentフラグの値を記録し、シーケンスの第１の画素を処理する間、このメッセージを塗りつぶしカラー判定モジュール６００へと転送する。全ての転送されたメッセージのx-independentフラグが指定されている場合、隣接するエッジ交差間の画素の範囲で全ての後続するメッセージをカウント−１の１回の繰り返し指定により置き換えることが可能である。これは、シーケンスにおける以降の全ての処理の代わりに、繰り返しメッセージを生成し、それを塗りつぶしカラー判定モジュール６００に送信することによって行なわれる。
【０１３４】
前述の基本オペレーションよりも好適な別の特徴として、優先度生成モジュール５１６は、レベル生成メッセージが終了するたびに、接続５２２を介して優先度更新モジュール５０６に最高不透明優先度を送信する。優先度更新モジュール５０６は、この優先度を記憶装置５２６に保持する。続いて、優先度更新モジュール５０６は、メッセージ中のＸ交差が現在のＸよりも大きいことを調べる簡単な検査の代わりに、メッセージ中のＸ交差が現在のＸよりも大きく、メッセージ中の各レベルの少なくとも１つが最高の不透明優先度以上であることを調べる検査を画素優先度生成メッセージを生成する前に実行する。この検査により、より少ない回数の画素優先度判定オペレーションが行なわれ、より長い繰り返しシーケンスが生成されるであろう。
【０１３５】
図１０および図１１に示すグラフィックオブジェクトの例を使用して、図１４Ｃから図１４Ｊに示されるエッジ交差を使用する走査線３５に対して、前述の優先度更新プロセスを示すことができる。このプロセスは、図１７Ａから図１７Ｅにおいて示される通りである。
【０１３６】
図１７Ａから図１７Ｅは、優先度テーブル５０２および５０４のオペレーションを示す。好適な実施例において、これらのテーブルは、レベルアクティブ化テーブル５３０と呼ばれる１つのテーブルに結合される。このテーブルは、配列５０８および５１０と符号器５１２および５１４とを伴う。
【０１３７】
図１７Ａにおいて明らかなように、走査線のためにエッジ交差メッセージがエッジ処理モジュール４００から受信され、テーブル５３０へとロードされる。このテーブルは優先度順に整列される。この例では、エッジ交差メッセージは、エッジ横断のノンゼロワインディング・ルールによる増分方向を含む。優先度テーブル５３０中のエントリが設定されない場合もある。
【０１３８】
５３０で示されるレベルアクティブ化テーブルは、塗りつぶしカウントのための列エントリを含む。列エントリは、ノンゼロワインディング・ルール、または場合によってはオッドイーブン・ルールに従って、エッジから判定される。need-belowフラグは、優先度の特性であり、LOAD_PRIORITIES_PROPERTIES命令の一部として設定される。テーブル５３０がロードされるとき、need-belowフラグは、全ての優先度レベルに対して設定される。「クリップカウント」および「塗りつぶしインデックステーブル」などの他の列が使用されても良いが、この例においては、説明の簡略化のために省略する。アクティブなレベルがない場合、対応するエントリは０に設定される。更に、配列５１０および５０８の値は、後続のエッジ交差を受信した後にテーブル５３０から更新される。
【０１３９】
明瞭なものとするため、複数のレコードが省略されていることが図１７Ａから明らかであろう。通常、レベルアクティブ化テーブル５３０は、優先度順に整列された以下のレコードを含むであろう。
−  塗りつぶしカウント、
−  クリップカウント、
−  塗りつぶしの型、
−  （i）need-belowフラグ（ii）クリップの型（iii）クリッパフラグ、を含むアクティブ化条件およびフラグ、
−  （i）ラスタ・オペレーションコード（ii）アルファチャネル・オペレーションコード（iii）「ソースポップ」フラグ（iv）「宛先ポップ」フラグ（v）x-independentフラグ、を含む合成グラフィックスオペレーションおよびフラグ、
−  塗りつぶしルール、
−  属性、
−  塗りつぶしテーブルインデックス
【０１４０】
テーブル５３０の内容は、優先度判定モジュール５００において使用されていないときには、画素生成の場合は塗りつぶしカラー判定モジュール６００、合成オペレーションの場合は画素合成モジュール７００へとメッセージとして渡される。
【０１４１】
走査線３５に対する第１のエッジ交差（図１４Ｅ）は、図１７Ａにおいて示される。ここで、Ｐ＝１の場合、ノンゼロワインディング・ルールに従って、塗りつぶしカウントは、エッジの値に更新される。このレベルに対する「need-below」フラグは、当該オブジェクトが不透明なときにはドライバソフトウェアにより０に設定される。
【０１４２】
テーブル５３０の前の状態は設定されなかったので、配列５１０および５０８は未設定のままであり、優先度符号器５１４は、優先度の出力ができない。これが、優先度生成モジュール５１６により解釈され、優先度生成モジュール５１６は、「オブジェクトなし」優先度（例えば、Ｐ＝０）に対してカウントｎ＝４０（画素）を出力する。「オブジェクトなし」優先度は、走査線３５の第１の空白部分である。
【０１４３】
図１７Ｂは、図１４Ｆのエッジ交差が受信されたときの構成を示す。塗りつぶしカウンタは更新される。続いて、配列５１０および５０８が、テーブル５３０の前の最高レベルで設定される。このとき、モジュール５１６は、半透明な三角形８０との交差の前に、不透明な赤色のオブジェクト９０のエッジ９２を表すカウントｎ＝４５、Ｐ＝１を出力する。
【０１４４】
図１７Ｃは、図１４Ｇのエッジ交差が受信されたときの構成を示す。尚、塗りつぶしカウントは、ノンゼロワインディング・ルールのために、下向きに調整されている。現在のエッジ交差を受信する前に有効であるオブジェクトは不透明ではないので、修正優先度符号器５１２を使用して、優先度Ｐ＝２を最高アクティブレベルとして選択する。この優先度は、ｎ＝（１１５−８５）＝３０画素に対する現在の優先度として出力される。
【０１４５】
図１７Ｄは、図１４Ｈのエッジ交差が受信されたときの構成を示す。尚、Ｐ＝２に対して先に変更された「need-below」は、アクティブフラグ配列５０８に転送されており、優先度符号器は、ｎ＝（１６０−１１５）＝４５画素に対して現在の値Ｐ＝１を出力することができる。
【０１４６】
図１７Ｅは、図１４Ｉのエッジ交差が受信されたときの結果を示す。ｎ＝（１８０−１６０）＝２０画素に対してＰ＝０の出力を提供する。
【０１４７】
優先度判定モジュール５００は、走査線の全ての画素に対して、画素のカウントおよび対応する優先度表示値を出力する。
【０１４８】
塗りつぶしカラー判定モジュール６００のオペレーションを図８を参照して説明する。優先度判定モジュール５００からの入力メッセージ５９８は、塗りつぶしデータ設定メッセージ、繰り返しメッセージ、優先度設定メッセージ、画素終端メッセージ、および走査線終端メッセージを含んでも良い。入力メッセージ５９８は、最初に塗りつぶし参照・制御モジュール６０４へと渡される。塗りつぶし参照・制御モジュール６０４は、塗りつぶしカラー判定モジュール６００の種々の構成要素により使用するために、現在のＸ位置カウンタ６１４および現在のＹ位置カウンタ６１６を維持する。
【０１４９】
走査線終端メッセージを受信すると、塗りつぶし参照・制御モジュール６０４は、現在のＸカウンタ６１４を０にリセットし、現在のＹカウンタ６１６を増分する。続いて、走査線終端メッセージは、画素合成モジュール７００に渡される。
【０１５０】
塗りつぶしデータ設定メッセージを受信すると、塗りつぶしモジュール６０４は、塗りつぶしデータテーブル３６の指定位置６０２にデータを格納する。
【０１５１】
繰り返しメッセージを受信すると、塗りつぶし参照・制御モジュール６０４は、繰り返しメッセージからのカウントにより現在のＸカウンタ６１４を増分する。その後、繰り返しメッセージは、画素合成モジュール７００に渡される。
【０１５２】
画素終端メッセージを受信すると、塗りつぶし参照・制御モジュール６０４は、現在のＸカウンタ６１４を増分し、その後、画素終端メッセージは、画素合成モジュール７００に渡される。
【０１５３】
塗りつぶし優先度メッセージを受信すると、塗りつぶし参照・制御モジュール６０４は、以下に示すようなオペレーションを実行する。
（i）  塗りつぶし優先度メッセージを使用してテーブル３６のレコードサイズを選択する
（ii）  塗りつぶし優先度メッセージからの塗りつぶしテーブルアドレスおよび先に判定したレコードサイズを使用して、塗りつぶしデータテーブル３６からレコードを選択する
（iii）  塗りつぶし優先度メッセージからの塗りつぶしの型を使用して、サブモジュールを判定、選択して塗りつぶしカラーの生成を実行する。サブモジュールは、ラスタ画像モジュール６０６、フラットカラーモジュール６０８、線形傾斜カラーモジュール６１０、および不透明度タイルモジュール６１２を含んでも良い。
（iv）  判定されたレコードを選択されたサブモジュール６０６から６１２に供給する
（v）  選択されたサブモジュール６０６から６１２は、供給されたデータを使用して色および不透明度値を判定する
（vi）  判定された色および不透明度を塗りつぶし優先度メッセージからの残る情報、すなわち、ラスタオペレーションコード、アルファチャネルオペレーションコード、ソースポップフラグ、および宛先ポップフラグと組み合わせ、色合成メッセージを形成する。この色合成メッセージは、接続６９８を介して画素合成モジュール７００へと送信される。
【０１５４】
好適な実施例において、判定された色および不透明度は、通常の８ビット精度の４倍の３２ビット／画素のＲＧＢおよび不透明度である。しかし、暗示された不透明度の４倍のＣＭＹＫ、あるいは、他の多数の周知の色表現のうちの１つを代わりに使用しても良い。以下ではＲＧＢおよび不透明度の場合を説明するが、この説明は他の場合にも適用しうる。
【０１５５】
ラスタ画像モジュール６０６、フラットカラーモジュール６０８、線形傾斜カラーモジュール６１０、および不透明度タイルモジュール６１２について説明する。
【０１５６】
フラットカラーモジュール６０８は、３つの８ビット色成分（通常、ＲＧＢ成分として解釈される）および８ビット不透明度値（通常、指定色により塗られる画素の断片の測定単位として解釈される。０は塗りつぶしがない、すなわち、完全に透明であることを意味し、２５５は完全に塗りつぶされている、すなわち、完全な不透明であることを意味する）を含む固定形式のレコードとして供給されたレコードを解釈する。この色および不透明度値は、接続６９８を介して直接出力され、更なる処理を行なわずに判定された色および不透明度を形成する。
【０１５７】
線形傾斜カラーモジュール６１０は、３つの色成分および１つの不透明度成分と関連付けられた３つの定数ｃｘ、ｃｙ、およびｄの４つの組を含む固定形式のレコードとして供給されたレコードを解釈する。４つの組の各組に対して、以下の式を使用して、３つの定数と現在のＸカウントのｘおよび現在のＹカウントのｙとを組み合わせることによって結果値ｒが計算される。
【０１５８】
r ＝ clamp(cx * x + cy * y + d)
【０１５９】
ただし、関数clampは以下のように定義される。
0003797666.tif 000003
このように生成された４つの結果より、色および不透明度値が形成される。この色および不透明度値は、接続６９８を介して直接出力され、更なる処理を行なわずに判定された色および不透明度を形成する。
【０１６０】
不透明度タイルモジュール６１２は、３つの８ビット色成分、８ビット不透明度値、整数Ｘ相（ｐｘ）、Ｙ相（ｐｙ）、Ｘスケール（ｓｘ）、Ｙスケール（ｓｙ）、および６４ビットマスクを含む固定形式のレコードを供給されたレコードとして解釈する。これらの値は、ディスプレイリスト生成において生じ、最初のページ記述に通常含まれる。ビットマスク中のビットアドレスａは、以下の式により判定される。
【０１６１】
a = ((x/2SX + px) mod 8) + ((y/2SY + py) mod 8) x 8
【０１６２】
ビットマスク中のアドレスａにおけるビットが検査される。検査されたビットが１の場合、レコードからの色および不透明度が直接モジュール６１２の出力にコピーされ、判定された色および不透明度を形成する。検査されたビットが０の場合、３つの０成分値および０不透明度値を有する色が形成され、判定された色および不透明度として出力される。
【０１６３】
ラスタ画像モジュール６０６は、６つの定数ａ、ｂ、ｃ、ｄ、ｔｘ、およびｔｙと、サンプリングされるラスタ画像画素データ１６の各ラスタ行中のビット数（ｂｐｌ）の整数カウントと、画素の型とを含む固定形式のレコードを供給されたレコードとして解釈する。画素の型は、ラスタ画像画素データ中の画素データ１６が以下に示す画素のうちのどの画素として解釈されるかを示す。
（i）  １ビット／画素の不透明な黒色／白色の画素、
（ii）  １ビット／画素の不透明な黒色の画素または透明な画素、
（iii）  ８ビット／画素のグレースケールの不透明な画素、
（iv）  ８ビット／画素の黒色の不透明度スケール画素、
（v）  ２４ビット／画素の不透明な３色成分画素、または
（vi）  ３２ビット／画素の３色成分＋不透明度画素
【０１６４】
ラスタ画像モジュール６０６は、画素の型の標識を使用してビット単位での画素サイズ（ｂｐｐ）を判定する。その後、以下の式で表されるラスタ画像画素データ１６中のビットアドレスａが計算される。
【０１６５】
a = bpp*floor(a*x+c*y+tx) + bpl*floor(b*x+d*y+ty)
【０１６６】
レコード６０２からの画素の型によって解釈された画素は、ラスタ画像画素データ１６中の計算されたアドレス「ａ」からフェッチされる。画素は、必要に応じて、３つの８ビット色成分および８ビット不透明度成分を有するように拡張される。「拡張される（expanded）」とは、例えば、８ビット／画素のグレースケール不透明ラスタ画像からの画素が、ＲＧＢ成分および完全な不透明に設定された不透明度成分の各々に対して適用されるサンプリングされた８ビット値を有するであろうことを意味する。これにより、画素合成モジュール７００に対する判定された色および不透明度出力６９８が形成される。
【０１６７】
結果として、表示可能なオブジェクト内で有効なラスタ画素データが、メモリ１６内の画素画像データに対するマッピングの判定を介して得られる。これにより、ラスタ画素データのオブジェクトベースの画像へのアフィン変換が効果的に実現される。この方法は、画像ソースからグラフィックオブジェクトとの合成が行なわれるであろうフレームメモリへ画素を転送する従来技術よりも効率的である。
【０１６８】
前述の例よりも好適な特徴として、ラスタ画像画素データ１６中の画素間での補間が、最初に以下の式に従って中間結果ｐおよびｑを計算することによって、オプションとして実行されても良い。
【０１６９】
p = a * x + c * y + tx
q = b * x + d * y + ty
【０１７０】
次に、ラスタ画像画素データ１６中の４つの画素のビットアドレスａ００、ａ０１、ａ１０、およびａ１１が、以下の式に従って判定される。
【０１７１】
a00 = bpp * floor(p) + bpl * floor(q)
a01 = a00 + bpp
a10 = a00 + bpl
a11 = a00 + bpl + bpp
【０１７２】
次に、結果画素成分値ｒが、以下の式に従って色および不透明度ごとに判定される。
【０１７３】
r = interp(interp(get(a00),get(a01),p),interp(get(a10),get(a11),p),q)
ただし、関数interpは以下のように定義される。
interp(a,b,c) = a + (b - a) * (c - floor(c))
【０１７４】
前述の各式において、floor(value)は床関数演算であり、これはvalueの小数部を切り捨てて、valueより大きくない最大の整数を得る演算である。
【０１７５】
ｇｅｔ関数は、所定のビットアドレスにおけるラスタ画像画素データ１６からサンプリングされる現在の画素成分の値を戻す。なお、この値は、ある画素の型の一部の成分に対しては、黙示の値を取ることが可能である。
【０１７６】
前述の例よりも好適な特徴として、供給されたレコードから読み出されたタイルサイズを用いて係数演算を行なうことにより現在のＸカウンタ６１４および現在のＹカウンタ６１６から得られた前述の式中のｘ値およびｙ値を使用することによって、画像タイル張りがオプションとして実行されても良い。
【０１７７】
更に多くの塗りつぶしカラー生成サブモジュールが利用可能である。
【０１７８】
画素合成モジュール７００のオペレーションを説明する。塗りつぶしカラー判定モジュール６００からの入力メッセージは、繰り返しメッセージ、色合成メッセージ、画素終端メッセージ、および走査線終端メッセージが、順番に処理される。
【０１７９】
繰り返しメッセージまたは走査線終端メッセージを受信すると、画素合成モジュール７００は、更なる処理を行なわずにそのメッセージを画素出力ＦＩＦＯ７０２へと転送する。
【０１８０】
色合成メッセージを受信すると、画素合成モジュール７００は、通常、一般的に言って、色合成メッセージからの色および不透明度を色合成メッセージからのラスタオペレーションおよびアルファチャネルオペレーションにより画素合成スタック３８から取り出される色および不透明度と結合する。その後、画素合成モジュール７００は、結果を合成スタック３８に戻す。色合成メッセージの受信の際に実行される処理の記述を以下で行なう。
【０１８１】
画素終端メッセージを受信すると、画素合成モジュール７００は、画素合成スタック３８から色および不透明度を取り出す。例外的に、スタック３８が空の場合には、不透明な白色の値が使用される。結果として生じる色および不透明度により、画素出力メッセージが形成され、このメッセージは、画素出力ＦＩＦＯへと転送される。
【０１８２】
周知の合成手法の１つが、Porter, TおよびDuff, Tの「Compositing Digital Images」（Computer Graphics, Vol. 18 No. 3 (1984) pp. 253-259）に記載されている。PorterおよびDuffの合成オペレーションの例を、図２３に示す。しかし、このような手法では、合成物により形成される交差領域中のソースおよび宛先の色のみを扱うことが可能であり、交差領域における透明度の影響を吸収することができない点において問題がある。この結果、PorterおよびDuffにより定義されるラスタオペレーションは、透明性がある場合には実質的な効力がない。
【０１８３】
色合成メッセージを受信した際に画素合成モジュール７００により実行される処理を説明する。
【０１８４】
色合成メッセージを受信すると、画素合成モジュール７００は、最初にソースの色および不透明度を形成する。これは、ポップソースフラグが色合成メッセージ中で設定されていない限り、色合成メッセージにおいて提供される色および不透明度から得られる。この場合には代わりに、画素合成スタック３８から色が取り出される。このとき、あるいは、画素合成スタックの取り出し中に、画素合成スタック３８が空であることが判明した場合、エラーの表示を行なわずに不透明な白色値が使用される。次に、宛先の色および不透明度が、画素合成スタック３８から取り出される。但し、色合成メッセージ中で宛先ポップフラグが設定されていない場合、「取り出し」オペレーション中にスタックポインタは妨害されないので、事実上、これがスタック３８の最上部からの読み出しになる。
【０１８５】
ソースの色および不透明度を宛先の色および不透明度と結合する方法を図９Ａから図９Ｃを参照して説明する。色および不透明度値は、通常、０から２５５の範囲内の８ビット値として格納されるが、この説明においては、０から１の範囲にあるものと見なされる（すなわち、正規化される）。２つの画素を合成するために、各画素は、完全に不透明な領域と完全に透明な領域の２つの領域に分割されるものと見なされる。不透明度値は、これらの２つの領域の比率を示すものである。
【０１８６】
図９Ａは、不図示のある３成分色値と不透明度値（ｓｏ）を有するソース画素７０２を示す。ソース画素７０２の陰影部は、画素７０２の完全に不透明な部分７０４を表す。同様に、図９Ａの非陰影領域は、ソース画素７０２のうちの完全に透明と見なされる比率７０６を表す。
【０１８７】
図９Ｂは、ある不透明度値（ｄｏ）を有する宛先画素７１０を示す。宛先画素７１０の陰影領域は、画素７１０の完全に不透明な部分７１２を表す。同様に、画素７１０は、完全に透明な部分７１４を有する。ソース画素７０２および宛先画素７１０の不透明な領域は、結合のために相互に直交するものとされる。
【０１８８】
これらの２つの画素のオーバレイ７１６が図９Ｃに示される。注目画像領域が３つ存在し、これらの領域には、ｓｏ＊（１−ｄｏ）の面積を有する宛先を除くソース領域７１８と、ｓｏ＊ｄｏの面積を有するソースと宛先の共通領域７２０と、（１−ｓｏ）＊ｄｏの面積を有するソースを除く宛先領域７２２とが含まれる。これらの３つの領域の各々の色値は、概念上別々に計算される。宛先を除くソース領域７１８は、ソースの色から直接色を取得する。ソースを除く宛先領域７２２は、宛先の色から直接色を取得する。ソースと宛先の共通領域７２０は、ソースの色と宛先の色との結合から色を取得する。ソースの色と宛先の色を結合するプロセスは、先に検討した他のオペレーションとは異なり、ラスタオペレーションと呼ばれ、画素合成メッセージからラスタオペレーションコードにより指定される１組の関数のうちの１つである。好適な実施例に含まれるラスタオペレーションの一部を本明細書に添付した図面の図９Ｄに示す。
【０１８９】
各関数は、ソースの色および宛先の色の対応する色成分の各対に適用され、結果として生じる色において同様の成分が得られる。その他の多くの関数も利用可能である。
【０１９０】
画素合成メッセージからのアルファチャネル・オペレーションも考慮される。アルファチャネル・オペレーションは、３つのフラグを使用して実行される。各フラグは、ソース画素７０２および宛先画素７１０のオーバレイ７１６中の注目画像領域のうちの１つに対応する。アルファチャネルオペレーションにおける対応するフラグが設定されていない場合、各領域に対して０の領域不透明度値が形成される。フラグが設定されている場合、それは領域の面積である。
【０１９１】
合成不透明度は、領域不透明度の合計から形成される。続いて、合成色の各成分が、領域の色／領域の不透明度の各対の積の合計を合成不透明度で割った値により形成される。
【０１９２】
合成色および不透明度は、画素合成スタック３８へと押し込まれる。
【０１９３】
表現ツリーは、画像を形成するのに必要な合成オペレーションを記述するのに使用されることが多く、通常、葉ノード、単項ノード、およびバイナリノードを含む複数のノードから構成される。葉ノードは、表現ツリーの最も外側のノードであり、子孫ノードを持たず、画像の基本要素を表す。単項ノードは、単項演算子の下のツリーの部分からの画素データを修正するオペレーションを表す。バイナリノードは、通常、左右のサブツリーへと分岐し、各サブツリーは、それ自体が少なくとも１つの葉ノードから構成される表現ツリーである。
【０１９４】
任意の形状のオブジェクトを用いて合成するときに、前述の種々のスタックオペレーションが、画像の区域によって異なるという問題が発生する。このオペレーションは、特定の位置においてアクティブなオブジェクトによって決まる。
【０１９５】
図１９Ａおよび図１９Ｂは、ソース（Ｓ）と宛先（Ｄ）との間の典型的なバイナリオペレーション（表現ツリーとして示される）を示す。実際のオペレーションが実行されるか否かに関わらず、図１９Ａのバイナリオペレーションは、以下に示すように４つの場合、すなわち、アクティビティ領域に分けられる。
１．  （Ａ）Ｓ  アクティブ、  （Ｂ）Ｄ  非アクティブ、
２．  （Ａ）Ｓ  アクティブ、  （Ｂ）Ｄ  アクティブ、
３．  （Ａ）Ｓ  非アクティブ、（Ｂ）Ｄ  アクティブ、
４．  （Ａ）Ｓ  非アクティブ、（Ｂ）Ｄ  非アクティブ
【０１９６】
例４では、常に、実行する必要があるオペレーションがない（ＮＯＰ）結果となり、バイナリツリーに対するアクティブレベルの３つの異なる組み合わせが存在することになる。３次、４次、および更に高い次数のツリーへのこの概念の拡張は、当業者には明らかであろう。
【０１９７】
結果として、合成スタック３８（バイナリの例に対して）を作成するときには、前述の３つの識別されたオペレーションのうちの１つがスタックにより実現される必要がある。更に、スタック中の各オブジェクトと関連付けられた様々なオペレーションは、レベルアクティブ化テーブル中のオブジェクトの下に何があるかによって決まる。簡単なＯＶＥＲオペレーションを使用するオブジェクトのレンダリングに対しては、画家アルゴリズムと同様に問題は発生しない。
【０１９８】
しかし、他の合成オペレーションに対しては、合成オペレーションのオペランドのアクティビティによってスタックオペレーションが変更される必要がある。これは、スタックオペレーションを提供する各レベルをクリッピングすることによって行なうことができるが、各レベルに適用されるクリップの数が急激に増加する可能性があり、スタックオペレーションを扱う上で困難が生じることになる。
【０１９９】
問題となるオペレーションの例は、図２３において示されるPorter／DuffオペレーションのＯＵＴとＲＯＵＴである。図２３において、オブジェクト（オペランド）は、他のオブジェクトをクリッピング（他のオブジェクトの境界を変更）し、共通領域において変動的な透明度を有する。
【０２００】
この問題に対処するために、「アクティビティ」テーブルと呼ばれる更なるテーブルが設けられる。このテーブルは、レベルアクティブ化テーブルの付属テーブルとして動作し、前述の代替アクションの論理的な判定を提供する。
【０２０１】
図２０Ａは、実質的に３つの区分を含む汎用アクティビティテーブル８００を示す。第１の区分８０２は、処理中の指定塗りつぶしレベルに対するアクティブ化条件を提供する。第２の区分８０４は、先の説明で各レベルに（特に、バイナリの例に）適しているとされた様々なアクションの各々を含む。第３の区分８０６は、特定のレベルにおいてソースオブジェクトまたは宛先オブジェクトがアクティブであるか否かを示す。尚、アクション区分８０４に含まれる各エントリは、それ自体が特定のオペレーションであっても、あるいは、必要に応じてレベルアクティブ化テーブルに対するポインタであっても良い。
【０２０２】
また、場合によっては、種々のオペレーションにより他のオペレーションにデータを供給することが可能であることにも留意すべきである。結果として、アクティビティテーブル８００をオペレーションがデータを供給する種々の条件を示すフラグを組み込むように修正することができる。
【０２０３】
アクティビティテーブルの好適な形態に対するデータ構造が、テーブル８１０として図２０Ｂにおいて示される。テーブル８１０は、データを使用する次のオペレーションに対するエントリへのポインタ８１４（Ｎｅｘｔ Ｌｅｖｅｌ）とオペレーションがデータを供給している表現ツリーの枝を示すフラグ８０６（Ｓｒｃ＿Ａｃｔｉｖｅ／Ｄｅｓｔ＿Ａｃｔｉｖｅ）（あるいは、３次または更に高い次数のツリーが使用される１組のフラグ）とを含む。
【０２０４】
また、テーブル８１０は、オペレーションがデータをソース枝または宛先枝に供給しているのか否かを示すフラグ８１６を含む。データを供給している場合、オペレーションのアクティビティ状態８１８が変化するときには、次のレベルエントリ中のＳｒｃ＿ＡｃｔｉｖｅフラグまたはＤｅｓｔ＿Ａｃｔｉｖｅフラグ８０６が調節される。オペレーションは、ある組み合わせにおいてデータを供給するだけであるので、更に、これを示すためにフラグ８１２（ｄａｔａ＿ｉｎ＿＊）が設けられる。
【０２０５】
フラグ８１２は、Ｓｒｃ／Ｄｅｓｔ＿Ａｃｔｉｖｅフラグ８０６と協働して、レベルのアクティビティ状態を判定する。更に、アクティビティ状態が変化する場合には、いかなるオペレーションも次のレベルの状態を変更するだけで良いので、ノードアクティブフラグ８１８は、このような状況を監視するために設けられる。
【０２０６】
したがって、右の葉ノードに対しては、押し込みオペレーションと次のオペレーションレコード中のＤｅｓｔ＿Ａｃｔｉｖｅフラグとをアクティブ化する必要がある。左の葉ノードに対しては、エッジ交差上のＳｒｃ＿Ａｃｔｉｖｅフラグをアクティブ化する必要があり、宛先が既にアクティブである可能性があることを記録する。
【０２０７】
図２０Ｂにおいて、アクティブ化条件８０２は、葉ノードのアクティブ化を判定する塗りつぶしルールとレベルアクティブ化テーブルに対して前述のように使用される塗りつぶしカウントとを含む。クリップカウントも前述のように動作する。エッジ交差は、テーブル８１０中のレベル（ソースレベル）をアクティブ化する。
【０２０８】
レベルのアクティブ化状態が変化するとき、その変化は、Ｎｅｘｔ Ｌｅｖｅｌエントリ８１４によりポイントされるレベルへと伝播する。Ｄａｔａ＿ｉｓ＿Ｓｒｃフラグ８１６の状態により、Ｓｒｃ＿Ａｃｔｉｖｅ／Ｄｅｓｔ＿Ａｃｔｉｖｅフラグ８０６は、次のレベルにおいて変更される。次のレベルの状態も変化する場合、その変化は伝播する。テーブルエントリは、例１、例２、および例３のそれぞれに対するオペレーションを含む。これらは、レベルアクティブ化テーブル内の各レベルに対するポインタであっても、実際のオペレーション（アルファオペレーション、カラーオペレーション、塗りつぶしの型フラグ、およびスタックオペレーションフラグ）であっても良い。あるいは、オペレーションが必要とされない場合は、ヌルであっても良い。
【０２０９】
ノードレベルのアクティブ化状態は、ｄａｔａ＿ｉｎ＿Ｓ∩Ｄ￣ｏｐフラグ、ｄａｔａ＿ｉｎ＿Ｓ∩Ｄｏｐフラグ、ｄａｔａ＿ｉｎ＿Ｓ￣∩Ｄｏｐフラグ８１２、およびノードレベルに対するＳｒｃ／Ｄｅｓｔ＿Ａｃｔｉｖｅフラグ８０６により判定されるように、表現ツリーにおける次のオペレーションに対してデータがあるか否かにより判定される。これは、Ｎｏｄｅ＿Ａｃｔｉｖｅフラグ８１８としてリスト中に記述される。
【０２１０】
この実現例を、図２１における表現ツリー８３０に示す。対応する初期のアクティビティテーブル８２０が図２２Ａに示される。
【０２１１】
表現ツリー８３０は、オペランドＡ、Ｂ、およびＣのページへのレンダリングを規定する。完全にするために、ページは、右の葉ノードＰＡＧＥとしてツリー８３０において示されている。ＰＡＧＥは、常にアクティブであり、画像出力空間全体を包含するので、アクティビティテーブル８２０から省略されても良い。
【０２１２】
ＢおよびＣはリーフノードであるので、テーブル８２０の下位レベルを形成し、それぞれに対してアクティブ化オペレーション８０４が行なわれることになる。このアクティブ化オペレーション８０４により、各演算子は合成スタックに押し込まれる可能性がある。各々が右のリーフノードであり、Ｃが最初に押し込まれる。オペランドＣに対しては何のオペレーションも行なわれないので、Ｓ￣∩ＤｏｐはＮＯＰである。ｄａｔａ＿ｉｎ＿＊ｏｐフラグ８１２、Ｎｅｘｔ Ｌｅｖｅｌフラグ８１４、およびＤａｔａ＿ｉｓ＿Ｓｒｃフラグ８１６も更新される。オペランドＢに対しては、対応するアクションが行なわれることになる。
【０２１３】
アクティビティテーブル８２０の次のレベルは、左の葉ノードＡおよびその対応する演算子Ｏｐ２により形成される。このレベルに対するアクティブ化オペレーション８０４が更新され、Ｓ￣∩ＤｏｐおよびＳ∩Ｄｏｐは、修飾子ａまたはｂにより修飾されるＡｏｐ２Ｂである。修飾子ａおよびｂはオペレーション間の相違を表す。オペレーションＯｐ２は、Ｓにおいてデータを供給するだけであり、これは、Ｄがアクティブであり且つＳがアクティブでない場合（すなわち、Ｓ￣∩Ｄｏｐ）、スタックからＢを取り出すアクティビティにより表される。
【０２１４】
テーブル８２０の次のレベルはＯｐ１に関し、アクティブ化オペレーション８０４において修飾された結果であるａ、ｂ、およびｃを生成する。最後のレベルｏｖｅｒに対して、ＰＡＧＥは常にアクティブであるので、Ｓ∩Ｄ￣ｏｐおよびＳ∩Ｄ￣ｏｐは、ＮＯＰがスタックに押し込まれる結果となる。単純な共通部Ｓ∩Ｄｏｐのみが、オーバ・アクティブ（over active）である。
【０２１５】
この例に関して、Ａ、Ｂ、およびＣが最初非アクティブで、これらのオペランドが後で順番にアクティブ化される場合を検討する。
【０２１６】
Ａが最初にアクティブ化される場合、このレベルにおいてＡＯｐ２ａがアクティブ化され、Ｓｒｃ＿Ａｃｔｉｖｅフラグ８０６の設定により反映される。Ｓ∩Ｄ￣フラグ８１２が設定される（Ｂはまだアクティブでないため）ので、Ｎｏｄｅ＿Ａｃｔｉｖｅフラグ８１８がそのレベルに対して設定される。Ｎｏｄｅ＿Ａｃｔｉｖｅの状態が変化したので、ＯｐｌレベルにおけるＳｒｃ＿Ａｃｔｉｖｅフラグ８０６が設定される。なお、Ｄａｔａ＿ｉｓ＿Ｓｒｃフラグ８１６がＡＯｐ２レベルに対して設定される。
【０２１７】
Ｏｐｌレベルは、Ｓｒｃ＿Ａｃｔｉｖｅおよび（ｄｅｓｔ＿Ａｃｔｉｖｅ）￣（Ｃはまだアクティブ化されていないため）を有するので、Ｏｐ１ａがこのレベルにおいてアクティブ化される。Ｓ∩Ｄ￣が設定されるので、Ｎｏｄｅ＿Ａｃｔｉｖｅ８１８がＯｐ１レベルに対して設定される。Ｎｏｄｅ＿Ａｃｔｉｖｅ８１８の状態が変化したので、ｏｖｅｒレベルにおけるＳｒｃ＿Ａｃｔｉｖｅフラグ８０６が設定される。ｏｖｅｒレベルはＳｒｃ＿ＡｃｔｉｖｅおよびＤｅｓｔ＿Ａｃｔｉｖｅを有する（ＰＡＧＥは常にアクティブであるため）ので、ｏｖｅｒはこのレベルにおいてアクティブ化される。Ｓ∩Ｄが設定されるので、Ｎｏｄｅ＿Ａｃｔｉｖｅが設定され、Ｎｏｄｅ＿Ａｃｔｉｖｅの状態は変化しない。これ以上のアクションは要求されない。この段階において、合成スタック３８はテーブル８２０から生成され、図２２Ｂに示すような外観となる。
【０２１８】
ここで図２２Ｃを参照されたい。Ｂが次にアクティブ化される場合、Ｓ∩Ｄ￣が設定される（Ｄは無関係）ので、このレベルにおいてＰｕｓｈ Ｂがアクティブ化される。このレベルに対してＮｏｄｅ＿Ａｃｔｉｖｅ８１８が設定される。Ｎｏｄｅ＿Ａｃｔｉｖｅフラグの状態が変化したので、ＡＯｐ２レベルにおけるＤｅｓｔ＿Ａｃｔｉｖｅフラグが設定される。続いて、ＡＯｐ２ｂＢがアクティブ化され、ＡＯｐ２ａＢが非アクティブ化される。Ｓ∩Ｄが設定されるので、Ｎｏｄｅ＿Ａｃｔｉｖｅは設定された状態を維持し、Ｎｏｄｅ＿Ａｃｔｉｖｅフラグの状態はＡＯｐ２ａに対して不変である。これ以上のアクションは起こらない。合成スタック３８は、図２２Ｄに示すような外観になる。
【０２１９】
図２２Ｅにおいて明らかなように、Ｃが次にアクティブ化される場合、Ｐｕｓｈ Ｃがこのレベルにおいてアクティブ化される。Ｓはアクティブ、Ｄは無関係であるので、Ｎｏｄｅ＿Ａｃｔｉｖｅ８１８がこのレベルに対して設定される。Ｎｏｄｅ＿Ａｃｔｉｖｅが変化したので、Ｏｐ１レベルにおけるＤｅｓｔ＿Ａｃｔｉｖｅフラグが設定される。Ｏｐ１ｂがアクティブ化されるので、Ｏｐ１ａは非アクティブ化される。Ｓ∩Ｄにおけるデータが設定されるので、Ｎｏｄｅ＿Ａｃｔｉｖｅフラグは設定された状態を維持する。Ｎｏｄｅ＿ＡｃｔｉｖｅはＯｐ１レベルに対して不変であるので、更なるアクションは要求されない。合成スタック３８は、図２２Ｆに示すような外観になる。
【０２２０】
この手順は、図２１の表現ツリー全体の評価の間続行されるので、種々のオペレーションが確立されるように、アクティビティテーブル８２０が規定される。種々のオペレーションは、種々のアクティブ化条件８０２およびアクティビティ標識８０４により必要とされる場合には合成スタックへと押し込まれることもある。このようにして、実行されるクリッピングまたはその他のオペレーションの型に関わらず、評価される表現ツリーの複雑度に関係なく正確なレベルにおける正確なオペレーションを行なうことでスタックを維持することが可能である。表現ツリーの大きさはディスプレイリストの形成を介して評価されるが、ディスプレイリストの生成は、通常、クリッピングなどの種々のオブジェクトのオペレーションにおけるばらつきを説明することができない。これらのオペレーションは、合成表現の評価中に実現される必要がある。
【０２２１】
更なるフラグ、すなわち、エッジ交差によりアクティブ化されるであろうｓｒｃ＿ｉｓ＿ｌｅａｆ＿ｎｏｄｅに対するフラグ、およびｄｅｓｔ＿ｉｓ＿ＰＡＧＥ（常にアクティブ）に対するフラグが有用であることに更に留意すべきである。ｄｅｓｔ＿ｉｓ＿ＰＡＧＥの場合、起こり得ないケースとして無視することが可能である。
【０２２２】
以上の説明では、アクティビティテーブル８２０が表現ツリー８３０の構造に基づいて作成される様子と、ツリー８３０の種々のオペランドのアクティブ化の変更を介してエントリが完成される（すなわち、記入される）様子とを示している。テーブル８２０の特定の例に対して、様々なアクティブ化および可能な結果を説明するために、７２個（＝２ｘ２ｘ３ｘ３ｘ２）のスタック構造を生成することが可能である。このようにして、条件８０２、８０６、８１２、８１４、８１６、および８１８の論理的評価により、特定のレベルに対する適切なスタックオペレーションとして識別される正確なアクティビティ８０４がもたらされる。
【０２２３】
代替の実現例において、アクティビティテーブル８２０は、独立のテーブルとして構成されるのではなく、レベルアクティブ化テーブル５３０へと結合され、結合されたテーブル８３０が得られる。これにより、データの複製が防止される一方で、優先度符号器５１２および５１４は、正確なエッジ優先度のみならずアクティブ化オペレーションも選択することが可能になり、アクティブ化オペレーションは、モジュール６００から得られた塗りつぶしカラーを使用して画素合成モジュール７００により評価されるように、画素合成スタック３８へと（徐々に）転送される。このような構成は、図２２Ｇにおいて機能的に表される。
【０２２４】
あるいは、図２２Ｈにおいて機能的に示されるように、アクティビティテーブル８２０は、レベルアクティブ化テーブル５３０より先行しても良い。この場合、塗りつぶしカウントおよびクリップカウントに対する列は、アクティビティテーブル８２０に含まれ、レベルアクティブ化テーブル５３０からは省略されても良い。更なる代替の構成では、図２２Ｉにおいて機能的に示されるように、アクティビティテーブル８２０は、レベルアクティブ化テーブル５３０の後に続いても良い。その場合、塗りつぶしカウントおよびクリップカウントは、レベルアクティブ化テーブル５３０に含まれているので、アクティビティテーブル８２０は、これらのカウントを省略することができる。アクティビティテーブル８２０が図２２Ａに示すように構成される一部の適用例では、レベルアクティブ化テーブル５３０は省略されても良い。
【０２２５】
アクティビティテーブル８２０およびスタック３８を参照して先に説明したオペレーションコードは、ディスプレイリストおよび特に命令ストリーム１４（図５参照）から得られる。オペレーションコードは、他のデータ（エッジ交差、塗りつぶしデータなど）と同時に図５に示す処理ステージのパイプラインを介して転送され、画素合成モジュール７００は、優先度判定、レベルアクティブ化、および塗りつぶし判定の結果として判定順にｏｐコードをスタックへ押し込む。
【０２２６】
画素出力モジュール８００のオペレーションを説明する。入力メッセージが画素出力ＦＩＦＯから読み取られる。この入力メッセージには、画素出力メッセージ、繰り返しメッセージ、および走査線終端メッセージが含まれ、これらのメッセージは順番に処理される。
【０２２７】
画素出力メッセージを受信すると、画素出力モジュール８００は画素を格納すると共に、それを出力に転送する。繰り返しメッセージを受信すると、最後に格納された画素が、繰り返しメッセージからのカウントにより指定される回数だけ出力８９８に転送される。走査線終端メッセージを受信すると、画素出力モジュール８００は、そのメッセージを出力に渡す。
【０２２８】
出力８９８は、必要に応じて画素画像データを利用する装置に接続しても良い。このような装置には、ビデオ表示装置またはプリンタなどの出力装置、ハードディスクおよびラインメモリ、バンドストアまたはフレームメモリを含む半導体ＲＡＭなどのメモリ記憶装置、またはコンピュータネットワークが含まれる。しかし、前述の説明から明らかなように、レンダリングプロセス中の画素画像データの中間記憶を必要とせずに、高度なグラフィック記述言語により要求される完全な機能性をもってグラフィックオブジェクトのレンダリングを行なう方法および装置が説明される。
【０２２９】
＜１．２  第２のモードによる動作＞
コンピュータシステム１は、レンダリング済のページの走査線を横断するときに各エッジを追跡し、エッジごとに走査方向における横断の最小範囲および最大範囲を判定し、次の走査線に対してエッジ位置を定義するレコードのリスト３２に追加のレコードを配置するメカニズムを具備する。これらのレコード３２は、次の走査線に対して昇順へとソートされる。これらのレコードの各々は、次の走査線上で読み込まれるときに、優先度判定モジュール５００に対するメッセージを生成する。続く段落で検討されるように、各メッセージは、優先度判定モジュール５００に対して、エッジが適用されるレベルと関連付けられた種々のカウンタを増分または減分するように命令する。
【０２３０】
画素順次レンダリング装置２０において、優先度判定モジュール５００は、エッジ処理モジュール４００からメッセージを受信する。優先度判定モジュール５００は、各優先度レベルが塗りつぶしカウンタを含むレベルのテーブルと、レベルにより部分的に、あるいは、全体的に表されるオブジェクトがアクティブ化される条件を含むレコードとを具備する。
【０２３１】
また、各レベルは、レベルにより表されるオブジェクトがアクティブの画素を構成するときに実行される合成オペレーションを含む。オブジェクトがアクティブのときに幾つかの命令が実行される必要がある場合、命令ごとにレベルが要求される。
【０２３２】
オブジェクトのトポロジを定義する塗りつぶしルールが、各テーブルエントリに含まれる。塗りつぶしルールは、オブジェクトがノンゼロワインディング塗りつぶしルールを使用するか、あるいは、オッドイーブン塗りつぶしルールを使用するかを示すために、各レベルにおいてフラグビットを使用して定義されるのが好ましい。ノンゼロワインディング塗りつぶしルールでは、塗りつぶしカウンタ値が０以外の場合、オブジェクトはアクティブであり、カウンタ値が０の場合は非アクティブである。これに対し、オッドイーブン塗りつぶしルールでは、塗りつぶしカウンタ値が奇数の場合（すなわち、塗りつぶしカウンタの最下位ビットがアサートされる場合）、オブジェクトはアクティブであり、カウンタ値が偶数の場合は非アクティブである。異なるＸ位置値を有する２本の連続するエッジ間の画素連が、アクティブ命令を使用して塗りつぶされる。連続するエッジメッセージが同じＸ位置を有する場合、画素連は生成されないことが明らかであるので、全画像が画素順に構築される。
【０２３３】
優先度判定モジュール５００は、別のカウンタの追加、すなわち、オーバーライドカウンタを具備するのが好ましい。第２の動作モードにおける装置２０は、オーバーライドカウンタが０以外のときに塗りつぶしルールを無効にする。更に、エッジ処理モジュール４００と優先度判定モジュール５００との間のエッジ交差メッセージは、オブジェクトのエッジが接する画素に対してはオーバーライドカウンタが０以外に設定され、接しない画素に対しては０に設定されるように構成される。残る画素に対しては、塗りつぶしルールおよび塗りつぶしカウンタが、オブジェクトがアクティブか否かを判定する。
【０２３４】
画素順次レンダリング装置２０において、走査線は一度に完全に処理される。レンダリングシーケンスにおける第１のステップとして、現在の走査線と交わる各エッジが、現在処理中の走査線ごとにアクティブエッジレコードのソート済のリストから得られる。先に説明したように、各エッジは、優先度判定モジュール５００において１つ以上のレベルを制御し、ディスプレイリスト中のアクティブレベルからの命令のみが実際に最終画素値に寄与するように、制御するレベルをアクティブ化したり、あるいは、非アクティブ化したりする。
【０２３５】
前節で検討した第１の動作モードで優先度判定モジュールにおいてエッジ位置を計算し、レベルをアクティブ化するメカニズムは、エッジが接する全ての画素がアクティブ化されなければならない場合には不十分である。第１の動作モードでは、エッジの軌跡を判定するために、Ｙ方向には画素精度、Ｘ方向には副画素精度でエッジが計算される。従って、セグメントのＹ範囲は、整数表現を使用して格納され、セグメントのＸ範囲は、固定小数点表現を使用して格納される。これに対し、第２の動作モードでは、エッジの軌跡を判定するために、エッジはＸ方向と同様にＹ方向にも副画素精度で計算される。このため、セグメントのＹ範囲は、新規のエッジを備えたセグメントデータ形式においても、アクティブエッジ自体においても、固定小数点表現を使用して格納される。この目的で浮動小数点表現が使用されても良い。
【０２３６】
第２の動作モードでは、エッジレコードの２つのクラスが使用される。
【０２３７】
エッジレコードの第１のクラスは、前節において説明したように、第１の動作モードで使用される型のエッジレコードと同等であり、これにより後続の走査線上のエッジ位置が計算される。また、エッジレコードの第１のクラスは、エッジの次の走査線との共通部分のＸ範囲の一端を指定するために提供される。
【０２３８】
エッジレコードの第２のクラスは、エッジの次の走査線との共通部分のＸ範囲の他端を指定するために提供される。エッジレコードの第２のクラスは、破棄される前は１本の走査線に対して存在する。レコードは、直ちに破棄されるべきものであり、後続の走査線上のエッジの位置を計算するための情報は必要とされないため、エッジレコードから除外されても良い。
【０２３９】
エッジレコードのこの第２のクラスにおけるエッジレコードを以降は終端レコード（terminating record）と呼び、第１のクラスのエッジレコードを継続エッジレコード（continuing edge record）と呼ぶ。また、第２の動作モードにおいて、塗りつぶしルールに対する各レベルにおける塗りつぶしカウンタに基づく優先度状態テーブル（５０２）は、別のカウンタを追加することにより拡張される。このカウンタを以降はオーバーライドカウンタと呼ぶ。以下の説明で明らかになるであろうが、オーバーライドカウンタは、エッジが接する画素に対しては０以外であり、塗りつぶしカウンタの状態に関わらず、これらの画素が確実にアクティブ化されるようにするために使用される。
【０２４０】
ここで図２６を参照されたい。図２６では、このような優先度状態テーブルの好適な形式が示される。優先度判定モジュール５００のレベルアクティブ化メカニズムに対する各レベルにおいて３つのカウンタがある。第２の動作モードに関連する２つは、塗りつぶしカウンタとオーバーライドカウンタである。前節で説明した個別のクリッピングメカニズムに対してクリップカウンタが提供される。前節で説明したように、カウンタに加えて、アクティブなときにレベルにより実行されるオペレーションを管理する複数のフィールドが存在する。いずれの走査線上でも、各レベルにおける塗りつぶしカウンタが使用され、そのレベルに関連し、走査線の開始以来横断されたエッジの本数がカウントされる。これは、塗りつぶしルールと共に使用され、塗りつぶしルールフラグの状態により示されて、レベルが１つの画素に対してアクティブであるか、あるいは、一連の画素に対してアクティブであるかが判定される。
【０２４１】
オーバーライドカウンタは、エッジが次の走査線へと渡る前にエッジの軌跡がまたがる走査線の区分に対して、塗りつぶしカウンタを無効にするために使用される。このため、以下の条件のうちのいずれかが発生するとき、レベルはアクティブである。
（i）  ノンゼロワインディング塗りつぶしルールを示す塗りつぶしルールフラグがデアサートされ、塗りつぶしカウンタが０以外のとき、
（ii）  オッドイーブン塗りつぶしルールを示す塗りつぶしルールフラグがアサートされ、塗りつぶしカウンタが奇数のとき、
（iii）  オーバーライドカウンタが０以外のとき
【０２４２】
優先度判定モジュールのレベルアクティブ化メカニズムの各レベルにおいてオーバーライドカウンタを制御するために、エッジレコードに格納されるアクティブ化情報に付加ビットが加えられる。付加ビットをオーバーライドフラグと呼ぶ。
【０２４３】
図１４Ａに戻る。図１４Ａでは、アクティブエッジレコードの形式が示される。先に述べたように、以下の項目に対するフィールドが存在する。
（i）  現在のＸ位置、
（ii）  次の走査線またはその一部上のエッジ位置を取得するためにＸ位置に加えられるＤＸ値、
（iii）  別のセグメントが読み込まれる前に、Ｙ方向にどの程度までエッジが延伸しなければならないのかについてのレコードＮＹ、
（iv）  エッジ中の次のセグメントのアドレスであるセグメントアドレス、
（v）  エッジが影響を及ぼす優先度に対する１つの優先度インデックスおよびエッジが影響を及ぼす優先度のリストのアドレスのいずれかを含み、オブジェクトをレンダリングするのに幾つかのグラフィカルオペレーションが要求される場合、あるいは、クリッピングオブジェクトが複数の他のオブジェクトに影響を及ぼす場合に、優先度のリストのアドレスを含むことが要求されるであろう値Ｐ、
（vi）  ｄ、ｃ、ｕ、ｏ、およびｐの１組のフラグ
【０２４４】
終端レコードにおいては、ＤＸ、ＮＹ、セグメントアドレスフィールド、およびエッジを更新するための他の任意のフィールド（例えば、ＤＤＸおよびより高い次数の項目）は要求されないので、これらは除外されても良い。
【０２４５】
前節で説明したように、エッジ追跡がより高い次数に対して実行される場合は、ＤＤＸおよびより高い次数の項目に対して、追加のフィールドが使用されても良い。
【０２４６】
第１の動作モードでは、ＮＹ値が格納されて整数値として維持される。しかし、第２の動作モードでは、ＮＹは副画素精度で格納される。この精度は、固定小数点または浮動小数点の数としての格納を要求する。ハードウェアによる実現例では、通常は、固定小数点記憶装置を使用するのがより便利である。
【０２４７】
フラグｄ（ＤＩＲＥＣＴ＿ＣＬＩＰ）は、エッジがクリッピングカウンタに影響を及ぼすのか、あるいは、塗りつぶしカウンタに影響を及ぼすのかを判定し、クリッピングメカニズムのために使用される。クリッピングメカニズムについては、先に説明したのでここでは取り上げない。
【０２４８】
フラグｃ（ＣＯＮＴＩＮＵＩＮＧ）は、エッジが継続エッジ（フラグｃはアサートされる）か、あるいは、終端エッジ（フラグｃはデアサートされる）かを判定する。
【０２４９】
フラグｕ（ＵＰ）は、塗りつぶしカウンタが継続エッジにより増分されるか、あるいは、減分されるかを判定する。オーバーライドカウントにのみ影響を及ぼす終端レコードの場合、フラグｕは無視される。
【０２５０】
フラグｏ（ＯＶＥＲＲＩＤＥ）は、オーバーライドカウントがエッジにより増分されるか、あるいは、減分されるかを判定する。
【０２５１】
フラグｐ（ＰＯＳＴＳＣＲＩＰＴ）は、イネーブルビットであり、アサートされるときにオーバーライドメカニズムを使用可能にする。フラグｐがアサートされるとき、フラグｃおよびｏは前述の意味を有する。フラグｐがデアサートされるとき、フラグｃおよびｏは無視されても、他の目的のために使用されても良い。
【０２５２】
第２の動作モードにおいて、次の走査線に対してエッジの位置が計算されるとき、継続エッジは、ページを横断する（Ｘ方向に）のみならず、ページを縦断して（Ｙ方向に）副画素精度で追跡される。走査線内の現在のＹ位置を格納するために、ｄＮＹと呼ばれるメモリまたはレジスタが設けられる。追跡が開始されると、エッジごとにｄＮＹレジスタは０に初期化される。走査線を横断するエッジの軌跡中にエッジの最小Ｘ位置および最大Ｘ位置を格納するために、ＭｉｎＸおよびＭａｘＸと呼ばれる２つのメモリまたはレジスタが設けられる。エッジレコードがメモリから読み込まれるとき、走査線へのエッジのエントリ位置がこれらの２つのレジスタへとロードされる。エッジの位置は走査線内で追跡され、Ｘ方向における最小軌跡および最大軌跡も追跡される。
【０２５３】
ここで図２４Ａ、図２４Ｂを参照されたい。図２４Ａ、図２４Ｂでは、第２の動作モード中に画素順次レンダリング装置２０においてエッジを追跡する方法２４００が示される。方法２４００は、ステップ２４０２で開始され、ステップ２４０４へと進む。ステップ２４０４において、現在の最小Ｘ値を有するエッジレコードが読み込まれる。この方法２４００は、エッジレコードがオブジェクトのエッジが接する全ての画素がそのオブジェクトにより塗りつぶされることを示すフラグｐを含むときに実現される。エッジレコードがフラグｐを含まないときには、画素順次レンダリング装置２０は、第１の動作モードで動作する処理へと進む。この処理についてはより詳細に後述する。方法２４００は、ラスタ順でエッジレコードごとにエッジ処理モジュール４００において実現され、呼び出される。説明を簡単にするために、任意の走査線を参照して方法を説明する。ここでは、この走査線を現在の走査線と呼ぶ。
【０２５４】
ステップ２４０４において、エッジレコード記憶装置３２中の３つのリスト（新規のエッジリスト４０２、アクティブエッジリスト４０４、およびあふれエッジリスト４０６）のうちの１つから、エッジ入力モジュール４０８によりエッジレコードが選択されて読み込まれる。エッジ入力モジュール４０８は、３つのリスト４０２、４０４、および４０６の各々において、各レコードに対する参照を維持する。各リスト４０２、４０４、および４０６中のエッジレコードは、そのＸフィールド（現在の走査線共通部分Ｘ座標）中の値により順序付けられるのが好ましい。これらの参照の各々は、走査線の処理開始時に各リスト中の第１のエッジを参照するように初期化される。
【０２５５】
その後、エッジ入力モジュールの４０８は、選択されたレコードが３つの参照されるエッジレコードのうちのＸフィールドに最小Ｘ値を有するレコードであるように、３つの参照されるレコードのうちの１つからエッジレコードを選択する。そのレコードを選択するために使用された参照は、リスト中の次のレコードへと進められる。
【０２５６】
このようにして、エッジ処理モジュールは、現在の走査線のエッジレコードをラスタ順に処理する。エッジレコードがステップ２４０４で読み込まれた後、エッジ入力モジュールは、ステップ２４０６において、現在のエッジレコードのｃ（ＣＯＮＴＩＮＵＩＮＧ）フラグをチェックする。チェックにおいてｃ（ＣＯＮＴＩＮＵＩＮＧ）フラグがデアサートされていることが明らかになった場合、終端エッジ交差メッセージが生成され、ステップ２４０８において、パイプライン４９８を下って優先度判定モジュール５００へと渡される。生成された終端エッジ交差メッセージは、以下のデータ、すなわち、整数のＸ位置値、フラグｐ、ｏ、ｕ、ｃ、ｄ、およびエッジのレベル番号から構成されるのが好ましいが、これに限定されない。
【０２５７】
終端エッジ交差メッセージのフラグｐ、ｏ、ｕ、ｃ、ｄは、現在（終端）のエッジレコードからコピーされる。整数のＸ位置値は、現在（終端）のエッジレコードのＸフィールド中のＸ値を丸めることにより得られる。オーバーライドｏフラグがアサートされる場合、ＸフィールドからのＸ値は、最も近い整数Ｘ値へと切り捨てられ、整数のＸ位置値が得られる。これに対し、オーバーライドｏフラグがデアサートされる場合、ＸフィールドからのＸ値は、最も近い整数Ｘ値へと切り上げられ、整数のＸ位置値が得られる。
【０２５８】
第２の動作モード中に、コンピュータシステム１は、PostScript（登録商標）ラスタライズルールを実現し、切り上げ演算および切り捨て演算は、特に、floor(X)+1演算およびfloor(X)演算として実現されるのが好ましい。しかし、他の変形例も実現可能である。例えば、これらの切り上げ演算および切り捨て演算は、それぞれ、ceil(X)オペレーションおよびfloor(X)演算として実現されても良い。現在(終端)のエッジレコードがレベルインデックスを含む場合、インデックスによりポイントされるリスト中の各レベルに対して生成される１つの終端エッジ交差メッセージが存在する。終端エッジ交差メッセージが優先度判定モジュール５００に渡された後、方法はステップ２４４４において終了する。
【０２５９】
ステップ２４４４においての終了後、エッジ処理モジュール４００は、現在の走査線中の次のエッジレコードを処理するために、すなわち、ステップ２４０４において次の最小Ｘ位置を有するエッジレコードを処理するために再度方法２４００を呼び出す。このようにして、エッジ処理モジュールは、現在の走査線のエッジレコードをラスタ順に処理する。エッジレコードが現在の走査線中の最終エッジレコードである場合、エッジ処理モジュール４００は、走査線終端メッセージを送出し、次の走査線のためにエッジリストを更新する。この更新プロセス中に、エッジレコードを格納するバッファは、更新されたエッジリスト（４０４’および４０６’）が現在のエッジリストになり、古いリスト（４０４および４０６）が無効化されるようにスワップされ、更新された新規のエッジリスト（４０２）がロードされる。方法は、最小Ｘ位置において次の走査線中の第１のエッジレコードを処理するために再度呼び出される。エッジ処理モジュール４００は、このように全てのエッジレコードの処理が終了するまで続けられる。
【０２６０】
これに対し、ステップ２４０６のチェックにおいてエッジレコードのｃ（ＣＯＮＴＩＮＵＩＮＧ）フラグがアサートされていることが明らかになった場合、エッジ入力モジュール４０８は、ステップ２４１２において現在のエッジレコードが新規のエッジであるか、すなわち、現在のエッジレコードが新規のエッジリスト４０２からのものであるか否かをチェックする。現在のエッジレコードが新規のエッジレコードである場合、エッジ入力モジュール４０８は、ステップ２４１４において新規のエッジレコードの各セグメントのうちの第１のセグメントをそのエッジに対するアクティブエッジレコードへとロードする。また、アクティブエッジレコードは、ステップ２４１４においてエッジの第１のセグメントに対する更新情報ＮＹおよびＤＸ並びにエッジの次のセグメントのアドレスと共にロードされる。エッジ入力モジュール４０８は、続いて、ステップ２４１６へと進む。これに対し、ステップ２４１２におけるチェックにおいてエッジレコードが新規のエッジレコードでないことが明らかになった場合、エッジ入力モジュール４０８は直接ステップ２４１６へと進む。
【０２６１】
エッジ入力モジュール４０８は、ステップ２４１６において、現在の走査線の位置Ｘに対する継続エッジ交差メッセージを生成し、これをパイプライン４９８を下って優先度判定モジュール５００へと渡す。生成された継続エッジ交差メッセージは、以下のデータ、すなわち、整数のＸ位置値、フラグｐ、ｏ、ｕ、ｃ、ｄ、およびエッジのレベル番号から構成されるのが好ましいが、これに限定されない。
【０２６２】
終端エッジ交差メッセージのフラグｐ、ｏ、ｕ、ｃ、ｄは、現在（継続）のエッジレコードからコピーされる。整数のＸ位置値は、現在（終端）のエッジレコードのＸフィールド中のＸ値を丸めることにより得られる。オーバーライドｏフラグがアサートされる場合、ＸフィールドからのＸ値が最も近い整数Ｘ値へと切り捨てられ、整数のＸ位置値が得られる。
【０２６３】
これに対し、オーバーライドｏフラグがデアサートされる場合、ＸフィールドからのＸ値は最も近いＸ値に切り上げられ、整数のＸ位置値が得られる。現在の継続エッジレコードのＸフィールド中のＸ値は、次の走査線に対してエッジ処理モジュール４００によりソート／処理するために、浮動小数点副画素Ｘ値が必要であるときには丸められないことに留意することは重要である。
【０２６４】
現在（継続）のエッジレコードがレベルインデックスを含む場合、インデックスによりポイントされるリスト中の各レベルに対して生成される１つの継続エッジ交差メッセージが存在する。現在のエッジレコードは継続エッジレコードであるので、現在の走査線の後に次の走査線と交わる対応するエッジレコードを判定するために、このエッジレコードは、ステップ２４１６においてエッジ更新モジュール４１０に渡される。
【０２６５】
この継続エッジレコードを受信すると、エッジ更新モジュール４１０は、ステップ２４１８においてレジスタｍｉｎＸ＝Ｘ、ｍａｘＸ＝Ｘ、およびｄＮＹ＝０を初期化する。式中、Ｘは継続エッジレコードの位置である。エッジ更新モジュール４１０は、ステップ２４２０においてＮＹ＋ｄＮＹ＜１であるか否かをチェックする。チェック２４２０においてＮＹ＋ｄＮＹ＞＝１であることが明らかになった場合、エッジ更新モジュール４１０は、ステップ２４３５においてＮＹフィールドのＮＹ値を（１−ｄＮＹ）だけ減分し、ステップ２４３６において継続エッジレコードのＸフィールドのＸ値にＤＸ（１−ｄＮＹ）を加える。これにより、新規のＸ値およびＮＹ値を有する次の走査線に対して新規の継続エッジが得られる。ステップ２４３６の後、エッジ更新モジュール４１０は、ステップ２４３８において継続エッジレコードに格納された新規のＸ位置の値をレジスタｍｉｎＸに格納された値と比較する。
【０２６６】
比較２４３８において新規のＸ位置がレジスタｍｉｎＸに格納された値以下であることが明らかになった場合、エッジ更新モジュール４１０は、ステップ２４４０へと進む。ステップ２４４０において、エッジ更新モジュール４１０は、新規の継続エッジレコードのオーバーライドｏフラグをアサートし、ステップ２４４０において次の走査線中の処理のために新規の継続エッジレコードをエッジプール４１２へと送出する。ステップ２４４０の後、エッジ更新モジュール４１０は、ステップ２４４２においてデアサートされた（クリアされた）オーバーライドｏフラグを有すると共にレジスタｍａｘＸに格納された値に設定されたＸフィールドを有する終端エッジレコードを生成する。エッジ更新モジュール４１０は、ステップ２４４２において次の走査線中の処理のために終端レコードをエッジプール４１２へと送出する。ステップ２４４０および２４４２により形成される分岐において、２つのエッジレコードは、次の走査線内のエッジの範囲を定義する。すなわち、新規の継続エッジレコードは最小範囲を定義し、終端エッジレコードは次の走査線内の現在のエッジの最大範囲を定義する。この処理に関しては、図２７Ａを参照してより詳細に説明する。
【０２６７】
ステップ２４４２の後、方法はステップ２４４４において終了し、エッジ処理モジュール４００は、前述のように方法を再度呼び出す。これに対し、ステップ２４３８の比較において新規のＸ位置がレジスタｍｉｎＸに格納される値より大きいことが明らかになった場合、エッジ更新モジュール４１０は、ステップ２４５０において新規の継続エッジレコードに格納された新規のＸ位置の値をレジスタｍａｘＸに格納された値と比較する。
【０２６８】
ステップ２４５０の比較において新規のＸ位置がレジスタｍａｘＸに格納された値以上であることが明らかになった場合、エッジ更新モジュール４１０は、ステップ２４４６へと進む。ステップ２４４６において、エッジ更新モジュール４１０は、アサートされたオーバーライドｏフラグを有すると共にレジスタｍｉｎＸに格納された値に設定されたＸフィールドを有する終端エッジレコードを生成する。エッジ更新モジュール４１０は、ステップ２４４６において次の走査線中の処理のために終端レコードをエッジプール４１２に送出する。
【０２６９】
ステップ２４４６の後、エッジ更新モジュール４１０は、新規の継続エッジレコードのオーバーライドｏフラグをデアサート（クリア）し、ステップ２４４８において次の走査線中の処理のために新規の継続エッジレコードをエッジプール４１２へと送出する。ステップ２４４６および２４４８により形成される分岐において、２つのエッジレコードは、次の走査線内のエッジの範囲を定義する。すなわち、新規の継続エッジレコードは最大範囲を定義し、終端エッジレコードは次の走査線内のエッジの最小範囲を定義する。この処理に関しては図２７Ｂを参照してより詳細に説明する。
【０２７０】
ステップ２４４８の後、方法はステップ２４４４において終了し、エッジ処理モジュール４００は、前述のように再度方法を呼び出す。これに対し、ステップ２４５０の比較において新規のＸ位置がレジスタｍａｘＸに格納された値より小さいことが明らかになった場合、エッジ更新モジュール４１０はステップ２４５２へと進む。ステップ２４５２において、エッジ更新モジュール４１０は、双方がアサートされたオーバーライドｏフラグを有すると共にレジスタｍｉｎＸに格納された値に設定されたＸフィールドを有する２つの終端エッジレコードを生成する。エッジ更新モジュール４１０は、ステップ２４５２において次の走査線中の処理のために双方の終端レコードをエッジプール４１２へと送出する。ステップ２４５２の後、エッジ更新モジュール４１０は、ステップ２４５４において次の走査線中の処理のためにデアサートされたオーバーライドｏフラグを有する新規の継続エッジレコードをエッジプール４１２へと送出する。
【０２７１】
ステップ２４５４の終了後、エッジ更新モジュール４１０は、ステップ２４５６においてデアサートされたオーバーライドｏフラグを有すると共にレジスタｍａｘＸに格納された値に設定されたＸフィールドを有する終端エッジレコードを生成する。ステップ２４５２、２４５４、および２４５６により形成される分岐において、２つの終端エッジレコードは、エッジの範囲を次の走査線内で定義する。すなわち、ｍａｘＸのＸ値を有する終端エッジレコードは最大範囲を定義し、ｍｉｎＸのＸ値を有する終端エッジレコードは次の走査線内のエッジの最小範囲を定義する。この処理は図２７Ｃを参照してより詳細に説明する。
【０２７２】
ステップ２４５６の後、方法はステップ２４４４において終了し、エッジ処理モジュール４００は、前述のように方法を再度呼び出す。
【０２７３】
ステップ２４２０におけるチェックにおいてＮＹ＋ｄＮＹ＜１であることが明らかになった場合、エッジ更新モジュール４１０はステップ２４２２へと進む。この分岐において、エッジ更新モジュール４１０は、エッジの１つのセグメントから次のセグメントへの遷移を扱う。エッジ更新モジュール４１０は、ステップ２４２２において現在のエッジレコードのＮＹフィールドのＮＹ値だけｄＮＹレジスタのｄＮＹ値を増分する。エッジ更新モジュール４１０は、ステップ２４２３においてＮＹ＊ＤＸだけ現在のエッジレコードのＸフィールド中のＸ位置値を更に増分する。
【０２７４】
ステップ２４２３の後、エッジ更新モジュール４１０は、ステップ２４２４において継続エッジレコードの新規のＸ位置値をレジスタｍｉｎＸに格納された現在の値と比較する。ステップ２４２４における比較においてＸ＜ｍｉｎＸであることが明らかになった場合、エッジ更新モジュール４１０はステップ２４２６において継続エッジレコードの新規のＸ位置値をレジスタｍｉｎＸへとロードし、ステップ２４３２へと進む。これに対して、ステップ２４２４の比較においてＸ＞＝ｍｉｎＸであることが明らかになった場合、エッジ更新モジュールは、ステップ２４２８において継続エッジレコードの新規のＸ位置値をレジスタｍａｘＸに格納された現在の値と比較する。ステップＳ２４２８の比較においてＸ＞ｍａｘＸであることが明らかになった場合、エッジ更新モジュール４１０は、ステップ２４３０において継続エッジレコードの新規のＸ位置値をレジスタｍａｘＸへとロードし、ステップ２４３２へと進む。ステップ２４２８の比較においてＸ＜＝ｍａｘＸであることが明らかになった場合、エッジ更新モジュール４１０は直接ステップ２４３２へと進む。
【０２７５】
ステップ２４３２中に、エッジ更新モジュール４１０は、エッジ中の次のセグメントと関連付けられた継続エッジレコードをロードする。これは、現在の継続エッジレコード中のＮＹフィールドおよびＤＸフィールドに格納された値をエッジ中の次のセグメントのＮＹ値およびＤＸ値と置換することにより達成される。直前のセグメントの終端点のＸ位置および次のセグメントの始端点は同じであり、現在の継続エッジレコード中のＸフィールドに格納されたＸ位置値は、たいていの場合には置換されないことに留意すべきである。しかし、次のセグメントがＸＳＴＥＰ値を含む場合、エッジ更新モジュール４１０は、ステップ２４３４においてＸＳＴＥＰ値をＸ位置へと加え、ＤＸは０に設定される。ＸＳＴＥＰ値がない場合には、エッジ更新モジュールは、このステップ２４３４を省略し、現在の継続エッジの更なる処理を行なうために直接比較２４２０へと進む。ＮＹ＋ｄＮＹの現在の値が依然として１未満である場合、ステップ２４２２から２４３４により形成される分岐が繰り返される。
【０２７６】
エッジが走査線内のセグメントリストの終端に達し、エッジが走査線から離れる前に処理が終了する場合、エッジは走査線内ではアクティブであるので、軌跡の最小範囲および最大範囲が引き続き要求される。従って、エッジは垂直に延長されて走査線から延出し、塗りつぶしカウンタをアクティブ化するために０長継続エッジが生成される。次の走査線上での読み込みの場合、エッジ交差が生成されるが、更なる追跡は行なわれない。すなわち、エッジ更新モジュール４１０が、ステップ２４３２において次のセグメントをロードしようと試みて次のセグメントがなかったとき（エッジの終端）、エッジ更新モジュール４１０は、継続エッジレコード中のＮＹ値を０に設定し、直接（不図示）比較ステップ２４３８へと進む。エッジ更新モジュール４１０は、適切な継続エッジレコードおよび終端エッジレコード（２４４０、２４４２または２４４６、２４４８）をエッジプール４１２へと送出し、２４４４を終了する。エッジ入力モジュール４０８は、次の走査線の処理中にステップ２４１６においてＸの更新された値におけるエッジ交差メッセージを送出すると共に、ＮＹの現在の値がＮＹ＝０であることを判定する。ＮＹ＝０であるので、このエッジに対しては更なる継続エッジレコードは要求されず、エッジ入力モジュール４０８はステップ２４４４において終了する。ステップ２４４４における終了後、エッジ処理モジュール４００は、前述のように処理を再度開始する。
【０２７７】
走査線全体に対するエッジの軌跡に対して最小Ｘ位置および最大Ｘ位置が得られる場合、Ｘにおけるより高い次数の微分（ＤＤＸ、ＤＤＤＸなど）を利用するエッジ追跡のための他の手順が使用されても良い。
【０２７８】
前述の説明より明らかなように、エッジが現在の走査線から離れるとき、次の走査線に対してステップ２４３６において判定される更新されたＸ位置値は、ステップ２４３８および２４５０においてｍｉｎＸレジスタおよびｍａｘＸレジスタと照合され、次の走査線に対する継続エッジレコードに加えて、１つまたは３つの終端レコードが生成される。これらのレコードは、次の走査線内のエッジの軌跡の範囲を指定すると共に関連するレベルにおけるオーバーライドカウンタをアクティブ化／非アクティブ化するのに使用される。終端レコードは、優先度判定モジュール５００中の塗りつぶしカウンタに影響を及ぼさないが、継続エッジは、前述のような通常の方法で塗りつぶしカウンタを増分または減分する。更に、次の走査線に対する継続エッジのＸフィールドに格納されたＸ位置値は、エッジが次の走査線から延出するＸ座標位置である。
【０２７９】
図２４Ａ、図２４Ｂのフローチャートから明らかなように、次の走査線中の処理に対してエッジプール４１２に対して送出されるであろう終端エッジレコードおよび継続エッジレコードの組み合わせには３つの代替案がある。これらの組み合わせについては、図２７Ａ、図２７Ｂ、および図２７Ｃを参照して以下に説明する。図２７Ａ、図２７Ｂ、および図２７Ｃは、次の走査線２７００と、３本の異なる型の現在のエッジ２７０２ａ、２７０２ｂ、および２７０２ｃと、エッジの次の走査線への入口点および次の操作線からの出口点とを示す。継続エッジレコードが、常に、次の走査線からのエッジの出口点に対応するステップ２４３６における更新されたＸ位置を有するエッジプール４１２へと送出されることに留意することは重要である。
【０２８０】
前述の可能な代替案は以下の通りである。
【０２８１】
１．継続エッジレコードのＸ位置のステップ２４３６からの更新された値がｍｉｎＸレジスタ中の値以下の場合、更新されたＸ位置における継続エッジに加えて、次の走査線に対して最大Ｘ位置（ｍａｘＸレジスタに格納された値）で終端レコードが送出される（図２７Ａ参照）。オーバーライドビットは、継続エッジレコードにおいてはアサートされ、終端レコードにおいてはデアサートされる。
【０２８２】
２．継続エッジのステップ２４３６において判定される更新されたＸ位置が、ｍａｘＸレジスタに格納された値以上である場合、継続エッジに加えて次の走査線に対して最小Ｘ位置（ｍｉｎＸレジスタに格納された値）で終端レコードが送出される（図２７Ｂ参照）。オーバーライドビットは、終端レコードにおいてはアサートされ、継続エッジにおいてはデアサートされる。
【０２８３】
３．継続エッジのステップ２４３６において判定される更新されたＸ位置が、ｍｉｎＸレジスタに格納された値とｍａｘＸレジスタに格納された値との間である場合、更新されたＸ位置２４３６で送出された継続エッジレコードに加えて、オーバーライドビットが設定された状態で終端レコードが最小Ｘ位置（ｍｉｎＸレジスタに格納された値）で送出され、オーバーライドビットがクリアされた状態で別の終端レコードが最大Ｘ位置（ｍａｘＸレジスタに格納された値）で送出される。継続エッジは、オーバーライドカウンタに影響を及ぼすオーバーライドビットを有することになるので、継続エッジとは逆の意味でオーバーライドカウントに影響を及ぼす第３の終端レコードと対にされる（図２７Ｃ参照）。
【０２８４】
以上説明した全ての場合において、生成された終端レコードと関連付けられたレベルは、継続エッジと関連付けられたレベルと同じである。更に、継続エッジと対をなす別の終端レコードの位置は、より小さいＸ位置に対してはアサートされ、より高いＸ位置に対してはデアサートされる場合には、最小Ｘ位置と最大Ｘ位置との間のどの位置でも良い。
【０２８５】
オーバーライドビットのオペレーションを有効化／無効化するためにエッジレコードにイネーブルビットを追加する処理は、前述の例３において第３の終端レコードを不要にするために使用されても良い。例３において、オーバーライドビットが無効化される結果、継続エッジは塗りつぶしカウンタにのみ影響を及ぼすようになり、余分な終端レコードは生成されない。
【０２８６】
エッジにより生成される継続エッジおよび終端レコードは、前述のように、この後エッジ処理モジュール４００により整列を行なうためにエッジプール４１２へと渡される。この整列は、前節で検討したように次の走査線の以降の処理のために行なわれる。次の走査線に対する全てのエッジレコードが、次の走査線のために読み込まれる前に整数Ｘの次数により整列される。終端エッジレコードはメインのリストにおいてソートされる。
【０２８７】
エッジ処理モジュールは、最小Ｘ位置および最大Ｘ位置においてエッジレコードと関連付けられる丸めオペレーションが異なるために、丸められたＸ位置値に基づくＸ位置によりエッジレコードの整列を実行する。エッジがこのステージにおいて副画素Ｘ位置に基づいて整列された場合、２本のエッジは同じ画素内で不正確な順序で表示されるであろう。
【０２８８】
しかし、副画素値が次の走査線のＸ位置値の計算に必要とされるので、エッジレコード中の副画素Ｘ位置値自体は丸められないことに留意すべきである。
【０２８９】
丸められたＸ位置値に基づいてソートするとき、任意の特定の走査線上でエッジに接する画素の全範囲に対してオーバーライドカウンタが０以外であることを保証するために、オブジェクトビットが考慮される。オーバーライドビットがエッジレコードにおいてアサートされる場合、Ｘ位置は最も近い整数Ｘ位置に切り捨てられ、オーバーライドビットがエッジレコードにおいてデアサートされる場合、Ｘ位置は最も近い整数Ｘ位置に切り上げられる。
【０２９０】
この整列オペレーション中に実行される丸めオペレーションは、前述したエッジ交差メッセージの生成中に実行されるオペレーションと整合している。例えば、第２の動作モードがPostScript（登録商標）ラスタライズルールを実現する場合、切り上げオペレーションおよび切り捨てオペレーションは、それぞれfloor(X)+1オペレ-ションおよびfloor(X)オペレーションとして実現される。
【０２９１】
走査線の処理中に、エッジ処理モジュール４００は、継続エッジ交差メッセージおよび終端エッジ交差メッセージを整数Ｘ座標順に優先度判定モジュール５００へと送出する。優先度判定モジュール５００は、終端エッジ交差メッセージおよび継続エッジ交差メッセージを受信すると、メッセージ中のオーバーライドビットの値によってオーバーライドカウンタを増分または減分する。具体的には、オーバーライドビットがアサートされる場合、オーバーライドカウンタは増分され、オーバーライドビットがデアサートされる場合、オーバーライドカウンタは減分される。
【０２９２】
先に説明したように、優先度判定モジュール５００は、第１の動作モードの場合、現在の走査線中の現在走査中の画素への積極的な寄与を行なう優先度を判定する。オブジェクトに対する塗りつぶしルールによって優先度と関連付けられたオブジェクトに適用される境界エッジの内側に画素が存在する場合およびオブジェクトに対するクリップカウントが０の場合、優先度はアクティブである。特定の優先度レベルにおけるオブジェクトが、ある画素における最上のアクティブオブジェクトである場合、あるいは、それより上の全てのアクティブオブジェクトの対応するneed-belowフラグが設定されている場合、オブジェクトはその画素において露出する。優先度判定モジュール５００は、現在の画素において露出したそれらのオブジェクトを判定し、露出オブジェクトごとに塗りつぶし優先度メッセージを塗りつぶしカラー判定モジュール６００へと出力する。これらの塗りつぶし優先度メッセージは、露出オブジェクトの塗りつぶしデータに関連するデータから構成される。このようにして、画素値は露出オブジェクトの塗りつぶしデータのみを使用して生成されても良い。
【０２９３】
塗りつぶしカラー判定モジュール６００、画素合成モジュール７００、および画素出力モジュール８００は、エッジ処理モジュール４００および優先度判定モジュール５００が第１の動作モードで動作するか、あるいは、第２の動作モードで動作するかに関わらず、前述のように動作する。
【０２９４】
優先度判定モジュール５００は、第２の動作モードで動作するときには、優先度判定モジュール５００の第１の動作モードと多少類似した様式で動作し、以下のような変形例を伴う。これらの変形例において、優先度判定モジュール５００は、特定の優先度レベルにおけるオブジェクトが、終端エッジ交差メッセージおよび継続エッジ交差メッセージからオブジェクトのエッジの境界に沿ってアクティブであると判定する。具体的には、優先度判定モジュール５００は、関連付けられたオーバーライドカウントが０以外であるときにオブジェクトがアクティブであると判定する。０である場合にはクリッピングされる。更に、優先度判定モジュール５００は、エッジ交差メッセージのｃフラグがアサートされる場合のみ、第２の動作モードにおいて塗りつぶしカウンタを増分する。
【０２９５】
したがって、前述の例１および例２において、エッジの軌跡の範囲が２つのエッジレコード、すなわち、オーバーライドカウンタを増分させるエッジレコードとオーバーライドカウンタを減分させるエッジレコードとにより囲まれるので、オーバーライドカウントは軌跡の全範囲に対して０以外である。このため、優先度判定モジュール５００は、２つのエッジレコードの間のエッジの軌跡の範囲ではオブジェクト優先度がアクティブであると判定する。軌跡の範囲外では、オーバーライドカウントは０であり、優先度判定モジュール５００は、第１の動作モードに従って塗りつぶしルールを適用する。
【０２９６】
また、例３において、最小Ｘ位置および最大Ｘ位置における終端レコード間では、オーバーライドカウントは０以外である。オーバーライドカウントは、最大Ｘ位置において終端レコードにより再度減分される前に、最小Ｘ位置における終端レコードにより１度増分され、継続エッジとそれと対になる終端レコードとの間で再度増分されるからである。軌跡の範囲外では、オーバーライドカウントは０であり、第１の動作モードによる塗りつぶしルールも適用される。
【０２９７】
オーバーライドカウントは、エッジレコードの対のＸの下端において常に増分され、Ｘの上端において常に減分される。このため、同じレベルに影響を及ぼす２本のエッジに対する軌跡の範囲が交わる場合、共通範囲中のこのレベルにおけるオーバーライドカウントは０に戻るのではなく、２度増分される。これにより、各エッジの軌跡の範囲の画素は確実にアクティブ化される。２本のエッジが複数の共通レベルに影響を及ぼすか、あるいは、このように交わるエッジが３本以上存在する場合にこうなることが明らかである。
【０２９８】
図２４Ａ、図２４Ｂを参照して説明したエッジ処理モジュール４００のオペレーションの方法は、新規のエッジの開始の処理を考慮していない。前述のドライバソフトウェアがこの処理を請け負う。ドライバソフトウェアは、ページ記述をディスプレイリストへと変換し、各オブジェクトを２つ以上の単調なエッジに分割することによってこれを実行する。これらの単調なエッジのうちのいずれかが１本の走査線内に含まれる場合、ドライバソフトウェアはこの単調なエッジを隣接する単調なエッジと結合させて１本のエッジを形成する。ドライバソフトウェアは、単調なエッジを複数のセグメントへとベクトル化してセグメントのリストを含む新規のエッジレコードを形成する。これらの新規のエッジレコードの各々は、エッジに対するフラグ設定ｐ、ｕ、ｃ、ｏ、ｄ、優先度レベル、始端点、およびエッジに対するセグメントリストを含む。
【０２９９】
現在の走査線がエッジ処理モジュール４００により処理されるとき、現在の走査線において開始される新規のエッジレコードが最初に処理され、エッジ処理モジュール４００からの命令に応じて新規のエッジリスト４０２へとロードされる。具体的には、エッジ処理モジュール４００からの命令に応じて、ドライバソフトウェアは、現在の走査線において開始される新規のエッジレコードを処理し、対応する新規の継続エッジレコードおよび終端レコードを生成する。
【０３００】
この点に関して、ドライバソフトウェアは、エッジがロードされる第１の走査線における各新規のエッジの入力ｙ値および出力ｙ値を検査する。継続エッジおよび１本以上の終端エッジが、図２４Ｂに記載されたステップ２４３８から２４４４と同様の決定プロセスに基づいて、ドライバソフトウェアにより送出される。
【０３０１】
しかし、このプロセスにおいて「Ｘ」は第１の走査線からのエッジの出力ｘ値（継続エッジの開始ｘ値）と見なされ、ｍｉｎＸおよびｍａｘＸの双方はｘ＿ｓｔａｒｔに等しいと見なされる。
【０３０２】
生成された継続エッジレコードのＮＹフィールドおよびＸフィールドは、ステップ２４３５および２４３６において以下に示すように計算される。
【０３０３】
NY = y_finish - (1 + floor(y - start))
X = x_start + DX * (ceil(y_start) - y_start)
【０３０４】
ドライバソフトウェアによる継続エッジレコードおよび終端エッジレコードの生成は、図２５に示す例示のエッジを参照してより詳細に説明される。ドライバソフトウェアは、現在の走査線（すなわち、ｙ＝１０）において開始されるエッジ２５００の始端点および終端点の座標を検査し、前述の式に従ってＮＹ値およびＸ値を判定する。ドライバソフトウェアは、値ｍｉｎＸ＝ｍａｘＸ＝ｘ＿ｓｔａｒｔとＸとを比較（２４３８、２４５０）し、どれが最大でどれが最小であるかを判定する。ドライバソフトウェアは、Ｘ＞＝ｍａｘＸ＝ｘ＿ｓｔａｒｔであると判定し、ｘ＿ｓｔａｒｔにおいて終端エッジ２５０２を送出し（２４４６）、Ｘにおいて継続エッジ２５０４を送出する（２４４８）。ドライバソフトウェアにより生成される新規の継続エッジレコードおよび終端エッジレコードが、（ステップ２４４０、２４４２、２４４６、２４４８、２４５２、２４５４、２４５６において）新規のエッジリスト４０２へと送出される。エッジ処理モジュール４００は、図２４Ａ、図２４Ｂを参照して説明したようにこれらの新規のエッジレコードを処理する。
【０３０５】
また、レベルアクティブ化メカニズムに対してエッジ交差メッセージを生成せずに新規のエッジが最初に必要とされる走査線の１本前に新規のエッジをロードすることが可能である。この場合、新規のエッジレコード中で提供されるオフセット値がｄＮＹを初期化するのに使用される。
【０３０６】
ドライバソフトウェアは、新規のエッジレコードを非同期式で前もって生成するのが好ましい。ドライバソフトウェアは、エッジが第１の動作モードによって生成されるべきか、あるいは、第２の動作モードによって生成されるべきかを判定し、それに応じて新規のエッジレコードを生成する。
【０３０７】
ドライバソフトウェアは、第２の動作モードで動作するときに、ステップ２４３６において現在の走査線内のエッジの出口点における新規のエッジレコードのＸ位置値を計算すると共に、ステップ２４３５において新規のエッジレコードのＮＹ値を更新する。
【０３０８】
さらに、ドライバソフトウェアは、現在の走査線内のエッジの最小範囲および最大範囲のうちの１つまたは双方を表すＸ位置値を有する終端エッジレコードを生成する。
【０３０９】
現在の走査線に対する全ての新規のエッジレコードが一度生成されると、ドライバソフトウェアは、適切に丸められたＸ位置値に従ってこれらのレコードをソートする。ソートされた新規のエッジレコードは、現在の走査線の処理の開始に先立って、LOAD_NEW_EDGES_AND_RENDER命令の一部として新規のエッジリストへとロードされる。エッジ処理モジュールは、ステップ２４０８および２４１６において現在の走査線に対するこれらのロードされた新規のエッジレコードに対応するエッジ交差メッセージを送出する。
【０３１０】
エッジ処理モジュールは、更新されたＸ値およびＮＹ値を有する継続エッジレコードと、次の走査線に対する終端エッジレコードとを生成する。ドライバソフトウェアは、エッジ処理モジュール４００と同様に、Ｘ位置値の丸められた値に従ってエッジレコードの整列を実行する。
【０３１１】
画素順次レンダリング装置２０および関連するドライバソフトウェアは、エッジ単位で第１の動作モードおよび第２の動作モードのいずれかにおいて動作するのが好ましい。具体的には、画素順次レンダリング装置２０およびドライバソフトウェアは、各エッジレコードに問合せを行ない、ｐフラグの状態を判定する。ｐフラグがデアサートされている場合は第１の動作モードで動作し、アサートされている場合は第２の動作モードで動作する。ドライバソフトウェアは、ディスプレイリストからエッジレコードを構成するときには、画像がPostScript（登録商標）に従ってレンダリングされるか否かを判定し、PostScript（登録商標）に従ってレンダリングされる場合、エッジレコードのｐフラグをアサートする。
【０３１２】
ドライバソフトウェアおよびエッジ処理モジュール４００は、第１の動作モードで動作するときには、図２４Ａ、図２４Ｂで表したように第２の動作モードとほぼ同じプロセスを実行する。異なるのは、終端レコードがエッジプール（４１２）へと送出されない点である。更に、エッジ処理モジュール４００は、第１の動作モードで動作するときには、対応するエッジレコードのＸ位置値の丸められた値に等しい整数Ｘ位置を有するエッジ交差メッセージ（ステップ２４０８、２４１６参照）を生成し、これを送出するのが好ましい。これらの値は、最も近い整数Ｘ位置に丸められる。先に検討したように、エッジ処理モジュール４００は、第２の動作モードで動作するときには、対応するエッジレコード中のオーバーライドフラグの状態によって、Ｘ位置値の値を切り上げるか、あるいは、切り捨てるかするであろう。
【０３１３】
優先度判定モジュール５００は、第２の動作モードで動作するときには、第１の動作モードとほぼ同じプロセスを実行する。異なるのは、オーバーライドカウンタが第２の動作モードで使用される点である。優先度判定モジュールのオペレーションにおける主だった重大な相違は以下の通りである。優先度判定モジュール５００は、第１の動作モードで動作するときには、次の条件、すなわち、塗りつぶしルールフラグがデアサートされており、塗りつぶしカウンタが０以外であること、および塗りつぶしルールフラグがアサートされており、塗りつぶしカウンタが奇数であることのうちのいずれか１つが発生するときにレベルがアクティブであると判定する。これに対して、優先度判定モジュール５００は、第２の動作モードで動作するときには、次の条件、すなわち、塗りつぶしルールフラグがデアサートされており、塗りつぶしカウンタが０以外であること、塗りつぶしルールフラグがアサートされており、塗りつぶしカウンタが奇数であること、およびオーバーライドが０以外であることのうちのいずれか１つが発生するときにレベルがアクティブであると判定する。
【０３１４】
図２８を参照すると、単純なエッジが示されており、このエッジは単純なオブジェクトの第２の動作モードにおけるアクティブ化オペレーションを実証するための例として使用される。境界エッジＡＢＣＤＥＦＧＨＡは、レンダリング対象のグラフィックスオブジェクトを表す。ページ記述をディスプレイリストへと変換するコンピュータプログラム（ドライバソフトウェア）は、この境界を２本のエッジ、すなわち、ページを下るＡＢＣＤＥＦとページを上るＦＧＨＡとに分割し、これらのエッジに関して２つの新規のエッジレコードＡＢＣＤＥＦおよびＡＨＧＦを生成する。新規のエッジレコードＡＢＣＤＥＦのｕフラグがデアサートされている一方で、新規のエッジレコードＡＨＧＦのｕフラグはアサートされており、エッジＡＨＧＦが元々はエッジＦＧＨＡとして上向きであったことを示している。なお、セグメントＣＤも上向きであるが、ＣＤは走査線境界を横断しないので、エッジＡＢＣＤＥＦはＣＤで分割される必要がない。
【０３１５】
エッジＡＢＣＤＥＦの場合、セグメントＡＢはＡ(6.6,1.4)で開始し、Ｂ(1.7,6.3)へと続く。ドライバソフトウェアは、現在の走査線、すなわち、走査線１に対してＡＢＣＤＥＦに対する新規の継続エッジレコードを生成する。ドライバソフトウェアは、エッジのＸ位置をＸ＝６．０［すなわち、6.6+(−1.0)*ceil(1.4)−1.4)］に更新し（２４３６）、ＡＢＣＤＥＦに対する新規の継続エッジレコードのＮＹ値を４．３［すなわち、6.3−(1+ floor(1.4))］に更新する（２４３５）。また、ドライバソフトウェアは、第１の走査線上でエッジのＸ範囲の他方の極値で終端レコードを生成する（２４４２）。このため、走査線１において、新規の継続エッジレコードＡＢＣＤＥＦが、新規のエッジリスト（４０２）にＸ＝６．０で最初にロードされ（２４４０）、続いて終端レコードがＸ＝６．６でロードされる（２４４２）。これらの２つの位置は、走査線１上のエッジの軌跡の範囲を定義する。
【０３１６】
ＡＢＣＤＥＦに対して新規のエッジリスト（４０２）にロードされる結果の新規エッジレコードは以下のようになる。
【０３１７】
0003797666.tif 000004
0003797666.tif 000005
【０３１８】
なお、ｏフラグ（ＯＶＥＲＲＩＤＥ）は、継続エッジレコードにおいてはアサートされており、終端レコードにおいてはデアサートされている。このため、対応するエッジ交差メッセージがステップ２４０６および２４１６において優先度判定モジュール５００へと最終的に送出されるとき、このモジュール５００は、オーバーライドカウンタをレベルＮにおいてX=floor(6.0)=6で増分し、オーバーライドカウンタをX=floor(6.6)+1=7で減分する。前述のように、この丸めは、実際には、エッジ処理モジュール４００が請け負い、エッジ交差メッセージの優先度判定モジュール５００への送出に先立って行なわれる。丸める際には、任意の走査線上のエッジが接する画素の全範囲に対してオーバーライドカウンタが０以外であることを保証するために、オーバーライドビットが考慮される。オーバーライドビットがエッジ交差メッセージにおいてアサートされている場合、Ｘ位置は最も近い整数Ｘ位置に切り捨てられ、オーバーライドビットがエッジ交差メッセージにおいてデアサートされている場合、Ｘ位置は最も近い整数Ｘ位置に切り上げられる。継続エッジのみが塗りつぶしカウントに影響を及ぼすため、優先度判定モジュール５００は、塗りつぶしカウンタをレベルＰにおいてＸ＝６．０で増分する。優先度判定モジュール５００は、エッジ交差メッセージのｃフラグがアサートされているか否かを判定することによって、塗りつぶしカウンタを増分すべきか否かを判定する。
【０３１９】
ドライバソフトウェアは、走査線１に対して新規の継続エッジレコードＡＢＣＤＥＦおよびエッジＡＢＣＤＥＦに関する終端エッジレコードＡ１を生成した後に、エッジＡＨＧＦに関する新規のエッジレコードを生成する。具体的には、ドライバソフトウェアは、エッジＡＨＧＦに関して走査線１に対する新規の継続エッジレコードＡＨＧＦと終端レコードＡ０とを生成し、これらのレコードを新規のエッジリスト４０２へと送出する（２４４６、２４４８）。これらの新規のエッジレコードは以下のようになる。
【０３２０】
0003797666.tif 000006
【０３２１】
ドライバソフトウェアは、これらのエッジを整数Ｘの昇順にソートする。このソートでは、エッジにおいて指定されるようにＸの丸めが実行される。その結果、ローディングの順序は、ＡＢＣＤＥＦ、Ａ０、Ａ１、ＡＨＦＧになる。
【０３２２】
図２４Ａに戻る。エッジ処理モジュール４００によりステップ２４０４において読まれる第１のエッジレコードは、エッジプール４１２に格納される前述の結果として生じた新規のエッジレコードＡＢＣＤＥＦである。この新規のエッジレコードＡＢＣＤＥＦに対して、ステップ２４０６においてフラグｃ（ＣＯＮＴＩＮＵＩＮＧ）により示される継続エッジであるか否かを判定するための検査が行なわれ、ステップ２４１２において新規のエッジレコードであるか否かを判定するための検査が行なわれる。この走査線（すなわち、走査線１）において、エッジレコードＡＢＣＤＥＦは新規の継続エッジレコードであるので、新規のエッジレコードＡＢＣＤＥＦの各フラグ、Ｘ位置（Ｘ＝６．０）、および第１のセグメントがアクティブエッジレコードへとロードされる。アクティブエッジには、情報、すなわち、エッジＡＢの第１のセグメントに対するＮＹ＝４．３およびＤＸ＝−１と次のセグメントＢＣのアドレスとが更にロードされる。
【０３２３】
エッジ処理モジュール４００は、ステップ２４１６においてアクティブエッジレコードＡＢに対応するエッジ交差メッセージを優先度判定モジュール５００へと送出する。
【０３２４】
エッジ更新モジュール４１０は、ステップ２４３５および２４３６において次の走査線、すなわち、走査線２のアクティブエッジレコードＡＢに対するＸ位置値およびＮＹ値を更新する。継続エッジレコードＡＢは、最初、Ｘ＝６．０、ＤＸ＝−１．０、ＮＹ＝４．３の各値を有する。
【０３２５】
エッジ更新モジュール４１０は、ステップ２４１８において内部レジスタｍｉｎＸおよびｍａｘＸをＸ＝６．０に初期化し、ステップ２４１８においてレジスタｄＮＹを０に初期化する。
【０３２６】
エッジ更新モジュール４１０は、ステップ２４２０においてＮＹ＋ｄＮＹの現在の値を検査し（ステップ２４２０を形成）、この値は１より大きいので右の分岐が選ばれる。
【０３２７】
エッジ更新モジュール４１０は、ステップ２４３５において継続エッジレコードＡＢ中のＮＹの値を１だけ減分するのでＮＹ＝３．３となり、ステップ２４３６において継続エッジレコードＡＢ中のＸの値にＤＸが加えられるのでＸ＝５．０になる。
【０３２８】
エッジ更新モジュール４１０は、レジスタｍｉｎＸに現在格納されている値＝６．０に対し、ステップ２４３８において継続エッジレコードＡＢ中の更新された値Ｘ＝５．０を検査する。この値はｍｉｎＸより小さいことが判明する。このため、エッジ更新モジュール４１０は、ステップ２４４０および２４４２においてアサートされているｏフラグ（ＯＶＥＲＲＩＤＥ）を伴うＸ値５．０とデアサートされているｏフラグ（ＯＶＥＲＲＩＤＥ）を伴うｍａｘＸ＝６．０のＸ値とを有する継続エッジをエッジプール４１２へと送出する。送出される継続エッジは以下の情報を含む。
【０３２９】
0003797666.tif 000007
【０３３０】
エッジプール４１２に送出される終端レコードは以下の情報を含む。
【０３３１】
0003797666.tif 000008
【０３３２】
ここで、エッジＡＢＣＤＥＦに対するエッジ追跡プロセスが終了し、ステップ２４０４においてＸ順の次のエッジがエッジ処理モジュール４００により読まれる。他にアクティブなオブジェクトがないものと想定すると、ステップ２４０４において読まれる次のエッジは、エッジＡＨＧＦ（前述参照）に対する終端レコードＡ０（前述参照）である。このレコードＡ０は、走査線１中のセグメントＡＨの最小Ｘ位置＝６．６を指定する。このレコードのｃフラグはデアサートされているので、このレコードに対するエッジ交差メッセージがステップ２４０８において優先度判定モジュール５００へと送出される。オーバーライドフラグがアサートされているので、ステップ２４０８においてｆｌｏｏｒ（Ｘ＝６．６）＝６のＸ位置値を有するエッジ交差メッセージが送出される。エッジ処理モジュールは２４４４において終了し、レコードＡ０に対しては更なるオペレーションは行なわれない。
【０３３３】
ステップ２４０４において読まれる次のエッジは、この走査線（走査線１）上のエッジＡＢＣＤＥＦの最大Ｘ点に対応する終端レコードＡ１（前述参照）である。このレコードのｃフラグはデアサートされているので、このレコードに対するエッジ交差メッセージがステップ２４０８において優先度判定モジュール５００へと送出される。オーバーライドフラグがデアサートされているので、このレコードに対するエッジ交差メッセージはステップ２４０８においてｆｌｏｏｒ（６．６）＋１＝７で優先度判定モジュール５００へと送出される。エッジ処理モジュールは、ステップ２４４４において処理を終了し、レコードＡ１に対しては更なるオペレーションは行なわれない。
【０３３４】
ステップ２４０４においてエッジ処理モジュール４００により読まれる走査線（走査線１）上の最終エッジレコードは、Ｘ＝６．７５（前述参照）でＡＨＦＧを表す新規の継続エッジレコードである。ｃフラグがアサートされており、エッジレコードが新規のエッジレコードであるので、新規の継続エッジレコードＡＨＦＧが読み込まれるときに第１のセグメントＡＨがロードされる。エッジ処理モジュール４００は、新規のエッジレコードの第１のセグメントＡＨに対応するエッジ交差メッセージを優先度判定モジュール５００へと送出する。オーバーライドフラグがデアサートされているので、ｆｌｏｏｒ（６．７５）＋１＝７のＸ位置値を有するこのエッジ交差メッセージが送出される。
【０３３５】
エッジレコードＡＨＦＧに対応するエッジ交差メッセージが送出された後、エッジ更新モジュール４１０は、次の走査線（走査線２）に対する継続エッジレコードＡＨを更新する。先に述べたように、継続エッジレコードＡＨは、値Ｘ＝６．７５、ＤＸ＝０．２５、およびＮＹ＝４．２を有する。
【０３３６】
最初に、エッジ更新モジュール４１０は、ステップ２４２０において内部レジスタｍｉｎＸおよびｍａｘＸを現在の継続エッジレコードＡＨ中のＸ位置値（Ｘ＝６．７５）に初期化し、ステップ２４２０においてｄＮＹを０に初期化する。値ＮＹ＋ｄＮＹの検査によって１より大きいことが判明するので、右の分岐が選ばれる。継続エッジレコードＡＨ中のＮＹ値が、ステップ２４３５において１だけ減分されてＮＹ＝３．２になり、ステップ２４３６においてＤＸが継続エッジレコードＡＨに加えられてＸ＝７．０になる。継続エッジレコードＡＨの現在のＸ値が、ステップ２４３８においてｍｉｎＸ（６．７５）に対して検査され、ｍｉｎＸより大きいことが判明する。
【０３３７】
続いて、継続エッジレコードＡＨの現在のＸ値は、ステップ２４５０においてｍａｘＸ（６．７５）に対して検査され、ｍａｘＸより大きいことが判明する。その結果、ｍｉｎＸ＝６．７５のＸ値を有する終端レコードが、ステップ２４４６においてアサートされているｏフラグ（ＯＶＥＲＲＩＤＥ）と共にエッジプール４１２へと送出され、Ｘ＝７．０のＸ値を有する継続エッジＡＨが、デアサートされているｏフラグ（ＯＶＥＲＲＩＤＥ）と共にエッジプール４１２へと送出される。アクティブ継続エッジは以下の情報を含む。
【０３３８】
0003797666.tif 000009
【０３３９】
エッジプール（４１２）へと送出される終端レコードは以下の情報を含む。
【０３４０】
0003797666.tif 000010
【０３４１】
ここで、走査線２上でのエッジＡＨＧＦに対するエッジ追跡プロセスが終了する。次に、走査線１上で優先度判定モジュールへと送出されたエッジ交差メッセージについて考える。これらのメッセージは、生成元のエッジレコードから各フラグの状態をコピーする。メッセージは以下の通りである。
【０３４２】
0003797666.tif 000011
0003797666.tif 000012
【０３４３】
これらのエッジ交差メッセージにおいて、ｐフラグ（ＰＯＳＴＳＣＲＩＰＴ）は、優先度判定モジュール５００のレベルアクティブ化テーブル中のオーバーライドカウンタを有効化する。オーバーライドカウンタが有効化される場合、エッジ交差メッセージのｏフラグ（ＯＶＥＲＲＩＤＥ）は、アサートされているときにはオーバーライドカウンタを増分し、デアサートされているときにはオーバーライドカウンタを減分する。また、エッジ交差メッセージのｃフラグ（ＣＯＮＴＩＮＵＩＮＧ）は、塗りつぶしカウンタを有効化する。塗りつぶしカウンタが有効化される場合、ｕフラグ（ＵＰ）はアサートされているときには塗りつぶしカウンタを増分し、デアサートされているときには塗りつぶしカウンタを減分する。
【０３４４】
上述したように、優先度判定モジュール５００に対する第１のエッジ交差メッセージ（ＡＢＣＤＥＦ）は、画素６においてオーバーライドカウンタを増分し、塗りつぶしカウンタを減分する。その結果、塗りつぶしカウント＝−１、オーバーライドカウント＝１となる。画素０から５に対して塗りつぶしカウンタがアクティブ化されていない状態で一連の画素が生成される。
【０３４５】
第２のエッジ交差メッセージ（Ａ０）は、再度画素６においてオーバーライドカウンタを増分し、その結果、塗りつぶしカウント＝−１、オーバーライドカウント＝２となる。このエッジ交差メッセージは現在の画素に影響を及ぼすので、画素連は生成されない。
【０３４６】
第３のエッジ交差メッセージ（Ａ１）は、画素７においてオーバーライドカウンタを減分し、その結果、塗りつぶしカウント＝−１、オーバーライドカウント＝１となる。一連の画素が画素６に対してアクティブなレベルＰと共に生成される。
【０３４７】
第４のエッジ交差メッセージ（ＡＨＧＦ）は、画素７において塗りつぶしカウンタを増分し、オーバーライドカウンタを減分する。その結果、塗りつぶしカウント＝０、オーバーライドカウント＝０となる。このエッジ交差メッセージは、現在の画素に影響を及ぼすので、画素連は生成されない。
【０３４８】
別のエッジ交差メッセージが発行される場合、あるいは、走査線終端メッセージが受信される場合、塗りつぶしが画素７から次のエッジまたは走査線の終端に至るまでアクティブ化されない状態で一連の画素が生成される。
【０３４９】
今度は図２８に示すエッジに関して、走査線５上のオペレーション、特に、走査線６に対するエッジ追跡を考える。走査線５において、エッジリスト中のエッジレコードは以下の通りである。
【０３５０】
0003797666.tif 000013
0003797666.tif 000014
【０３５１】
走査線５において、アクティブエッジＡＢＣＤＥＦは、最初に（２４０４）エッジ入力モジュール４０８により読み込まれ、ステップ２４１６においてエッジ交差メッセージを画素２（Ｘ＝２．０）において送出した後、エッジ更新モジュール（４１０）に渡される。ｍｉｎＸ、ｍａｘＸ、およびｄＮＹレジスタがステップ２４１８において初期化された後、（ＮＹ＋ｄＮＹ）がステップ２４２０において０．３であると判明する。この値は１よりも小さいので、左の分岐が選ばれる。
【０３５２】
次のステップにおいて、継続エッジレコードＡＢＣＤＥＦのＮＹ（＝０．３）がステップ２４２２においてｄＮＹ（＝０）に加えられる。その結果、ｄＮＹは０．３になる。ステップＳ４２３においてＮＹ＊ＤＸが継続エッジＡＢＣＤＥＦの現在のＸ値に加えられ、２．０＋０．３＊（−１．０）＝１．７になる。
【０３５３】
継続エッジＡＢＣＤＥＦの現在のＸ値１．７がステップ２４２４においてｍｉｎＸ（＝２．０）に対して検査され、この値よりも小さいことが判明する。そのため、Ｘがステップ２４２６においてレジスタｍｉｎＸへとロードされる。このレジスタｍｉｎＸは値１．７を有するようになる。
【０３５４】
次に、新規のセグメントであるセグメントＢＣがステップ２４３２において読まれる。ＢＣに対する初期のＸＳＴＥＰ値はないので、新規のセグメントＢＣが読み込まれた後、アクティブエッジレコードＡＢＣＤＥＦは以下の情報を含む。
【０３５５】
0003797666.tif 000015
【０３５６】
ＮＹ＋ｄＮＹの現在の値がステップ２４２０において再度チェックされ、５．２＋０．３であることが判明する。この値は１より大きいので右の分岐が選ばれる。セグメントの残るＹ範囲は、ステップ２４３５において継続エッジレコード中のＮＹの現在の値から値（１−ｄＮＹ）を引くことによって判定される。エッジの走査線出口点は、ステップ２４３６において継続エッジレコードＡＢＣＤＥＦの現在のＸ位置値に値（１−ｄＮＹ）＊ＤＸ＝（１−０．３）＊０．２１２＝０．１４８４を加えることによって判定される。継続エッジレコードＡＢＣＤＥＦのＸの現在の値（１．８４８４）は、ステップ２４３８および２４５０においてｍｉｎＸ（１．７）およびｍａｘＸ（２．０）に対して検査され、これらの値の間に位置することが判明する。
【０３５７】
したがって、ｍｉｎＸ（１．７）のＸ位置値を有する２つの終端レコードが、ステップ２４５２においてオーバーライドがアサートされている状態でエッジプール４１２へと送出される。１．８４８４のＸ位置値を有する継続エッジＡＢＣＤＥＦは、ステップ２４５４においてオーバーライドがデアサートされている状態でエッジプール４１２へと送出され、ｍａｘＸ（２．０）のＸ位置値を有する第３の終端レコードが、ステップ２４５６においてオーバーライドがデアサートされている状態でエッジプール４１２へと送出される。
【０３５８】
同様に、同じ走査線上において、継続エッジレコードＡＨＧＦのセグメントＡＨが終了し、ステップ２４３２においてセグメントＨＧがロードされ、走査線６を離れる地点まで追跡される。エッジＡＨＧＦは、Ｘ＝７．７５において走査線に入り、Ｘ＝７．８、ｄＮＹ＝０．２まで追跡される。これは、セグメントＨＧがステップ２４３２において読み込まれる前である。このため、Ｘｍｉｎ＝７．７５であり、Ｘｍａｘ＝７．８である。後者は、ステップ２４３２におけるセグメントＨＧのローディングに先立ってステップ２４３０において更新される。エッジＡＨＧＦは、Ｘ＝１０．９３において走査線６を離れる。この値はＸｍａｘよりも大きいので、Ｘｍｉｎ＝７．７５のＸ位置値を有する１つの終端レコードが、ステップ２４４６においてアサートされているｏフラグを伴ってエッジプール４１２へと送出される。加えて、１０．９３のＸ位置値を有する継続エッジレコードＡＨＧＦおよびデアサートされているｏフラグは、ステップ２４４８においてエッジプール４１２へと送出される。
【０３５９】
このため、ソート済のエッジが走査線６上でステップ２４０４において読み込まれるとき、以下のエッジ交差メッセージが優先度判定モジュール５００へと送信される。
【０３６０】
0003797666.tif 000016
0003797666.tif 000017
【０３６１】
優先度判定モジュール５００へと送信されたこれらのエッジ交差メッセージに応答して画素順次レンダリング装置２０により塗りつぶされた結果の区域が図２９に示される。
【０３６２】
第１のエッジ交差メッセージＢＣ０は、優先度判定モジュール５００により画素１において受信されるので、画素０は非アクティブ化されたレベルＰと共に送出される。すなわち、画素０は塗りつぶされない。画素１に関して、レベルＰに対する優先度判定モジュール５００におけるオーバーライドカウンタは、最初に受信した２つのメッセージ（ＢＣ０およびＢＣ１）によって２度増分される。このため、レベルＰはこれらのメッセージにより画素１に対してアクティブ化される。さらに、これらのメッセージ（ＢＣ０およびＢＣ１）は継続エッジメッセージではないので、レベルＰにおける塗りつぶしカウントは０のままであり、増分または減分は行なわれない。
【０３６３】
優先度判定モジュール５００が受信する次のメッセージ（ＡＢＣＤＥＦ）は画素２に対するものであり、オーバーライドカウントは０以外であるので、レベルＰは画素１に対してアクティブ化される。メッセージＡＢＣＤＥＦは、画素２においてオーバーライドカウントを減分すると共に塗りつぶしカウントを増分し、この後にはメッセージＢＣ２が続く。
【０３６４】
メッセージＢＣ２は、オーバーライドカウントをもう１度減分する。受信する次のメッセージ（ＨＧ０）は画素７に対するものであるので、画素２から６に対してはオーバーライドカウントは０であり、塗りつぶしカウントは１である。このため、レベルＰは画素２から６に対してアクティブ化された状態を維持する。なお、エッジが接していない画素に対してはオーバーライドカウントは０である。
【０３６５】
これらの画素に対して塗りつぶしカウントおよび塗りつぶしルールは、画素がアクティブ化されているか否かを判定する。メッセージＨＧ０は、画素７においてオーバーライドカウンタを増分するが、残るメッセージ（ＡＨＧＦ）は画素１１に対するものである。このため、画素７から１０に対してオーバーライドカウントは１、塗りつぶしカウントは１であり、レベルＰはこれらの画素に対してアクティブ化された状態を維持する。
【０３６６】
メッセージＡＨＧＦは、画素１１において塗りつぶしカウントおよびオーバーライドカウントを減分するので、残る画素に対して塗りつぶしカウントおよびオーバーライドカウントは共に０である。別のオブジェクトからの別のエッジ交差メッセージまたは走査線終端メッセージが受信されるとき、１１で開始される残る画素は、レベルＮが非アクティブ化された状態で送出される。
【０３６７】
別の実施例は、画素順次レンダリング装置２０を完全にソフトウェアで実現した例である。このソフトウェア実現例は、現在の走査線に対してオブジェクトのエッジを定義するエッジレコードの連結リストを利用することによって画素スパンの塗りつぶしを可能にするエッジソフトウェアモジュールから構成される。このエッジソフトウェアモジュールは、エッジ処理モジュール４００と機能的にほぼ同等である。しかし、幾つかの機能的な相違があるのでそれを説明する。
【０３６８】
先に説明したエッジ処理モジュール４００と同様に、エッジソフトウェアモジュールは、２つ以上の動作モードで動作することが可能である。第１の動作モードおよび第２の動作モードの双方において、ドライバソフトウェアは、先に説明したのと同様に継続エッジレコードおよび終端エッジレコードを生成する。この実施例において、これらの継続エッジレコードおよび終端エッジレコードは、エッジソフトウェアモジュールへと供給される。
【０３６９】
エッジソフトウェアモジュールの第２の動作モードにおいて、エッジレコードの連結リストは、１つ以上の組のエッジレコードを含む。各組は、第１の型のエッジレコード（以降、影のエッジレコードと呼ぶ）と第２の型のエッジレコード（以降、元のエッジレコードと呼ぶ）とから構成される。１つの組の影のエッジレコードおよび元のエッジレコードは、それぞれ、現在の走査線のオブジェクトのエッジと関連付けられた第１のエッジ（以降、影のエッジと呼ぶ）および第２のエッジ（以降、元のエッジと呼ぶ）を定義する。
【０３７０】
影のエッジレコードおよび元のエッジレコードは、共に同じ構造を有する。この構造は、ほぼ図１４Ａに示されると共に図１４Ａを参照して説明される通りであり、以下の変形例を伴う。図１４Ａに示すフィールドに加えて、影のエッジレコードおよび元のエッジレコードは、共に整数値を格納するための更なるフィールドＸ．ｐｉｘｅｌ（不図示）を含む。
【０３７１】
影のエッジレコードは、走査線に沿った方向に対する現在の走査線内のエッジの最小範囲のＸ座標の切り捨てられた値をＸ．ｐｉｘｅｌフィールドに格納する。これに対し、元のエッジレコードは、走査線に沿った同じ方向に対する現在の走査線内のエッジの最大範囲のＸ座標の切り上げられた値をＸ．ｐｉｘｅｌフィールドに格納する。
【０３７２】
各エッジレコードは、ポインタ（Ｓ）を含むための更なるフィールド（不図示）を含む。このポインタは、関連する影のエッジレコードを参照するために元のエッジレコードが使用する。影のエッジレコードではこのフィールドは使用されておらず、ヌルに設定される。各影のエッジレコードは、分数値としてＸフィールド中の現在の走査線からの関連するエッジの出口位置のＸ座標をＸフィールドに格納する。
【０３７３】
また、そのオーバーライドフラグｏはアサートされている。これに対し、ポインタ（Ｓ）を介して関連する影のエッジレコードを参照することによってこの値を取得することができるので、元のエッジレコードのＸフィールドはヌルに設定される。元のエッジレコードのオーバーライドフラグはデアサートされている。また、影のエッジレコードは、現在の走査線内のエッジの最大範囲のＸ座標の切り上げされた値を格納するためのＸ．ｍａｘと呼ばれるフィールドを有する。このフィールドは、元のエッジレコードではヌルに設定される。
【０３７４】
連結リストは、継続エッジレコードおよび終端エッジレコードを含んでも良い。先に説明したように、ドライバソフトウェアは、現在の走査線で開始される新規のエッジごとに継続エッジレコードおよび終端エッジレコードを生成する。これらの新規の継続エッジレコードおよび終端エッジレコードは、現在の走査線中に連結リストへとマージされる。現在の走査線のレンダリング後に、終端エッジは連結リストから破棄され、継続エッジレコードは、影のエッジレコードまたは元のエッジレコードに適宜変換される。
【０３７５】
これらの影のエッジレコード、元のエッジレコード、継続エッジレコード、および終端エッジレコードは、全て同じ構造（すなわち、フィールド）を有する。これら全てのエッジレコードのｃフラグ（図１４Ａ参照）は、連結リスト中のエッジレコードが影のエッジレコード、元のエッジレコード、継続エッジレコード、および終端エッジレコードのいずれであるかを指定するために２ビットを有する。継続エッジレコードおよび終端エッジレコードはポインタ（Ｓ）フィールドを使用しないので、このフィールドはヌルに設定される。
【０３７６】
継続エッジレコードは、分数値として現在の走査線からの関連するエッジの出口位置のＸ座標をＸフィールドに格納する。終端エッジレコードのＸフィールドはヌルに設定されている。継続エッジレコードまたは終端エッジレコード中のアサートされたオーバーライドフラグｏは、最小範囲のＸ座標の切り捨てられた値がＸ．ｐｉｘｅｌフィールドに格納されていることを示す。これに対し、継続エッジレコードまたは終端エッジレコード中のデアサートされたオーバーライドフラグｏは、最大範囲のＸ座標の切り上げられた値がＸ．ｐｉｘｅｌフィールドに格納されていることを示す。
【０３７７】
第２の動作モードにおいて、エッジソフトウェアモジュールは、新規の走査線の開始時において、新規の走査線に対してドライバソフトウェアにより生成された継続エッジレコードおよび終端エッジレコードを検索し、それらのレコードを連結リストへとマージする。マージングの後、連結リストのエッジレコードは、フィールドＸ．ｐｉｘｅｌに格納された整数Ｘ値に従ってソートされる。
【０３７８】
エッジソフトウェアモジュールは、優先度判定モジュール、塗りつぶしカラー判定モジュール、画素合成モジュール、およびレンダリングのための出力モジュールの各オペレーションを実現するために、この新規の走査線に対するマージされた連結リストを更なるソフトウェアモジュールへと渡す。連結リストは、次の走査線に対するエッジソフトウェアモジュールによる更新のために保存される。エッジソフトウェアモジュールは、連結リスト中の関連する影のエッジレコードおよび元のエッジレコード、終端エッジレコード、および継続エッジレコードの各組を順番に更新する。ソフトウェアは、新規の走査線に対して予め更新されていないリスト中の第１のエッジレコードを順番に検索する。
【０３７９】
続いて、ソフトウェアは、このエッジレコードが終端エッジレコード、継続エッジレコード、影のエッジレコード、および元のエッジレコードのいずれであるのかをチェックする。
【０３８０】
エッジレコードが終端エッジレコードの場合、そのエッジレコードは連結リストから削除され、ソフトウェアはリスト中の次のエッジレコードへと進む。
【０３８１】
エッジレコードが影のエッジレコードの場合、ソフトウェアはエッジレコード中の各フィールド（Ｘ、ＮＹ、ＤＷ、ＳＥＧＭＥＮＴ ＡＤＤＲなど）から以下の項目を計算する。すなわち、影のエッジレコードのＸフィールドに格納される次の走査線からのエッジの出口位置（新規のＸ値）、影のエッジレコードのＸ．ｐｉｘｅｌフィールドに格納される次の走査線内のエッジの最小Ｘ位置の切り捨てられた値、および影のエッジレコードのＸ．ｍａｘフィールドに格納される次の走査線内のエッジの最大Ｘ位置の切り上げられた値である。この影のエッジレコードが次の走査線において終結する場合、レコードのｗｉｌｌＴｅｒｍｉｎａｔｅフラグが設定される。
【０３８２】
ソフトウェアは、リスト中の次の未処理のエッジへと進む。エッジレコードが元のエッジレコードの場合、ソフトウェアはエッジレコード中のＳポインタを使用して関連する影のエッジレコードを参照し、元のエッジのＸ．ｐｉｘｅｌフィールドは参照される影のエッジレコード中のＸ．ｍａｘ値と同じ値に設定される。参照される影のエッジレコード中のｗｉｌｌＴｅｒｍｉｎａｔｅフラグが設定される場合、ソフトウェアは影のエッジレコードおよび元のエッジレコードの双方をリストから削除する。
【０３８３】
ソフトウェアはリスト中の次の未処理のエッジへと進む。エッジレコードが継続エッジレコードの場合、このレコードは元のエッジレコードと影のエッジレコードの対へと変換される。この変換は、新規のエッジレコードを作成し、リスト中の継続エッジレコードの前にこの新規のエッジレコードを挿入し、新規のエッジレコード中の全てのフィールドを継続エッジレコード中の対応するフィールドと同じ値を有するように設定し、影のエッジレコードであることを示すように新規のエッジレコード中のｃフラグを設定し、元のエッジレコードであることを示すように継続エッジレコード中のｃフラグを設定し、双方のエッジレコードに対して適正であるようにオーバーライドフラグｏを設定し、新規の影のエッジをポイントするように元のエッジレコードのＳポインタを設定し、影のエッジレコードおよび元のエッジレコードに対して前述したように双方のエッジレコードを更新することによって行なわれる。ソフトウェアは、リスト中の未処理のエッジへと進む。
【０３８４】
連結リストの既存のエッジレコードの処理が終了した後に、ソフトウェアは新規の継続エッジレコードおよび終端エッジレコードが次の走査線において開始されるか否かをチェックする。開始される場合、新規の継続エッジレコードおよび終端エッジレコードは、連結リストへとマージされる。ソフトウェアは、連結リストをＸの昇順でフィールドＸ．ｐｉｘｅｌに従ってソートし、連結リストを優先度判定モジュール、塗りつぶしカラー判定モジュール、画素合成モジュール、およびレンダリングのための出力モジュールの各オペレーションを実現するために更なるソフトウェアモジュールへと渡す。
【０３８５】
エッジソフトウェアモジュールは、次の走査線のために連結リストを再度更新する。ソフトウェアは、このように全ての走査線の処理が終了するまで処理を続行する。
【０３８６】
あるエッジの影のエッジが常にエッジの片側にあり、元のエッジが常にそのエッジの別の側にあることは、当業者には明らかであろう。これに対し、エッジの継続エッジは常に負の傾斜を有するエッジの片側にあり、正の傾斜を有するエッジの別の側にあるであろう。終端エッジに関してはその逆である。
【０３８７】
この後の方の実施例の変形例において、ドライバソフトウェアは、新規の影のエッジレコードおよび元のエッジレコードを生成する。
【０３８８】
「影の」エッジおよび「元の」エッジの目的は、終端エッジおよび継続エッジのオペレーションを模倣することであるが、「影の」エッジは、元のエッジと同じ本数の走査線に対して存在する。このため、影のエッジは、各走査線上で作成／破棄される前述の終端エッジとは異なり、元のエッジレコードの間に１度だけ作成され、破棄される。従って、このソフトウェア実現例は、走査線ごとにエッジレコードを作成／破棄するハードウェア版と同等のソフトウェアよりも効率が良いエッジの処理を考慮に入れている。
【０３８９】
エッジソフトウェアモジュールの第２の動作モードにおいて、エッジレコードの連結リストは、元のエッジレコードのみを含む。エッジソフトウェアモジュールの第２の動作モードにおいて、エッジレコードの連結リストは、継続エッジレコードのみを含む。この動作モードにおいて、継続エッジレコードは、影のエッジを更新するための前述の方法に従って更新される。異なるのは、エッジが次の走査線で終結する場合、ｗｉｌｌＴｅｒｍｉｎａｔｅフラグを設定する代わりに、連結リストからエッジが削除される点である。
【０３９０】
コンピュータシステム１により実現される前述の好適なプロセスは、特定の制御フローから成る。本発明の趣旨から逸脱することなく様々な制御フローを使用する好適なプロセスの変形例は、他にも数多く存在する。更に、好適な方法の各ステップのうちの１つ以上は、順次に実行されるのではなく、並行して実行されても良い。
【０３９１】
（産業上の利用可能性）
以上の説明から前述の各構成はコンピュータグラフィックスおよび印刷産業に適用可能であることが明らかである。
【０３９２】
以上の記述では、本発明の幾つかの実施例のみの説明を行なったが、本発明の趣旨から逸脱することなく、変形および／または変更を行なうことが可能である。各実施例は例示のためのものであり、本発明を限定するものではない。
【図面の簡単な説明】
【図１】各々が複数の画素から構成される画像の複数の走査線と、ページ記述言語PostScript（登録商標）のラスタライズルールを説明するための例示のオブジェクトの複数のエッジとを示す図である。
【図２Ａ】複数の画素から構成される画像の１本の走査線と、ページ記述言語の典型的な従来のラスタライズルールを説明するための例示のオブジェクトの２本のエッジとを示す図である。
【図２Ｂ】複数の画素から構成される画像の１本の走査線と、ページ記述言語のPostScript（登録商標）のラスタライズルールをより詳細に説明するための例示のオブジェクトの２本のエッジとを示す図である。
【図３】好適な実施例を組み込むコンピュータシステムを表す概略ブロック図である。
【図４】好適な実施例の機能データフローを示すブロック図である。
【図５】好適な実施例の画素順次レンダリング装置、関連するディスプレイリスト、および一時的な記憶装置を表す概略ブロック図である。
【図６】図５のエッジ処理モジュールを表す概略機能図である。
【図７】図５の優先度判定モジュールを表す概略機能図である。
【図８】図５の塗りつぶしデータ判定モジュールを表す概略機能図である。
【図９Ａ】、
【図９Ｂ】、
【図９Ｃ】ソースと宛先との間の画素の組み合わせを示す図である。
【図９Ｄ】好適な実施例に含まれるラスタオペレーションの例を示す図である。
【図１０】好適な実施例のオペレーションを説明するための一例として使用される２オブジェクト画像を示す図である。
【図１１Ａ】、
【図１１Ｂ】図１０のオブジェクトのベクトルエッジを示す図である。
【図１２】図１０の画像の複数の走査線のレンダリングを示す図である。
【図１３】図１０の画像に対するエッジレコードの構成を表す図である。
【図１４Ａ】、
【図１４Ｂ】、
【図１４Ｃ】、
【図１４Ｄ】、
【図１４Ｅ】、
【図１４Ｆ】、
【図１４Ｇ】、
【図１４Ｈ】、
【図１４Ｉ】、
【図１４Ｊ】図１０の例に対して図４の構成により実現されるエッジ更新ルーチンを示す図である。
【図１５Ａ】、
【図１５Ｂ】オッドイーブン塗りつぶしルールおよびノンゼロワインディング塗りつぶしルールを示す図である。
【図１６Ａ】、
【図１６Ｂ】、
【図１６Ｃ】、
【図１６Ｄ】、
【図１６Ｅ】Ｘ座標における大きな変化があふれ条件に寄与する様子およびそれらの変化が処理される様子を示す図である。
【図１７Ａ】、
【図１７Ｂ】、
【図１７Ｃ】、
【図１７Ｄ】、
【図１７Ｅ】図７の構成により実現される優先度塗りつぶしルーチンを示す図である。
【図１８Ａ】、
【図１８Ｂ】、
【図１８Ｃ】、
【図１８Ｄ】２つの従来のエッジ記述形式と好適な装置で使用されるエッジ記述形式との比較を提供する図である。
【図１９Ａ】、
【図１９Ｂ】表現ツリーおよび対応する描写として表される単純な合成表現を示す図である。
【図２０Ａ】正確なスタックオペレーションを保証するために構成されるテーブルを示す図である。
【図２０Ｂ】図２０Ａのテーブルの好適な形態を示す図である。
【図２１】表現ツリーの一例を示す図である。
【図２２Ａ】、
【図２２Ｂ】、
【図２２Ｃ】、
【図２２Ｄ】、
【図２２Ｅ】、
【図２２Ｆ】図２１の表現のアクティビティテーブル評価とその評価中の対応する合成スタックとを示す図である。
【図２２Ｇ】、
【図２２Ｈ】、
【図２２Ｉ】アクティビティテーブルおよび関連するモジュールの種々の構成を示す図である。
【図２３】複数の合成オペレーションの結果を示す図である。
【図２４Ａ】、
【図２４Ｂ】エッジが接した画素が塗りつぶされていることを保証する追加のレコードを生成するエッジ追跡メカニズムのフローチャートである。
【図２５】新規のエッジの継続エッジレコードおよび終端エッジレコードのドライバソフトウェアによる生成の一例を示す図である。
【図２６】幾つかのレベルから構成される好適な実施例におけるレベルアクティブ化メカニズムの小区分を示す図である。
【図２７Ａ】、
【図２７Ｂ】、
【図２７Ｃ】走査線を横断するエッジの最大Ｘ位置レジスタ、最小Ｘ位置レジスタ、継続Ｘ位置レジスタに記録される位置を、それぞれとりうる値の構成の結果を比較しながら示す図である。
【図２８】単純なオブジェクトのアクティブ化オペレーションを実証するための例において使用される単純なエッジを示す図である。
【図２９】例において検討される走査線上での図２８に示すオブジェクトのアクティブ化オペレーションを示す図である。
【図１】
0003797666.tif 000018
【図２Ａ】
0003797666.tif 000019
【図２Ｂ】
0003797666.tif 000020
【図３】
0003797666.tif 000021
【図４】
0003797666.tif 000022
【図５】
0003797666.tif 000023
【図６】
0003797666.tif 000024
【図７】
0003797666.tif 000025
【図８】
0003797666.tif 000026
【図９Ａ】
0003797666.tif 000027
【図９Ｂ】
0003797666.tif 000028
【図９Ｃ】
0003797666.tif 000029
【図９Ｄ】
0003797666.tif 000030
【図１０】
0003797666.tif 000031
【図１１Ａ】
0003797666.tif 000032
【図１１Ｂ】
0003797666.tif 000033
【図１２】
0003797666.tif 000034
【図１３】
0003797666.tif 000035
【図１４Ａ】
0003797666.tif 000036
【図１４Ｂ】
0003797666.tif 000037
【図１４Ｃ】
0003797666.tif 000038
【図１４Ｄ】
0003797666.tif 000039
【図１４Ｅ】
0003797666.tif 000040
【図１４Ｆ】
0003797666.tif 000041
【図１４Ｇ】
0003797666.tif 000042
【図１４Ｈ】
0003797666.tif 000043
【図１４Ｉ】
0003797666.tif 000044
【図１４Ｊ】
0003797666.tif 000045
【図１５Ａ】
0003797666.tif 000046
【図１５Ｂ】
0003797666.tif 000047
【図１６Ａ】
0003797666.tif 000048
【図１６Ｂ】
0003797666.tif 000049
【図１６Ｃ】
0003797666.tif 000050
【図１６Ｄ】
0003797666.tif 000051
【図１６Ｅ】
0003797666.tif 000052
【図１７Ａ】
0003797666.tif 000053
【図１７Ｂ】
0003797666.tif 000054
【図１７Ｃ】
0003797666.tif 000055
【図１７Ｄ】
0003797666.tif 000056
【図１７Ｅ】
0003797666.tif 000057
【図１８Ａ】
0003797666.tif 000058
【図１８Ｂ】
0003797666.tif 000059
【図１８Ｃ】
0003797666.tif 000060
【図１８Ｄ】
0003797666.tif 000061
【図１９Ａ】
0003797666.tif 000062
【図１９Ｂ】
0003797666.tif 000063
【図２０Ａ】
0003797666.tif 000064
【図２０Ｂ】
0003797666.tif 000065
【図２１】
0003797666.tif 000066
【図２２Ａ】
0003797666.tif 000067
【図２２Ｂ】
0003797666.tif 000068
【図２２Ｃ】
0003797666.tif 000069
【図２２Ｄ】
0003797666.tif 000070
【図２２Ｅ】
0003797666.tif 000071
【図２２Ｆ】
0003797666.tif 000072
【図２２Ｇ】
0003797666.tif 000073
【図２２Ｈ】
0003797666.tif 000074
【図２２Ｉ】
0003797666.tif 000075
【図２３】
0003797666.tif 000076
【図２４Ａ】
0003797666.tif 000077
【図２４Ｂ】
0003797666.tif 000078
【図２５】
0003797666.tif 000079
【図２６】
0003797666.tif 000080
【図２７Ａ】
0003797666.tif 000081
【図２７Ｂ】
0003797666.tif 000082
【図２７Ｃ】
0003797666.tif 000083
【図２８】
0003797666.tif 000084
【図２９】
0003797666.tif 000085