JP3797666B2 - グラフィックオブジェクトの塗りつぶしをアクティブ化する方法および装置 - Google Patents
グラフィックオブジェクトの塗りつぶしをアクティブ化する方法および装置 Download PDFInfo
- Publication number
- JP3797666B2 JP3797666B2 JP2002313989A JP2002313989A JP3797666B2 JP 3797666 B2 JP3797666 B2 JP 3797666B2 JP 2002313989 A JP2002313989 A JP 2002313989A JP 2002313989 A JP2002313989 A JP 2002313989A JP 3797666 B2 JP3797666 B2 JP 3797666B2
- Authority
- JP
- Japan
- Prior art keywords
- edge
- scan line
- current scan
- record
- pixel
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims description 99
- 230000003213 activating effect Effects 0.000 title claims description 32
- 238000004804 winding Methods 0.000 claims description 17
- 238000004590 computer program Methods 0.000 claims description 9
- 238000011049 filling Methods 0.000 claims description 6
- 235000019687 Lamb Nutrition 0.000 claims 1
- 238000012545 processing Methods 0.000 description 103
- 238000009877 rendering Methods 0.000 description 69
- 230000000875 corresponding effect Effects 0.000 description 45
- 238000001994 activation Methods 0.000 description 44
- 230000008569 process Effects 0.000 description 44
- 230000004913 activation Effects 0.000 description 43
- 239000000203 mixture Substances 0.000 description 35
- 230000015654 memory Effects 0.000 description 28
- 230000000694 effects Effects 0.000 description 27
- 238000010586 diagram Methods 0.000 description 25
- 238000003860 storage Methods 0.000 description 20
- 239000002131 composite material Substances 0.000 description 15
- 230000015572 biosynthetic process Effects 0.000 description 13
- 238000003786 synthesis reaction Methods 0.000 description 12
- 230000007246 mechanism Effects 0.000 description 11
- 239000013598 vector Substances 0.000 description 11
- 230000006870 function Effects 0.000 description 10
- 230000009471 action Effects 0.000 description 8
- 239000003973 paint Substances 0.000 description 8
- 230000008859 change Effects 0.000 description 7
- 208000019300 CLIPPERS Diseases 0.000 description 6
- 208000021930 chronic lymphocytic inflammation with pontine perivascular enhancement responsive to steroids Diseases 0.000 description 6
- 238000011156 evaluation Methods 0.000 description 6
- 239000004065 semiconductor Substances 0.000 description 6
- 238000003491 array Methods 0.000 description 5
- 230000001174 ascending effect Effects 0.000 description 5
- 238000004364 calculation method Methods 0.000 description 4
- 230000009849 deactivation Effects 0.000 description 4
- 238000007639 printing Methods 0.000 description 4
- 238000012546 transfer Methods 0.000 description 4
- 241001289753 Graphium sarpedon Species 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 238000011068 loading method Methods 0.000 description 3
- 235000020004 porter Nutrition 0.000 description 3
- 230000004044 response Effects 0.000 description 3
- 101100328887 Caenorhabditis elegans col-34 gene Proteins 0.000 description 2
- 238000004422 calculation algorithm Methods 0.000 description 2
- 239000003086 colorant Substances 0.000 description 2
- 238000007667 floating Methods 0.000 description 2
- 239000012634 fragment Substances 0.000 description 2
- 238000007689 inspection Methods 0.000 description 2
- 230000005055 memory storage Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- PXFBZOLANLWPMH-UHFFFAOYSA-N 16-Epiaffinine Natural products C1C(C2=CC=CC=C2N2)=C2C(=O)CC2C(=CC)CN(C)C1C2CO PXFBZOLANLWPMH-UHFFFAOYSA-N 0.000 description 1
- 108091081062 Repeated sequence (DNA) Proteins 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000012432 intermediate storage Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000005259 measurement Methods 0.000 description 1
- 230000003278 mimic effect Effects 0.000 description 1
- 239000003607 modifier Substances 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000010422 painting Methods 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 230000000717 retained effect Effects 0.000 description 1
- 238000012552 review Methods 0.000 description 1
- 238000005070 sampling Methods 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
- 230000026676 system process Effects 0.000 description 1
- 230000009897 systematic effect Effects 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
- 238000011144 upstream manufacturing Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T11/00—2D [Two Dimensional] image generation
- G06T11/40—Filling a planar surface by adding surface attributes, e.g. colour or texture
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T2200/00—Indexing scheme for image data processing or generation, in general
- G06T2200/28—Indexing scheme for image data processing or generation, in general involving image processing hardware
Description
(発明の分野)
本発明は、印刷および/または表示に関し、特に、グラフィックオブジェクトの塗りつぶしのアクティブ化に関する。
【0002】
(背景)
印刷および/または表示のためにページをレンダリングするとき、PostScript(登録商標)やPCLなどのページ記述言語で、すなわち、WindowsのGDI又はX−11などのグラフィックインタフェースに対する関数呼出しにおいて提供されるグラフィックスオブジェクトの1組の記述として、ページの中間記述が行なわれることが多い。ページ上のエッジの観点から記述されるオブジェクトのラスタライズのためのルールは、インタフェース又はページ記述言語の固有の特徴であり、使用されるインタフェース又はページ記述言語の種類によって異なる。ページは、通常、オブジェクトベースのグラフィックスシステムによりグラフィックインタフェースを介して印刷および/または表示のためのレンダリングが行なわれる。
【0003】
これらのオブジェクトベースのグラフィックスシステムの多くは、続いて印刷および/または表示を行なうページまたは画面の画素ベースの画像を保持するのにフレームメモリまたはページバッファを利用する。通常、グラフィックオブジェクトの輪郭が計算され、塗りつぶされ、フレームメモリへと書き込まれる。2次元グラフィックスの場合、他のオブジェクトの前面に表示されるオブジェクトは、背景オブジェクトより後にフレームメモリへと書き込まれるだけであり、それにより、背景が画素単位で置き換えられる。これは、従来より「Painter's algorithm(画家アルゴリズム)」として広く知られている。オブジェクトは、最後尾のオブジェクトから先頭のオブジェクトに至るまで優先度の順序で考慮される。通常、各オブジェクトは走査線順でラスタライズされ、画素は各走査線に沿った順次の走行においてフレームメモリに書き込まれる。
【0004】
この技術には、本質的に2つの問題がある。第1の問題は、フレームメモリ中の全ての画素に対して高速なランダムアクセスが必要とされることである。これは、考慮される各新規のオブジェクトがフレームメモリ中の任意の画素に影響を及ぼす可能性があるからである。このため、フレームメモリは、通常、半導体ランダムアクセスメモリ(RAM)において保持される。高解像度のカラープリンタの場合、必要なRAMの容量は非常に大きく、通常、100メガバイトを超える。これではコストが高くつくし、高速で動作させることが困難である。第2の問題は、ペイント済(レンダリング済)の多数の画素が、後のオブジェクトにより過剰ペイント(再レンダリング)されることである。既にオブジェクトを有する画素をペイントするのは時間の浪費であった。
【0005】
フレームメモリが大容量になる問題を克服する方法の1つは、「バンディング(banding)」の使用である。バンディングを使用すると、常に、フレームメモリの一部のみがメモリに存在するようになる。描画対象の全てのオブジェクトが「ディスプレイリスト」に保存される。画像全体は前述のようにレンダリングされるが、フレームメモリのうちの既に存在する部分以外をペイント(レンダリング)するべく試みる画素ペインティング(レンダリング)動作は「省略」される。全てのオブジェクトの描画が終了すると、フレームメモリの断片部がプリンタ(又は他の位置)に送信され、フレームメモリの別の部分が選択されて処理が繰り返される。この技術には幾つかの不利な点がある。例えば、描画されるオブジェクトは、考慮された後に何度も −バンドごとに1度− 再考慮しなければならない。バンドの数が増加すると、レンダリングを必要とするオブジェクトの検査を繰り返す回数も増加する。バンディングの技術では過剰ペイントのコストの問題は解決しない。
【0006】
別のグラフィックシステムは走査線順で画像の処理にあたる。描画対象の全てのオブジェクトは、同様にディスプレイリストに保存される。各走査線上で、走査線と交わるオブジェクトが優先度順に考慮され、オブジェクトごとにオブジェクトエッジ交点間の画素のスパンがラインメモリに設定される。この技術も、フレームメモリの大容量の問題は克服するが、依然として過剰ペイントの問題を抱えている。
【0007】
別のグラフィックシステムは、画素順次レンダリングを使用する。この画素順次レンダリングは、フレームメモリの大容量の問題および過剰ペイントの問題の双方を克服する。このシステムでは、各走査線が順次生成される。描画対象の全てのオブジェクトはディスプレイリストに保存される。各走査線上で、走査線と交わるオブジェクトのエッジが、走査線との交差の昇順で保存される。これらの交点、すなわち、エッジ交点は、順次考慮されてアクティブフィールドのアレイをトグルで切り換えるのに使用される。各オブジェクト優先度には、1つのアクティブフィールドがあり、これは、走査線上で注目されるフィールドである。考慮される各1対のエッジ間において、第1のエッジと次のエッジとの間にある画素ごとのカラーデータは、どの優先度が一番高いかを判定するためにアクティブフラグ上で優先度符号器を使用すると共に、2本のエッジ間のスパンの各画素に対する優先度と関連付けられる色を使用することによって生成される。次の走査線に備えて、各エッジの性質に従ってエッジの交点の座標が更新される。隣接するエッジは、この更新の結果、ソートが失敗してスワップされる。新規のエッジもエッジのリストにマージされる。
【0008】
画素順次レンダリングを使用するこれらのグラフィックスシステムは、フレームメモリまたはラインメモリがなく、過剰ペイントがなく、オブジェクト優先度が順序N(Nは優先順位の数)の時間ではなく、一定の順序の時間で処理される点で重要な利点を有する。これらの画素順次レンダリンググラフィックシステムでは、オブジェクトのエッジは相互に無関係に追跡される。これらのシステムは、エッジ位置を丸めるための、グラフィックインタフェースまたはページ記述言語において固有のラスタライズ・ルールが、オブジェクトのアクティブ化および非アクティブ化に対しても同じである場合に、ページの確実な表現をレンダリングするであろう。
【0009】
図2Aを参照して説明する。ページ記述言語の典型的な従来のラスタライズ・ルールを説明するために、複数の画素(ボックスで表される)で構成される1本の画像の走査線200a、および、オブジェクトの一例として2本のエッジ202a、203aが描かれている。このラスタライズ・ルールでは、オブジェクトのアクティブ化および非アクティブ化のどちらに対しても、エッジ(例えば、202a、203a)のエッジ交点(例えば、204a、205a)の位置は、常に、次の画素の左上隅の位置へと数学的に切り上げられる。この例では、オブジェクトのアクティブ画素、すなわち、オブジェクトにより塗りつぶされる全ての画素は、斜線で塗りつぶされたボックスとして示されている。典型的な画素順次レンダリンググラフィックシステムは、オブジェクトがアクティブ化されるか非アクティブ化されるかに関わらず、各エッジに対して別々に適用することが可能であるので、このようなラスタライズ・ルールを実現することができる。しかし、エッジ位置を丸めるためのラスタライズ・ルールが、オブジェクトがアクティブ化されているか非アクティブ化されているかに依存するページ記述言語およびインタフェースもある。適切な例は、ページ記述言語PostScript(登録商標)の従来のラスタライズ・ルールである。このルールは、オブジェクトのエッジに接し、そのオブジェクトにより塗りつぶされる全ての画素を指定する。
【0010】
ここで、図1を参照されたい。このようなラスタライズ・ルールを説明するために、それぞれが複数の画素(ボックスで表される)で構成される複数本の画像の走査線100a、および、オブジェクトの一例として複数のエッジ102a、104a、106a、108aが描かれている。オブジェクトのアクティブ画素、すなわち、オブジェクトにより塗りつぶされる全ての画素は、斜線で塗りつぶされたボックスとして示されている。図1において明らかなように、例示のオブジェクトのエッジ102a、104a、106a、108aが接する全ての画素はアクティブである。このため、エッジの位置は、アクティブ化のためには切り捨てられ、非アクティブ化のためには切り上げられなければならない。
【0011】
ここで図2Bを参照すると、ページ記述言語PostScript(登録商標)の従来のラスタライズ・ルールをより詳細に説明するために、複数の画素(ボックスで表される)で構成される1本の画像の走査線210b、および、オブジェクト一例として2本のエッジ212b、213bが描かれている。例示のオブジェクトの2本のエッジ212b、213bはそれぞれ、入口点218b、214bおよび出口点220b、216bで走査線210bと交差する。ここでも、オブジェクトのアクティブ画素は、斜線で塗りつぶされたボックスとして示されている。図2Bにおいて明らかなように、例示のオブジェクトのエッジ212b、213bが接する全ての画素はアクティブである。このため、アクティブ化のためには、エッジ212bの入口位置218bまたは出口位置220bの最小位置は、数学的に切り捨てられ、非アクティブ化のためには、エッジ213bの入口位置214bまたは出口位置216bの最大位置が数学的に切り上げられなければならない。
【0012】
また、エッジが走査線を横切る際にいくつかの画素を通る場合があるので、かかる軌跡の範囲は、エッジの入口点および出口点にかかわらずアクティブ化されなければならない。しかし、通常の画素順次レンダリンググラフィックシステムは、オブジェクトがアクティブ化されるか非アクティブ化されるかにかかわらず、各エッジの丸めに同じラスタライズ・ルールを適用する。その結果、ページ記述言語およびグラフィックインタフェースに固有のエッジ位置を丸めるためのラスタライズ・ルールが、オブジェクトがアクティブ化されているか非アクティブ化されているかに依存する場合、画素順次レンダリンググラフィックシステムは、オブジェクトの不安定な描画をレンダリングしてしまう。
【0013】
(概要)
本発明は、既存の構成の1つ以上の欠点を克服、あるいは、少なくとも改善することを目的とする。
【0014】
本発明の一側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化する方法であって、現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成する生成ステップと、前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するアクティブ化ステップと、を有し、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られることを特徴とする方法が提供される。
【0015】
本発明の別の側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化する装置であって、現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成するモジュールと、前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するモジュールと、を有し、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線からの前記エッジの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られることを特徴とする装置が提供される。
【0016】
本発明の別の側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコンピュータプログラムであって、現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成するためのコードと、前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコードと、を有し、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線からの前記エッジの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られることを特徴とするコンピュータプログラムが提供される。
【0017】
本発明の更に別の側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化する方法であって、現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた2つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成する生成ステップと、前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するアクティブ化ステップと、を有し、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とする方法が提供される。
【0018】
本発明の更に別の側面によれば、グラフィックオブジェクトの塗りつぶしをアクティブ化する装置であって、現在の走査線に対して前記オブジェクトのエッジと関連付けられた2つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成する手段と、前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化する手段と、を有し、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とする装置が提供される。
【0019】
本発明の別の側面によると、グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコンピュータプログラムであって、現在の走査線に対して前記オブジェクトのエッジと関連付けられた2つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成するコードと、前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するコードと、を有し、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とするコンピュータプログラムが提供される。
【0020】
本発明のその他の側面も開示される。
【0021】
(ベストモードを含む詳細な説明)
添付のいずれか1つ以上の図面において、同じ符号を有するステップおよび/または特徴に言及する場合、特に明記されていない限り、以下の記述においては、これらのステップおよび/または特徴は、同じ機能または動作を有するものとする。
【0022】
<1.0 コンピュータグラフィックオブジェクト画像のレンダリングおよび描画のためのシステム>
図3は、コンピュータグラフィックオブジェクト画像のレンダリングおよび描画のために構成されたコンピュータシステム1を概略的に示す図である。システムは、システムランダムアクセスメモリ(RAM)3と関連付けられたホストプロセッサ2を含む。システムRAM3は、不揮発性ハードディスクドライブまたは同様の装置5と揮発性の半導体RAM4とを含んでも良い。また、システム1は、通常は、半導体ROM7に設置され、多くの場合、コンパクトディスク装置(CD−ROM)8により補足されるシステム読出し専用メモリ(ROM)6を含む。システム1は、ビデオ表示装置(VDU)またはプリンタのような、ラスタ形式で動作する画像を表示するための何らかの手段10を組み込んでも良い。
【0023】
システム1の前述の構成要素は、バスシステム9を介して相互に接続され、IBMのPC/AT型のパソコンおよびそれを進化させた構成、Sun Sparcstationなどの当該技術で良く知られたコンピュータシステムの通常の動作モードで動作可能である。
【0024】
図3において明らかなように、画素順次レンダリング装置20はバス9に接続する。好適な実施例においては、画素順次レンダリング装置20は、システム1からバス9を介して命令およびデータを供給されるグラフィックオブジェクトベースの記述から得られる画素ベースの画像の順次レンダリングのために構成される。画素順次レンダリング装置20は、通常、半導体RAMから形成される専用のレンダリング記憶装置30を自身と関連付けているのが好ましいが、オブジェクト記述のレンダリングのためにシステムRAM3を利用しても良い。
【0025】
<1.1 第1のモードによるコンピュータシステム1の動作>
コンピュータシステム1は、使用されているのがグラフィックインタフェースか、あるいは、ページ記述言語かによって2つ以上の動作モードで動作することができる。
【0026】
グラフィックインタフェースまたはページ記述言語が、システムが最も近い整数値へのエッジの系統的な切り上げのためにラスタライズ・ルールを実現することを要求するとき、コンピュータシステム1は第1のモードで動作する。このラスタライズ・ルールは、端数の値を有する全てのエッジ位置(図2Aを参照)を数学的に切り上げることによって、コンピュータシステム1において周知の方法で実現される。
【0027】
グラフィックインタフェースまたはページ記述言語が、システムがオブジェクトのエッジに接する全ての画素を塗りつぶすためのラスタライズ・ルールを実現することを要求するとき、コンピュータシステム1は第2のモードで動作する。例えば、ページ記述言語がPostScript(登録商標)であるとき(図2Bを参照)、コンピュータシステムは第2のモードで動作することになる。
【0028】
後者のラスタライズ・ルールは、本発明に従ってコンピュータシステム1において実現される。別の変形例では、コンピュータシステム1は、第2のモードと同等の1つのモードで動作する。その他のモードで実現されても良い丸めの変形例は、他にも多数存在する。例えば、コンピュータシステム1は、更に別のモードで動作しても良い。この更に別のモードでは、コンピュータシステム1は、最も近い整数値へのエッジの丸めのためのラスタライズ・ルールを実現する(例えば、ページ記述言語がPCLのとき)。
【0029】
このようにして、処理されるページ記述言語が、PostScript(登録商標)などの特定の種類の言語であるときには、本発明のプロセスが実行され、ページ記述言語がPCLなどの別の種類の言語である場合は、別のプロセスが実行される。
【0030】
コンピュータシステム1をより良く理解するために、最初に、第1の動作モードにおけるコンピュータシステム1の詳細な検討をこの第1.1節で行なう。次に、第2の動作モードにおけるコンピュータシステム1の詳細な検討を次の第1.2節で行なう。
【0031】
図4に、好適な実施例の機能データ流れ図を示す。図4の機能流れ図は、ホストプロセッサ2により生成し、および/または、必要に応じて、システムRAM3内に格納するか、あるいは、システムROM6から得るのに適した形式でグラフィックオブジェクトのパラメータを記述するのに使用されると共に、画素順次レンダリング装置20により解釈され、そこから画素ベースの画像をレンダリングしても良いオブジェクトグラフィック記述11で開始される。
【0032】
例えば、オブジェクトグラフィック記述11は、ディスプレイ上の1点から別の1点まで横断する直線のエッジ(単純ベクトル)を含む複数の形式において、あるいは、2次元オブジェクトが直交直線を含む複数のエッジにより定義される場合には直交のエッジの形式において、エッジを有するオブジェクトを組み込んでも良い。オブジェクトが連続的な曲線により定義される異なる形式も適切であり、乗算を実行する必要なしに2次曲線を1つの出力空間においてレンダリングできるようにする複数のパラメータによって1本の曲線が記述される場合には、2次多項式の断片を含むことができる。3次スプラインなどの更なるデータ形式を使用しても良い。オブジェクトは、多様な種類のエッジの組み合わせを含んでも良い。通常、全ての形式に共通であるのは、各線(直線または曲線を問わない)の始端および終端に対する識別子であり、これらは、走査線の本数により識別される。これにより、曲線がレンダリングされるであろう特定の出力空間が定義される。
【0033】
例えば、図18Aは、セグメントを適切に記述しかつレンダリングするためには2つのセグメント601および602に分割される必要があるエッジ600の従来のエッジ記述を示す。分割の必要があったのは、従来のエッジ記述は、2次式を介して簡単に計算されるものの、変曲点604に対応することができなかったからである。このため、エッジ600は、端点603および604、端点604および605のそれぞれを有する2本の別々のエッジとして扱われる。
【0034】
図18Bは、端点611および612と制御点613および614により記述される3次スプライン610を示す。この形式は、レンダリングのために3次多項式の計算を必要とし、計算時間の点でコストがかかる。
【0035】
図18Cおよび図18Dは、好適な実施例に適用可能なエッジの例を示す。好適な実施例において、エッジは1つのエンティティと見なされ、必要に応じて分割されてエッジの複数の区分が描かれる。この区分は、それぞれが異なる形式で記述されることもあり、その目的は、各区分の記述に対して最低レベルの複雑度を保証することである。
【0036】
図18Cにおいて、走査線Aから走査線Mにまで及ぶ1本のエッジ620が描かれる。エッジは、start_x、start_y、エッジの次のセグメントをポイントするアドレスを含む1つ以上のセグメント記述、およびエッジを終結させるために使用される最終セグメントを含む複数のパラメータにより記述される。好適な実施例によると、エッジ620は、3つのステップセグメント、ベクトルセグメント、および2次セグメントを有するものとして記述されても良い。ステップセグメントは、単にxステップ値およびyステップ値を有するものとして定義される。図18Cに描かれた3つのステップセグメントにおいて、セグメント記述は、[0,2]、[+2,2]、および[+2,0]である。xステップ値には符号が付されており、これにより、ステップの方向を示す。
【0037】
一方、yステップ値には符号が付されておらず、常に、走査線値が増加するラスタ走査方向にある。次のセグメントは、通常、start_x(X)、start_y(Y)、num_of_scanlines(NY)およびslope(DX)のパラメータを必要とするベクトルセグメントである。この例では、ベクトルセグメントはエッジ620の中間セグメントであるので、start_xおよびstart_yは省略されることもある。これらのパラメータは前のセグメントから得られるためである。パラメータnum_of_scanlines(NY)は、ベクトルセグメントがまたがる走査線の本数を示す。slope値(DX)には符号が付されており、先行する走査線のx値に加えられることで現在の走査線のx値が得られる。図示する例では、DX=+1である。次のセグメントは、ベクトルセグメントに対応する構造を有すると共に、符号が付されておりセグメントのslopeを変更するためにDXに加えられる2次値(DDX)を有する2次セグメントである。
【0038】
図18Dは、好適な実施例による3次曲線の例を示す。この曲線は、符号付き3次値(DDDX)の付加を除いて2次セグメントに対応する記述を含む。符号付き3次値は、セグメントのslopeの変化率を変更するためにDDXに加えられる。数多くの他の次数で実現されても良い。
【0039】
以上の説明から、エッジセグメントを記述する複数のデータ形式を扱う能力により、複雑で計算上コストがかかる数学的な演算に依存することなく、エッジ記述および評価を簡略化できることが明らかであろう。これとは対称的に、図18Aの従来のシステムでは、直交であるか、ベクトルであるか、あるいは、2次であるかに関わらず、全てのエッジは2次形式で記述される必要があった。
【0040】
好適な実施例の動作を図10に示す画像78をレンダリングする簡単な例を参照して説明する。図10は、2つのグラフィックオブジェクトを含む。特に、部分的に透明な青色の三角形80は、最前面においてレンダリングされ、そのために、不透明な赤色の矩形90が部分的に隠れている。図10において明らかなように、矩形90は、種々の画素位置(X)と走査線位置(Y)との間で定義されたエッジ(side edges)92、94、96、および98を含む。エッジ96および98は、走査線上に形成されるので(従ってこれに平行である)、矩形90の実際のオブジェクト記述は、図11Aにおいて明らかなように、エッジ92および94にのみ基づくことができる。これに関連して、エッジ92は、画素位置(40,35)で開始し、画面をラスタ方向に下り、画素位置(40,105)で終結する。同様に、エッジ94は、画素位置(160,35)から画素位置(160,105)まで伸びる。矩形のグラフィックオブジェクト90の水平位置は、エッジ92からエッジ94までをラスタライズ様式で走査することのみで取得しても良い。
【0041】
しかし、青色の三角形オブジェクト80は、3本のオブジェクトエッジ82、84、および86により定義される。各オブジェクトエッジは、三角形の頂点を定義するベクトルとして示される。エッジ82および84は、画素位置 (100,20)で開始し、それぞれ、画素位置(170,90)および画素位置(30,90)まで伸びる。エッジ86は、この2つの画素位置間で左から右への従来のラスタライズ方向に伸びる。この例では、エッジ86は、前述のエッジ96および98と同様に水平であるので、エッジ86を定義することは必ずしも必要ではない。エッジ82および84を記述するのに使用される開始画素位置および終了画素位置に加えて、これらのエッジの各々は、slope値を自身と関連付ける。この場合、slope値は、それぞれ、+1および−1である。
【0042】
図4に戻って説明する。レンダリング対象のグラフィックオブジェクトを記述するのに必要なデータを識別すると、グラフィックシステム1は、ディスプレイリスト生成ステップ12を実行する。
【0043】
ディスプレイリスト生成12は、付属のROM6およびRAM3を伴ってホストプロセッサ2上で実行されるソフトウェアモジュールとして実現されるのが好ましい。ディスプレイリスト生成12は、周知のグラフィック記述言語、グラフィックライブラリ呼出し、またはその他のアプリケーション特有の形式のいずれか1つ以上で表されたオブジェクトグラフィックス記述をディスプレイリストに変換する。ディスプレイリストは、通常、一般的にはRAM4内に形成されるが、代わりにレンダリング記憶装置30内に形成されても良いディスプレイリスト記憶装置13へと書き込まれる。
【0044】
図5において明らかなように、ディスプレイリスト記憶装置13は、複数の構成要素を含むことができる。その1つは命令ストリーム14、別の1つはエッジ情報15であり、必要に応じて、ラスタ画像画素データ16も含むことができる。
【0045】
命令ストリーム14は、いずれの画像においても必要とされる特定のグラフィックオブジェクトをレンダリングするために、画素順次レンダリング装置20により読まれる命令として解釈可能なコードを含むことができる。図10に示す画像の例において、命令ストリーム14は、以下の形態を取ることが可能であろう。すなわち、
(1) 走査線20に対してレンダリングし(対象無し)、
(2) 走査線20において2本の青色のエッジ82および84を加え、
(3) 走査線35に対してレンダリングし、
(4) 走査線35において2本の赤色のエッジ92および94を加え、
(5) レンダリングを完了する。
【0046】
同様に、図10の例に対するエッジ情報15は、以下の情報を含んでも良い。すなわち、
(i) エッジ84は画素位置100で開始し、エッジ82は画素位置100で開始し、
(ii) エッジ92は画素位置40で開始し、エッジ94は画素位置160で開始し、
(iii) エッジ84は70本の走査線にまたがり、エッジ82は70本の走査線にまたがり、
(iv) エッジ84はslope=−1を有し、エッジ82はslope=+1を有し、
(v) エッジ92はslope=0を有し、エッジ94はslope=0を有し、
(vi) エッジ92および94の各々は70本の走査線にまたがる。
【0047】
命令ストリーム14およびエッジ情報15の前述の例と各々が表される方法とから、図10の画像78において、画素位置(X)および走査線値(Y)が、画像78がレンダリングされる1つの出力空間を定義することが認識されるであろう。しかし、その他の出力空間構成も、本開示の原則を使用して実現することが可能である。
【0048】
図10は、ラスタ画像画素データを含まないので、ディスプレイリスト13の記憶部分16には何も格納する必要はない。この特徴については後述する。
【0049】
ディスプレイリスト記憶装置13は、画素順次レンダリング装置20により読み出される。この画素順次レンダリング装置20は、通常、集積回路として実現される。画素順次レンダリング装置20は、例えば、プリンタ、ディスプレイまたはメモリ記憶装置のような別の装置に転送することが可能なラスタ画素19のストリーム19へとディスプレイリストを変換する。
【0050】
好適な実施例では、画素順次レンダリング装置20を集積回路として記述するが、ホストプロセッサ2などの汎用処理装置上で実行される同等のソフトウェアモジュールとして実現されても良い。
【0051】
図5は、画素順次レンダリング装置20、ディスプレイリスト記憶装置13および一時レンダリング記憶装置30の構成を示す。画素順次レンダリング装置20の処理ステージ22は、命令実行プログラム300、エッジ処理モジュール400、優先度判定モジュール500、塗りつぶしカラー判定モジュール600、画素合成モジュール700、および画素出力モジュール800を含む。処理動作は、前述のようにディスプレイリスト13として同じ装置(例えば、磁気ディスクまたは半導体RAM)を共有しても良く、あるいは、速度の最適化のために個別の記憶装置として実現されても良い一時記憶装置30を使用する。
【0052】
エッジ処理モジュール400は、エッジレコード記憶装置32を使用してエッジ情報を保持し、このエッジ情報は、走査線から走査線へと繰り越される。優先度判定モジュール500は、優先性/状況テーブル34を使用して各優先度に関する情報と走査線のレンダリング中のエッジ交差に対する各優先度の現在の状態とを保持する。塗りつぶしカラー判定モジュール600は、塗りつぶしデータテーブル36を使用して、ある位置における特定の優先度の塗りつぶしカラーを判定するのに必要な情報を保持する。画素合成モジュール700は、値を判定するための複数の優先度から各色を必要とする出力画素を判定している間、画素合成スタック38を使用して中間結果を保持する。
【0053】
前述のディスプレイリスト記憶装置13およびその他の記憶装置32から38は、RAMまたはその他の任意の記憶技術において実現されても良い。
【0054】
図5の実施例で示される処理ステップは、処理パイプライン22の形態を取る。この場合、パイプラインの各モジュールが、画像データのそれぞれ異なる部分で同時に並行して実行され、メッセージが後述するようにこれらのモジュール間で交わされても良い。別の実施例では、後述する各メッセージは、下流のモジュールに対する制御の同期転送の形態を取っても良い。上流の処理は、下流のモジュールがメッセージの処理を終了するまで中断される。
【0055】
命令実行プログラム300は、命令ストリーム14からの命令を読んで処理し、その命令をメッセージの書式へと変換する。メッセージは、出力398を介してパイプライン22内の他のモジュール400、500、600、および700へと転送される。好適な実施例では、命令ストリーム14は、以下の命令を含んでも良い。
【0056】
LOAD_PRIORITY_PROPERTIES:この命令は、優先性/状況テーブル34へとロードされるデータ、およびデータがロードされるテーブル34のアドレスと関連付けられる。命令実行プログラム300によりこの命令が発行されるとき、命令実行プログラム300は、優先性/状況テーブル34の指定位置にデータを格納するためのメッセージを発行する。メッセージの発行は、このデータを含むメッセージの書式設定を行ない、処理パイプライン22を介して格納動作を実行する優先度判定モジュール500にメッセージを渡すことにより達成されても良い。
【0057】
LOAD_FILL_DATA:この命令は、塗りつぶしデータテーブル36へとロードされるデータ、およびデータがロードされるテーブル36のアドレスと関連付けられる。命令実行プログラム300によりこの命令が発行されるとき、命令実行プログラム300は、塗りつぶしデータテーブル36の指定アドレスにデータを格納するためのメッセージを発行する。メッセージの発行は、このデータを含むメッセージの書式設定を行ない、処理パイプライン22を介して格納動作を実行する塗りつぶしデータ判定モジュールにメッセージを渡すことにより達成されても良い。
【0058】
LOAD_NEW_EDGES_AND_RENDER:この命令は、次の走査線がレンダリングされるときにレンダリングプロセスへと導入される新規のエッジ15のディスプレイリスト記憶装置13のアドレスと関連付けられる。命令実行プログラム300によりこの命令が発行されるとき、命令実行プログラム300は、このデータを含むメッセージの書式設定を行ない、エッジ処理モジュール400にメッセージを渡す。エッジ処理モジュール400は、エッジレコード記憶装置32に新規のエッジのアドレスを格納する。指定のアドレスにおけるエッジは、次の走査線がレンダリングされる前に初期走査線交点座標上でソートされる。一実施例において、エッジは、ディスプレイリスト生成プロセス12によりソートされる。別の実施例では、画素順次レンダリング装置20によりソートされる。
【0059】
SET_SCANLINE_LENGTH:この命令は、各レンダリング済の走査線において生成される複数の画素と関連付けられる。命令実行プログラム300によりこの命令が発行されるとき、命令実行プログラム300は、エッジ処理モジュール400および画素合成モジュール700に値を渡す。
【0060】
SET_OPACITY_MODE:この命令は、画素合成動作が不透明度チャネル(当該技術ではアルファチャネルとしても知られる)を使用するか否かを示すフラグと関連付けられる。命令実行プログラム300によりこの命令が発行されるとき、命令実行プログラム300は、画素合成モジュール700中のフラグ値を渡す。
【0061】
命令実行プログラム300は、通常、命令をマッピングし、種々のモジュールへと渡すためにそれをパイプライン動作へと復号化するマイクロコード状態マシンにより形成される。対応するソフトウェアプロセスが代わりに使用されても良い。
【0062】
走査線レンダリング走査中のエッジ処理モジュール400の動作を図6を参照して説明する。走査線のレンダリングに対する初期条件は、エッジレコードの3つのリストが利用可能なことである。これらのリストのいずれか、あるいは、全てが空であっても良い。リストは、エッジ情報15から得られ、LOAD_NEW_EDGES_AND_RENDER命令により設定された新規のエッジを含む新規のエッジリスト402、先行する走査線から繰り越されたエッジレコードを含むメインのエッジリスト404、および同じく先行する走査線から繰り越されたエッジレコードを含むあふれエッジリスト406である。
【0063】
図14Aを参照すると、このようなエッジレコードの形式が示される。エッジレコードは以下の項目を含んでも良い。
(i) 現在の走査線交点座標(ここでは、X座標と呼ぶ)、
(ii) このエッジの現在のセグメントがまたがる走査線の本数(実施例によっては、Y限界として表されることもある)のカウント(ここでは、NYと呼ぶ)、
(iii) 各走査線が終了する毎にこのエッジレコードのX座標に加えられる値(ここでは、DXと呼ぶ)、
(iv) 優先度番号(P)または優先度番号のリストの索引(P)、
(v) リストの次のエッジセグメントのアドレス(addr)、および
(vi) d、c、u、o、およびpが付された1組のフラグ。このフラグについては、後でより詳細に説明する。
【0064】
この形式は、ベクトルおよび直交するように構成されたエッジを含んでも良い。また、形式は、DDXと呼ぶ更なるパラメータを含んでも良い。DDXは、各走査線の終了後にこのエッジレコードのDXに加えられる値である。後者により、2次曲線から構成されるエッジのレンダリングが可能になる。DDDXなどの更なるパラメータの追加により、このような構成は3次曲線を含むことが可能になるであろう。3次ベジェ曲線などの一部の適用例では、6次多項式(すなわち、最大DDDDDDX)が要求されるかもしれない。フラグ(u)は、巻数カウントをエッジにより増分すべきか、あるいは、減分すべきかを示す。巻数カウントは、塗りつぶしカウンタに格納され、現在走査中の画素が当該オブジェクトの内側にあるか、あるいは、外側にあるのかを判定するのに使用される。
【0065】
図10のエッジ84および92の例では、走査線20における対応するエッジレコードは、表1に示すような値を示すであろう:
【0066】
【表1】
【0067】
この記述では、レンダリングプロセスにより生成中であり、走査線に沿って1画素単位で刻まれる座標をX座標と呼び、1走査線単位で刻まれる座標をY座標と呼ぶ。各エッジリストは、メモリ中に連続的に配置された0個以上のレコードを含む。ポインタチェーンの使用を含むその他の記憶構成も利用可能である。3つのリスト402、404、および406の各々のレコードは、走査線の交差(X)座標の順に配置される。これは、通常、エッジ情報を含むメッセージを命令実行プログラム300から受信するエッジ入力モジュール408により当初管理されるソートプロセスにより行なわれる。各走査線の交差座標の整数部分のみを重視するようにソートを緩和することが可能であるが、更に各走査線の交差座標を現在のレンダリングプロセスにより生成中の最小X座標および最大X座標に固定されているものと見なすことによってソートを緩和することも可能である。必要に応じて、エッジ入力モジュール408は、出力498を介してパイプライン22の下流のモジュール500、600、および700にメッセージを中継する。
【0068】
エッジ入力モジュール408は、3つのリスト402、404、および406の各々への参照を維持すると共に、各リストからエッジデータを受信する。これらの参照の各々は、走査線の処理の開始時に各リストの第1のエッジを参照するように初期化される。その後、エッジ入力モジュール408は、選択されるエッジレコードが3つの参照されるエッジレコードの外側の最小X座標を有するエッジレコードであるように、3つのレコードのうちの1つからエッジレコードを選択する。Xレコードのうちの2つ以上が等しい場合、各レコードは、任意の順序で処理され、対応するエッジ交差は以下のように出力される。レコードを選択するのに使用された参照は、リストの次のレコードへと進められる。選択されたエッジは、メッセージの形式に設定され、エッジ更新モジュール410に送信される。また、エッジのある特定のフィールド、特に、現在のX、優先度番号、および方向フラグは、メッセージの形式に設定され、このメッセージがエッジ処理モジュール400の出力498として優先度判定モジュール500に転送される。ここで説明したリストより多いまたは少ないリストを使用する実施例も実現可能である。
【0069】
エッジを受信すると、エッジ更新モジュール410は、現在のセグメントがまたがる走査線の数のカウントを減分する。カウントが0に達する場合、新規のセグメントが次のセグメントアドレスにより示されるアドレスから読み出される。セグメントは、以下の項目を指定するのが好ましい。
(i) セグメントが読まれると直ちに現在のX座標に加えられる値、
(ii) エッジに対する新規のDX値、
(iii) エッジに対する新規のDDX値、および
(iv) 新規のセグメントがまたがる走査線の本数の新規のカウント
【0070】
示されたアドレスに次の利用可能なセグメントがない場合、そのエッジにおいて更なる処理は行なわれない。利用可能なセグメントがある場合、エッジ更新モジュール410は、エッジの次の走査線に対するX座標を計算する。この計算は、通常、現在のX座標を取り込み、それをDX値に加えることを含むであろう。DXは、処理中のエッジの種類に適するように、DDX値を自身に加えるようにしても良い。続いて、エッジが、エッジプール412の利用可能な空きスロットへと書き込まれる。エッジプール412は、2つ以上のエッジレコードのアレイである。空きスロットがない場合、エッジ更新モジュール410は、スロットが利用可能になるまで待つ。エッジレコードがエッジプール412に書き込まれると、エッジ更新モジュール410は、新規のエッジがエッジプール412に加えられたことを線416を介してエッジ出力モジュール414に信号で伝える。
【0071】
走査線のレンダリングの初期条件として、エッジ出力モジュール414は、次のメインのエッジリスト404’および次のあふれエッジリスト406’の各々に対する参照を有する。これらの参照の各々は、最初は空であるリスト404’および406’が作成された位置に初期化される。エッジがエッジプール412に加えられたことを示す信号416を受信すると、エッジ出力モジュール414は、加えられたエッジが次のメインのエッジリスト404’(存在する場合)に最後に書き込まれたエッジよりも小さいX座標を有するか否かを判定する。小さいX座標を有する場合、「あふれ」が生じたものとされるが、それは、配列基準を破らずにそのエッジをメインのエッジリスト404に付加することができないからである。あふれが発生すると、エッジは次のあふれエッジリスト406’に挿入される。ソートされた次のあふれエッジリスト406’を維持するように挿入されるのが好ましい。例えば、これは、ソフトウェア整列ルーチンを使用して達成されても良い。実施例によっては、X座標が過剰に大きいなどの他の条件がトリガとなってあふれが発生することもある。
【0072】
エッジプール412に加えられたエッジが、次のメインのエッジリスト404’(存在する場合)に最後に書き込まれたエッジより大きいまたはそれに等しいX座標を有し、エッジプール412には利用可能な空きスロットがない場合、エッジ出力モジュール414は、エッジプール412から最小X座標を有するエッジを選択し、そのエッジを次のメインのエッジリスト404’に付加して処理中にリスト404’を拡張する。エッジにより占められていたエッジプール412のスロットは空きとなる。
【0073】
エッジ入力モジュール408は、3つの入力リスト402、404、および406の全てから全エッジを読み出して転送すると、走査線の終端に到達したことを示すメッセージの形式を整え、それを優先度判定モジュール500およびエッジ更新モジュール410の双方へと送信する。メッセージを受信すると、エッジ更新モジュール410は、現在実行中の処理が完了するのを待ってからメッセージをエッジ出力モジュール414へと送信する。メッセージを受信すると、エッジ出力モジュール414は、残る全てのエッジレコードをエッジプール412から次のメインのエッジリスト404’へとX順に書き込む。続いて、次のメインのエッジリスト404’およびメインのエッジリスト404への参照が、エッジ入力モジュール408とエッジ出力モジュール414との間で交換され、次のあふれエッジリスト406’およびあふれエッジリスト406に対して同様の交換が実行される。このようにして、以下の走査線に対する初期条件が確立される。
【0074】
エッジレコードの挿入の際に、次のあふれエッジリスト406’をソートするのではなく、エッジレコードをリスト406’に加えるだけでも良い。走査線の終端に到達すると現在のあふれエッジリスト406への交換の前にソートされるリスト406’は、次の走査線のエッジラスタライズにおいてアクティブになる。
【0075】
以上の説明から、エッジ交差メッセージが、走査線/画素順(すなわち、最初にY、次にXにおいて順序付けされる)で優先度判定モジュール500に送信され、各エッジ交差メッセージが、適用される優先度でラベル付けされることが推測可能である。
【0076】
図14Aは、エッジのセグメントが受信されるときにエッジ処理モジュール400により作成されるであろうアクティブエッジレコード418の構造を表す。エッジの第1のセグメントがステップ(直交)セグメントである場合、アクティブ化されたエッジのX位置を取得するために、エッジのX値が第1のセグメントに対する「Xstep」と呼ばれる変数に加えられる。第1のセグメントがステップセグメントでない場合、エッジのX値が使用される。Xstep値は、エッジのセグメントデータから得られ、次のセグメントに対するエッジレコードのX位置を取得するために次のセグメントのXedge値に1度追加される。これは、新規のエッジレコード中の各エッジがXedge+Xstepによりソートされるであろうことを意味する。従って、第1のセグメントのXstepは、各エッジの整列を簡略化するためには0となるべきである。
【0077】
第1のセグメントのY値は、アクティブエッジレコード418のNYフィールドへとロードされる。アクティブエッジのDXフィールドは、ベクトルセグメントまたは2次セグメントのDXフィールド識別子からコピーされ、ステップセグメントに関しては0に設定される。セグメントが上向きである(図15Aに関する記述を参照)場合、図14Aに示すようなuフラグが設定される。
【0078】
エッジが、関連するクリッピングレベルなしに直接クリッピングオブジェクトとして使用され、閉曲線に適用可能な場合、dフラグが設定される。
【0079】
セグメントの実際の優先度レベル、すなわち、レベルアドレスは、新規のエッジレコードの対応するフィールドからアクティブエッジレコード418のレベルフィールドへとコピーされる。セグメントリストの次のセグメントのアドレスは、新規のエッジレコードの対応するフィールドからアクティブエッジレコード418のセグメントアドレスフィールド(segment addr)へとコピーされる。
【0080】
セグメントアドレスは、エッジレコードの終結を示すのに使用されても良い。図14Aに示すエッジレコードの残るフィールドは、第2の動作モードを参照して後述する。
【0081】
他のデータ構造も使用可能であり、例えば、多項式実現が使用される場合に必要であることが、図14Aから認識されるであろう。1つの代替データ構造において、セグメントが2次である場合、「segment addr」フィールドは、セグメントリストの次のセグメントのアドレスであるか、あるいは、セグメントDDX値からコピーされるかのいずれかである。後者の場合、データ構造はqフラグを有し、このqフラグは、セグメントが2次セグメントである場合に設定され、2次セグメントでない場合にクリアされる。更なる変形例では、セグメントアドレスおよびDDXフィールドは、別々のフィールドに分離されても良く、代替の実現例に適合するように追加のフラグが設けられても良い。
【0082】
図14Bは、好適な実施例において先に説明したエッジ処理モジュール400で使用されるエッジレコードの構成を表す。エッジプール412は、新規のアクティブエッジレコード428、現在のアクティブエッジレコード430、およびあふれアクティブエッジレコード432により補足される。図14Bにおいて明らかなように、レコード402、404、406、404’、および406’は、任意の1回でレンダリングされるエッジの本数により、サイズが動的に変動する。各レコードは限界値を含み、この限界値は、新規のエッジリスト402の場合にはLOAD_EDGES_AND_RENDER命令と共に取り入れられるSIZE値により判定される。このような命令が発行されるときにはSIZEがチェックされ、0でない場合には、新規のエッジレコードのアドレスがロードされ、各リスト402、404、406、404’、および406’に対して限界サイズを判定する限界値が計算される。
【0083】
好適な実施例では、エッジレコードの処理のためにアレイおよび関連するポインタを利用するが、連結リストなどのその他の実現例を使用しても良い。このような他の実現例は、ハードウェアベースまたはソフトウェアベースのものであっても良く、あるいは、それらの組み合わせであっても良い。
【0084】
図10に示す画像78の特定のレンダリングを図12に示す走査線34、35、および36を参照して説明する。この例では、次の走査線に対する新規のX座標の計算は、明瞭にする目的で省略される。図14Cから図14Iは、エッジプール412のレジスタ428、430、および432のうちの1つから得られる出力エッジ交差を示す。
【0085】
図14Cは、走査線34(半透明な青色の三角形80の最上部)のレンダリング終了時の前述のリストの状態を示す。なお、走査線34には新規のエッジはないため、リスト402は空である。
【0086】
メインのエッジリスト404および次のメインのエッジリスト404’の各々は、エッジ82および84のみを含む。各リストは、走査線34の完了後に対応するリストの次の空きレコードをポイントする対応ポインタ434、436、および440を含む。
【0087】
また、各リストは、対応するリストの末尾をポイントするのに必要なアスタリスク(*)で示される限界ポインタ450を含む。連結リストが使用される場合、このリストが対応する機能を実行するヌルポインタ終止符を含むときにはこれは必要とされないであろう。
【0088】
前述のように、各走査線の開始時に、次のメインのエッジリスト404’およびメインのエッジリスト404はスワップされ、新規のエッジリスト402は新規のエッジを受け取る。残る各リストはクリアされ、各ポインタは各リストの第1のメンバに設定される。走査線35の開始時に、構成は図14Dに示すようになる。図14Dから明らかなように、各レコードは4本のアクティブエッジを含み、このアクティブエッジは図12から明らかなように、エッジ92、94、84、および82に対応する。
【0089】
今度は、図14Eを参照する。レンダリングが開始されると、新規のエッジレコード402の第1のセグメントがアクティブエッジレコード428へとロードされ、メインのエッジリスト404およびあふれエッジリスト406の第1のアクティブエッジレコードは、それぞれ、レコード430および432にコピーされる。この例では、あふれエッジリスト406は空であり、ローディングは行なわれない。レコード428、430、および432内のエッジのX位置が比較され、エッジ交差が、最小X位置のエッジに対して送出される。この場合、送出されたエッジは、優先度値と共に出力されるエッジ92に対応するエッジである。続いて、ポインタ434、436、および438が更新され、リストの次のレコードをポイントする。
【0090】
エッジ交差が送出されたエッジが更新され(この場合、位置にDX=0が加えられる)、エッジプール412にバッファリングされる。ここで、エッジプール412は、3つのエッジレコードを保存するようなサイズに設定されている。送出されるエッジが属していたリスト(この場合では、リスト402)の次のエントリが対応するレコード(この場合では、レコード428)へとロードされる。これは、図14Fに示されている。
【0091】
さらに、図14Fから明らかなように、レジスタ428、430、および432間での比較により、最小X値のエッジが選択され、このエッジは、適切な次のエッジ交差(X=85、P=2)として出力される。再度、選択された出力エッジが更新されてエッジプール412に加えられ、全ての適切なポインタが増分される。この場合、更新された値は、X←X+DXにより与えられる。この式は、84=85−1として評価される。また、図14Fから明らかなように、新規のエッジポインタ434が、この場合、新規のエッジレコード402の末尾に移動させられる。
【0092】
図14Gにおいて、最小の現在のX値と共に識別される次のエッジは、エッジ交差(X=115、P=2)として出力されるレジスタ430から得られるエッジである。エッジは再度更新され、その値は、図14Gに示すようにエッジプール412に加えられる。このとき、エッジプール412が満杯になり、このエッジプール412から最小X値を伴うエッジが選択されて出力リスト404’へと送出され、対応する限定ポインタがそれに従って移動したことが図より明らかである。
【0093】
図14Hにおいて明らかなように、次の最小エッジ交差は、出力される(X=160、P=1)レジスタ428からのものである。エッジプール412は再度更新され、次の小さいX値が出力リスト404’へと送出される。
【0094】
走査線35の終端において、図14Iにおいて明らかなように、エッジプール412の内容が最小X値の順に出力リスト404’に書き出される。図14Jにおいて明らかなように、次のメインのエッジリスト404’およびメインのエッジリスト404は、次の走査線36のレンダリングを見越して相互のポインタを交換することによりスワップされる。スワッピングの後、メインのエッジリスト404の内容がX位置の順で配置された走査線36上に現在ある全てのエッジを含むことが図14Jから明らかであり、このため、アクセスが便利になって高速レンダリングを容易に行なえるようになる。
【0095】
通常、新規のエッジは、X位置の昇順にエッジ処理モジュール400が受け取る。新規のエッジが到着するとその位置が更新され(レンダリング対象の次の走査線に対して計算される)、これにより、以下に示すように、更なる動作が決定される。
(a) 更新された位置がライン438上の最後のX位置出力より小さい場合、新規のエッジはメインのあふれエッジリスト406へと挿入ソートされ、対応する限界レジスタが更新され、
(b) 更新された位置が最後のX位置出力より大きい場合で、空きがある場合は、エッジプール412に保存される。
【0096】
前述の説明から明らかなように、エッジプール412は、ラスタライズ画像における次の走査線のレンダリングを見越して順序に従ってリスト更新を行なえるように支援する。更に、エッジプール412のサイズは、整列していないより多くの本数のエッジを収容するように変動させても良い。
【0097】
しかし、このエッジプール412に事実上の限界があることは認識されるであろう。この限界は、通常、グラフィック処理システムにおける処理速度および使用可能なメモリに依存する。限定された意味において、エッジプール412は省略されても良いが、その場合、更新されたエッジが次の出力エッジリスト404’へと挿入ソートされる必要が通常生じるであろう。
【0098】
しかし、好適な実施例では、この状況は、前述のあふれリストの使用により通常起こることとして回避される。あふれリストの提供により、実際的なサイズのエッジプールを伴う好適な実施例の実現が可能になり、ソフトウェア集約型の整列プロセスを用いることなしに、比較的複雑なエッジ交差を扱うことが可能になる。まれではあるが、エッジプールおよびあふれリストが複雑なエッジ交差を収容するのに不十分である場合には、整列方法を使用しても良い。
【0099】
あふれリスト手順が利用される場合の例を、図16Aに示す。図16Aでは、3本の任意のエッジ60、61、および63が、走査線AとBとの間の相対的な位置で任意のエッジ62と交わる。更に、走査線AおよびBの各々に対する実際に表示される画素位置64が、画素位置CからJにまたがっているのが示される。エッジプール412が3つのエッジレコードを保存するようなサイズに設定される前述の例において、図16Aにおいて示されるように、この構成だけでは、隣接する走査線間で発生する3つのエッジ交差を収容するのに十分でないことが明らかであろう。
【0100】
図16Bは、走査線上のエッジ60、61、および62をレンダリングした後のエッジレコードの状態を示す。エッジ交差Hは、ごく最近送出されたものであり、エッジプール412は、次の走査線である走査線Bにおいて、エッジ60、61、および63のそれぞれに対して更新されたX値E、G、およびIを有し、満杯である。エッジ62が現在のアクティブエッジレコード430へとロードされ、エッジプール412が満杯であるので、エッジ60に対応する最小X値は、出力エッジリスト404’に出力される。
【0101】
図16Cにおいて、次のエッジ交差が送出され(エッジ62に対してX=J)、対応する更新された値が判定される。この場合、走査線Bに対してX=Cである。新規の更新された値X=Cは、出力リスト404’にコピーされた最新の値X=Eよりも小さいので、現在のエッジレコードおよび対応する新規の更新された値は、直接出力あふれリスト406’へと転送される。
【0102】
図16Dは、メインのリストおよび出力リストと、その対応するあふれ要素がスワップされた場合における走査線Bの開始時のエッジレコードの状態を示す。第1の送出されたエッジを判定するためには、エッジ60は現在のアクティブエッジレジスタ430へとロードされ、エッジ62は、あふれアクティブエッジレコード432へとロードされる。X値が比較され、最小X値(X=C)を有するエッジ62が送出され、更新されてエッジプール412へとロードされる。
【0103】
エッジの送出および更新は、メインのエッジリスト404の残るエッジに対して続けられ、走査線の終端に到達すると、エッジプール412がフラッシュされて図16に示す状況を露呈し、この場合、エッジ60から63の各々は、次の走査線上でのレンダリングのために適切に順序付けされ、正確に送出されて走査線B上でレンダリングされる。
【0104】
前述の説明から明らかなように、あふれリストにより、複雑なエッジ交差状況が存在する際のエッジラスタライズ順序が維持される。更に、リストのサイズが動的に変動可能であることにより、エッジ交差の数および複雑度における大きな変動も、格別に複雑なエッジ交差以外の全てのエッジ交差において、整列手順を行なう必要なしに処理されるであろう。
【0105】
好適な実施例において、エッジプール412は、8つのエッジレコードを保存するようなサイズに設定され、リスト404および404’と関連するあふれリスト406および406’は、512バイトの基本(最小)サイズを有する。この基本サイズは動的に変動可能であり、複雑なエッジ交差条件を伴う大きな画像を扱うのに十分な範囲を取る。
【0106】
図7を参照して優先度判定モジュール500の動作を説明する。エッジ処理モジュール400からの入力メッセージ498は、優先度データ設定メッセージ、塗りつぶしデータ設定メッセージ、エッジ交差メッセージ、および走査線終端メッセージを含んでも良い。この入力メッセージ498が、優先度更新モジュール506により読まれる前に、最初に先入れ先出し(FIFO)バッファ518を通る。FIFO518は、エッジ処理モジュール400の動作と優先度判定モジュール500の動作とを分離するために動作する。
【0107】
前述のテーブル34の一部を構成する優先度状態テーブル502は、各オブジェクトの優先度に関する情報を保持するのに使用される。FIFO518は、1回の動作でエッジ処理モジュール400からの受信とエッジ交差の全走査線の優先度状態テーブル502への転送が可能なサイズに設定されるのが好ましい。これにより、優先度判定モジュール500は、同じ画素(X)位置で複数のエッジ交差を正確に扱うことが可能になる。
【0108】
優先度状態テーブル502における各レコードは、以下の項目を記録するのが好ましい。
(i) この優先度が、内側状態対外側状態をオッドイーブン塗りつぶしルール(odd-even fill rule)の適用により判定するか、あるいは、ノンゼロワインディング塗りつぶしルール(non-zero winding fill rule)の適用により判定するかを示す塗りつぶしルールフラグ、
(ii) この優先度を実施するエッジが横断するたびに塗りつぶしルールにより示されるように修正される現在の塗りつぶしカウントを格納するための塗りつぶしカウンタ、
(iii) この優先度がクリッピングに使用されるか、あるいは、塗りつぶしに使用されるかを示すクリッパフラグ、
(iv) クリッパフラグが設定されているエッジに対して、クリッピングの型が「クリップイン」であるか「クリップアウト」であるかを記録するクリップ型フラグ、
(v) この優先度を実施するクリップイン型のクリップ領域が入力/出力されるときに減分/増分され、この優先度を達成するクリップアウト型のクリップ領域が入力/出力されるときに増分/減分される現在のクリップカウントを格納するためのクリップカウンタ、
(vi) この優先度が、それより下のレベルが最初に計算されることを要求するか否かを記録するフラグであり、「ニード・ビロウ(need−below)」フラグと呼ばれるフラグ
【0109】
クリッピングオブジェクトは公知であり、特定の新規のオブジェクトを表示するのではなく、画像中の別のオブジェクトの形状を修正するように動作する。また、クリッピングオブジェクトは、種々の視覚効果を達成するために、表示/非表示を行なうことが可能である。例えば、オブジェクト90に作用してオブジェクト80の下にあるオブジェクト90の一部を除去するクリッピングオブジェクトとして図のオブジェクト80を構成することが可能であろう。これには、オブジェクト90の下のオブジェクトまたは画像、およびオブジェクト90の不透明度により隠れるであろうクリッピングの範囲内のオブジェクトまたは画像を露出させる効果があっても良い。
【0110】
図15Aおよび図15Bは、オブジェクトをアクティブ化するためのオッドイーブン・ルールおよびノンゼロワインディング・ルールの適用を実証する。ノンゼロワインディング塗りつぶしルールに関して、図15Aは、オブジェクト70のエッジ71および72が、それぞれ、下向きであるか、あるいは、上向きであるかに従って、概念的な方向を割り当てられる様子を示す。閉じた境界を形成するために、エッジは境界の周囲に隙間なく連結される。塗りつぶしルール(適用および説明は後述)を行なうためにエッジに与えられる方向は、セグメントが定義される順序とは無関係である。各セグメントは、追跡される順序で定義され、レンダリング方向に対応する。
【0111】
図15Bは、2本の下向きエッジ73および76と、3本の上向きのエッジ74、75、および76を有する1つのオブジェクト(五角星形)を示す。オッドイーブン・ルールは、各エッジが当該走査線により横断されるときに、ブール値をトグルで切り換えるだけで動作し、それにより、効果的にオブジェクトの色を表示(アクティブ化)または非表示(非アクティブ化)にすることができる。ノンゼロワインディング・ルールは、横断されるエッジの方向によって、塗りつぶしカウンタに格納された値を増分/減分する。
【0112】
図15Bにおいて、走査線と交わる最初の2本のエッジ73および76は下向きであり、これらのエッジの横断により、塗りつぶしカウンタは、それぞれ、+1および+2に増分される。走査線と交わる次の2本のエッジ74および77は上向きであるので、塗りつぶしカウンタは、それぞれ、+1および0に減分される。
【0113】
ノンゼロワインディング・ルールは、塗りつぶしカウンタが0以外のときにオブジェクトの色を表示(アクティブ化)にし、塗りつぶしカウンタが0のときに非表示(非アクティブ化)にする。
【0114】
幾つかの実施例では、この情報の一部は、ディスプレイリスト13および前述の種々のエッジリスト中のエッジと関連付けられ、エッジ交差メッセージの一部として優先度判定モジュール500に転送される。特に、塗りつぶしルールフラグ、クリッパフラグ、クリップ型フラグ、およびニード・ビロウフラグは、このように扱っても良い。
【0115】
図7に戻って説明する。優先度更新モジュール506は、処理を完了した箇所までの走査線交差座標を記録するカウンタ524を維持する。これを優先度更新モジュール506の現在のXと呼ぶ。走査線の開始時の初期値は0である。
【0116】
FIFO518の先頭で受信したエッジ交差メッセージを検査するときに、優先度更新モジュール506は、エッジ交差メッセージ中のX交差値を現在のXと比較する。エッジ交差メッセージ中のX交差値が優先度更新モジュール506の現在のX以下である場合、エッジ交差メッセージは処理される。エッジ交差メッセージには2つの形態があり、エッジ交差メッセージ中の第1の優先度により示される優先度状態テーブル502中のレコードが、クリップ優先度でないことを示すクリッパフラグを有するときには「通常のエッジ処理」(後述)が使用され、クリップ優先度であることを示すクリッパフラグを有するときには「クリップエッジ処理」(後述)が実行される。
【0117】
優先度に対する塗りつぶしルールによると、その優先度に適用される境界エッジの内側に画素が存在する場合、優先度はその画素においてアクティブであり、優先度に対するクリップカウントは0である。優先度が最高のアクティブ優先度であるか、あるいは、その優先度より高い全てのアクティブ優先度の対応するニード・ビロウ・フラグが設定されている場合、優先度は公開される。このようにして、画素値は、公開された優先度の塗りつぶしデータのみを使用して生成されても良い。オブジェクトの優先度が、最後尾のオブジェクトから先頭のオブジェクトまでのオブジェクトの順でオブジェクトの位置(すなわち、レベル)を指定することに留意することが重要である。
【0118】
同じ塗りつぶし/合成動作を有し、連続シーケンスを形成する複数の非重複オブジェクトは、同じ優先度を有するものとして指定されるのが好ましい。これにより、塗りつぶしテーブル中のメモリ空間を効果的に節約できる。更に、オブジェクトの対応するエッジレコードは、対応する塗りつぶし/合成動作を参照するのに、対応する優先度を参照するだけで良い。加えて、本明細書を通して、「優先度(priority)」、「レベル(level)」、および「優先度レベル(priority level)」の各用語に言及する場合、これらの用語は、特に明記しない限りは本質的に同じことを意味するものとする。
【0119】
優先度に対するニード・ビロウ・フラグは、ディスプレイリストの情報内において定められ、このフラグが設定されない限り、当該優先度より低いいかなるアクティブ優先度も、レンダリング中の画素値に寄与しないことを画素生成システムに通知するのに使用される。必要以上の合成動作を防止するために必要に応じてフラグはクリアされる。クリアされない場合、フラグは最終的な画素値に対して何の寄与も行なわないであろう。
【0120】
「通常のエッジ処理」は、エッジ交差メッセージ中の優先度ごとに、その優先度により示される優先度状態テーブルレコードの各フィールドに関して、以下のステップを含む。
(i) 現在の優先度の現在の塗りつぶしカウントを記録するステップ、
(ii) 次のステップのいずれか、すなわち、
(a) 現在の優先度の塗りつぶしルールがオッドイーブン・ルールである場合、塗りつぶしカウントが現在0以外のときには塗りつぶしカウントを0に設定し、0のときには0以外の値に設定するステップ、もしくは、
(b) 現在の優先度の塗りつぶしルールがノンゼロワインディング・ルールである場合、塗りつぶしカウントを増分または減分(エッジ方向フラグによる)するステップ、
(iii) 新規の塗りつぶしカウントを記録された塗りつぶしカウントと比較し、一方が0であると共に他方が0以外の場合、現在の優先度に対して「アクティブフラグ更新」(後述)動作を実行するステップ
【0121】
実施例によっては、各エッジ交差メッセージに複数の優先度を配置するのではなく、優先度毎に別個のエッジ交差メッセージを使用しても良い。
【0122】
アクティブフラグ更新動作は、最初に、現在の優先度に対して新規のアクティブフラグを確立することを含む。優先度状態テーブル502中の優先度に対する塗りつぶしカウントが0以外であり、優先度に対するクリップカウントが0である場合、アクティブフラグは0ではない。それ以外の場合は、アクティブフラグは0である。アクティブフラグ更新動作の第2のステップは、アクティブフラグアレイ508中の現在の優先度により示される位置に判定されたアクティブフラグを格納することである。現在の優先度に対する優先度状態テーブル中のニード・ビロウ・フラグが0の場合も、不透明アクティブフラグアレイ510中の現在の優先度により示される位置にアクティブフラグを格納する。
【0123】
「クリップエッジ処理」は、エッジ交差メッセージ中の第1の優先度により示される優先度状態テーブルレコードの各フィールドに関して、以下のステップを含む。
(i) 現在の優先度の現在の塗りつぶしカウントを記録するステップ、
(ii) 次のステップのいずれか、すなわち、
(a) 現在の優先度の塗りつぶしルールが奇偶ルールである場合、塗りつぶしカウントが現在0以外のときには塗りつぶしカウントを0に設定し、0のときには0以外の値に設定するステップ、もしくは、
(b) 現在の優先度の塗りつぶしルールがノンゼロワインディングルールである場合、塗りつぶしカウントを増分または減分(エッジ方向フラグによる)するステップ、
(iii) 新規の塗りつぶしカウントを記録された塗りつぶしカウントと比較し、以下のクリップデルタ値うちのいずれかを判定するステップ:
(a) 新規の塗りつぶしカウントが0であると共に記録された塗りつぶしカウントが0である場合、または新規の塗りつぶしカウントが0以外であると共に記録された塗りつぶしカウントが0以外である場合には0、
(b) 現在の優先度のクリップ型フラグがクリップアウトであると共に記録された塗りつぶしカウントが0以外の場合、または現在の優先度のクリップ型フラグがクリップインであると共に記録された塗りつぶしカウントが0である場合には+1、
(c) それ以外の場合には、−1
(vi) エッジ交差メッセージ中の第1の優先度に後続する全ての優先度に対して、後続の優先度により示される優先度状態テーブルのレコード中のクリップカウントに判定されたクリップデルタ値を加え、そのプロセスにおいて、クリップカウントが0以外の値から0へ、または0から0以外の値へと移った場合、その後続の優先度に対して前述のようなアクティブフラグ更新動作を実行するステップ
【0124】
なお、各クリップカウントの初期値は、前述のLOAD_PRIORITY_PROPERTIES命令により設定される。クリップカウントは、通常、各優先度に影響するクリップイン優先度の数に初期化される。
【0125】
実施例によっては、優先度をクリップと関連付けずに、エッジ交差メッセージ中において与えられた全ての優先度のクリップカウントを直接増分/減分する。この技術は、例えば、クリップの形状が単純であり、複雑な塗りつぶしルールの適用を必要としないときに使用することができる。この特定の適用例では、エッジにより制御されるレベルのクリップカウントは、上向きのエッジに対しては増分され、下向きのエッジに対しては減分される。反時計回りの単純な閉曲線は、クリップインとして動作し、一方、時計回りの単純な閉曲線は、クリップアウトとして動作する。
【0126】
エッジ交差メッセージ中のX交差値が、優先度更新モジュール506の現在のXよりも大きい場合、優先度更新モジュール506は、いくつの画素を生成すべきかのカウントを形成する。このカウントは、エッジ交差メッセージ中のX交差値と現在のXとの差分であり、優先度生成メッセージの形式に設定される。メッセージは、接続520を介して優先度生成モジュール516に送信される。優先度更新モジュール506は、優先度生成モジュール516から所定数の画素に対する処理が完了したことを示す信号522が送信されるのを待つ。信号522を受信すると、優先度更新モジュール506は、現在のXをエッジ交差メッセージ中のX交差値に設定し、前述のように処理を続行する。
【0127】
優先度生成モジュール516は、テーブル34内に形成された優先度データテーブル504に関して動作する。このテーブル504は、各優先度に関する情報を保持するのに使用される。優先度データテーブル504中の各レコードは、以下の項目を含んでも良い。
(i) 塗りつぶしテーブルアドレス、
(ii) 塗りつぶしの型、
(iii) ラスタ・オペレーション・コード、
(iv) アルファチャネル・オペレーション・コード、
(v) 「ソースポップ」フラグ
(vi) 「宛先ポップ」フラグ
(vi) この優先度の色が所定のYに対して一定であるか否かを記録するフラグで、ここでは、「x-independent」フラグと呼ばれるフラグ
【0128】
優先度生成メッセージ520を受信すると、優先度生成モジュール516は、供給されたカウントにより示される回数だけ「画素優先度生成オペレーション」(後述)を実行し、その上で、優先度更新モジュール506に対してオペレーションを完了したことを信号522により伝える。
【0129】
各画素優先度生成オペレーションは、最初に不透明アクティブフラグ配列510に対して優先度符号器514(4096ビットから12ビットの優先度符号器など)を使用して最高の不透明アクティブフラグの優先度番号を判定することを含む。この優先度(存在する場合)は、優先度データテーブル504にインデックス付けするのに使用され、参照されるレコードの内容により、優先度生成モジュール516からの塗りつぶし優先度メッセージ出力が形成され、塗りつぶしカラー判定モジュール600へと送信される。
【0130】
更に、優先度が前のステップにより判定されていた(すなわち、少なくとも1つの不透明アクティブフラグが設定されていた)場合、判定された優先度が保持され、「現在の優先度」とされる。優先度が判定されなかった場合、現在の優先度は0に設定されている。
【0131】
優先度生成モジュール516は、アクティブフラグ配列508に対して修正優先度符号器512を繰り返し使用して、現在の優先度よりも大きい最低アクティブフラグを判定する。判定された優先度(存在する場合)は、優先度データテーブル504にインデックス付けするのに使用され、参照されるレコードの内容により、塗りつぶし優先度メッセージが形成され、優先度判定モジュール500へと送信598される。判定された優先度は、現在の優先度を更新するのに使用される。
【0132】
このステップは、判定される優先度がなくなる(すなわち、現在の優先度より大きく、フラグが立てられている優先度が、アクティブフラグ中にはない)まで繰り返し使用される。優先度生成モジュール516は、画素終端メッセージを形成し、それを塗りつぶしカラー判定モジュール600へと送信する。
【0133】
前述の基本オペレーションよりも好適な特徴として、優先度生成モジュール516は、各メッセージのx-independentフラグの値を記録し、シーケンスの第1の画素を処理する間、このメッセージを塗りつぶしカラー判定モジュール600へと転送する。全ての転送されたメッセージのx-independentフラグが指定されている場合、隣接するエッジ交差間の画素の範囲で全ての後続するメッセージをカウント−1の1回の繰り返し指定により置き換えることが可能である。これは、シーケンスにおける以降の全ての処理の代わりに、繰り返しメッセージを生成し、それを塗りつぶしカラー判定モジュール600に送信することによって行なわれる。
【0134】
前述の基本オペレーションよりも好適な別の特徴として、優先度生成モジュール516は、レベル生成メッセージが終了するたびに、接続522を介して優先度更新モジュール506に最高不透明優先度を送信する。優先度更新モジュール506は、この優先度を記憶装置526に保持する。続いて、優先度更新モジュール506は、メッセージ中のX交差が現在のXよりも大きいことを調べる簡単な検査の代わりに、メッセージ中のX交差が現在のXよりも大きく、メッセージ中の各レベルの少なくとも1つが最高の不透明優先度以上であることを調べる検査を画素優先度生成メッセージを生成する前に実行する。この検査により、より少ない回数の画素優先度判定オペレーションが行なわれ、より長い繰り返しシーケンスが生成されるであろう。
【0135】
図10および図11に示すグラフィックオブジェクトの例を使用して、図14Cから図14Jに示されるエッジ交差を使用する走査線35に対して、前述の優先度更新プロセスを示すことができる。このプロセスは、図17Aから図17Eにおいて示される通りである。
【0136】
図17Aから図17Eは、優先度テーブル502および504のオペレーションを示す。好適な実施例において、これらのテーブルは、レベルアクティブ化テーブル530と呼ばれる1つのテーブルに結合される。このテーブルは、配列508および510と符号器512および514とを伴う。
【0137】
図17Aにおいて明らかなように、走査線のためにエッジ交差メッセージがエッジ処理モジュール400から受信され、テーブル530へとロードされる。このテーブルは優先度順に整列される。この例では、エッジ交差メッセージは、エッジ横断のノンゼロワインディング・ルールによる増分方向を含む。優先度テーブル530中のエントリが設定されない場合もある。
【0138】
530で示されるレベルアクティブ化テーブルは、塗りつぶしカウントのための列エントリを含む。列エントリは、ノンゼロワインディング・ルール、または場合によってはオッドイーブン・ルールに従って、エッジから判定される。need-belowフラグは、優先度の特性であり、LOAD_PRIORITIES_PROPERTIES命令の一部として設定される。テーブル530がロードされるとき、need-belowフラグは、全ての優先度レベルに対して設定される。「クリップカウント」および「塗りつぶしインデックステーブル」などの他の列が使用されても良いが、この例においては、説明の簡略化のために省略する。アクティブなレベルがない場合、対応するエントリは0に設定される。更に、配列510および508の値は、後続のエッジ交差を受信した後にテーブル530から更新される。
【0139】
明瞭なものとするため、複数のレコードが省略されていることが図17Aから明らかであろう。通常、レベルアクティブ化テーブル530は、優先度順に整列された以下のレコードを含むであろう。
− 塗りつぶしカウント、
− クリップカウント、
− 塗りつぶしの型、
− (i)need-belowフラグ(ii)クリップの型(iii)クリッパフラグ、を含むアクティブ化条件およびフラグ、
− (i)ラスタ・オペレーションコード(ii)アルファチャネル・オペレーションコード(iii)「ソースポップ」フラグ(iv)「宛先ポップ」フラグ(v)x-independentフラグ、を含む合成グラフィックスオペレーションおよびフラグ、
− 塗りつぶしルール、
− 属性、
− 塗りつぶしテーブルインデックス
【0140】
テーブル530の内容は、優先度判定モジュール500において使用されていないときには、画素生成の場合は塗りつぶしカラー判定モジュール600、合成オペレーションの場合は画素合成モジュール700へとメッセージとして渡される。
【0141】
走査線35に対する第1のエッジ交差(図14E)は、図17Aにおいて示される。ここで、P=1の場合、ノンゼロワインディング・ルールに従って、塗りつぶしカウントは、エッジの値に更新される。このレベルに対する「need-below」フラグは、当該オブジェクトが不透明なときにはドライバソフトウェアにより0に設定される。
【0142】
テーブル530の前の状態は設定されなかったので、配列510および508は未設定のままであり、優先度符号器514は、優先度の出力ができない。これが、優先度生成モジュール516により解釈され、優先度生成モジュール516は、「オブジェクトなし」優先度(例えば、P=0)に対してカウントn=40(画素)を出力する。「オブジェクトなし」優先度は、走査線35の第1の空白部分である。
【0143】
図17Bは、図14Fのエッジ交差が受信されたときの構成を示す。塗りつぶしカウンタは更新される。続いて、配列510および508が、テーブル530の前の最高レベルで設定される。このとき、モジュール516は、半透明な三角形80との交差の前に、不透明な赤色のオブジェクト90のエッジ92を表すカウントn=45、P=1を出力する。
【0144】
図17Cは、図14Gのエッジ交差が受信されたときの構成を示す。尚、塗りつぶしカウントは、ノンゼロワインディング・ルールのために、下向きに調整されている。現在のエッジ交差を受信する前に有効であるオブジェクトは不透明ではないので、修正優先度符号器512を使用して、優先度P=2を最高アクティブレベルとして選択する。この優先度は、n=(115−85)=30画素に対する現在の優先度として出力される。
【0145】
図17Dは、図14Hのエッジ交差が受信されたときの構成を示す。尚、P=2に対して先に変更された「need-below」は、アクティブフラグ配列508に転送されており、優先度符号器は、n=(160−115)=45画素に対して現在の値P=1を出力することができる。
【0146】
図17Eは、図14Iのエッジ交差が受信されたときの結果を示す。n=(180−160)=20画素に対してP=0の出力を提供する。
【0147】
優先度判定モジュール500は、走査線の全ての画素に対して、画素のカウントおよび対応する優先度表示値を出力する。
【0148】
塗りつぶしカラー判定モジュール600のオペレーションを図8を参照して説明する。優先度判定モジュール500からの入力メッセージ598は、塗りつぶしデータ設定メッセージ、繰り返しメッセージ、優先度設定メッセージ、画素終端メッセージ、および走査線終端メッセージを含んでも良い。入力メッセージ598は、最初に塗りつぶし参照・制御モジュール604へと渡される。塗りつぶし参照・制御モジュール604は、塗りつぶしカラー判定モジュール600の種々の構成要素により使用するために、現在のX位置カウンタ614および現在のY位置カウンタ616を維持する。
【0149】
走査線終端メッセージを受信すると、塗りつぶし参照・制御モジュール604は、現在のXカウンタ614を0にリセットし、現在のYカウンタ616を増分する。続いて、走査線終端メッセージは、画素合成モジュール700に渡される。
【0150】
塗りつぶしデータ設定メッセージを受信すると、塗りつぶしモジュール604は、塗りつぶしデータテーブル36の指定位置602にデータを格納する。
【0151】
繰り返しメッセージを受信すると、塗りつぶし参照・制御モジュール604は、繰り返しメッセージからのカウントにより現在のXカウンタ614を増分する。その後、繰り返しメッセージは、画素合成モジュール700に渡される。
【0152】
画素終端メッセージを受信すると、塗りつぶし参照・制御モジュール604は、現在のXカウンタ614を増分し、その後、画素終端メッセージは、画素合成モジュール700に渡される。
【0153】
塗りつぶし優先度メッセージを受信すると、塗りつぶし参照・制御モジュール604は、以下に示すようなオペレーションを実行する。
(i) 塗りつぶし優先度メッセージを使用してテーブル36のレコードサイズを選択する
(ii) 塗りつぶし優先度メッセージからの塗りつぶしテーブルアドレスおよび先に判定したレコードサイズを使用して、塗りつぶしデータテーブル36からレコードを選択する
(iii) 塗りつぶし優先度メッセージからの塗りつぶしの型を使用して、サブモジュールを判定、選択して塗りつぶしカラーの生成を実行する。サブモジュールは、ラスタ画像モジュール606、フラットカラーモジュール608、線形傾斜カラーモジュール610、および不透明度タイルモジュール612を含んでも良い。
(iv) 判定されたレコードを選択されたサブモジュール606から612に供給する
(v) 選択されたサブモジュール606から612は、供給されたデータを使用して色および不透明度値を判定する
(vi) 判定された色および不透明度を塗りつぶし優先度メッセージからの残る情報、すなわち、ラスタオペレーションコード、アルファチャネルオペレーションコード、ソースポップフラグ、および宛先ポップフラグと組み合わせ、色合成メッセージを形成する。この色合成メッセージは、接続698を介して画素合成モジュール700へと送信される。
【0154】
好適な実施例において、判定された色および不透明度は、通常の8ビット精度の4倍の32ビット/画素のRGBおよび不透明度である。しかし、暗示された不透明度の4倍のCMYK、あるいは、他の多数の周知の色表現のうちの1つを代わりに使用しても良い。以下ではRGBおよび不透明度の場合を説明するが、この説明は他の場合にも適用しうる。
【0155】
ラスタ画像モジュール606、フラットカラーモジュール608、線形傾斜カラーモジュール610、および不透明度タイルモジュール612について説明する。
【0156】
フラットカラーモジュール608は、3つの8ビット色成分(通常、RGB成分として解釈される)および8ビット不透明度値(通常、指定色により塗られる画素の断片の測定単位として解釈される。0は塗りつぶしがない、すなわち、完全に透明であることを意味し、255は完全に塗りつぶされている、すなわち、完全な不透明であることを意味する)を含む固定形式のレコードとして供給されたレコードを解釈する。この色および不透明度値は、接続698を介して直接出力され、更なる処理を行なわずに判定された色および不透明度を形成する。
【0157】
線形傾斜カラーモジュール610は、3つの色成分および1つの不透明度成分と関連付けられた3つの定数cx、cy、およびdの4つの組を含む固定形式のレコードとして供給されたレコードを解釈する。4つの組の各組に対して、以下の式を使用して、3つの定数と現在のXカウントのxおよび現在のYカウントのyとを組み合わせることによって結果値rが計算される。
【0158】
r = clamp(cx * x + cy * y + d)
【0159】
ただし、関数clampは以下のように定義される。
このように生成された4つの結果より、色および不透明度値が形成される。この色および不透明度値は、接続698を介して直接出力され、更なる処理を行なわずに判定された色および不透明度を形成する。
【0160】
不透明度タイルモジュール612は、3つの8ビット色成分、8ビット不透明度値、整数X相(px)、Y相(py)、Xスケール(sx)、Yスケール(sy)、および64ビットマスクを含む固定形式のレコードを供給されたレコードとして解釈する。これらの値は、ディスプレイリスト生成において生じ、最初のページ記述に通常含まれる。ビットマスク中のビットアドレスaは、以下の式により判定される。
【0161】
a = ((x/2SX + px) mod 8) + ((y/2SY + py) mod 8) x 8
【0162】
ビットマスク中のアドレスaにおけるビットが検査される。検査されたビットが1の場合、レコードからの色および不透明度が直接モジュール612の出力にコピーされ、判定された色および不透明度を形成する。検査されたビットが0の場合、3つの0成分値および0不透明度値を有する色が形成され、判定された色および不透明度として出力される。
【0163】
ラスタ画像モジュール606は、6つの定数a、b、c、d、tx、およびtyと、サンプリングされるラスタ画像画素データ16の各ラスタ行中のビット数(bpl)の整数カウントと、画素の型とを含む固定形式のレコードを供給されたレコードとして解釈する。画素の型は、ラスタ画像画素データ中の画素データ16が以下に示す画素のうちのどの画素として解釈されるかを示す。
(i) 1ビット/画素の不透明な黒色/白色の画素、
(ii) 1ビット/画素の不透明な黒色の画素または透明な画素、
(iii) 8ビット/画素のグレースケールの不透明な画素、
(iv) 8ビット/画素の黒色の不透明度スケール画素、
(v) 24ビット/画素の不透明な3色成分画素、または
(vi) 32ビット/画素の3色成分+不透明度画素
【0164】
ラスタ画像モジュール606は、画素の型の標識を使用してビット単位での画素サイズ(bpp)を判定する。その後、以下の式で表されるラスタ画像画素データ16中のビットアドレスaが計算される。
【0165】
a = bpp*floor(a*x+c*y+tx) + bpl*floor(b*x+d*y+ty)
【0166】
レコード602からの画素の型によって解釈された画素は、ラスタ画像画素データ16中の計算されたアドレス「a」からフェッチされる。画素は、必要に応じて、3つの8ビット色成分および8ビット不透明度成分を有するように拡張される。「拡張される(expanded)」とは、例えば、8ビット/画素のグレースケール不透明ラスタ画像からの画素が、RGB成分および完全な不透明に設定された不透明度成分の各々に対して適用されるサンプリングされた8ビット値を有するであろうことを意味する。これにより、画素合成モジュール700に対する判定された色および不透明度出力698が形成される。
【0167】
結果として、表示可能なオブジェクト内で有効なラスタ画素データが、メモリ16内の画素画像データに対するマッピングの判定を介して得られる。これにより、ラスタ画素データのオブジェクトベースの画像へのアフィン変換が効果的に実現される。この方法は、画像ソースからグラフィックオブジェクトとの合成が行なわれるであろうフレームメモリへ画素を転送する従来技術よりも効率的である。
【0168】
前述の例よりも好適な特徴として、ラスタ画像画素データ16中の画素間での補間が、最初に以下の式に従って中間結果pおよびqを計算することによって、オプションとして実行されても良い。
【0169】
p = a * x + c * y + tx
q = b * x + d * y + ty
【0170】
次に、ラスタ画像画素データ16中の4つの画素のビットアドレスa00、a01、a10、およびa11が、以下の式に従って判定される。
【0171】
a00 = bpp * floor(p) + bpl * floor(q)
a01 = a00 + bpp
a10 = a00 + bpl
a11 = a00 + bpl + bpp
【0172】
次に、結果画素成分値rが、以下の式に従って色および不透明度ごとに判定される。
【0173】
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))
【0174】
前述の各式において、floor(value)は床関数演算であり、これはvalueの小数部を切り捨てて、valueより大きくない最大の整数を得る演算である。
【0175】
get関数は、所定のビットアドレスにおけるラスタ画像画素データ16からサンプリングされる現在の画素成分の値を戻す。なお、この値は、ある画素の型の一部の成分に対しては、黙示の値を取ることが可能である。
【0176】
前述の例よりも好適な特徴として、供給されたレコードから読み出されたタイルサイズを用いて係数演算を行なうことにより現在のXカウンタ614および現在のYカウンタ616から得られた前述の式中のx値およびy値を使用することによって、画像タイル張りがオプションとして実行されても良い。
【0177】
更に多くの塗りつぶしカラー生成サブモジュールが利用可能である。
【0178】
画素合成モジュール700のオペレーションを説明する。塗りつぶしカラー判定モジュール600からの入力メッセージは、繰り返しメッセージ、色合成メッセージ、画素終端メッセージ、および走査線終端メッセージが、順番に処理される。
【0179】
繰り返しメッセージまたは走査線終端メッセージを受信すると、画素合成モジュール700は、更なる処理を行なわずにそのメッセージを画素出力FIFO702へと転送する。
【0180】
色合成メッセージを受信すると、画素合成モジュール700は、通常、一般的に言って、色合成メッセージからの色および不透明度を色合成メッセージからのラスタオペレーションおよびアルファチャネルオペレーションにより画素合成スタック38から取り出される色および不透明度と結合する。その後、画素合成モジュール700は、結果を合成スタック38に戻す。色合成メッセージの受信の際に実行される処理の記述を以下で行なう。
【0181】
画素終端メッセージを受信すると、画素合成モジュール700は、画素合成スタック38から色および不透明度を取り出す。例外的に、スタック38が空の場合には、不透明な白色の値が使用される。結果として生じる色および不透明度により、画素出力メッセージが形成され、このメッセージは、画素出力FIFOへと転送される。
【0182】
周知の合成手法の1つが、Porter, TおよびDuff, Tの「Compositing Digital Images」(Computer Graphics, Vol. 18 No. 3 (1984) pp. 253-259)に記載されている。PorterおよびDuffの合成オペレーションの例を、図23に示す。しかし、このような手法では、合成物により形成される交差領域中のソースおよび宛先の色のみを扱うことが可能であり、交差領域における透明度の影響を吸収することができない点において問題がある。この結果、PorterおよびDuffにより定義されるラスタオペレーションは、透明性がある場合には実質的な効力がない。
【0183】
色合成メッセージを受信した際に画素合成モジュール700により実行される処理を説明する。
【0184】
色合成メッセージを受信すると、画素合成モジュール700は、最初にソースの色および不透明度を形成する。これは、ポップソースフラグが色合成メッセージ中で設定されていない限り、色合成メッセージにおいて提供される色および不透明度から得られる。この場合には代わりに、画素合成スタック38から色が取り出される。このとき、あるいは、画素合成スタックの取り出し中に、画素合成スタック38が空であることが判明した場合、エラーの表示を行なわずに不透明な白色値が使用される。次に、宛先の色および不透明度が、画素合成スタック38から取り出される。但し、色合成メッセージ中で宛先ポップフラグが設定されていない場合、「取り出し」オペレーション中にスタックポインタは妨害されないので、事実上、これがスタック38の最上部からの読み出しになる。
【0185】
ソースの色および不透明度を宛先の色および不透明度と結合する方法を図9Aから図9Cを参照して説明する。色および不透明度値は、通常、0から255の範囲内の8ビット値として格納されるが、この説明においては、0から1の範囲にあるものと見なされる(すなわち、正規化される)。2つの画素を合成するために、各画素は、完全に不透明な領域と完全に透明な領域の2つの領域に分割されるものと見なされる。不透明度値は、これらの2つの領域の比率を示すものである。
【0186】
図9Aは、不図示のある3成分色値と不透明度値(so)を有するソース画素702を示す。ソース画素702の陰影部は、画素702の完全に不透明な部分704を表す。同様に、図9Aの非陰影領域は、ソース画素702のうちの完全に透明と見なされる比率706を表す。
【0187】
図9Bは、ある不透明度値(do)を有する宛先画素710を示す。宛先画素710の陰影領域は、画素710の完全に不透明な部分712を表す。同様に、画素710は、完全に透明な部分714を有する。ソース画素702および宛先画素710の不透明な領域は、結合のために相互に直交するものとされる。
【0188】
これらの2つの画素のオーバレイ716が図9Cに示される。注目画像領域が3つ存在し、これらの領域には、so*(1−do)の面積を有する宛先を除くソース領域718と、so*doの面積を有するソースと宛先の共通領域720と、(1−so)*doの面積を有するソースを除く宛先領域722とが含まれる。これらの3つの領域の各々の色値は、概念上別々に計算される。宛先を除くソース領域718は、ソースの色から直接色を取得する。ソースを除く宛先領域722は、宛先の色から直接色を取得する。ソースと宛先の共通領域720は、ソースの色と宛先の色との結合から色を取得する。ソースの色と宛先の色を結合するプロセスは、先に検討した他のオペレーションとは異なり、ラスタオペレーションと呼ばれ、画素合成メッセージからラスタオペレーションコードにより指定される1組の関数のうちの1つである。好適な実施例に含まれるラスタオペレーションの一部を本明細書に添付した図面の図9Dに示す。
【0189】
各関数は、ソースの色および宛先の色の対応する色成分の各対に適用され、結果として生じる色において同様の成分が得られる。その他の多くの関数も利用可能である。
【0190】
画素合成メッセージからのアルファチャネル・オペレーションも考慮される。アルファチャネル・オペレーションは、3つのフラグを使用して実行される。各フラグは、ソース画素702および宛先画素710のオーバレイ716中の注目画像領域のうちの1つに対応する。アルファチャネルオペレーションにおける対応するフラグが設定されていない場合、各領域に対して0の領域不透明度値が形成される。フラグが設定されている場合、それは領域の面積である。
【0191】
合成不透明度は、領域不透明度の合計から形成される。続いて、合成色の各成分が、領域の色/領域の不透明度の各対の積の合計を合成不透明度で割った値により形成される。
【0192】
合成色および不透明度は、画素合成スタック38へと押し込まれる。
【0193】
表現ツリーは、画像を形成するのに必要な合成オペレーションを記述するのに使用されることが多く、通常、葉ノード、単項ノード、およびバイナリノードを含む複数のノードから構成される。葉ノードは、表現ツリーの最も外側のノードであり、子孫ノードを持たず、画像の基本要素を表す。単項ノードは、単項演算子の下のツリーの部分からの画素データを修正するオペレーションを表す。バイナリノードは、通常、左右のサブツリーへと分岐し、各サブツリーは、それ自体が少なくとも1つの葉ノードから構成される表現ツリーである。
【0194】
任意の形状のオブジェクトを用いて合成するときに、前述の種々のスタックオペレーションが、画像の区域によって異なるという問題が発生する。このオペレーションは、特定の位置においてアクティブなオブジェクトによって決まる。
【0195】
図19Aおよび図19Bは、ソース(S)と宛先(D)との間の典型的なバイナリオペレーション(表現ツリーとして示される)を示す。実際のオペレーションが実行されるか否かに関わらず、図19Aのバイナリオペレーションは、以下に示すように4つの場合、すなわち、アクティビティ領域に分けられる。
1. (A)S アクティブ、 (B)D 非アクティブ、
2. (A)S アクティブ、 (B)D アクティブ、
3. (A)S 非アクティブ、(B)D アクティブ、
4. (A)S 非アクティブ、(B)D 非アクティブ
【0196】
例4では、常に、実行する必要があるオペレーションがない(NOP)結果となり、バイナリツリーに対するアクティブレベルの3つの異なる組み合わせが存在することになる。3次、4次、および更に高い次数のツリーへのこの概念の拡張は、当業者には明らかであろう。
【0197】
結果として、合成スタック38(バイナリの例に対して)を作成するときには、前述の3つの識別されたオペレーションのうちの1つがスタックにより実現される必要がある。更に、スタック中の各オブジェクトと関連付けられた様々なオペレーションは、レベルアクティブ化テーブル中のオブジェクトの下に何があるかによって決まる。簡単なOVERオペレーションを使用するオブジェクトのレンダリングに対しては、画家アルゴリズムと同様に問題は発生しない。
【0198】
しかし、他の合成オペレーションに対しては、合成オペレーションのオペランドのアクティビティによってスタックオペレーションが変更される必要がある。これは、スタックオペレーションを提供する各レベルをクリッピングすることによって行なうことができるが、各レベルに適用されるクリップの数が急激に増加する可能性があり、スタックオペレーションを扱う上で困難が生じることになる。
【0199】
問題となるオペレーションの例は、図23において示されるPorter/DuffオペレーションのOUTとROUTである。図23において、オブジェクト(オペランド)は、他のオブジェクトをクリッピング(他のオブジェクトの境界を変更)し、共通領域において変動的な透明度を有する。
【0200】
この問題に対処するために、「アクティビティ」テーブルと呼ばれる更なるテーブルが設けられる。このテーブルは、レベルアクティブ化テーブルの付属テーブルとして動作し、前述の代替アクションの論理的な判定を提供する。
【0201】
図20Aは、実質的に3つの区分を含む汎用アクティビティテーブル800を示す。第1の区分802は、処理中の指定塗りつぶしレベルに対するアクティブ化条件を提供する。第2の区分804は、先の説明で各レベルに(特に、バイナリの例に)適しているとされた様々なアクションの各々を含む。第3の区分806は、特定のレベルにおいてソースオブジェクトまたは宛先オブジェクトがアクティブであるか否かを示す。尚、アクション区分804に含まれる各エントリは、それ自体が特定のオペレーションであっても、あるいは、必要に応じてレベルアクティブ化テーブルに対するポインタであっても良い。
【0202】
また、場合によっては、種々のオペレーションにより他のオペレーションにデータを供給することが可能であることにも留意すべきである。結果として、アクティビティテーブル800をオペレーションがデータを供給する種々の条件を示すフラグを組み込むように修正することができる。
【0203】
アクティビティテーブルの好適な形態に対するデータ構造が、テーブル810として図20Bにおいて示される。テーブル810は、データを使用する次のオペレーションに対するエントリへのポインタ814(Next Level)とオペレーションがデータを供給している表現ツリーの枝を示すフラグ806(Src_Active/Dest_Active)(あるいは、3次または更に高い次数のツリーが使用される1組のフラグ)とを含む。
【0204】
また、テーブル810は、オペレーションがデータをソース枝または宛先枝に供給しているのか否かを示すフラグ816を含む。データを供給している場合、オペレーションのアクティビティ状態818が変化するときには、次のレベルエントリ中のSrc_ActiveフラグまたはDest_Activeフラグ806が調節される。オペレーションは、ある組み合わせにおいてデータを供給するだけであるので、更に、これを示すためにフラグ812(data_in_*)が設けられる。
【0205】
フラグ812は、Src/Dest_Activeフラグ806と協働して、レベルのアクティビティ状態を判定する。更に、アクティビティ状態が変化する場合には、いかなるオペレーションも次のレベルの状態を変更するだけで良いので、ノードアクティブフラグ818は、このような状況を監視するために設けられる。
【0206】
したがって、右の葉ノードに対しては、押し込みオペレーションと次のオペレーションレコード中のDest_Activeフラグとをアクティブ化する必要がある。左の葉ノードに対しては、エッジ交差上のSrc_Activeフラグをアクティブ化する必要があり、宛先が既にアクティブである可能性があることを記録する。
【0207】
図20Bにおいて、アクティブ化条件802は、葉ノードのアクティブ化を判定する塗りつぶしルールとレベルアクティブ化テーブルに対して前述のように使用される塗りつぶしカウントとを含む。クリップカウントも前述のように動作する。エッジ交差は、テーブル810中のレベル(ソースレベル)をアクティブ化する。
【0208】
レベルのアクティブ化状態が変化するとき、その変化は、Next Levelエントリ814によりポイントされるレベルへと伝播する。Data_is_Srcフラグ816の状態により、Src_Active/Dest_Activeフラグ806は、次のレベルにおいて変更される。次のレベルの状態も変化する場合、その変化は伝播する。テーブルエントリは、例1、例2、および例3のそれぞれに対するオペレーションを含む。これらは、レベルアクティブ化テーブル内の各レベルに対するポインタであっても、実際のオペレーション(アルファオペレーション、カラーオペレーション、塗りつぶしの型フラグ、およびスタックオペレーションフラグ)であっても良い。あるいは、オペレーションが必要とされない場合は、ヌルであっても良い。
【0209】
ノードレベルのアクティブ化状態は、data_in_S∩D ̄opフラグ、data_in_S∩Dopフラグ、data_in_S ̄∩Dopフラグ812、およびノードレベルに対するSrc/Dest_Activeフラグ806により判定されるように、表現ツリーにおける次のオペレーションに対してデータがあるか否かにより判定される。これは、Node_Activeフラグ818としてリスト中に記述される。
【0210】
この実現例を、図21における表現ツリー830に示す。対応する初期のアクティビティテーブル820が図22Aに示される。
【0211】
表現ツリー830は、オペランドA、B、およびCのページへのレンダリングを規定する。完全にするために、ページは、右の葉ノードPAGEとしてツリー830において示されている。PAGEは、常にアクティブであり、画像出力空間全体を包含するので、アクティビティテーブル820から省略されても良い。
【0212】
BおよびCはリーフノードであるので、テーブル820の下位レベルを形成し、それぞれに対してアクティブ化オペレーション804が行なわれることになる。このアクティブ化オペレーション804により、各演算子は合成スタックに押し込まれる可能性がある。各々が右のリーフノードであり、Cが最初に押し込まれる。オペランドCに対しては何のオペレーションも行なわれないので、S ̄∩DopはNOPである。data_in_*opフラグ812、Next Levelフラグ814、およびData_is_Srcフラグ816も更新される。オペランドBに対しては、対応するアクションが行なわれることになる。
【0213】
アクティビティテーブル820の次のレベルは、左の葉ノードAおよびその対応する演算子Op2により形成される。このレベルに対するアクティブ化オペレーション804が更新され、S ̄∩DopおよびS∩Dopは、修飾子aまたはbにより修飾されるAop2Bである。修飾子aおよびbはオペレーション間の相違を表す。オペレーションOp2は、Sにおいてデータを供給するだけであり、これは、Dがアクティブであり且つSがアクティブでない場合(すなわち、S ̄∩Dop)、スタックからBを取り出すアクティビティにより表される。
【0214】
テーブル820の次のレベルはOp1に関し、アクティブ化オペレーション804において修飾された結果であるa、b、およびcを生成する。最後のレベルoverに対して、PAGEは常にアクティブであるので、S∩D ̄opおよびS∩D ̄opは、NOPがスタックに押し込まれる結果となる。単純な共通部S∩Dopのみが、オーバ・アクティブ(over active)である。
【0215】
この例に関して、A、B、およびCが最初非アクティブで、これらのオペランドが後で順番にアクティブ化される場合を検討する。
【0216】
Aが最初にアクティブ化される場合、このレベルにおいてAOp2aがアクティブ化され、Src_Activeフラグ806の設定により反映される。S∩D ̄フラグ812が設定される(Bはまだアクティブでないため)ので、Node_Activeフラグ818がそのレベルに対して設定される。Node_Activeの状態が変化したので、OplレベルにおけるSrc_Activeフラグ806が設定される。なお、Data_is_Srcフラグ816がAOp2レベルに対して設定される。
【0217】
Oplレベルは、Src_Activeおよび(dest_Active) ̄(Cはまだアクティブ化されていないため)を有するので、Op1aがこのレベルにおいてアクティブ化される。S∩D ̄が設定されるので、Node_Active818がOp1レベルに対して設定される。Node_Active818の状態が変化したので、overレベルにおけるSrc_Activeフラグ806が設定される。overレベルはSrc_ActiveおよびDest_Activeを有する(PAGEは常にアクティブであるため)ので、overはこのレベルにおいてアクティブ化される。S∩Dが設定されるので、Node_Activeが設定され、Node_Activeの状態は変化しない。これ以上のアクションは要求されない。この段階において、合成スタック38はテーブル820から生成され、図22Bに示すような外観となる。
【0218】
ここで図22Cを参照されたい。Bが次にアクティブ化される場合、S∩D ̄が設定される(Dは無関係)ので、このレベルにおいてPush Bがアクティブ化される。このレベルに対してNode_Active818が設定される。Node_Activeフラグの状態が変化したので、AOp2レベルにおけるDest_Activeフラグが設定される。続いて、AOp2bBがアクティブ化され、AOp2aBが非アクティブ化される。S∩Dが設定されるので、Node_Activeは設定された状態を維持し、Node_Activeフラグの状態はAOp2aに対して不変である。これ以上のアクションは起こらない。合成スタック38は、図22Dに示すような外観になる。
【0219】
図22Eにおいて明らかなように、Cが次にアクティブ化される場合、Push Cがこのレベルにおいてアクティブ化される。Sはアクティブ、Dは無関係であるので、Node_Active818がこのレベルに対して設定される。Node_Activeが変化したので、Op1レベルにおけるDest_Activeフラグが設定される。Op1bがアクティブ化されるので、Op1aは非アクティブ化される。S∩Dにおけるデータが設定されるので、Node_Activeフラグは設定された状態を維持する。Node_ActiveはOp1レベルに対して不変であるので、更なるアクションは要求されない。合成スタック38は、図22Fに示すような外観になる。
【0220】
この手順は、図21の表現ツリー全体の評価の間続行されるので、種々のオペレーションが確立されるように、アクティビティテーブル820が規定される。種々のオペレーションは、種々のアクティブ化条件802およびアクティビティ標識804により必要とされる場合には合成スタックへと押し込まれることもある。このようにして、実行されるクリッピングまたはその他のオペレーションの型に関わらず、評価される表現ツリーの複雑度に関係なく正確なレベルにおける正確なオペレーションを行なうことでスタックを維持することが可能である。表現ツリーの大きさはディスプレイリストの形成を介して評価されるが、ディスプレイリストの生成は、通常、クリッピングなどの種々のオブジェクトのオペレーションにおけるばらつきを説明することができない。これらのオペレーションは、合成表現の評価中に実現される必要がある。
【0221】
更なるフラグ、すなわち、エッジ交差によりアクティブ化されるであろうsrc_is_leaf_nodeに対するフラグ、およびdest_is_PAGE(常にアクティブ)に対するフラグが有用であることに更に留意すべきである。dest_is_PAGEの場合、起こり得ないケースとして無視することが可能である。
【0222】
以上の説明では、アクティビティテーブル820が表現ツリー830の構造に基づいて作成される様子と、ツリー830の種々のオペランドのアクティブ化の変更を介してエントリが完成される(すなわち、記入される)様子とを示している。テーブル820の特定の例に対して、様々なアクティブ化および可能な結果を説明するために、72個(=2x2x3x3x2)のスタック構造を生成することが可能である。このようにして、条件802、806、812、814、816、および818の論理的評価により、特定のレベルに対する適切なスタックオペレーションとして識別される正確なアクティビティ804がもたらされる。
【0223】
代替の実現例において、アクティビティテーブル820は、独立のテーブルとして構成されるのではなく、レベルアクティブ化テーブル530へと結合され、結合されたテーブル830が得られる。これにより、データの複製が防止される一方で、優先度符号器512および514は、正確なエッジ優先度のみならずアクティブ化オペレーションも選択することが可能になり、アクティブ化オペレーションは、モジュール600から得られた塗りつぶしカラーを使用して画素合成モジュール700により評価されるように、画素合成スタック38へと(徐々に)転送される。このような構成は、図22Gにおいて機能的に表される。
【0224】
あるいは、図22Hにおいて機能的に示されるように、アクティビティテーブル820は、レベルアクティブ化テーブル530より先行しても良い。この場合、塗りつぶしカウントおよびクリップカウントに対する列は、アクティビティテーブル820に含まれ、レベルアクティブ化テーブル530からは省略されても良い。更なる代替の構成では、図22Iにおいて機能的に示されるように、アクティビティテーブル820は、レベルアクティブ化テーブル530の後に続いても良い。その場合、塗りつぶしカウントおよびクリップカウントは、レベルアクティブ化テーブル530に含まれているので、アクティビティテーブル820は、これらのカウントを省略することができる。アクティビティテーブル820が図22Aに示すように構成される一部の適用例では、レベルアクティブ化テーブル530は省略されても良い。
【0225】
アクティビティテーブル820およびスタック38を参照して先に説明したオペレーションコードは、ディスプレイリストおよび特に命令ストリーム14(図5参照)から得られる。オペレーションコードは、他のデータ(エッジ交差、塗りつぶしデータなど)と同時に図5に示す処理ステージのパイプラインを介して転送され、画素合成モジュール700は、優先度判定、レベルアクティブ化、および塗りつぶし判定の結果として判定順にopコードをスタックへ押し込む。
【0226】
画素出力モジュール800のオペレーションを説明する。入力メッセージが画素出力FIFOから読み取られる。この入力メッセージには、画素出力メッセージ、繰り返しメッセージ、および走査線終端メッセージが含まれ、これらのメッセージは順番に処理される。
【0227】
画素出力メッセージを受信すると、画素出力モジュール800は画素を格納すると共に、それを出力に転送する。繰り返しメッセージを受信すると、最後に格納された画素が、繰り返しメッセージからのカウントにより指定される回数だけ出力898に転送される。走査線終端メッセージを受信すると、画素出力モジュール800は、そのメッセージを出力に渡す。
【0228】
出力898は、必要に応じて画素画像データを利用する装置に接続しても良い。このような装置には、ビデオ表示装置またはプリンタなどの出力装置、ハードディスクおよびラインメモリ、バンドストアまたはフレームメモリを含む半導体RAMなどのメモリ記憶装置、またはコンピュータネットワークが含まれる。しかし、前述の説明から明らかなように、レンダリングプロセス中の画素画像データの中間記憶を必要とせずに、高度なグラフィック記述言語により要求される完全な機能性をもってグラフィックオブジェクトのレンダリングを行なう方法および装置が説明される。
【0229】
<1.2 第2のモードによる動作>
コンピュータシステム1は、レンダリング済のページの走査線を横断するときに各エッジを追跡し、エッジごとに走査方向における横断の最小範囲および最大範囲を判定し、次の走査線に対してエッジ位置を定義するレコードのリスト32に追加のレコードを配置するメカニズムを具備する。これらのレコード32は、次の走査線に対して昇順へとソートされる。これらのレコードの各々は、次の走査線上で読み込まれるときに、優先度判定モジュール500に対するメッセージを生成する。続く段落で検討されるように、各メッセージは、優先度判定モジュール500に対して、エッジが適用されるレベルと関連付けられた種々のカウンタを増分または減分するように命令する。
【0230】
画素順次レンダリング装置20において、優先度判定モジュール500は、エッジ処理モジュール400からメッセージを受信する。優先度判定モジュール500は、各優先度レベルが塗りつぶしカウンタを含むレベルのテーブルと、レベルにより部分的に、あるいは、全体的に表されるオブジェクトがアクティブ化される条件を含むレコードとを具備する。
【0231】
また、各レベルは、レベルにより表されるオブジェクトがアクティブの画素を構成するときに実行される合成オペレーションを含む。オブジェクトがアクティブのときに幾つかの命令が実行される必要がある場合、命令ごとにレベルが要求される。
【0232】
オブジェクトのトポロジを定義する塗りつぶしルールが、各テーブルエントリに含まれる。塗りつぶしルールは、オブジェクトがノンゼロワインディング塗りつぶしルールを使用するか、あるいは、オッドイーブン塗りつぶしルールを使用するかを示すために、各レベルにおいてフラグビットを使用して定義されるのが好ましい。ノンゼロワインディング塗りつぶしルールでは、塗りつぶしカウンタ値が0以外の場合、オブジェクトはアクティブであり、カウンタ値が0の場合は非アクティブである。これに対し、オッドイーブン塗りつぶしルールでは、塗りつぶしカウンタ値が奇数の場合(すなわち、塗りつぶしカウンタの最下位ビットがアサートされる場合)、オブジェクトはアクティブであり、カウンタ値が偶数の場合は非アクティブである。異なるX位置値を有する2本の連続するエッジ間の画素連が、アクティブ命令を使用して塗りつぶされる。連続するエッジメッセージが同じX位置を有する場合、画素連は生成されないことが明らかであるので、全画像が画素順に構築される。
【0233】
優先度判定モジュール500は、別のカウンタの追加、すなわち、オーバーライドカウンタを具備するのが好ましい。第2の動作モードにおける装置20は、オーバーライドカウンタが0以外のときに塗りつぶしルールを無効にする。更に、エッジ処理モジュール400と優先度判定モジュール500との間のエッジ交差メッセージは、オブジェクトのエッジが接する画素に対してはオーバーライドカウンタが0以外に設定され、接しない画素に対しては0に設定されるように構成される。残る画素に対しては、塗りつぶしルールおよび塗りつぶしカウンタが、オブジェクトがアクティブか否かを判定する。
【0234】
画素順次レンダリング装置20において、走査線は一度に完全に処理される。レンダリングシーケンスにおける第1のステップとして、現在の走査線と交わる各エッジが、現在処理中の走査線ごとにアクティブエッジレコードのソート済のリストから得られる。先に説明したように、各エッジは、優先度判定モジュール500において1つ以上のレベルを制御し、ディスプレイリスト中のアクティブレベルからの命令のみが実際に最終画素値に寄与するように、制御するレベルをアクティブ化したり、あるいは、非アクティブ化したりする。
【0235】
前節で検討した第1の動作モードで優先度判定モジュールにおいてエッジ位置を計算し、レベルをアクティブ化するメカニズムは、エッジが接する全ての画素がアクティブ化されなければならない場合には不十分である。第1の動作モードでは、エッジの軌跡を判定するために、Y方向には画素精度、X方向には副画素精度でエッジが計算される。従って、セグメントのY範囲は、整数表現を使用して格納され、セグメントのX範囲は、固定小数点表現を使用して格納される。これに対し、第2の動作モードでは、エッジの軌跡を判定するために、エッジはX方向と同様にY方向にも副画素精度で計算される。このため、セグメントのY範囲は、新規のエッジを備えたセグメントデータ形式においても、アクティブエッジ自体においても、固定小数点表現を使用して格納される。この目的で浮動小数点表現が使用されても良い。
【0236】
第2の動作モードでは、エッジレコードの2つのクラスが使用される。
【0237】
エッジレコードの第1のクラスは、前節において説明したように、第1の動作モードで使用される型のエッジレコードと同等であり、これにより後続の走査線上のエッジ位置が計算される。また、エッジレコードの第1のクラスは、エッジの次の走査線との共通部分のX範囲の一端を指定するために提供される。
【0238】
エッジレコードの第2のクラスは、エッジの次の走査線との共通部分のX範囲の他端を指定するために提供される。エッジレコードの第2のクラスは、破棄される前は1本の走査線に対して存在する。レコードは、直ちに破棄されるべきものであり、後続の走査線上のエッジの位置を計算するための情報は必要とされないため、エッジレコードから除外されても良い。
【0239】
エッジレコードのこの第2のクラスにおけるエッジレコードを以降は終端レコード(terminating record)と呼び、第1のクラスのエッジレコードを継続エッジレコード(continuing edge record)と呼ぶ。また、第2の動作モードにおいて、塗りつぶしルールに対する各レベルにおける塗りつぶしカウンタに基づく優先度状態テーブル(502)は、別のカウンタを追加することにより拡張される。このカウンタを以降はオーバーライドカウンタと呼ぶ。以下の説明で明らかになるであろうが、オーバーライドカウンタは、エッジが接する画素に対しては0以外であり、塗りつぶしカウンタの状態に関わらず、これらの画素が確実にアクティブ化されるようにするために使用される。
【0240】
ここで図26を参照されたい。図26では、このような優先度状態テーブルの好適な形式が示される。優先度判定モジュール500のレベルアクティブ化メカニズムに対する各レベルにおいて3つのカウンタがある。第2の動作モードに関連する2つは、塗りつぶしカウンタとオーバーライドカウンタである。前節で説明した個別のクリッピングメカニズムに対してクリップカウンタが提供される。前節で説明したように、カウンタに加えて、アクティブなときにレベルにより実行されるオペレーションを管理する複数のフィールドが存在する。いずれの走査線上でも、各レベルにおける塗りつぶしカウンタが使用され、そのレベルに関連し、走査線の開始以来横断されたエッジの本数がカウントされる。これは、塗りつぶしルールと共に使用され、塗りつぶしルールフラグの状態により示されて、レベルが1つの画素に対してアクティブであるか、あるいは、一連の画素に対してアクティブであるかが判定される。
【0241】
オーバーライドカウンタは、エッジが次の走査線へと渡る前にエッジの軌跡がまたがる走査線の区分に対して、塗りつぶしカウンタを無効にするために使用される。このため、以下の条件のうちのいずれかが発生するとき、レベルはアクティブである。
(i) ノンゼロワインディング塗りつぶしルールを示す塗りつぶしルールフラグがデアサートされ、塗りつぶしカウンタが0以外のとき、
(ii) オッドイーブン塗りつぶしルールを示す塗りつぶしルールフラグがアサートされ、塗りつぶしカウンタが奇数のとき、
(iii) オーバーライドカウンタが0以外のとき
【0242】
優先度判定モジュールのレベルアクティブ化メカニズムの各レベルにおいてオーバーライドカウンタを制御するために、エッジレコードに格納されるアクティブ化情報に付加ビットが加えられる。付加ビットをオーバーライドフラグと呼ぶ。
【0243】
図14Aに戻る。図14Aでは、アクティブエッジレコードの形式が示される。先に述べたように、以下の項目に対するフィールドが存在する。
(i) 現在のX位置、
(ii) 次の走査線またはその一部上のエッジ位置を取得するためにX位置に加えられるDX値、
(iii) 別のセグメントが読み込まれる前に、Y方向にどの程度までエッジが延伸しなければならないのかについてのレコードNY、
(iv) エッジ中の次のセグメントのアドレスであるセグメントアドレス、
(v) エッジが影響を及ぼす優先度に対する1つの優先度インデックスおよびエッジが影響を及ぼす優先度のリストのアドレスのいずれかを含み、オブジェクトをレンダリングするのに幾つかのグラフィカルオペレーションが要求される場合、あるいは、クリッピングオブジェクトが複数の他のオブジェクトに影響を及ぼす場合に、優先度のリストのアドレスを含むことが要求されるであろう値P、
(vi) d、c、u、o、およびpの1組のフラグ
【0244】
終端レコードにおいては、DX、NY、セグメントアドレスフィールド、およびエッジを更新するための他の任意のフィールド(例えば、DDXおよびより高い次数の項目)は要求されないので、これらは除外されても良い。
【0245】
前節で説明したように、エッジ追跡がより高い次数に対して実行される場合は、DDXおよびより高い次数の項目に対して、追加のフィールドが使用されても良い。
【0246】
第1の動作モードでは、NY値が格納されて整数値として維持される。しかし、第2の動作モードでは、NYは副画素精度で格納される。この精度は、固定小数点または浮動小数点の数としての格納を要求する。ハードウェアによる実現例では、通常は、固定小数点記憶装置を使用するのがより便利である。
【0247】
フラグd(DIRECT_CLIP)は、エッジがクリッピングカウンタに影響を及ぼすのか、あるいは、塗りつぶしカウンタに影響を及ぼすのかを判定し、クリッピングメカニズムのために使用される。クリッピングメカニズムについては、先に説明したのでここでは取り上げない。
【0248】
フラグc(CONTINUING)は、エッジが継続エッジ(フラグcはアサートされる)か、あるいは、終端エッジ(フラグcはデアサートされる)かを判定する。
【0249】
フラグu(UP)は、塗りつぶしカウンタが継続エッジにより増分されるか、あるいは、減分されるかを判定する。オーバーライドカウントにのみ影響を及ぼす終端レコードの場合、フラグuは無視される。
【0250】
フラグo(OVERRIDE)は、オーバーライドカウントがエッジにより増分されるか、あるいは、減分されるかを判定する。
【0251】
フラグp(POSTSCRIPT)は、イネーブルビットであり、アサートされるときにオーバーライドメカニズムを使用可能にする。フラグpがアサートされるとき、フラグcおよびoは前述の意味を有する。フラグpがデアサートされるとき、フラグcおよびoは無視されても、他の目的のために使用されても良い。
【0252】
第2の動作モードにおいて、次の走査線に対してエッジの位置が計算されるとき、継続エッジは、ページを横断する(X方向に)のみならず、ページを縦断して(Y方向に)副画素精度で追跡される。走査線内の現在のY位置を格納するために、dNYと呼ばれるメモリまたはレジスタが設けられる。追跡が開始されると、エッジごとにdNYレジスタは0に初期化される。走査線を横断するエッジの軌跡中にエッジの最小X位置および最大X位置を格納するために、MinXおよびMaxXと呼ばれる2つのメモリまたはレジスタが設けられる。エッジレコードがメモリから読み込まれるとき、走査線へのエッジのエントリ位置がこれらの2つのレジスタへとロードされる。エッジの位置は走査線内で追跡され、X方向における最小軌跡および最大軌跡も追跡される。
【0253】
ここで図24A、図24Bを参照されたい。図24A、図24Bでは、第2の動作モード中に画素順次レンダリング装置20においてエッジを追跡する方法2400が示される。方法2400は、ステップ2402で開始され、ステップ2404へと進む。ステップ2404において、現在の最小X値を有するエッジレコードが読み込まれる。この方法2400は、エッジレコードがオブジェクトのエッジが接する全ての画素がそのオブジェクトにより塗りつぶされることを示すフラグpを含むときに実現される。エッジレコードがフラグpを含まないときには、画素順次レンダリング装置20は、第1の動作モードで動作する処理へと進む。この処理についてはより詳細に後述する。方法2400は、ラスタ順でエッジレコードごとにエッジ処理モジュール400において実現され、呼び出される。説明を簡単にするために、任意の走査線を参照して方法を説明する。ここでは、この走査線を現在の走査線と呼ぶ。
【0254】
ステップ2404において、エッジレコード記憶装置32中の3つのリスト(新規のエッジリスト402、アクティブエッジリスト404、およびあふれエッジリスト406)のうちの1つから、エッジ入力モジュール408によりエッジレコードが選択されて読み込まれる。エッジ入力モジュール408は、3つのリスト402、404、および406の各々において、各レコードに対する参照を維持する。各リスト402、404、および406中のエッジレコードは、そのXフィールド(現在の走査線共通部分X座標)中の値により順序付けられるのが好ましい。これらの参照の各々は、走査線の処理開始時に各リスト中の第1のエッジを参照するように初期化される。
【0255】
その後、エッジ入力モジュールの408は、選択されたレコードが3つの参照されるエッジレコードのうちのXフィールドに最小X値を有するレコードであるように、3つの参照されるレコードのうちの1つからエッジレコードを選択する。そのレコードを選択するために使用された参照は、リスト中の次のレコードへと進められる。
【0256】
このようにして、エッジ処理モジュールは、現在の走査線のエッジレコードをラスタ順に処理する。エッジレコードがステップ2404で読み込まれた後、エッジ入力モジュールは、ステップ2406において、現在のエッジレコードのc(CONTINUING)フラグをチェックする。チェックにおいてc(CONTINUING)フラグがデアサートされていることが明らかになった場合、終端エッジ交差メッセージが生成され、ステップ2408において、パイプライン498を下って優先度判定モジュール500へと渡される。生成された終端エッジ交差メッセージは、以下のデータ、すなわち、整数のX位置値、フラグp、o、u、c、d、およびエッジのレベル番号から構成されるのが好ましいが、これに限定されない。
【0257】
終端エッジ交差メッセージのフラグp、o、u、c、dは、現在(終端)のエッジレコードからコピーされる。整数のX位置値は、現在(終端)のエッジレコードのXフィールド中のX値を丸めることにより得られる。オーバーライドoフラグがアサートされる場合、XフィールドからのX値は、最も近い整数X値へと切り捨てられ、整数のX位置値が得られる。これに対し、オーバーライドoフラグがデアサートされる場合、XフィールドからのX値は、最も近い整数X値へと切り上げられ、整数のX位置値が得られる。
【0258】
第2の動作モード中に、コンピュータシステム1は、PostScript(登録商標)ラスタライズルールを実現し、切り上げ演算および切り捨て演算は、特に、floor(X)+1演算およびfloor(X)演算として実現されるのが好ましい。しかし、他の変形例も実現可能である。例えば、これらの切り上げ演算および切り捨て演算は、それぞれ、ceil(X)オペレーションおよびfloor(X)演算として実現されても良い。現在(終端)のエッジレコードがレベルインデックスを含む場合、インデックスによりポイントされるリスト中の各レベルに対して生成される1つの終端エッジ交差メッセージが存在する。終端エッジ交差メッセージが優先度判定モジュール500に渡された後、方法はステップ2444において終了する。
【0259】
ステップ2444においての終了後、エッジ処理モジュール400は、現在の走査線中の次のエッジレコードを処理するために、すなわち、ステップ2404において次の最小X位置を有するエッジレコードを処理するために再度方法2400を呼び出す。このようにして、エッジ処理モジュールは、現在の走査線のエッジレコードをラスタ順に処理する。エッジレコードが現在の走査線中の最終エッジレコードである場合、エッジ処理モジュール400は、走査線終端メッセージを送出し、次の走査線のためにエッジリストを更新する。この更新プロセス中に、エッジレコードを格納するバッファは、更新されたエッジリスト(404’および406’)が現在のエッジリストになり、古いリスト(404および406)が無効化されるようにスワップされ、更新された新規のエッジリスト(402)がロードされる。方法は、最小X位置において次の走査線中の第1のエッジレコードを処理するために再度呼び出される。エッジ処理モジュール400は、このように全てのエッジレコードの処理が終了するまで続けられる。
【0260】
これに対し、ステップ2406のチェックにおいてエッジレコードのc(CONTINUING)フラグがアサートされていることが明らかになった場合、エッジ入力モジュール408は、ステップ2412において現在のエッジレコードが新規のエッジであるか、すなわち、現在のエッジレコードが新規のエッジリスト402からのものであるか否かをチェックする。現在のエッジレコードが新規のエッジレコードである場合、エッジ入力モジュール408は、ステップ2414において新規のエッジレコードの各セグメントのうちの第1のセグメントをそのエッジに対するアクティブエッジレコードへとロードする。また、アクティブエッジレコードは、ステップ2414においてエッジの第1のセグメントに対する更新情報NYおよびDX並びにエッジの次のセグメントのアドレスと共にロードされる。エッジ入力モジュール408は、続いて、ステップ2416へと進む。これに対し、ステップ2412におけるチェックにおいてエッジレコードが新規のエッジレコードでないことが明らかになった場合、エッジ入力モジュール408は直接ステップ2416へと進む。
【0261】
エッジ入力モジュール408は、ステップ2416において、現在の走査線の位置Xに対する継続エッジ交差メッセージを生成し、これをパイプライン498を下って優先度判定モジュール500へと渡す。生成された継続エッジ交差メッセージは、以下のデータ、すなわち、整数のX位置値、フラグp、o、u、c、d、およびエッジのレベル番号から構成されるのが好ましいが、これに限定されない。
【0262】
終端エッジ交差メッセージのフラグp、o、u、c、dは、現在(継続)のエッジレコードからコピーされる。整数のX位置値は、現在(終端)のエッジレコードのXフィールド中のX値を丸めることにより得られる。オーバーライドoフラグがアサートされる場合、XフィールドからのX値が最も近い整数X値へと切り捨てられ、整数のX位置値が得られる。
【0263】
これに対し、オーバーライドoフラグがデアサートされる場合、XフィールドからのX値は最も近いX値に切り上げられ、整数のX位置値が得られる。現在の継続エッジレコードのXフィールド中のX値は、次の走査線に対してエッジ処理モジュール400によりソート/処理するために、浮動小数点副画素X値が必要であるときには丸められないことに留意することは重要である。
【0264】
現在(継続)のエッジレコードがレベルインデックスを含む場合、インデックスによりポイントされるリスト中の各レベルに対して生成される1つの継続エッジ交差メッセージが存在する。現在のエッジレコードは継続エッジレコードであるので、現在の走査線の後に次の走査線と交わる対応するエッジレコードを判定するために、このエッジレコードは、ステップ2416においてエッジ更新モジュール410に渡される。
【0265】
この継続エッジレコードを受信すると、エッジ更新モジュール410は、ステップ2418においてレジスタminX=X、maxX=X、およびdNY=0を初期化する。式中、Xは継続エッジレコードの位置である。エッジ更新モジュール410は、ステップ2420においてNY+dNY<1であるか否かをチェックする。チェック2420においてNY+dNY>=1であることが明らかになった場合、エッジ更新モジュール410は、ステップ2435においてNYフィールドのNY値を(1−dNY)だけ減分し、ステップ2436において継続エッジレコードのXフィールドのX値にDX(1−dNY)を加える。これにより、新規のX値およびNY値を有する次の走査線に対して新規の継続エッジが得られる。ステップ2436の後、エッジ更新モジュール410は、ステップ2438において継続エッジレコードに格納された新規のX位置の値をレジスタminXに格納された値と比較する。
【0266】
比較2438において新規のX位置がレジスタminXに格納された値以下であることが明らかになった場合、エッジ更新モジュール410は、ステップ2440へと進む。ステップ2440において、エッジ更新モジュール410は、新規の継続エッジレコードのオーバーライドoフラグをアサートし、ステップ2440において次の走査線中の処理のために新規の継続エッジレコードをエッジプール412へと送出する。ステップ2440の後、エッジ更新モジュール410は、ステップ2442においてデアサートされた(クリアされた)オーバーライドoフラグを有すると共にレジスタmaxXに格納された値に設定されたXフィールドを有する終端エッジレコードを生成する。エッジ更新モジュール410は、ステップ2442において次の走査線中の処理のために終端レコードをエッジプール412へと送出する。ステップ2440および2442により形成される分岐において、2つのエッジレコードは、次の走査線内のエッジの範囲を定義する。すなわち、新規の継続エッジレコードは最小範囲を定義し、終端エッジレコードは次の走査線内の現在のエッジの最大範囲を定義する。この処理に関しては、図27Aを参照してより詳細に説明する。
【0267】
ステップ2442の後、方法はステップ2444において終了し、エッジ処理モジュール400は、前述のように方法を再度呼び出す。これに対し、ステップ2438の比較において新規のX位置がレジスタminXに格納される値より大きいことが明らかになった場合、エッジ更新モジュール410は、ステップ2450において新規の継続エッジレコードに格納された新規のX位置の値をレジスタmaxXに格納された値と比較する。
【0268】
ステップ2450の比較において新規のX位置がレジスタmaxXに格納された値以上であることが明らかになった場合、エッジ更新モジュール410は、ステップ2446へと進む。ステップ2446において、エッジ更新モジュール410は、アサートされたオーバーライドoフラグを有すると共にレジスタminXに格納された値に設定されたXフィールドを有する終端エッジレコードを生成する。エッジ更新モジュール410は、ステップ2446において次の走査線中の処理のために終端レコードをエッジプール412に送出する。
【0269】
ステップ2446の後、エッジ更新モジュール410は、新規の継続エッジレコードのオーバーライドoフラグをデアサート(クリア)し、ステップ2448において次の走査線中の処理のために新規の継続エッジレコードをエッジプール412へと送出する。ステップ2446および2448により形成される分岐において、2つのエッジレコードは、次の走査線内のエッジの範囲を定義する。すなわち、新規の継続エッジレコードは最大範囲を定義し、終端エッジレコードは次の走査線内のエッジの最小範囲を定義する。この処理に関しては図27Bを参照してより詳細に説明する。
【0270】
ステップ2448の後、方法はステップ2444において終了し、エッジ処理モジュール400は、前述のように再度方法を呼び出す。これに対し、ステップ2450の比較において新規のX位置がレジスタmaxXに格納された値より小さいことが明らかになった場合、エッジ更新モジュール410はステップ2452へと進む。ステップ2452において、エッジ更新モジュール410は、双方がアサートされたオーバーライドoフラグを有すると共にレジスタminXに格納された値に設定されたXフィールドを有する2つの終端エッジレコードを生成する。エッジ更新モジュール410は、ステップ2452において次の走査線中の処理のために双方の終端レコードをエッジプール412へと送出する。ステップ2452の後、エッジ更新モジュール410は、ステップ2454において次の走査線中の処理のためにデアサートされたオーバーライドoフラグを有する新規の継続エッジレコードをエッジプール412へと送出する。
【0271】
ステップ2454の終了後、エッジ更新モジュール410は、ステップ2456においてデアサートされたオーバーライドoフラグを有すると共にレジスタmaxXに格納された値に設定されたXフィールドを有する終端エッジレコードを生成する。ステップ2452、2454、および2456により形成される分岐において、2つの終端エッジレコードは、エッジの範囲を次の走査線内で定義する。すなわち、maxXのX値を有する終端エッジレコードは最大範囲を定義し、minXのX値を有する終端エッジレコードは次の走査線内のエッジの最小範囲を定義する。この処理は図27Cを参照してより詳細に説明する。
【0272】
ステップ2456の後、方法はステップ2444において終了し、エッジ処理モジュール400は、前述のように方法を再度呼び出す。
【0273】
ステップ2420におけるチェックにおいてNY+dNY<1であることが明らかになった場合、エッジ更新モジュール410はステップ2422へと進む。この分岐において、エッジ更新モジュール410は、エッジの1つのセグメントから次のセグメントへの遷移を扱う。エッジ更新モジュール410は、ステップ2422において現在のエッジレコードのNYフィールドのNY値だけdNYレジスタのdNY値を増分する。エッジ更新モジュール410は、ステップ2423においてNY*DXだけ現在のエッジレコードのXフィールド中のX位置値を更に増分する。
【0274】
ステップ2423の後、エッジ更新モジュール410は、ステップ2424において継続エッジレコードの新規のX位置値をレジスタminXに格納された現在の値と比較する。ステップ2424における比較においてX<minXであることが明らかになった場合、エッジ更新モジュール410はステップ2426において継続エッジレコードの新規のX位置値をレジスタminXへとロードし、ステップ2432へと進む。これに対して、ステップ2424の比較においてX>=minXであることが明らかになった場合、エッジ更新モジュールは、ステップ2428において継続エッジレコードの新規のX位置値をレジスタmaxXに格納された現在の値と比較する。ステップS2428の比較においてX>maxXであることが明らかになった場合、エッジ更新モジュール410は、ステップ2430において継続エッジレコードの新規のX位置値をレジスタmaxXへとロードし、ステップ2432へと進む。ステップ2428の比較においてX<=maxXであることが明らかになった場合、エッジ更新モジュール410は直接ステップ2432へと進む。
【0275】
ステップ2432中に、エッジ更新モジュール410は、エッジ中の次のセグメントと関連付けられた継続エッジレコードをロードする。これは、現在の継続エッジレコード中のNYフィールドおよびDXフィールドに格納された値をエッジ中の次のセグメントのNY値およびDX値と置換することにより達成される。直前のセグメントの終端点のX位置および次のセグメントの始端点は同じであり、現在の継続エッジレコード中のXフィールドに格納されたX位置値は、たいていの場合には置換されないことに留意すべきである。しかし、次のセグメントがXSTEP値を含む場合、エッジ更新モジュール410は、ステップ2434においてXSTEP値をX位置へと加え、DXは0に設定される。XSTEP値がない場合には、エッジ更新モジュールは、このステップ2434を省略し、現在の継続エッジの更なる処理を行なうために直接比較2420へと進む。NY+dNYの現在の値が依然として1未満である場合、ステップ2422から2434により形成される分岐が繰り返される。
【0276】
エッジが走査線内のセグメントリストの終端に達し、エッジが走査線から離れる前に処理が終了する場合、エッジは走査線内ではアクティブであるので、軌跡の最小範囲および最大範囲が引き続き要求される。従って、エッジは垂直に延長されて走査線から延出し、塗りつぶしカウンタをアクティブ化するために0長継続エッジが生成される。次の走査線上での読み込みの場合、エッジ交差が生成されるが、更なる追跡は行なわれない。すなわち、エッジ更新モジュール410が、ステップ2432において次のセグメントをロードしようと試みて次のセグメントがなかったとき(エッジの終端)、エッジ更新モジュール410は、継続エッジレコード中のNY値を0に設定し、直接(不図示)比較ステップ2438へと進む。エッジ更新モジュール410は、適切な継続エッジレコードおよび終端エッジレコード(2440、2442または2446、2448)をエッジプール412へと送出し、2444を終了する。エッジ入力モジュール408は、次の走査線の処理中にステップ2416においてXの更新された値におけるエッジ交差メッセージを送出すると共に、NYの現在の値がNY=0であることを判定する。NY=0であるので、このエッジに対しては更なる継続エッジレコードは要求されず、エッジ入力モジュール408はステップ2444において終了する。ステップ2444における終了後、エッジ処理モジュール400は、前述のように処理を再度開始する。
【0277】
走査線全体に対するエッジの軌跡に対して最小X位置および最大X位置が得られる場合、Xにおけるより高い次数の微分(DDX、DDDXなど)を利用するエッジ追跡のための他の手順が使用されても良い。
【0278】
前述の説明より明らかなように、エッジが現在の走査線から離れるとき、次の走査線に対してステップ2436において判定される更新されたX位置値は、ステップ2438および2450においてminXレジスタおよびmaxXレジスタと照合され、次の走査線に対する継続エッジレコードに加えて、1つまたは3つの終端レコードが生成される。これらのレコードは、次の走査線内のエッジの軌跡の範囲を指定すると共に関連するレベルにおけるオーバーライドカウンタをアクティブ化/非アクティブ化するのに使用される。終端レコードは、優先度判定モジュール500中の塗りつぶしカウンタに影響を及ぼさないが、継続エッジは、前述のような通常の方法で塗りつぶしカウンタを増分または減分する。更に、次の走査線に対する継続エッジのXフィールドに格納されたX位置値は、エッジが次の走査線から延出するX座標位置である。
【0279】
図24A、図24Bのフローチャートから明らかなように、次の走査線中の処理に対してエッジプール412に対して送出されるであろう終端エッジレコードおよび継続エッジレコードの組み合わせには3つの代替案がある。これらの組み合わせについては、図27A、図27B、および図27Cを参照して以下に説明する。図27A、図27B、および図27Cは、次の走査線2700と、3本の異なる型の現在のエッジ2702a、2702b、および2702cと、エッジの次の走査線への入口点および次の操作線からの出口点とを示す。継続エッジレコードが、常に、次の走査線からのエッジの出口点に対応するステップ2436における更新されたX位置を有するエッジプール412へと送出されることに留意することは重要である。
【0280】
前述の可能な代替案は以下の通りである。
【0281】
1.継続エッジレコードのX位置のステップ2436からの更新された値がminXレジスタ中の値以下の場合、更新されたX位置における継続エッジに加えて、次の走査線に対して最大X位置(maxXレジスタに格納された値)で終端レコードが送出される(図27A参照)。オーバーライドビットは、継続エッジレコードにおいてはアサートされ、終端レコードにおいてはデアサートされる。
【0282】
2.継続エッジのステップ2436において判定される更新されたX位置が、maxXレジスタに格納された値以上である場合、継続エッジに加えて次の走査線に対して最小X位置(minXレジスタに格納された値)で終端レコードが送出される(図27B参照)。オーバーライドビットは、終端レコードにおいてはアサートされ、継続エッジにおいてはデアサートされる。
【0283】
3.継続エッジのステップ2436において判定される更新されたX位置が、minXレジスタに格納された値とmaxXレジスタに格納された値との間である場合、更新されたX位置2436で送出された継続エッジレコードに加えて、オーバーライドビットが設定された状態で終端レコードが最小X位置(minXレジスタに格納された値)で送出され、オーバーライドビットがクリアされた状態で別の終端レコードが最大X位置(maxXレジスタに格納された値)で送出される。継続エッジは、オーバーライドカウンタに影響を及ぼすオーバーライドビットを有することになるので、継続エッジとは逆の意味でオーバーライドカウントに影響を及ぼす第3の終端レコードと対にされる(図27C参照)。
【0284】
以上説明した全ての場合において、生成された終端レコードと関連付けられたレベルは、継続エッジと関連付けられたレベルと同じである。更に、継続エッジと対をなす別の終端レコードの位置は、より小さいX位置に対してはアサートされ、より高いX位置に対してはデアサートされる場合には、最小X位置と最大X位置との間のどの位置でも良い。
【0285】
オーバーライドビットのオペレーションを有効化/無効化するためにエッジレコードにイネーブルビットを追加する処理は、前述の例3において第3の終端レコードを不要にするために使用されても良い。例3において、オーバーライドビットが無効化される結果、継続エッジは塗りつぶしカウンタにのみ影響を及ぼすようになり、余分な終端レコードは生成されない。
【0286】
エッジにより生成される継続エッジおよび終端レコードは、前述のように、この後エッジ処理モジュール400により整列を行なうためにエッジプール412へと渡される。この整列は、前節で検討したように次の走査線の以降の処理のために行なわれる。次の走査線に対する全てのエッジレコードが、次の走査線のために読み込まれる前に整数Xの次数により整列される。終端エッジレコードはメインのリストにおいてソートされる。
【0287】
エッジ処理モジュールは、最小X位置および最大X位置においてエッジレコードと関連付けられる丸めオペレーションが異なるために、丸められたX位置値に基づくX位置によりエッジレコードの整列を実行する。エッジがこのステージにおいて副画素X位置に基づいて整列された場合、2本のエッジは同じ画素内で不正確な順序で表示されるであろう。
【0288】
しかし、副画素値が次の走査線のX位置値の計算に必要とされるので、エッジレコード中の副画素X位置値自体は丸められないことに留意すべきである。
【0289】
丸められたX位置値に基づいてソートするとき、任意の特定の走査線上でエッジに接する画素の全範囲に対してオーバーライドカウンタが0以外であることを保証するために、オブジェクトビットが考慮される。オーバーライドビットがエッジレコードにおいてアサートされる場合、X位置は最も近い整数X位置に切り捨てられ、オーバーライドビットがエッジレコードにおいてデアサートされる場合、X位置は最も近い整数X位置に切り上げられる。
【0290】
この整列オペレーション中に実行される丸めオペレーションは、前述したエッジ交差メッセージの生成中に実行されるオペレーションと整合している。例えば、第2の動作モードがPostScript(登録商標)ラスタライズルールを実現する場合、切り上げオペレーションおよび切り捨てオペレーションは、それぞれfloor(X)+1オペレ-ションおよびfloor(X)オペレーションとして実現される。
【0291】
走査線の処理中に、エッジ処理モジュール400は、継続エッジ交差メッセージおよび終端エッジ交差メッセージを整数X座標順に優先度判定モジュール500へと送出する。優先度判定モジュール500は、終端エッジ交差メッセージおよび継続エッジ交差メッセージを受信すると、メッセージ中のオーバーライドビットの値によってオーバーライドカウンタを増分または減分する。具体的には、オーバーライドビットがアサートされる場合、オーバーライドカウンタは増分され、オーバーライドビットがデアサートされる場合、オーバーライドカウンタは減分される。
【0292】
先に説明したように、優先度判定モジュール500は、第1の動作モードの場合、現在の走査線中の現在走査中の画素への積極的な寄与を行なう優先度を判定する。オブジェクトに対する塗りつぶしルールによって優先度と関連付けられたオブジェクトに適用される境界エッジの内側に画素が存在する場合およびオブジェクトに対するクリップカウントが0の場合、優先度はアクティブである。特定の優先度レベルにおけるオブジェクトが、ある画素における最上のアクティブオブジェクトである場合、あるいは、それより上の全てのアクティブオブジェクトの対応するneed-belowフラグが設定されている場合、オブジェクトはその画素において露出する。優先度判定モジュール500は、現在の画素において露出したそれらのオブジェクトを判定し、露出オブジェクトごとに塗りつぶし優先度メッセージを塗りつぶしカラー判定モジュール600へと出力する。これらの塗りつぶし優先度メッセージは、露出オブジェクトの塗りつぶしデータに関連するデータから構成される。このようにして、画素値は露出オブジェクトの塗りつぶしデータのみを使用して生成されても良い。
【0293】
塗りつぶしカラー判定モジュール600、画素合成モジュール700、および画素出力モジュール800は、エッジ処理モジュール400および優先度判定モジュール500が第1の動作モードで動作するか、あるいは、第2の動作モードで動作するかに関わらず、前述のように動作する。
【0294】
優先度判定モジュール500は、第2の動作モードで動作するときには、優先度判定モジュール500の第1の動作モードと多少類似した様式で動作し、以下のような変形例を伴う。これらの変形例において、優先度判定モジュール500は、特定の優先度レベルにおけるオブジェクトが、終端エッジ交差メッセージおよび継続エッジ交差メッセージからオブジェクトのエッジの境界に沿ってアクティブであると判定する。具体的には、優先度判定モジュール500は、関連付けられたオーバーライドカウントが0以外であるときにオブジェクトがアクティブであると判定する。0である場合にはクリッピングされる。更に、優先度判定モジュール500は、エッジ交差メッセージのcフラグがアサートされる場合のみ、第2の動作モードにおいて塗りつぶしカウンタを増分する。
【0295】
したがって、前述の例1および例2において、エッジの軌跡の範囲が2つのエッジレコード、すなわち、オーバーライドカウンタを増分させるエッジレコードとオーバーライドカウンタを減分させるエッジレコードとにより囲まれるので、オーバーライドカウントは軌跡の全範囲に対して0以外である。このため、優先度判定モジュール500は、2つのエッジレコードの間のエッジの軌跡の範囲ではオブジェクト優先度がアクティブであると判定する。軌跡の範囲外では、オーバーライドカウントは0であり、優先度判定モジュール500は、第1の動作モードに従って塗りつぶしルールを適用する。
【0296】
また、例3において、最小X位置および最大X位置における終端レコード間では、オーバーライドカウントは0以外である。オーバーライドカウントは、最大X位置において終端レコードにより再度減分される前に、最小X位置における終端レコードにより1度増分され、継続エッジとそれと対になる終端レコードとの間で再度増分されるからである。軌跡の範囲外では、オーバーライドカウントは0であり、第1の動作モードによる塗りつぶしルールも適用される。
【0297】
オーバーライドカウントは、エッジレコードの対のXの下端において常に増分され、Xの上端において常に減分される。このため、同じレベルに影響を及ぼす2本のエッジに対する軌跡の範囲が交わる場合、共通範囲中のこのレベルにおけるオーバーライドカウントは0に戻るのではなく、2度増分される。これにより、各エッジの軌跡の範囲の画素は確実にアクティブ化される。2本のエッジが複数の共通レベルに影響を及ぼすか、あるいは、このように交わるエッジが3本以上存在する場合にこうなることが明らかである。
【0298】
図24A、図24Bを参照して説明したエッジ処理モジュール400のオペレーションの方法は、新規のエッジの開始の処理を考慮していない。前述のドライバソフトウェアがこの処理を請け負う。ドライバソフトウェアは、ページ記述をディスプレイリストへと変換し、各オブジェクトを2つ以上の単調なエッジに分割することによってこれを実行する。これらの単調なエッジのうちのいずれかが1本の走査線内に含まれる場合、ドライバソフトウェアはこの単調なエッジを隣接する単調なエッジと結合させて1本のエッジを形成する。ドライバソフトウェアは、単調なエッジを複数のセグメントへとベクトル化してセグメントのリストを含む新規のエッジレコードを形成する。これらの新規のエッジレコードの各々は、エッジに対するフラグ設定p、u、c、o、d、優先度レベル、始端点、およびエッジに対するセグメントリストを含む。
【0299】
現在の走査線がエッジ処理モジュール400により処理されるとき、現在の走査線において開始される新規のエッジレコードが最初に処理され、エッジ処理モジュール400からの命令に応じて新規のエッジリスト402へとロードされる。具体的には、エッジ処理モジュール400からの命令に応じて、ドライバソフトウェアは、現在の走査線において開始される新規のエッジレコードを処理し、対応する新規の継続エッジレコードおよび終端レコードを生成する。
【0300】
この点に関して、ドライバソフトウェアは、エッジがロードされる第1の走査線における各新規のエッジの入力y値および出力y値を検査する。継続エッジおよび1本以上の終端エッジが、図24Bに記載されたステップ2438から2444と同様の決定プロセスに基づいて、ドライバソフトウェアにより送出される。
【0301】
しかし、このプロセスにおいて「X」は第1の走査線からのエッジの出力x値(継続エッジの開始x値)と見なされ、minXおよびmaxXの双方はx_startに等しいと見なされる。
【0302】
生成された継続エッジレコードのNYフィールドおよびXフィールドは、ステップ2435および2436において以下に示すように計算される。
【0303】
NY = y_finish - (1 + floor(y - start))
X = x_start + DX * (ceil(y_start) - y_start)
【0304】
ドライバソフトウェアによる継続エッジレコードおよび終端エッジレコードの生成は、図25に示す例示のエッジを参照してより詳細に説明される。ドライバソフトウェアは、現在の走査線(すなわち、y=10)において開始されるエッジ2500の始端点および終端点の座標を検査し、前述の式に従ってNY値およびX値を判定する。ドライバソフトウェアは、値minX=maxX=x_startとXとを比較(2438、2450)し、どれが最大でどれが最小であるかを判定する。ドライバソフトウェアは、X>=maxX=x_startであると判定し、x_startにおいて終端エッジ2502を送出し(2446)、Xにおいて継続エッジ2504を送出する(2448)。ドライバソフトウェアにより生成される新規の継続エッジレコードおよび終端エッジレコードが、(ステップ2440、2442、2446、2448、2452、2454、2456において)新規のエッジリスト402へと送出される。エッジ処理モジュール400は、図24A、図24Bを参照して説明したようにこれらの新規のエッジレコードを処理する。
【0305】
また、レベルアクティブ化メカニズムに対してエッジ交差メッセージを生成せずに新規のエッジが最初に必要とされる走査線の1本前に新規のエッジをロードすることが可能である。この場合、新規のエッジレコード中で提供されるオフセット値がdNYを初期化するのに使用される。
【0306】
ドライバソフトウェアは、新規のエッジレコードを非同期式で前もって生成するのが好ましい。ドライバソフトウェアは、エッジが第1の動作モードによって生成されるべきか、あるいは、第2の動作モードによって生成されるべきかを判定し、それに応じて新規のエッジレコードを生成する。
【0307】
ドライバソフトウェアは、第2の動作モードで動作するときに、ステップ2436において現在の走査線内のエッジの出口点における新規のエッジレコードのX位置値を計算すると共に、ステップ2435において新規のエッジレコードのNY値を更新する。
【0308】
さらに、ドライバソフトウェアは、現在の走査線内のエッジの最小範囲および最大範囲のうちの1つまたは双方を表すX位置値を有する終端エッジレコードを生成する。
【0309】
現在の走査線に対する全ての新規のエッジレコードが一度生成されると、ドライバソフトウェアは、適切に丸められたX位置値に従ってこれらのレコードをソートする。ソートされた新規のエッジレコードは、現在の走査線の処理の開始に先立って、LOAD_NEW_EDGES_AND_RENDER命令の一部として新規のエッジリストへとロードされる。エッジ処理モジュールは、ステップ2408および2416において現在の走査線に対するこれらのロードされた新規のエッジレコードに対応するエッジ交差メッセージを送出する。
【0310】
エッジ処理モジュールは、更新されたX値およびNY値を有する継続エッジレコードと、次の走査線に対する終端エッジレコードとを生成する。ドライバソフトウェアは、エッジ処理モジュール400と同様に、X位置値の丸められた値に従ってエッジレコードの整列を実行する。
【0311】
画素順次レンダリング装置20および関連するドライバソフトウェアは、エッジ単位で第1の動作モードおよび第2の動作モードのいずれかにおいて動作するのが好ましい。具体的には、画素順次レンダリング装置20およびドライバソフトウェアは、各エッジレコードに問合せを行ない、pフラグの状態を判定する。pフラグがデアサートされている場合は第1の動作モードで動作し、アサートされている場合は第2の動作モードで動作する。ドライバソフトウェアは、ディスプレイリストからエッジレコードを構成するときには、画像がPostScript(登録商標)に従ってレンダリングされるか否かを判定し、PostScript(登録商標)に従ってレンダリングされる場合、エッジレコードのpフラグをアサートする。
【0312】
ドライバソフトウェアおよびエッジ処理モジュール400は、第1の動作モードで動作するときには、図24A、図24Bで表したように第2の動作モードとほぼ同じプロセスを実行する。異なるのは、終端レコードがエッジプール(412)へと送出されない点である。更に、エッジ処理モジュール400は、第1の動作モードで動作するときには、対応するエッジレコードのX位置値の丸められた値に等しい整数X位置を有するエッジ交差メッセージ(ステップ2408、2416参照)を生成し、これを送出するのが好ましい。これらの値は、最も近い整数X位置に丸められる。先に検討したように、エッジ処理モジュール400は、第2の動作モードで動作するときには、対応するエッジレコード中のオーバーライドフラグの状態によって、X位置値の値を切り上げるか、あるいは、切り捨てるかするであろう。
【0313】
優先度判定モジュール500は、第2の動作モードで動作するときには、第1の動作モードとほぼ同じプロセスを実行する。異なるのは、オーバーライドカウンタが第2の動作モードで使用される点である。優先度判定モジュールのオペレーションにおける主だった重大な相違は以下の通りである。優先度判定モジュール500は、第1の動作モードで動作するときには、次の条件、すなわち、塗りつぶしルールフラグがデアサートされており、塗りつぶしカウンタが0以外であること、および塗りつぶしルールフラグがアサートされており、塗りつぶしカウンタが奇数であることのうちのいずれか1つが発生するときにレベルがアクティブであると判定する。これに対して、優先度判定モジュール500は、第2の動作モードで動作するときには、次の条件、すなわち、塗りつぶしルールフラグがデアサートされており、塗りつぶしカウンタが0以外であること、塗りつぶしルールフラグがアサートされており、塗りつぶしカウンタが奇数であること、およびオーバーライドが0以外であることのうちのいずれか1つが発生するときにレベルがアクティブであると判定する。
【0314】
図28を参照すると、単純なエッジが示されており、このエッジは単純なオブジェクトの第2の動作モードにおけるアクティブ化オペレーションを実証するための例として使用される。境界エッジABCDEFGHAは、レンダリング対象のグラフィックスオブジェクトを表す。ページ記述をディスプレイリストへと変換するコンピュータプログラム(ドライバソフトウェア)は、この境界を2本のエッジ、すなわち、ページを下るABCDEFとページを上るFGHAとに分割し、これらのエッジに関して2つの新規のエッジレコードABCDEFおよびAHGFを生成する。新規のエッジレコードABCDEFのuフラグがデアサートされている一方で、新規のエッジレコードAHGFのuフラグはアサートされており、エッジAHGFが元々はエッジFGHAとして上向きであったことを示している。なお、セグメントCDも上向きであるが、CDは走査線境界を横断しないので、エッジABCDEFはCDで分割される必要がない。
【0315】
エッジABCDEFの場合、セグメントABはA(6.6,1.4)で開始し、B(1.7,6.3)へと続く。ドライバソフトウェアは、現在の走査線、すなわち、走査線1に対してABCDEFに対する新規の継続エッジレコードを生成する。ドライバソフトウェアは、エッジのX位置をX=6.0[すなわち、6.6+(−1.0)*ceil(1.4)−1.4)]に更新し(2436)、ABCDEFに対する新規の継続エッジレコードのNY値を4.3[すなわち、6.3−(1+ floor(1.4))]に更新する(2435)。また、ドライバソフトウェアは、第1の走査線上でエッジのX範囲の他方の極値で終端レコードを生成する(2442)。このため、走査線1において、新規の継続エッジレコードABCDEFが、新規のエッジリスト(402)にX=6.0で最初にロードされ(2440)、続いて終端レコードがX=6.6でロードされる(2442)。これらの2つの位置は、走査線1上のエッジの軌跡の範囲を定義する。
【0316】
ABCDEFに対して新規のエッジリスト(402)にロードされる結果の新規エッジレコードは以下のようになる。
【0317】
【0318】
なお、oフラグ(OVERRIDE)は、継続エッジレコードにおいてはアサートされており、終端レコードにおいてはデアサートされている。このため、対応するエッジ交差メッセージがステップ2406および2416において優先度判定モジュール500へと最終的に送出されるとき、このモジュール500は、オーバーライドカウンタをレベルNにおいてX=floor(6.0)=6で増分し、オーバーライドカウンタをX=floor(6.6)+1=7で減分する。前述のように、この丸めは、実際には、エッジ処理モジュール400が請け負い、エッジ交差メッセージの優先度判定モジュール500への送出に先立って行なわれる。丸める際には、任意の走査線上のエッジが接する画素の全範囲に対してオーバーライドカウンタが0以外であることを保証するために、オーバーライドビットが考慮される。オーバーライドビットがエッジ交差メッセージにおいてアサートされている場合、X位置は最も近い整数X位置に切り捨てられ、オーバーライドビットがエッジ交差メッセージにおいてデアサートされている場合、X位置は最も近い整数X位置に切り上げられる。継続エッジのみが塗りつぶしカウントに影響を及ぼすため、優先度判定モジュール500は、塗りつぶしカウンタをレベルPにおいてX=6.0で増分する。優先度判定モジュール500は、エッジ交差メッセージのcフラグがアサートされているか否かを判定することによって、塗りつぶしカウンタを増分すべきか否かを判定する。
【0319】
ドライバソフトウェアは、走査線1に対して新規の継続エッジレコードABCDEFおよびエッジABCDEFに関する終端エッジレコードA1を生成した後に、エッジAHGFに関する新規のエッジレコードを生成する。具体的には、ドライバソフトウェアは、エッジAHGFに関して走査線1に対する新規の継続エッジレコードAHGFと終端レコードA0とを生成し、これらのレコードを新規のエッジリスト402へと送出する(2446、2448)。これらの新規のエッジレコードは以下のようになる。
【0320】
【0321】
ドライバソフトウェアは、これらのエッジを整数Xの昇順にソートする。このソートでは、エッジにおいて指定されるようにXの丸めが実行される。その結果、ローディングの順序は、ABCDEF、A0、A1、AHFGになる。
【0322】
図24Aに戻る。エッジ処理モジュール400によりステップ2404において読まれる第1のエッジレコードは、エッジプール412に格納される前述の結果として生じた新規のエッジレコードABCDEFである。この新規のエッジレコードABCDEFに対して、ステップ2406においてフラグc(CONTINUING)により示される継続エッジであるか否かを判定するための検査が行なわれ、ステップ2412において新規のエッジレコードであるか否かを判定するための検査が行なわれる。この走査線(すなわち、走査線1)において、エッジレコードABCDEFは新規の継続エッジレコードであるので、新規のエッジレコードABCDEFの各フラグ、X位置(X=6.0)、および第1のセグメントがアクティブエッジレコードへとロードされる。アクティブエッジには、情報、すなわち、エッジABの第1のセグメントに対するNY=4.3およびDX=−1と次のセグメントBCのアドレスとが更にロードされる。
【0323】
エッジ処理モジュール400は、ステップ2416においてアクティブエッジレコードABに対応するエッジ交差メッセージを優先度判定モジュール500へと送出する。
【0324】
エッジ更新モジュール410は、ステップ2435および2436において次の走査線、すなわち、走査線2のアクティブエッジレコードABに対するX位置値およびNY値を更新する。継続エッジレコードABは、最初、X=6.0、DX=−1.0、NY=4.3の各値を有する。
【0325】
エッジ更新モジュール410は、ステップ2418において内部レジスタminXおよびmaxXをX=6.0に初期化し、ステップ2418においてレジスタdNYを0に初期化する。
【0326】
エッジ更新モジュール410は、ステップ2420においてNY+dNYの現在の値を検査し(ステップ2420を形成)、この値は1より大きいので右の分岐が選ばれる。
【0327】
エッジ更新モジュール410は、ステップ2435において継続エッジレコードAB中のNYの値を1だけ減分するのでNY=3.3となり、ステップ2436において継続エッジレコードAB中のXの値にDXが加えられるのでX=5.0になる。
【0328】
エッジ更新モジュール410は、レジスタminXに現在格納されている値=6.0に対し、ステップ2438において継続エッジレコードAB中の更新された値X=5.0を検査する。この値はminXより小さいことが判明する。このため、エッジ更新モジュール410は、ステップ2440および2442においてアサートされているoフラグ(OVERRIDE)を伴うX値5.0とデアサートされているoフラグ(OVERRIDE)を伴うmaxX=6.0のX値とを有する継続エッジをエッジプール412へと送出する。送出される継続エッジは以下の情報を含む。
【0329】
【0330】
エッジプール412に送出される終端レコードは以下の情報を含む。
【0331】
【0332】
ここで、エッジABCDEFに対するエッジ追跡プロセスが終了し、ステップ2404においてX順の次のエッジがエッジ処理モジュール400により読まれる。他にアクティブなオブジェクトがないものと想定すると、ステップ2404において読まれる次のエッジは、エッジAHGF(前述参照)に対する終端レコードA0(前述参照)である。このレコードA0は、走査線1中のセグメントAHの最小X位置=6.6を指定する。このレコードのcフラグはデアサートされているので、このレコードに対するエッジ交差メッセージがステップ2408において優先度判定モジュール500へと送出される。オーバーライドフラグがアサートされているので、ステップ2408においてfloor(X=6.6)=6のX位置値を有するエッジ交差メッセージが送出される。エッジ処理モジュールは2444において終了し、レコードA0に対しては更なるオペレーションは行なわれない。
【0333】
ステップ2404において読まれる次のエッジは、この走査線(走査線1)上のエッジABCDEFの最大X点に対応する終端レコードA1(前述参照)である。このレコードのcフラグはデアサートされているので、このレコードに対するエッジ交差メッセージがステップ2408において優先度判定モジュール500へと送出される。オーバーライドフラグがデアサートされているので、このレコードに対するエッジ交差メッセージはステップ2408においてfloor(6.6)+1=7で優先度判定モジュール500へと送出される。エッジ処理モジュールは、ステップ2444において処理を終了し、レコードA1に対しては更なるオペレーションは行なわれない。
【0334】
ステップ2404においてエッジ処理モジュール400により読まれる走査線(走査線1)上の最終エッジレコードは、X=6.75(前述参照)でAHFGを表す新規の継続エッジレコードである。cフラグがアサートされており、エッジレコードが新規のエッジレコードであるので、新規の継続エッジレコードAHFGが読み込まれるときに第1のセグメントAHがロードされる。エッジ処理モジュール400は、新規のエッジレコードの第1のセグメントAHに対応するエッジ交差メッセージを優先度判定モジュール500へと送出する。オーバーライドフラグがデアサートされているので、floor(6.75)+1=7のX位置値を有するこのエッジ交差メッセージが送出される。
【0335】
エッジレコードAHFGに対応するエッジ交差メッセージが送出された後、エッジ更新モジュール410は、次の走査線(走査線2)に対する継続エッジレコードAHを更新する。先に述べたように、継続エッジレコードAHは、値X=6.75、DX=0.25、およびNY=4.2を有する。
【0336】
最初に、エッジ更新モジュール410は、ステップ2420において内部レジスタminXおよびmaxXを現在の継続エッジレコードAH中のX位置値(X=6.75)に初期化し、ステップ2420においてdNYを0に初期化する。値NY+dNYの検査によって1より大きいことが判明するので、右の分岐が選ばれる。継続エッジレコードAH中のNY値が、ステップ2435において1だけ減分されてNY=3.2になり、ステップ2436においてDXが継続エッジレコードAHに加えられてX=7.0になる。継続エッジレコードAHの現在のX値が、ステップ2438においてminX(6.75)に対して検査され、minXより大きいことが判明する。
【0337】
続いて、継続エッジレコードAHの現在のX値は、ステップ2450においてmaxX(6.75)に対して検査され、maxXより大きいことが判明する。その結果、minX=6.75のX値を有する終端レコードが、ステップ2446においてアサートされているoフラグ(OVERRIDE)と共にエッジプール412へと送出され、X=7.0のX値を有する継続エッジAHが、デアサートされているoフラグ(OVERRIDE)と共にエッジプール412へと送出される。アクティブ継続エッジは以下の情報を含む。
【0338】
【0339】
エッジプール(412)へと送出される終端レコードは以下の情報を含む。
【0340】
【0341】
ここで、走査線2上でのエッジAHGFに対するエッジ追跡プロセスが終了する。次に、走査線1上で優先度判定モジュールへと送出されたエッジ交差メッセージについて考える。これらのメッセージは、生成元のエッジレコードから各フラグの状態をコピーする。メッセージは以下の通りである。
【0342】
【0343】
これらのエッジ交差メッセージにおいて、pフラグ(POSTSCRIPT)は、優先度判定モジュール500のレベルアクティブ化テーブル中のオーバーライドカウンタを有効化する。オーバーライドカウンタが有効化される場合、エッジ交差メッセージのoフラグ(OVERRIDE)は、アサートされているときにはオーバーライドカウンタを増分し、デアサートされているときにはオーバーライドカウンタを減分する。また、エッジ交差メッセージのcフラグ(CONTINUING)は、塗りつぶしカウンタを有効化する。塗りつぶしカウンタが有効化される場合、uフラグ(UP)はアサートされているときには塗りつぶしカウンタを増分し、デアサートされているときには塗りつぶしカウンタを減分する。
【0344】
上述したように、優先度判定モジュール500に対する第1のエッジ交差メッセージ(ABCDEF)は、画素6においてオーバーライドカウンタを増分し、塗りつぶしカウンタを減分する。その結果、塗りつぶしカウント=−1、オーバーライドカウント=1となる。画素0から5に対して塗りつぶしカウンタがアクティブ化されていない状態で一連の画素が生成される。
【0345】
第2のエッジ交差メッセージ(A0)は、再度画素6においてオーバーライドカウンタを増分し、その結果、塗りつぶしカウント=−1、オーバーライドカウント=2となる。このエッジ交差メッセージは現在の画素に影響を及ぼすので、画素連は生成されない。
【0346】
第3のエッジ交差メッセージ(A1)は、画素7においてオーバーライドカウンタを減分し、その結果、塗りつぶしカウント=−1、オーバーライドカウント=1となる。一連の画素が画素6に対してアクティブなレベルPと共に生成される。
【0347】
第4のエッジ交差メッセージ(AHGF)は、画素7において塗りつぶしカウンタを増分し、オーバーライドカウンタを減分する。その結果、塗りつぶしカウント=0、オーバーライドカウント=0となる。このエッジ交差メッセージは、現在の画素に影響を及ぼすので、画素連は生成されない。
【0348】
別のエッジ交差メッセージが発行される場合、あるいは、走査線終端メッセージが受信される場合、塗りつぶしが画素7から次のエッジまたは走査線の終端に至るまでアクティブ化されない状態で一連の画素が生成される。
【0349】
今度は図28に示すエッジに関して、走査線5上のオペレーション、特に、走査線6に対するエッジ追跡を考える。走査線5において、エッジリスト中のエッジレコードは以下の通りである。
【0350】
【0351】
走査線5において、アクティブエッジABCDEFは、最初に(2404)エッジ入力モジュール408により読み込まれ、ステップ2416においてエッジ交差メッセージを画素2(X=2.0)において送出した後、エッジ更新モジュール(410)に渡される。minX、maxX、およびdNYレジスタがステップ2418において初期化された後、(NY+dNY)がステップ2420において0.3であると判明する。この値は1よりも小さいので、左の分岐が選ばれる。
【0352】
次のステップにおいて、継続エッジレコードABCDEFのNY(=0.3)がステップ2422においてdNY(=0)に加えられる。その結果、dNYは0.3になる。ステップS423においてNY*DXが継続エッジABCDEFの現在のX値に加えられ、2.0+0.3*(−1.0)=1.7になる。
【0353】
継続エッジABCDEFの現在のX値1.7がステップ2424においてminX(=2.0)に対して検査され、この値よりも小さいことが判明する。そのため、Xがステップ2426においてレジスタminXへとロードされる。このレジスタminXは値1.7を有するようになる。
【0354】
次に、新規のセグメントであるセグメントBCがステップ2432において読まれる。BCに対する初期のXSTEP値はないので、新規のセグメントBCが読み込まれた後、アクティブエッジレコードABCDEFは以下の情報を含む。
【0355】
【0356】
NY+dNYの現在の値がステップ2420において再度チェックされ、5.2+0.3であることが判明する。この値は1より大きいので右の分岐が選ばれる。セグメントの残るY範囲は、ステップ2435において継続エッジレコード中のNYの現在の値から値(1−dNY)を引くことによって判定される。エッジの走査線出口点は、ステップ2436において継続エッジレコードABCDEFの現在のX位置値に値(1−dNY)*DX=(1−0.3)*0.212=0.1484を加えることによって判定される。継続エッジレコードABCDEFのXの現在の値(1.8484)は、ステップ2438および2450においてminX(1.7)およびmaxX(2.0)に対して検査され、これらの値の間に位置することが判明する。
【0357】
したがって、minX(1.7)のX位置値を有する2つの終端レコードが、ステップ2452においてオーバーライドがアサートされている状態でエッジプール412へと送出される。1.8484のX位置値を有する継続エッジABCDEFは、ステップ2454においてオーバーライドがデアサートされている状態でエッジプール412へと送出され、maxX(2.0)のX位置値を有する第3の終端レコードが、ステップ2456においてオーバーライドがデアサートされている状態でエッジプール412へと送出される。
【0358】
同様に、同じ走査線上において、継続エッジレコードAHGFのセグメントAHが終了し、ステップ2432においてセグメントHGがロードされ、走査線6を離れる地点まで追跡される。エッジAHGFは、X=7.75において走査線に入り、X=7.8、dNY=0.2まで追跡される。これは、セグメントHGがステップ2432において読み込まれる前である。このため、Xmin=7.75であり、Xmax=7.8である。後者は、ステップ2432におけるセグメントHGのローディングに先立ってステップ2430において更新される。エッジAHGFは、X=10.93において走査線6を離れる。この値はXmaxよりも大きいので、Xmin=7.75のX位置値を有する1つの終端レコードが、ステップ2446においてアサートされているoフラグを伴ってエッジプール412へと送出される。加えて、10.93のX位置値を有する継続エッジレコードAHGFおよびデアサートされているoフラグは、ステップ2448においてエッジプール412へと送出される。
【0359】
このため、ソート済のエッジが走査線6上でステップ2404において読み込まれるとき、以下のエッジ交差メッセージが優先度判定モジュール500へと送信される。
【0360】
【0361】
優先度判定モジュール500へと送信されたこれらのエッジ交差メッセージに応答して画素順次レンダリング装置20により塗りつぶされた結果の区域が図29に示される。
【0362】
第1のエッジ交差メッセージBC0は、優先度判定モジュール500により画素1において受信されるので、画素0は非アクティブ化されたレベルPと共に送出される。すなわち、画素0は塗りつぶされない。画素1に関して、レベルPに対する優先度判定モジュール500におけるオーバーライドカウンタは、最初に受信した2つのメッセージ(BC0およびBC1)によって2度増分される。このため、レベルPはこれらのメッセージにより画素1に対してアクティブ化される。さらに、これらのメッセージ(BC0およびBC1)は継続エッジメッセージではないので、レベルPにおける塗りつぶしカウントは0のままであり、増分または減分は行なわれない。
【0363】
優先度判定モジュール500が受信する次のメッセージ(ABCDEF)は画素2に対するものであり、オーバーライドカウントは0以外であるので、レベルPは画素1に対してアクティブ化される。メッセージABCDEFは、画素2においてオーバーライドカウントを減分すると共に塗りつぶしカウントを増分し、この後にはメッセージBC2が続く。
【0364】
メッセージBC2は、オーバーライドカウントをもう1度減分する。受信する次のメッセージ(HG0)は画素7に対するものであるので、画素2から6に対してはオーバーライドカウントは0であり、塗りつぶしカウントは1である。このため、レベルPは画素2から6に対してアクティブ化された状態を維持する。なお、エッジが接していない画素に対してはオーバーライドカウントは0である。
【0365】
これらの画素に対して塗りつぶしカウントおよび塗りつぶしルールは、画素がアクティブ化されているか否かを判定する。メッセージHG0は、画素7においてオーバーライドカウンタを増分するが、残るメッセージ(AHGF)は画素11に対するものである。このため、画素7から10に対してオーバーライドカウントは1、塗りつぶしカウントは1であり、レベルPはこれらの画素に対してアクティブ化された状態を維持する。
【0366】
メッセージAHGFは、画素11において塗りつぶしカウントおよびオーバーライドカウントを減分するので、残る画素に対して塗りつぶしカウントおよびオーバーライドカウントは共に0である。別のオブジェクトからの別のエッジ交差メッセージまたは走査線終端メッセージが受信されるとき、11で開始される残る画素は、レベルNが非アクティブ化された状態で送出される。
【0367】
別の実施例は、画素順次レンダリング装置20を完全にソフトウェアで実現した例である。このソフトウェア実現例は、現在の走査線に対してオブジェクトのエッジを定義するエッジレコードの連結リストを利用することによって画素スパンの塗りつぶしを可能にするエッジソフトウェアモジュールから構成される。このエッジソフトウェアモジュールは、エッジ処理モジュール400と機能的にほぼ同等である。しかし、幾つかの機能的な相違があるのでそれを説明する。
【0368】
先に説明したエッジ処理モジュール400と同様に、エッジソフトウェアモジュールは、2つ以上の動作モードで動作することが可能である。第1の動作モードおよび第2の動作モードの双方において、ドライバソフトウェアは、先に説明したのと同様に継続エッジレコードおよび終端エッジレコードを生成する。この実施例において、これらの継続エッジレコードおよび終端エッジレコードは、エッジソフトウェアモジュールへと供給される。
【0369】
エッジソフトウェアモジュールの第2の動作モードにおいて、エッジレコードの連結リストは、1つ以上の組のエッジレコードを含む。各組は、第1の型のエッジレコード(以降、影のエッジレコードと呼ぶ)と第2の型のエッジレコード(以降、元のエッジレコードと呼ぶ)とから構成される。1つの組の影のエッジレコードおよび元のエッジレコードは、それぞれ、現在の走査線のオブジェクトのエッジと関連付けられた第1のエッジ(以降、影のエッジと呼ぶ)および第2のエッジ(以降、元のエッジと呼ぶ)を定義する。
【0370】
影のエッジレコードおよび元のエッジレコードは、共に同じ構造を有する。この構造は、ほぼ図14Aに示されると共に図14Aを参照して説明される通りであり、以下の変形例を伴う。図14Aに示すフィールドに加えて、影のエッジレコードおよび元のエッジレコードは、共に整数値を格納するための更なるフィールドX.pixel(不図示)を含む。
【0371】
影のエッジレコードは、走査線に沿った方向に対する現在の走査線内のエッジの最小範囲のX座標の切り捨てられた値をX.pixelフィールドに格納する。これに対し、元のエッジレコードは、走査線に沿った同じ方向に対する現在の走査線内のエッジの最大範囲のX座標の切り上げられた値をX.pixelフィールドに格納する。
【0372】
各エッジレコードは、ポインタ(S)を含むための更なるフィールド(不図示)を含む。このポインタは、関連する影のエッジレコードを参照するために元のエッジレコードが使用する。影のエッジレコードではこのフィールドは使用されておらず、ヌルに設定される。各影のエッジレコードは、分数値としてXフィールド中の現在の走査線からの関連するエッジの出口位置のX座標をXフィールドに格納する。
【0373】
また、そのオーバーライドフラグoはアサートされている。これに対し、ポインタ(S)を介して関連する影のエッジレコードを参照することによってこの値を取得することができるので、元のエッジレコードのXフィールドはヌルに設定される。元のエッジレコードのオーバーライドフラグはデアサートされている。また、影のエッジレコードは、現在の走査線内のエッジの最大範囲のX座標の切り上げされた値を格納するためのX.maxと呼ばれるフィールドを有する。このフィールドは、元のエッジレコードではヌルに設定される。
【0374】
連結リストは、継続エッジレコードおよび終端エッジレコードを含んでも良い。先に説明したように、ドライバソフトウェアは、現在の走査線で開始される新規のエッジごとに継続エッジレコードおよび終端エッジレコードを生成する。これらの新規の継続エッジレコードおよび終端エッジレコードは、現在の走査線中に連結リストへとマージされる。現在の走査線のレンダリング後に、終端エッジは連結リストから破棄され、継続エッジレコードは、影のエッジレコードまたは元のエッジレコードに適宜変換される。
【0375】
これらの影のエッジレコード、元のエッジレコード、継続エッジレコード、および終端エッジレコードは、全て同じ構造(すなわち、フィールド)を有する。これら全てのエッジレコードのcフラグ(図14A参照)は、連結リスト中のエッジレコードが影のエッジレコード、元のエッジレコード、継続エッジレコード、および終端エッジレコードのいずれであるかを指定するために2ビットを有する。継続エッジレコードおよび終端エッジレコードはポインタ(S)フィールドを使用しないので、このフィールドはヌルに設定される。
【0376】
継続エッジレコードは、分数値として現在の走査線からの関連するエッジの出口位置のX座標をXフィールドに格納する。終端エッジレコードのXフィールドはヌルに設定されている。継続エッジレコードまたは終端エッジレコード中のアサートされたオーバーライドフラグoは、最小範囲のX座標の切り捨てられた値がX.pixelフィールドに格納されていることを示す。これに対し、継続エッジレコードまたは終端エッジレコード中のデアサートされたオーバーライドフラグoは、最大範囲のX座標の切り上げられた値がX.pixelフィールドに格納されていることを示す。
【0377】
第2の動作モードにおいて、エッジソフトウェアモジュールは、新規の走査線の開始時において、新規の走査線に対してドライバソフトウェアにより生成された継続エッジレコードおよび終端エッジレコードを検索し、それらのレコードを連結リストへとマージする。マージングの後、連結リストのエッジレコードは、フィールドX.pixelに格納された整数X値に従ってソートされる。
【0378】
エッジソフトウェアモジュールは、優先度判定モジュール、塗りつぶしカラー判定モジュール、画素合成モジュール、およびレンダリングのための出力モジュールの各オペレーションを実現するために、この新規の走査線に対するマージされた連結リストを更なるソフトウェアモジュールへと渡す。連結リストは、次の走査線に対するエッジソフトウェアモジュールによる更新のために保存される。エッジソフトウェアモジュールは、連結リスト中の関連する影のエッジレコードおよび元のエッジレコード、終端エッジレコード、および継続エッジレコードの各組を順番に更新する。ソフトウェアは、新規の走査線に対して予め更新されていないリスト中の第1のエッジレコードを順番に検索する。
【0379】
続いて、ソフトウェアは、このエッジレコードが終端エッジレコード、継続エッジレコード、影のエッジレコード、および元のエッジレコードのいずれであるのかをチェックする。
【0380】
エッジレコードが終端エッジレコードの場合、そのエッジレコードは連結リストから削除され、ソフトウェアはリスト中の次のエッジレコードへと進む。
【0381】
エッジレコードが影のエッジレコードの場合、ソフトウェアはエッジレコード中の各フィールド(X、NY、DW、SEGMENT ADDRなど)から以下の項目を計算する。すなわち、影のエッジレコードのXフィールドに格納される次の走査線からのエッジの出口位置(新規のX値)、影のエッジレコードのX.pixelフィールドに格納される次の走査線内のエッジの最小X位置の切り捨てられた値、および影のエッジレコードのX.maxフィールドに格納される次の走査線内のエッジの最大X位置の切り上げられた値である。この影のエッジレコードが次の走査線において終結する場合、レコードのwillTerminateフラグが設定される。
【0382】
ソフトウェアは、リスト中の次の未処理のエッジへと進む。エッジレコードが元のエッジレコードの場合、ソフトウェアはエッジレコード中のSポインタを使用して関連する影のエッジレコードを参照し、元のエッジのX.pixelフィールドは参照される影のエッジレコード中のX.max値と同じ値に設定される。参照される影のエッジレコード中のwillTerminateフラグが設定される場合、ソフトウェアは影のエッジレコードおよび元のエッジレコードの双方をリストから削除する。
【0383】
ソフトウェアはリスト中の次の未処理のエッジへと進む。エッジレコードが継続エッジレコードの場合、このレコードは元のエッジレコードと影のエッジレコードの対へと変換される。この変換は、新規のエッジレコードを作成し、リスト中の継続エッジレコードの前にこの新規のエッジレコードを挿入し、新規のエッジレコード中の全てのフィールドを継続エッジレコード中の対応するフィールドと同じ値を有するように設定し、影のエッジレコードであることを示すように新規のエッジレコード中のcフラグを設定し、元のエッジレコードであることを示すように継続エッジレコード中のcフラグを設定し、双方のエッジレコードに対して適正であるようにオーバーライドフラグoを設定し、新規の影のエッジをポイントするように元のエッジレコードのSポインタを設定し、影のエッジレコードおよび元のエッジレコードに対して前述したように双方のエッジレコードを更新することによって行なわれる。ソフトウェアは、リスト中の未処理のエッジへと進む。
【0384】
連結リストの既存のエッジレコードの処理が終了した後に、ソフトウェアは新規の継続エッジレコードおよび終端エッジレコードが次の走査線において開始されるか否かをチェックする。開始される場合、新規の継続エッジレコードおよび終端エッジレコードは、連結リストへとマージされる。ソフトウェアは、連結リストをXの昇順でフィールドX.pixelに従ってソートし、連結リストを優先度判定モジュール、塗りつぶしカラー判定モジュール、画素合成モジュール、およびレンダリングのための出力モジュールの各オペレーションを実現するために更なるソフトウェアモジュールへと渡す。
【0385】
エッジソフトウェアモジュールは、次の走査線のために連結リストを再度更新する。ソフトウェアは、このように全ての走査線の処理が終了するまで処理を続行する。
【0386】
あるエッジの影のエッジが常にエッジの片側にあり、元のエッジが常にそのエッジの別の側にあることは、当業者には明らかであろう。これに対し、エッジの継続エッジは常に負の傾斜を有するエッジの片側にあり、正の傾斜を有するエッジの別の側にあるであろう。終端エッジに関してはその逆である。
【0387】
この後の方の実施例の変形例において、ドライバソフトウェアは、新規の影のエッジレコードおよび元のエッジレコードを生成する。
【0388】
「影の」エッジおよび「元の」エッジの目的は、終端エッジおよび継続エッジのオペレーションを模倣することであるが、「影の」エッジは、元のエッジと同じ本数の走査線に対して存在する。このため、影のエッジは、各走査線上で作成/破棄される前述の終端エッジとは異なり、元のエッジレコードの間に1度だけ作成され、破棄される。従って、このソフトウェア実現例は、走査線ごとにエッジレコードを作成/破棄するハードウェア版と同等のソフトウェアよりも効率が良いエッジの処理を考慮に入れている。
【0389】
エッジソフトウェアモジュールの第2の動作モードにおいて、エッジレコードの連結リストは、元のエッジレコードのみを含む。エッジソフトウェアモジュールの第2の動作モードにおいて、エッジレコードの連結リストは、継続エッジレコードのみを含む。この動作モードにおいて、継続エッジレコードは、影のエッジを更新するための前述の方法に従って更新される。異なるのは、エッジが次の走査線で終結する場合、willTerminateフラグを設定する代わりに、連結リストからエッジが削除される点である。
【0390】
コンピュータシステム1により実現される前述の好適なプロセスは、特定の制御フローから成る。本発明の趣旨から逸脱することなく様々な制御フローを使用する好適なプロセスの変形例は、他にも数多く存在する。更に、好適な方法の各ステップのうちの1つ以上は、順次に実行されるのではなく、並行して実行されても良い。
【0391】
(産業上の利用可能性)
以上の説明から前述の各構成はコンピュータグラフィックスおよび印刷産業に適用可能であることが明らかである。
【0392】
以上の記述では、本発明の幾つかの実施例のみの説明を行なったが、本発明の趣旨から逸脱することなく、変形および/または変更を行なうことが可能である。各実施例は例示のためのものであり、本発明を限定するものではない。
【図面の簡単な説明】
【図1】各々が複数の画素から構成される画像の複数の走査線と、ページ記述言語PostScript(登録商標)のラスタライズルールを説明するための例示のオブジェクトの複数のエッジとを示す図である。
【図2A】複数の画素から構成される画像の1本の走査線と、ページ記述言語の典型的な従来のラスタライズルールを説明するための例示のオブジェクトの2本のエッジとを示す図である。
【図2B】複数の画素から構成される画像の1本の走査線と、ページ記述言語のPostScript(登録商標)のラスタライズルールをより詳細に説明するための例示のオブジェクトの2本のエッジとを示す図である。
【図3】好適な実施例を組み込むコンピュータシステムを表す概略ブロック図である。
【図4】好適な実施例の機能データフローを示すブロック図である。
【図5】好適な実施例の画素順次レンダリング装置、関連するディスプレイリスト、および一時的な記憶装置を表す概略ブロック図である。
【図6】図5のエッジ処理モジュールを表す概略機能図である。
【図7】図5の優先度判定モジュールを表す概略機能図である。
【図8】図5の塗りつぶしデータ判定モジュールを表す概略機能図である。
【図9A】、
【図9B】、
【図9C】ソースと宛先との間の画素の組み合わせを示す図である。
【図9D】好適な実施例に含まれるラスタオペレーションの例を示す図である。
【図10】好適な実施例のオペレーションを説明するための一例として使用される2オブジェクト画像を示す図である。
【図11A】、
【図11B】図10のオブジェクトのベクトルエッジを示す図である。
【図12】図10の画像の複数の走査線のレンダリングを示す図である。
【図13】図10の画像に対するエッジレコードの構成を表す図である。
【図14A】、
【図14B】、
【図14C】、
【図14D】、
【図14E】、
【図14F】、
【図14G】、
【図14H】、
【図14I】、
【図14J】図10の例に対して図4の構成により実現されるエッジ更新ルーチンを示す図である。
【図15A】、
【図15B】オッドイーブン塗りつぶしルールおよびノンゼロワインディング塗りつぶしルールを示す図である。
【図16A】、
【図16B】、
【図16C】、
【図16D】、
【図16E】X座標における大きな変化があふれ条件に寄与する様子およびそれらの変化が処理される様子を示す図である。
【図17A】、
【図17B】、
【図17C】、
【図17D】、
【図17E】図7の構成により実現される優先度塗りつぶしルーチンを示す図である。
【図18A】、
【図18B】、
【図18C】、
【図18D】2つの従来のエッジ記述形式と好適な装置で使用されるエッジ記述形式との比較を提供する図である。
【図19A】、
【図19B】表現ツリーおよび対応する描写として表される単純な合成表現を示す図である。
【図20A】正確なスタックオペレーションを保証するために構成されるテーブルを示す図である。
【図20B】図20Aのテーブルの好適な形態を示す図である。
【図21】表現ツリーの一例を示す図である。
【図22A】、
【図22B】、
【図22C】、
【図22D】、
【図22E】、
【図22F】図21の表現のアクティビティテーブル評価とその評価中の対応する合成スタックとを示す図である。
【図22G】、
【図22H】、
【図22I】アクティビティテーブルおよび関連するモジュールの種々の構成を示す図である。
【図23】複数の合成オペレーションの結果を示す図である。
【図24A】、
【図24B】エッジが接した画素が塗りつぶされていることを保証する追加のレコードを生成するエッジ追跡メカニズムのフローチャートである。
【図25】新規のエッジの継続エッジレコードおよび終端エッジレコードのドライバソフトウェアによる生成の一例を示す図である。
【図26】幾つかのレベルから構成される好適な実施例におけるレベルアクティブ化メカニズムの小区分を示す図である。
【図27A】、
【図27B】、
【図27C】走査線を横断するエッジの最大X位置レジスタ、最小X位置レジスタ、継続X位置レジスタに記録される位置を、それぞれとりうる値の構成の結果を比較しながら示す図である。
【図28】単純なオブジェクトのアクティブ化オペレーションを実証するための例において使用される単純なエッジを示す図である。
【図29】例において検討される走査線上での図28に示すオブジェクトのアクティブ化オペレーションを示す図である。
Claims (24)
- グラフィックオブジェクトの塗りつぶしをアクティブ化する方法であって、
現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成する生成ステップと、
前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するアクティブ化ステップと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、
前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られる
ことを特徴とする方法。 - さらに、
前記現在の走査線に対して、前記オブジェクト内の一連の画素または1つの画素の全体に対する前記オブジェクトの塗りつぶしをアクティブ化するステップを有することを特徴とする請求項1に記載の方法。 - さらに、
1のエッジレコードが、前記分数データが前記現在の走査線内の前記エッジの最小位置を定義することを示すフラグを含むときに、第1のカウンタを増分するステップと、
1のエッジレコードが、前記分数データが前記現在の走査線内のエッジの最大位置を定義することを示す前記フラグ、を含むときに、前記第1のカウンタを減分するステップと、
前記第1のカウンタが0以外になるとき、前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または1つの画素の全体に対する前記オブジェクトの塗りつぶしをアクティブ化するステップと、
を有することを特徴とする請求項1に記載の方法。 - 前記オブジェクト内の一連の画素または1つの画素の全体に対する塗りつぶしをアクティブ化するステップをさらに含み、
該ステップは、
前記現在の走査線に対する前記エッジレコードが、前記エッジの出口点を定義する分数データと、前記エッジが第1の方向を有することを示すフラグとを含むときに、塗りつぶしカウンタを増分するサブステップと、
前記現在の走査線に対する前記エッジレコードが、前記エッジの出口点を定義する分数データと、前記エッジが第2の方向を有することを示すフラグとを含むときに、塗りつぶしカウントを減分するサブステップと、
前記第1のカウンタが0になり、前記塗りつぶしカウンタが所定の状態にあるとき、
前記現在の走査線に対して、前記オブジェクト内の一連の画素または1つの画素の全体に対する前記オブジェクトの塗りつぶしをアクティブ化するサブステップと、
を含むことを特徴とする請求項3に記載の方法。 - 前記オブジェクトの塗りつぶしはノンゼロワインディング塗りつぶしルールに基づいて行われ、前記塗りつぶしカウントが0以外で、かつ、前記第1のカウンタが0のときに、前記オブジェクトがアクティブ化されることを特徴とする請求項4に記載の方法。
- 前記オブジェクトの塗りつぶしはオッドイーブン塗りつぶしルールに基づいて行われ、前記塗りつぶしカウントが奇数で、かつ、前記第1のカウンタが0のときに、前記オブジェクトがアクティブ化されることを特徴とする請求項4に記載の方法。
- 前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置は、当該エッジの当該現在の走査線からの出口位置に対応し、
前記現在の走査線に対する前記エッジレコードは、前記最小位置を定義する分数データを含むエッジレコードと、前記最大位置を定義する分数データを含むエッジレコードとの2つのエッジレコードを含む
ことを特徴とする請求項1に記載の方法。 - 前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置は、当該エッジの当該現在の走査線からの出口位置に対応し、
前記現在の走査線に対する前記エッジレコードは、前記最小位置を定義する分数データを含むエッジレコードと、前記最大位置を定義する分数データを含むエッジレコードとの計2つのエッジレコードを含む
ことを特徴とする請求項1に記載の方法。 - 前記エッジの前記現在の走査線からの出口位置は、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの前記最大位置と、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの前記最小位置との間に位置し、
前記エッジレコードは、前記最小位置を定義する前記分数データを含む2つのエッジレコードと、前記出口位置を定義する前記分数データを含む1つのエッジレコードと、前記最大位置を定義する前記分数データを含む1つのエッジレコードとの計4つのエッジレコードを含む
ことを特徴とする請求項1に記載の方法。 - 前記エッジの前記現在の走査線からの出口位置は、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの前記最大位置と、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの前記最小位置との間に位置し、
前記エッジレコードは、前記最小位置を定義する前記分数データを含む1つのエッジレコードと、前記出口位置を定義する前記分数データを含む1つのエッジレコードと、前記最大位置を定義する前記分数データを含む1つのエッジレコードとの計3つのエッジレコードを含む
ことを特徴とする請求項1に記載の方法。 - 一の動作モードで、前記生成ステップと前記アクティブ化ステップとを実行し、
別の動作モードで、
現在の走査線に対して、前記エッジと関連付けられたエッジレコードを、先行する走査線に対してすでに生成された前記エッジレコードから生成するステップと、
前記現在の走査線に対して、前記出口点を定義する分数データの丸められた値に等しい走査線位置で開始される前記オブジェクト内の一連の画素または1つの画素の全体に対するオブジェクトの塗りつぶしをアクティブ化するステップと、
を実行し、
前記現在の走査線に対する前記エッジレコードが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記エッジの前記先行する走査線からの出口点を定義する分数データを含む
ことを特徴とする請求項1に記載の方法。 - 前記丸められた値は、前記出口点を定義する前記分数データを切り上げることによって得られることを特徴とする請求項11に記載の方法。
- 前記丸められた値は、前記出口点を定義する前記分数データを切り捨てることによって得られることを特徴とする請求項11に記載の方法。
- 前記最小画素位置は、フラグの第1の状態に応じて前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることによって得られ、
前記最大画素位置は、前記フラグの第2の状態に応じて前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることによって得られる
ことを特徴とする請求項1に記載の方法。 - 前記エッジの前記現在の走査線からの出口位置は、そのエッジの前記先行する走査線からの出口位置と、そのエッジの傾斜とから得られることを特徴とする請求項1に記載の方法。
- 前記エッジは、複数の直線セグメントから構成され、
前記エッジの前記現在の走査線からの出口位置は、そのエッジの前記先行する走査線からの出口位置と、1または2以上の前記直線セグメントを定義するデータとから得られることを特徴とする請求項1に記載の方法。 - ページ記述言語が前記グラフィックオブジェクトを定義し、
そのページ記述言語が特定の種類である場合に、前記生成ステップと前記アクティブ化ステップとを実行し、
そのページ記述言語が他の種類である場合は、他のステップを実行する
ことを特徴とする請求項1に記載の方法。 - グラフィックオブジェクトの塗りつぶしをアクティブ化する装置であって、
現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成するモジュールと、
前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するモジュールと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線からの前記エッジの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、
前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られる
ことを特徴とする装置。 - グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコンピュータプログラムであって、
現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた複数のエッジレコードを、先行する走査線に対してすでに生成されたエッジレコードから生成するためのコードと、
前記現在の走査線に対して、最小画素位置から最大画素位置までの一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコードと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置を定義する分数データを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線からの前記エッジの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含んでおり、
前記最小画素位置が、前記最小位置を定義する前記エッジレコードの前記分数データに等しい値を切り捨てることで得られ、前記最大画素位置が、前記最大位置を定義する前記エッジレコードの前記分数データに等しい値を切り上げることで得られる
ことを特徴とするコンピュータプログラム。 - グラフィックオブジェクトの塗りつぶしをアクティブ化する方法であって、
現在の走査線に対して前記グラフィックオブジェクトのエッジと関連付けられた2つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成する生成ステップと、
前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するアクティブ化ステップと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とする方法。 - 各エッジレコードは、前記切り捨てられた値および前記切り上げられた値を定義する前記エッジレコード間で区別するためのフラグを含むことを特徴とする請求項20に記載の方法。
- ページ記述言語が前記グラフィックオブジェクトを定義し、
そのページ記述言語が特定の種類である場合に、前記生成ステップと前記アクティブ化ステップとを実行し、
そのページ記述言語が他の種類である場合は、他のステップを実行する
ことを特徴とする請求項20記載の方法。 - グラフィックオブジェクトの塗りつぶしをアクティブ化する装置であって、
現在の走査線に対して前記オブジェクトのエッジと関連付けられた2つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成する手段と、
前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化する手段と、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とする装置。 - グラフィックオブジェクトの塗りつぶしをアクティブ化するためのコンピュータプログラムであって、
現在の走査線に対して前記オブジェクトのエッジと関連付けられた2つのエッジレコードを先行する走査線に対してすでに生成された前記エッジレコードから生成するコードと、
前記現在の走査線に対して、前記切り捨てられた値から前記切り上げられた値まで一連の画素または1つの画素の全体に対する前記グラフィックオブジェクトの塗りつぶしをアクティブ化するコードと、
を有し、
前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最小位置の切り捨てられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記現在の走査線内もしくは前記現在の走査線の当該走査線に沿う方向における境界上の前記エッジの最大位置の切り上げられた値を定義するデータを含み、前記現在の走査線に対する前記エッジレコードのうちの1つが、前記エッジの前記現在の走査線からの出口位置を定義する分数データを含み、前記すでに生成されたエッジレコードが、前記先行する走査線からの前記エッジの出口点を定義する分数データを含むことを特徴とするコンピュータプログラム。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
AUPR8609A AUPR860901A0 (en) | 2001-10-31 | 2001-10-31 | Activating a filling of a graphical object |
AU8609 | 2001-10-31 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2003216960A JP2003216960A (ja) | 2003-07-31 |
JP3797666B2 true JP3797666B2 (ja) | 2006-07-19 |
Family
ID=3832431
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002313989A Expired - Fee Related JP3797666B2 (ja) | 2001-10-31 | 2002-10-29 | グラフィックオブジェクトの塗りつぶしをアクティブ化する方法および装置 |
Country Status (3)
Country | Link |
---|---|
US (1) | US7023439B2 (ja) |
JP (1) | JP3797666B2 (ja) |
AU (1) | AUPR860901A0 (ja) |
Families Citing this family (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
AU2002301643B2 (en) * | 2001-10-31 | 2005-02-17 | Canon Kabushiki Kaisha | Activating a Filling of a Graphical Object |
AU2002951651A0 (en) * | 2002-09-25 | 2002-10-10 | Canon Kabushiki Kaisha | Apparatus for printing using non-overlapping graphic objects |
US7199806B2 (en) * | 2003-03-19 | 2007-04-03 | Sun Microsystems, Inc. | Rasterization of primitives using parallel edge units |
US7145578B2 (en) * | 2004-03-18 | 2006-12-05 | Canon Kabushiki Kaisha | Scalable object recognition architecture |
US7755629B2 (en) * | 2004-06-30 | 2010-07-13 | Canon Kabushiki Kaisha | Method of rendering graphic objects |
US7586500B2 (en) * | 2004-09-24 | 2009-09-08 | Canon Kabushiki Kaisha | Dynamic render algorithm selection |
AU2004240229B2 (en) * | 2004-12-20 | 2011-04-07 | Canon Kabushiki Kaisha | A radial, three-dimensional, hierarchical file system view |
US7623712B2 (en) * | 2005-06-09 | 2009-11-24 | Canon Kabushiki Kaisha | Image processing method and apparatus |
US7965299B2 (en) * | 2005-10-31 | 2011-06-21 | Canon Kabushiki Kaisha | Implementing compositing operations on images |
US8294731B2 (en) * | 2005-11-15 | 2012-10-23 | Advanced Micro Devices, Inc. | Buffer management in vector graphics hardware |
US7978196B2 (en) * | 2006-03-02 | 2011-07-12 | Canon Kabushiki Kaisha | Efficient rendering of page descriptions |
JP4621617B2 (ja) * | 2006-03-28 | 2011-01-26 | 株式会社東芝 | 図形描画装置、図形描画方法、及びプログラム |
US8127233B2 (en) * | 2007-09-24 | 2012-02-28 | Microsoft Corporation | Remote user interface updates using difference and motion encoding |
US20090091564A1 (en) * | 2007-10-03 | 2009-04-09 | Raju Thevan | System and method for rendering electronic documents having overlapping primitives |
US20090096792A1 (en) * | 2007-10-15 | 2009-04-16 | Ati Technologies Ulc | Fill mode determination in vector graphics |
AU2008202364B2 (en) * | 2008-05-28 | 2011-04-21 | Canon Kabushiki Kaisha | Scan converting a set of vector edges to a set of pixel aligned edges |
US8314951B2 (en) | 2008-09-26 | 2012-11-20 | Kyocera Document Solutions Inc. | Image processing apparatus, and computer-readable recording medium |
JP5028372B2 (ja) * | 2008-09-26 | 2012-09-19 | 京セラドキュメントソリューションズ株式会社 | 画像処理装置、画像処理方法及び画像処理プログラム |
AU2009202377A1 (en) * | 2009-06-15 | 2011-01-06 | Canon Kabushiki Kaisha | Combining overlapping objects |
AU2010241218B2 (en) * | 2010-11-03 | 2013-10-31 | Canon Kabushiki Kaisha | Method, apparatus and system for associating an intermediate fill with a plurality of objects |
JP2013120496A (ja) | 2011-12-07 | 2013-06-17 | Canon Inc | 画像形成装置、情報処理方法及びプログラム |
US9979960B2 (en) | 2012-10-01 | 2018-05-22 | Microsoft Technology Licensing, Llc | Frame packing and unpacking between frames of chroma sampling formats with different chroma resolutions |
AU2013273660A1 (en) * | 2013-12-18 | 2015-07-02 | Canon Kabushiki Kaisha | Method, apparatus and system for generating an intermediate region-based representation of a document |
US20150269207A1 (en) * | 2014-03-18 | 2015-09-24 | Cong Deng | Simple and efficient method for recycling device identifiers |
JP2018063557A (ja) | 2016-10-12 | 2018-04-19 | キヤノン株式会社 | 画像形成装置、方法、プログラム |
US10368080B2 (en) | 2016-10-21 | 2019-07-30 | Microsoft Technology Licensing, Llc | Selective upsampling or refresh of chroma sample values |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4962468A (en) * | 1987-12-09 | 1990-10-09 | International Business Machines Corporation | System and method for utilizing fast polygon fill routines in a graphics display system |
US5471568A (en) * | 1993-06-30 | 1995-11-28 | Taligent, Inc. | Object-oriented apparatus and method for scan line conversion of graphic edges |
US5625768A (en) * | 1994-05-23 | 1997-04-29 | Cirrus Logic, Inc. | Method and apparatus for correcting errors in pixel characteristics when interpolating polygons into a pixel grid |
JP4365950B2 (ja) * | 1998-09-11 | 2009-11-18 | キヤノン株式会社 | 高速ラスタ形式レンダリングのためのグラフィックオブジェクト処理方法および装置 |
US6288724B1 (en) * | 1998-09-16 | 2001-09-11 | Texas Instruments Incorporated | Clipping and trapezoid decomposition of polygons for printing files in a page description language |
US6341020B1 (en) * | 1998-12-28 | 2002-01-22 | Xerox Corporation | Anamorphic object optimized function application for printer defect pre-compensation |
AUPQ697100A0 (en) * | 2000-04-18 | 2000-05-11 | Canon Kabushiki Kaisha | Rendering graphic object based images |
-
2001
- 2001-10-31 AU AUPR8609A patent/AUPR860901A0/en not_active Abandoned
-
2002
- 2002-10-29 JP JP2002313989A patent/JP3797666B2/ja not_active Expired - Fee Related
- 2002-10-30 US US10/283,237 patent/US7023439B2/en not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
US7023439B2 (en) | 2006-04-04 |
US20030179200A1 (en) | 2003-09-25 |
AUPR860901A0 (en) | 2001-11-29 |
JP2003216960A (ja) | 2003-07-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3797666B2 (ja) | グラフィックオブジェクトの塗りつぶしをアクティブ化する方法および装置 | |
JP4365950B2 (ja) | 高速ラスタ形式レンダリングのためのグラフィックオブジェクト処理方法および装置 | |
JP4343344B2 (ja) | ラスタ形式のグラフィックオブジェクトを用いたイメージの高速レンダリング方法 | |
US6961067B2 (en) | Reducing the number of compositing operations performed in a pixel sequential rendering system | |
JP3618838B2 (ja) | 画像出力方法 | |
JP4630482B2 (ja) | 表現ツリーを生成する装置及びラスタ画素イメージを描画する装置 | |
US7714865B2 (en) | Compositing list caching for a raster image processor | |
JP3618839B2 (ja) | 画像出力方法 | |
EP0694880B1 (en) | Optimization method for the efficient production of images | |
US7538770B2 (en) | Tree-based compositing system | |
US7551173B2 (en) | Pixel accurate edges for scanline rendering system | |
JP3058017B2 (ja) | グラフィックス画素データを変換するための装置および方法 | |
JP4143613B2 (ja) | 描画方法、描画装置 | |
AU744091B2 (en) | Processing graphic objects for fast rasterised rendering | |
AU743218B2 (en) | Fast renering techniques for rasterised graphic object based images | |
AU2002301643B2 (en) | Activating a Filling of a Graphical Object | |
AU2005200948B2 (en) | Compositing list caching for a raster image processor | |
AU2005201868A1 (en) | Removing background colour in group compositing | |
AU2004231232B2 (en) | Pixel accurate edges for scanline rendering system | |
AU2004200655B2 (en) | Reducing the Number of Compositing Operations Performed in a Pixel Sequential Rendering System | |
AU4064502A (en) | Compositing objects with opacity for fast rasterised rendering | |
AU2005201929A1 (en) | Rendering graphic object images | |
AU2004237873A1 (en) | State table optimization in expression tree based compositing | |
AU2005201931A1 (en) | Rendering graphic object images |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20060105 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060302 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20060331 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20060417 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 3797666 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090428 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100428 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110428 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120428 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130428 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130428 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140428 Year of fee payment: 8 |
|
LAPS | Cancellation because of no payment of annual fees |