付属図面のいずれかを参照する場合はステップ及び/又は特徴に対して、同一の参照番号が付けられ、異なる意図が生じない限り、この説明上は、同一機能又は動作を有する。
画素順次描画システム1のより良い理解のため、簡潔なシステムの概要説明を1.0項で行う。次に、2.0項で第3者ソフトウエアアプリケーションと画素順次描画装置20間を結ぶインタフェース用のドライバソフトの説明をする。3.0項では画素順次描画装置20の概説を行う。追って明らかになるように、画素順次描画装置20は命令実行モジュール300、エッジトラッキングモジュール400、優先度決定モジュール500、最適化モジュール550、フィルカラー決定モジュール600、画素合成モジュール700、画素出力モジュール800から成っている。これらのモジュールの簡潔な概要説明を3.1項から3.7項で行う。最適化モジュール550と画素合成モジュール700のより詳細な説明は、次に4.0項から4.5項と5.0項に続く。
この発明の一般原理は、画素順次描画システムにおいて実行される合成演算の回数削減に役立つ。これは最適化モジュール550と画素合成モジュール700による好適なシステムによって実現しており、それについては4.0項、4.1、4.2、4.3、4.4、4.5、及び5.0項で更に詳細に説明する。
1.0 画素順次描画システムの概要
図1は、コンピュータのグラフィックオブジェクト画像の描画と、提示用に構成されたコンピュータシステム1を、図式的に解説したものである。そのシステムは、システムランダムアクセスメモリ(RAM)3と結合されたホストプロセッサ2を含み、それは不揮発性記憶ハードディスクドライブ又は類似のデバイス5と、揮発性記憶半導体RAM4を含んでいる。システム1はまた、一般的に半導体ROM7上に構築され、多くの場合コンパクトディスクデバイス(CD ROM)8によって増強できる、システムのリードオンリーメモリ(ROM)6を含む。システム1は、例えばビデオ表示ユニット(VDU)又はプリンタのどちらか一方、或いは両方のような、ラスタ方式で動作する画像表示用の何かの手段10を組み込むこともまたできる。
上記のシステム1の構成要素は、バスシステム9を経由して相互接続されており、IBM PC/ATタイプパソコンと、そこから発展した実施態様である、SUNのSparcstations等のように当業者に周知のコンピュータシステムの通常動作モードで動作できる。
また図3に示すように、バス9に接続する画素順次描画装置20が、本発明の好ましい実施態様において、システム1からバス9経由で命令とデータを供給され、画像のオブジェクトベース記述から導かれた画素ベース画像を、順次描画するように構成されている。装置20は、オブジェクト記述の描画のために、一般的には半導体RAMから構成される専用の描画ストア装置30を備えることが好ましいが、システムRAM 3を使っても良い。
画素順次描画装置は一般的に言えば次のような実施態様で動作する。描画されるジョブは、画素順次描画装置に供給するため、第3者ソフトウエアによってドライバソフトに与えられる。描画のジョブは、典型的にはページ記述言語或いは標準画像APIへの関数呼び出しシーケンスで行われ、それはページ上の画像構成オブジェクトを、最後列から最前列のオブジェクトまで、描画ジョブによって定義された方法で描画するよう定義する。ドライバソフトは描画ジョブを中間描画ジョブに変換し、それは次に画素順次描画装置に送られる。画素順次描画装置は、画素に対するカラーと不透明度情報を、ラスタ走査順に順次生成する。走査され処理中の任意の画素で、画素順次描画装置は、現在走査された画素で描画されアクティブなオブジェクトのみを合成する。画素順次描画装置は、その画素がオブジェクトの境界内にあれば、オブジェクトが走査された画素でアクティブであると判定する。画素順次描画装置はこれをそのオブジェクトに関連付けられているフィルカウンタを参照して行う。フィルカウンタはその画素がオブジェクトの境界内にあるか否かを示すフィルカウントを維持する。画素順次描画装置がオブジェクトのエッジに出会うと、フィルカウンタはエッジの方向に応じてフィルカウントを増減する。画素順次描画装置はそのとき、現在の画素がオブジェクトの境界内にあるか否かを、フィルカウントと所定の巻き上げカウントルールに従って判定できる。画素順次描画装置はそのオブジェクトに関連付けられているフラッグによってアクティブオブジェクトが描画されているか否かを判定する。このオブジェクトに結び付いたフラッグは、そのオブジェクトが下位順のオブジェクトを被覆するか否かを示す。つまり、このフラッグはそのオブジェクトが半透明か否か、透明ならばアクティブな下位順のオブジェクトが現在の画素のカラーと不透明度に寄与するか否かを示す。透明でなければ、このフラッグはオブジェクトが透明であることを示し、その場合は、アクティブ下位順オブジェクトは現在走査されている画素のカラーと不透明度に何の寄与もしないことを示す。画素順次描画装置は、もしそれが最上位順のアクティブオブジェクトであれば、或いはそのオブジェクト上のすべてのアクティブオブジェクトが透明であるフラッグセットを有していれば、オブジェクトは描画されていると判定する、画素順次描画装置は次にこれらの描画されたアクティブオブジェクトを合成し、現在走査中の画素に対するカラーと不透明度を決め出力する。
ドライバソフトは、ページに対応して、エッジトラッキングモジュールに送るため、オブジェクトのエッジを定義するエッジ情報の抽出もまた行う。ドライバソフトは、優先度決定モジュールに送られる、オブジェクトの表現ツリーの線形化されたテーブル(以下優先度特性状態テーブルと呼ぶ)とそれらの合成演算もまた生成する。優先度特性状態テーブルは、ページ上のオブジェクト毎に一つのレコードを有している。更に、各レコードは、フィルテーブル内の対応するオブジェクトをフィルするための、アドレス指示器を格納するフィールドを含んでいる。このフィルテーブルは、ドライバソフトによっても生成され、対応するオブジェクトに対するフィルを含んでおり、フィル決定モジュールに送られる。優先度特性状態テーブルはフィルテーブルと共にエッジ情報が無く、オブジェクトが無限大に広がっているオブジェクトを効果的に表現する。エッジ情報はエッジトラッキングモジュールに送られ、それはラスタ走査順の各画素に対して、現在走査中の画素と交わる任意のオブジェクトのエッジを決定する。エッジトラッキングモジュールは、この情報を優先度決定モジュールに渡す。優先度特性状態テーブルの各レコードはカウンタを内蔵しており、それがそのレコードの対応するオブジェクトに関連付けられているフィルカウントを維持している。優先度決定モジュールは各画素をラスタ走査順に処理する。初期には、すべてのオブジェクトに関連付けられているフィルカウントはゼロであり、従ってすべてのオブジェクトは非アクティブ状態にある。優先度決定モジュールは、その画素と交わるエッジに出会うまで、各画素の処理を続ける。優先度決定モジュールはそのエッジのオブジェクトのフィルカウント値を更新し、そこでそのオブジェクトはアクティブ状態になる。優先度決定は、このような方法でオブジェクトのフィルカウントを続け、オブジェクトのアクティブ化と非アクティブ化を行う。優先度決定モジュールは、これらのアクティブオブジェクトが描画されているかどうかの判定もまた行い、その結果、これらが現在走査中の画素に対し寄与するかの決定をする。寄与する場合は、画素決定モジュールは、画素合成モジュールに対し、優先度特性状態テーブル内にこれらの描画されたアクティブオブジェクトに対して、指定された合成演算に従って、合成結果のカラーと不透明度を、現在走査中の画素に対し生成するよう最終的に命令する一連のメッセージを生成する。これらの一系列のメッセージは、その時点では、実際のフィルテーブルに対するアドレスを除き、フィル決定モジュールがオブジェクトのカラーと不透明度を決定するために使用する、そのオブジェクトに対するカラーと不透明度情報を含んでいない。
説明の都合上、最後列から最前列に並んだオブジェクトのオブジェクト順序におけるオブジェクトの位置(即ちレベル)は、ここでは、オブジェクトの優先度と呼ぶ。好適には、同じフィルと合成演算を有し、且つオブジェクトの順序において隣接するシーケンスを形成するオーバーラップしていない複数のオブジェクトは、同一優先度を有するものとして指定されることが好ましい。最も頻繁には、オブジェクト一つについて一つの優先度(即ちレベル)が要求されるが、しかし、幾つかのオブジェクトが幾つかの命令を要求することもあり、その結果、そのオブジェクトは幾つもの優先度(即ち多段レベル)を有していることもある。例えば、或るカラーフィルを有する一つの文字は、そのカラーフィルを有する第1レベルにバウンディングボックス(B)、第2レベルにその文字の形状を与える1ビットのビットマップ(S)、第3レベルにカラーフィル値を有する同じバウンディングボックス(B)で表すことができ、そこで多段レベルがカラー特性を生成するために合成される((B xor Page) and S)xor B。
画素順次描画装置は、別オブジェクトの形状を修正するために、クリップオブジェクトもまた用いている。画素順次描画装置はそのクリップについて関連するクリップカウントを、現在の画素がクリップ領域内にあるかを決定するのと類似の方法で、フィルカウントに維持する。
追って明らかになるように、隣接するエッジ間でカラーと不透明度が一定である画素連が存在する。画素順次描画装置は、その連の先端画素に対するカラーと不透明度を合成し、後続する画素においては、前に合成したカラーと不透明度をそれ以上の合成をすることなく再生成し、それによって全体としての合成演算回数を減らすことができる。画素連が一つ以上の優先度レベルで変動するカラー及び不透明度を有する状況ではこの技法は使えない。しかしながら、本発明の好ましい実施態様では、後者の場合でも、以下に更に詳細に説明するように、合成演算回数を最小化することができる。
2.0 ソフトウエアドライバの概要
ソフトウエアプログラム(以下ドライバと呼ぶ)は、第3者アプリケーションソフトによってそれに供給されるデータから、画素順次画像描画装置20に対する命令とデータを生成するために、ホストプロセッサー2にロードされ実行される。その第3者アプリケーションはPostScripやPCLのような、ページ上に描画されるオブジェクトの標準記述言語の形式か、又はWindows(登録商標) GDI若しくはX-IIのような、標準ソフトウエアインタフェースを通じたドライバへの関数呼び出しの形で、データを供給することができる。
ドライバソフトは、オブジェクトに関連付けられたデータ(その第3者アプリケーションによって供給された)を、そのオブジェクトのエッジ、オブジェクトのページ上にペイントする動作又は演算、及びオブジェクトのエッジの内側に入る画素をフィルする為の、カラーと不透明度に区分する。
ドライバソフトは各オブジェクトのエッジを、Y軸方向に単調増加するエッジに区分し、次いでそのオブジェクトの各区分されたエッジを、下記に説明されるエッジモジュールに適した形式のセグメントに分割する。分割されたエッジはそれらの出発点のX値、次いでY値によってソートされる。同じY値から出発するエッジ群は、X値でソートされたままの状態に留まり、描画がそのY値に到達すると、エッジモジュールの読み取りに適した新エッジリストを作るため、一緒にコンカチネートされる。
ドライバソフトは、ペインティングオブジェクトと関連する動作を優先度順にソートし、優先度決定モジュール(以下に説明)に関連するデータ構造をロードする命令を生成する。この構造には、各オブジェクトがエッジによってどのようにアクティブ化されるかのトポロジを記述するフィルルール用のフィールド、ペイントされつつあるそのオブジェクトと結び付いたフィルタイプ用のフィールド、及び現在のオブジェクトの下位レベルデータが、演算に要求されるか否かを識別するためのフィールドを含んでいる。また、ここにはクリップカウントと呼ぶ、オブジェクトを、クリッピングオブジェクト、つまり、それ自体はフィルされないがページ上の他のオブジェクトのフィリングを可能にしたり不可能にしたりするオブジェクト、として識別するフィールドがある。
ドライバソフトは、オブジェクトをどのようにフィルするかを記述するデータ構造(フィルテーブル) もまた備え、そのフィルテーブルは、優先度決定モジュール内のそのデータ構造によってインデクス化されている。これは、優先度決定モジュール内の数レベルが、同一フィルデータ構造を参照できるようにする。
ドライバソフトは、上記データを、描画システムの読み取り可能な形式で、データをロードし画素を描画する命令を含むジョブに組み立て、その組み立てられたジョブを描画システムに転送する。これは、周知の各種技法の一つを使って、描画システムとそのメモリの配置構成に応じて、実行することができる。
3.0 画素順次描画装置の概要
さて、図2について、本発明の好ましい実施態様の機能データの流れ図を示す。図2の機能の流れ図は、画像オブジェクトのこれらのパラメタ記述に使われるホストプロセッサー2によって生成され、および或いは、適切な場合には、システムRAM3に格納されるかシステムROM6から引き出され、画素順次描画装置20によって画素ベース画像の描画をすると解釈されるのに適切な方法によって使用される、オブジェクトの画像記述11から始まる。例えば、オブジェクト画像記述11は、エッジを持ったオブジェクトを、表示面上の或る点から他の点までを横切る直線エッジ(単純ベクトル)、或いは二次元オブジェクトが直行線を含む複数のエッジによって定義される直交エッジフォーマットなどの幾つかのフォーマットで取り込むことができる。更に多くのフォーマット、オブジェクトが連続曲線で定義されるのもまた適切、これらには二次の多項式の断片、単純曲線が幾つかのパラメタで記述できる、二次曲線を一つの出力スペースに乗算をせずに描画できる。更なるデータ形式三次元スプライン曲線とその類型もまた使用できる。一つのオブジェクトは多くの異なるエッジタイプの混合を含むことができる。一般的にすべてのフォーマットに共通なものは、各ライン(直線か曲線かを問わず)の始点と終点の識別子であり、一般的に、これらは走査線番号によって識別され、その結果、曲線がそこに描画される特定の出力スペースを定義する。
例えば図16Aは、セグメントを充分に記述し描画するために、二つのセグメント601と602に分割することを要求される、先行技術によるエッジ600のエッジ記述を示している。これは、先行技術によるエッジ記述では二次形式を通じて簡単に計算できる反面、変曲点604に対応できないから生じるものである。従って、エッジ600はエッジ終点603、604、と604、605をそれぞれ有する二つの区分されたエッジとして取り扱われる。図16Bは終点611、612と制御点613、614を持つ三次スプライン曲線610を示している。このフォーマットは三次多項式の数値計算を要求し、それ故に計算時間の負荷が高くなる。
図16Cと16Dは、好ましい実施態様に適切なエッジの例を示す。好ましい実施態様においては、エッジは一つの実体とみなされ、必要ならば、異なるフォーマットで記述することのできるエッジセクションの輪郭を描くために分割される。その目的は各分割部分の記述の複雑性を最低レベルに抑えることにある。
図16Cには、単体エッジ620は、走査線AとM間にまたがるものとして図解されている。或るエッジはstart_x、start_y、エッジの次セグメントを指すアドレスを含む一つ以上のセグメント記述、及びエッジを限るために使用する末端セグメントを含む幾つかのパラメタによって記述される。好ましい実施態様に従って、エッジ620は、三つのステップセグメント、一つのベクトルセグメント、並びに一つの二次式セグメントを有するものとして記述される。ステップセグメントは、xステップ値とyステップ値を有するものとして単純に定義される。図解の3ステップについては、セグメントの記述は[0, 2]、[+2, 2]、[+2, 0]となる。xステップ値はサイン付けによってステップの方向が示され、またyステップ値の方向は不等辺の増加値のラスタ走査方向になるため常にサイン付けがないことに注目されたい。次のセグメントは、start_x(X)、start_y(Y)、num_of_scanlines(NY)、傾き(DX)のパラメタを要求する典型的ベクトルセグメントである。この例では、ベクトルセグメントがエッジ620の中間セグメントであり、start_xとstart_yは、それらが前のセグメントから生起しているので、除くことができる。パラメタnum_of_scanlines(NY)は、ベクトルセグメントが続く走査線の線数を示している。傾き値(DX)はサイン付けされており、現在の走査線のx値を示すために、前の走査線のx値が加算されており、この場合にはDX = +1になる。次のセグメントは、ベクトルセグメントのそれに対応する構造を有する二次式セグメントであるが、それは、セグメントの傾きを変えるためのサイン付けもされDXに加算される第2補助値(DDX)も有している。
図16Dは、好ましい実施態様に従った、セグメントの傾き変化率を変えるために、DDXに加算されるサイン付きの第3補助値(DDDX)の加算を除き、二次式セグメントに対応する記述を有する三次曲線の例を示している。その他多くの補助値もまた実行できる。
上記から、エッジセグメントを記述する複数のデータフォーマットを扱う能力は、複雑で計算時間が割高な数学演算をせずに、エッジ記述と評価の簡易化をはかることにあることが明らかであろう。対照的に、図16Aの先行システムにおいては、すべてのエッジは、直交形式か、ベクトル形式か、二次式であるかを問わず、二次形式による記述が要求される。
好ましい実施態様の動作は、二つの画像オブジェクト、具体的には半透明な青色三角形80が不透明な赤色長方形90の上に描画され、それによって後者を部分的に被覆していると分る図8に示した画像78の単純な描画の例について説明する。見られるように長方形90は、多くの画素位置(X)と走査線位置(Y)の間に定義されるサイドエッジ92、94、96、98から成っている。エッジ96と98は走査線上に形成されている(従ってそれと平行)ため、長方形90の実際のオブジェクト記述は、図9Aに見られるように、サイドエッジ92と94のみに基づいて行うことができる。この関連で、エッジ92は画素位置(40,35)から始まり、ラスタ方向にスクリーン上の画素位置(40,105)まで伸びている。同じように、エッジ94は画素位置(160,35)から位置(160,105)に伸びている。長方形画像オブジェクト90の水平部分は、エッジ92からエッジ94へ、単にラスタ方式の走査をするだけで得ることができる。
青色三角形オブジェクト80は、しかし、それぞれ三角形の頂点を定義するベクトルとみられる三つのオブジェクトエッジ82、84、86によって定義されている。エッジ82と84は画素位置(100,20)から始まり、それぞれ、画素位置(170,90)と(30,90)に伸びているのが見られる。エッジ86は、それら二つの画素位置間を、従来型のラスタ方向である左から右に伸びている。この特例では、エッジ86は上記のエッジ96と98のように水平的なので、エッジ86の定義付けは必須ではない。エッジ82と84の記述に使われる画素の始点と終点位置に加え、これらの各エッジは、それに結び付いた傾き、この場合 +1と -1、をそれぞれ有している。
図2に戻ると、画像システム1は、画像オブジェクトの記述に必要なデータの識別を終えると、ディスプレイリスト生成ステップ12を実行する。
ディスプレイリスト生成12は、ROM6とRAM3を付帯するホストプロセッサー2上で実行するソフトウエアドライバとして実施することが好まれる。ディスプレイリスト生成12は、周知の画像記述言語、画像ライブラリ呼び出し,又はその他の特定アプリケーションのフォーマットのどれか一つ以上によって表現された、オブジェクトの画像記述をディスプレイリストに変換する。ディスプレイリストは、一般的にはRAM4内に構築されるが,代替的に描画ストア30内にも構築可能な、ディスプレイリストストア13に典型的に書き込まれる。図3に見られるように、ディスプレイリストストア13は、幾つかの構成要素、その一つは指示ストリーム14、もう一つはエッジ情報15、更にはそれが適当な場合、ラスタ画像の画素データ16を含めることができる。
指示ストリーム14には、任意の特定画像の中に望みの特定画像オブジェクトを描画するために、画素順次描画装置20によって読み取られ、命令として解釈されるコードが含まれる。図8に示した画像例についていえば、指示ストリーム14は次の形をとることができる:
(1) 走査線20まで描画する(何もしない)、
(2) 走査線20で二つの青色エッジ82と84を加える、
(3) 走査線35まで描画する、
(4) 走査線35で二つの赤色エッジ92と94を加える、
(5) 最後まで描画する。
同様に、エッジ情報15は図8の例では次を含むことができる:
(i) エッジ84は画素位置100、エッジ82は画素位置100から始まる
(ii) エッジ92は画素位置40から、エッジ94は画素位置160から始まる
(iii) エッジ84は70走査線、エッジ82は70走査線続く
(iv) エッジ84は傾き= -1、エッジ84は傾き=+1を有する
(v) エッジ92は傾き= 0、エッジ94は傾き=0を有する
(vi) エッジ92と94はそれぞれ70線の走査が続く
上記の命令ストリーム14、エッジ情報15とその各々がその中で表現される方法の例から、図8の画像78について、画素位置(X)と走査線値(Y)は画像78が描画される個々の出力スペースを定義していることが理解されよう。その他の出力スペースの設定は、しかし、本発明の情報開示による原理を使うことによって実現可能になる。
図8はラスタ画像の画素データを含んでいない、従って、この特性については後述するが、ディスプレイリスト13のストア16には何も格納する必要がない。
ディスプレイストア13は画素順次描画装置20によって読み取られるが、これは一般的には集積回路として実施される。画素順次描画装置20は、ディスプレイリストを、別のデバイス、例えば、プリンタ、表示機、或いはメモリストアに転送可能な、ラスタ画素のストリームに変換する。
好ましい実施態様では、画素順次描画装置20を集積回路として記述しているが、それは、ホストプロセサ2のような汎用プロセサ上で実行される、相当するソフトウエアモジュールとして実施することも可能である。
図3は、画素順次描画装置20、ディスプレイリストストア13、一時描画ストア30の機器構成を示している。画素順次描画装置20の処理ステージ22は、指示実行器300、エッジ処理モジュール400、優先度決定モジュール500、最適化モジュール550、フィルカラー決定モジュール600、画素合成モジュール700、及び画素出力モジュール800を備えている。処理動作は一時ストア30を使用するが、それは上記に注書きしたように、ディスプレイリストストア13と同じようなデバイス(例えば磁気ディスク或いは半導体RAM)を共用するか、またはスピード最適化の理由から、個々のストアとして実施することもできる。エッジ処理モジュール400は、エッジレコードストア32を、走査線を次々と繰り越すエッジ情報を維持するために使用する。優先度決定モジュール500は、優先度特性状態テーブル34を各優先度情報と走査線の描画中のエッジ交点に関する各優先度の現状を維持するために使う。フィルカラー決定モジュール600は、フィルデータテーブル36を、特定位置に在る特定優先度のフィルカラーを決定するために要求される情報を維持するために使う。画素合成モジュール700は、画素合成スタック38を、カラーが多くの優先度からその値を決定するために要求される出力画素の決定を行う間、中間結果を維持するために使う。
上に詳細に説明したディスプレイリストストア13とその他のストア32〜38は、RAM或いはその他の任意のデータ記憶技術を使っても実施することが可能である。図3の実施態様に示された処理ステップは、処理パイプライン22の形態をとっている。この場合、そのパイプラインのモジュールは、画像データの異なる部分を、以下に述べるように、両者間に流れる命令と並行して一度に実行できる。別の実施態様では、以下に述べる各命令は、川下のモジュールが命令の処理を終了するまで、川上の処理を一時停止して川下のモジュールに行われる、同期化された転送制御の形態をとることができる。
3.1 命令実行機の概要
命令実行機300は、命令ストリーム14から命令を読み取り処理して、その命令を、出力398を通じ、パイプライン22内の他のモジュール、400、500、550、600、700に転送するメッセージにフォーマット化する。本発明の好ましい実施態様では、その命令ストリーム13には、次の命令を含むことができる。
LOAD_PRIORITY_PROPERTIES:この命令は、優先度特性状態テーブル34にロードされるデータと、そのデータがロードされるそのテーブル内のアドレスに結び付けられている。この命令が命令実行機300に出会うと、命令実行機300は、優先度特性状態テーブル34内の指定位置に、そのデータの格納メッセージを送り出す。これは、このデータを含むメッセージをフォーマット化し、それを処理パイプライン22の川下の、格納動作を実行する優先度決定モジュール500に渡すことで成し遂げられる。
LOAD_FILL_DATAフィルデータロード:この命令は、フィルデータテーブル36にロードされるオブジェクトに結び付いたフィルデータと、そのデータがロードされるテーブル内のアドレスに結び付いている。この命令が命令実行機300に出会うと、命令実行機300は、フィルデータテーブル36の指定アドレスに、そのデータを格納するためのメッセージを送り出す。これは、このデータを含んでいるメッセージをフォーマット化し、それを、処理パイプライン22川下の、格納動作を実行するフィルカラー決定モジュールに渡すことによって成し遂げられる。
LOAD_NEW_EDGES_AND_RENDER:この命令は、次の走査線が描画されると描画処理に呼び出される、新エッジ15のディスプレイリストストア13内のアドレスと結び付いている。この命令が命令実行機に受け取られると、命令実行機300はこのデータを含むメッセージをフォーマット化し、それをエッジ処理モジュール400に渡す。エッジ処理モジュール400は、エッジレコードストア32に新エッジのアドレスを格納する。その指定されたアドレスでのエッジは、それらの開始走査線との交点座標上で、次の走査線が描画される前にソートされる。別の実施態様では、それらは画素順次描画装置20によってソートされる。
SET_SCANLINE_LENGTH:この命令は、各描画済み走査線内に生成される画素数と結び付いている。この命令が命令実行機300に受け取られると、命令実行機300は、その値をエッジ処理モジュール400と画素合成モジュール700に渡す。
SET_OPACITY_MODE:この命令はフラグに結び付いており、画素合成演算が不透明度チャネル(アルファチャネルとしても周知の技術)を使用するかどうかを表示する。この命令が命令実行機300に受け取られると、命令実行機300はそのフラグ値を画素合成モジュール700に渡す。
SET_BUF:この命令は、画素順次描画装置20によって使われている外部メモリバッファのアドレスを設定する。少なくとも、エッジ処理モジュール400の入力、出力、及びスピルバッファは、外部記憶装置に格納されることが好ましい。
命令実行機300は、典型的に、命令をマップし、それらを各種のモジュールに渡すため、パイプライン動作にデコードする、マイクロコード状態遷移機械によって作られる。代替的には相当するソフトウエア処理を使うこともできる。
3.2 エッジトラッキンッグモジュールの概要
図4についてエッジ処理モジュール400の走査線描画中の動作を説明する。走査線描画の最初の条件は、エッジレコードの三つのリストが使用可能であることである。これらのリストのどれか又はすべてが空白であることもある。これらのリストとは、エッジ情報15から取得されLOAD_NEW_EDGES_AND_RENDER命令によって設定された新エッジを含む新エッジリスト402、前の走査線から繰り越されたエッジレコードを含む主要エッジリスト404、及び前の走査線から繰り越されたエッジレコードをもまた含むスピルエッジリスト406である。
今度は図12Aに転じ、そのようなエッジレコードのフォーマット示すと、それは次を含んでいる。
(i) 現在の走査線交点座標(ここではX座標と呼ぶ)
(ii) このエッジの現在セグメントに何本の走査線が続く(ある種の装置ではこ
れはYリミットとして表示されることがある)かのカウント(ここでNYと呼ぶ)、
(iii) このエッジレコードのX座標に、各走査線の後ろに加算される値(ここで
はDXと呼ぶ)、
(iv) 優先度番号(P)或いは優先度番号リストに対するインデクス(P)
(v) リスト内の次エッジセグメントのアドレス(addr)、
(vi) p、o、u、c、dとマーク付けされた幾つかのフラグ。フラグdはエッジがクリッピンッグカウンタかフィルカウンタのどちらを動かすかを決める。フラグuはフラグカウンタがエッジによって増分されるか減分されるかを決定する。残りのフラグは、本発明に必須ではないので、これ以上の説明は省略する。
そのようなフォーマットは、ベクトルと直交配列エッジを収容することができる。そのフォーマットはまた、ここでDDXと呼ばれる更なるパラメタもまた含むことができ、それは、このエッジレコードのDX値に各走査線の後に加算される値である。後者は二次曲線から成るエッジの描画を可能にする。更なるパラメタ、例えばDDDX、を加えれば、そのような実施態様が三次曲線に対応するようにすることもできる。幾つかのアプリケーションでは、三次ベジェスプライン曲線、6項多項式(すなわちDDDDDDXまでの)のようなものが要求されることもある。フラグ(u)は、エッジによって、巻上げカウントを増分するか又は減分するかを指示する。巻上げカウントはフィルカウンタ内に格納され、現在走査中の画素が、問題のオブジェクトの内側か外側のどちらに入るかを判定する。図8Aのエッジ84と94の例では、走査線20に対応するエッジレコードは、図8Bのテーブルに示したように読み取ることができる。
この説明において、描画処理によって生成されつつある走査線に沿って画素から画素へステップする座標は、X座標と呼び、走査線から走査線へとステップする座標はY座標と呼ぶ。各エッジリストはゼロかそれを超えるレコードをメモリ内に隣接して含んでいることが好ましい。ポインタチェーンの使用を含む、他の記憶装置による実施態様も可能である。三つのリスト、402、404及び406内の各レコードは、走査線の交点(X)座標順に並べられている。これは、典型的には、エッジ情報を含めてメッセージを受け取るエッジ入力モジュール408によって最初に管理されながら、命令実行機300からソート処理によって取得することができる。ソート条件を、各走査線交点座標の整数部分だけが有効とみなすように緩めることは可能である。また、ソート条件を更に、各走査線交点座標を、現在の描画処理によって生成される最小と最大のX座標にクランプ留めするように緩めることもできる。適切な場合は、エッジ入力モジュール408は、パイプライン22の川下にある、モジュール500、600及び700に、出力498経由でメッセージをリレーする。
エッジ入力モジュール408は、三つのリスト、402、404、406のそれぞれに対する参照を維持しており、それらからエッジデータを受け取る。これらの各参照値は、走査線の処理開始点の各リストの最初のエッジを参照するように初期設定されている。その後は、エッジ入力モジュール408は、三つの参照されたエッジレコードの一つから、選択されたレコードが三つの参照レコードの中で最小のX座標を持つものであるように、エッジレコードを選択する。もし、二つ以上のXレコードが等しいときは、それぞれはどの様な順序で処理されてもよく、対応するエッジ交点は次の方法で出力される。そのレコードを選択するのに使われたその参照値は、それからそのリストの次のレコードに進められる。いま選択されたばかりのエッジは、メッセージにフォーマット化され、エッジ更新モジュール410の一つに送られる。また、そのエッジの或るフィールド、特に現在のX、優先度番号と方向フラグは、メッセージにフォーマット化され、優先度決定モジュール500に、エッジ処理モジュール400の出力498として転送される。実施態様としては、ここに説明されたものより数の多い或いは少ないリストを使用することも可能である。
エッジを受け取ると、エッジ更新モジュール410は、何本の走査線が現在セグメントに続くかのカウントを減分する。もし、そのカウントがゼロに到達すると、新セグメントが次セグメントアドレスによって指示されたアドレスから読み取られる。セグメントは、
(i) そのセグメントが読み取られたら、現在のX座標に直ぐ加算する値
(ii) そのエッジに対する新しいDX値
(iii) そのエッジに対する新しいDDX値
(iv) その新セグメントに何本の走査線が続いているかの新しいカウントを特定することが好ましい。
もし、次のセグメントが指示されたアドレスでなければ、そのエッジではそれ以上の処理は行われない。そうでなければ、エッジ更新モジュール410は、エッジの次走査線のX座標を計算する。これは一般的に、現在のX座標値をとり、それにDX値を加算することで行われる。DX値は、取り扱われているエッジタイプが適切であれば、それにDDX値を加えてもよい。エッジは次に、二つ以上のエッジレコードの配列であるエッジプール412の空いているスロットのどれかに書き込まれる。もし、空いたスロットが無ければ、エッジ更新モジュール410はスロットが使えるようになるのを待つ。エッジレコードがエッジプール412に書き込まれると直ちに、エッジ更新モジュール410は、416経由でエッジ出力モジュール414に、新しいエッジがエッジプール412に加えられたとの信号を送る。
走査線の描画のための初期条件として、エッジ出力モジュール414は、次の主エッジリスト404’と次のスピルエッジリスト406’のそれぞれに対する参照を持っている。これらの参照のそれぞれは、最初は空白の、リスト404’と406’が築き上げられる場所に初期設定されている。エッジプール412にエッジが加えられたことの信号416を受け取ると、エッジ出力モジュール414は、加えられたばかりのエッジが、次の主エッジリスト404’(もしあれば)に最後に書き込まれたエッジよりも小さいX座標値を持っているかどうかの判定を行う。もし、これが真ならば、そのエッジは、主エッジリスト404に順序付け基準を犯すことなく追加できないので、「スピル」が生じたといわれる。スピルが生じると、好ましくはソートされた次のスピルエッジリスト406’を維持する方法で、エッジは次のスピルエッジリスト406’に挿入される。例えば、これは挿入ソーティングルーチンを使用して達成できる。何かの実施態様では、そのスピルは、極端に大きなX座標値のような、その他の条件によって生じることがある。
もし、エッジプール412に加えられたエッジが、次の主エッジリスト404’(もしあれば)に書き込まれた最後のエッジより大きいか等しいX座標値をもっており、かつエッジプール412内に未使用のスロットがなければ、エッジ出力モジュール414はエッジプール412から最小のX座標値をもつエッジを選び、そのエッジを処理中に拡張しながら次の主エッジリスト404’に加える。エッジプール412内のそのエッジによって占められたスロットはそこでフリーであるとのマーク付けが行われる。
いったん、エッジ入力モジュール408が、その入力リスト402、404と406の三つすべてからすべてのエッジを読み取り転送を終えれば、それは、走査線の最終が到達されたというメッセージをフォーマット化し、優先度決定モジュール500とエッジ更新モジュール410の双方に送る。そのメッセージを受け取ると、エッジ更新モジュール410は、それが今実行中の処理の終了を待ち、それからそのメッセーをエッジ出力モジュール414に転送する。そのメッセージを受け取ると、エッジ出力モジュール414は、残りすべてのエッジレコードをエッジプール412から次の主エッジリスト404’にX座標順に書き込む。その後、次の主エッジリスト404’と主エッジリスト404への参照は、エッジ入力モジュール408とエッジ出力モジュール414間で交換され、類似の交換が次のスピルエッジリスト406’とスピルエッジリスト406に対して実行される。このようにして、次に続く走査線の初期条件値が設定される。
次のスピルエッジリスト406’を、そこへのエッジレコードの挿入後直ちにソートするよりも、そのようなエッジレコードは、単にリスト406’に加え、現在のスピルリスト406への交換が次の走査線のエッジラスタ化中にアクティブになる前に、リスト406’を最終走査線でソートさせることもできる。
上記から、エッジ交差メッセージは優先度決定モジュール500に走査線と画素順に送られ(つまり、それらは先ずY上、次いでX上に順序付けられる)、各エッジ交差メッセージはそれが該当する優先度でラベル付けがなされていることが推論できよう。
図12Aは、エッジ処理モジュール400によって、エッジのセグメントが受け取られたとき創生される、アクティブエッジレコード418の具体的な構造を示している。もし、エッジの最初のセグメントがステップ(直交)セグメントのときは、最初のセグメントがアクティブ化されたエッジのX位置を取得できるよう、エッジのX値は「X-step」と呼ばれる変数に加算される。そうでなければ、エッジのX値が使用される。Xstep値はエッジのセグメントデータから取得され、その次のセグメントエッジレコードのX位置を取得するために、次のセグメントのXedge値にいったん加算される。これは新しいエッジレコード内のエッジはXedge+Xstepによってソートされるということを意味する。最初のセグメントのXstepは従って、エッジのソートを簡単化するためにゼロとするのが良い。最初のセグメントのY値はアクティブエッジレコード418のNYフィールドにロードされる。アクティブエッジのDXフィールドは、ベクトル又は二次セグメントのDXフィールド識別器からコピーされ、ステップセグメントのためにゼロに設定される。図12Aに見られるuフラグは、セグメントが上方向き(図13Aに関する説明を参照)であれば設定される。dフラグはエッジが直接のクリッピングオブジェクトとして使われた場合に、対応するクリッピングレベルなしに設定され、閉曲線に適用される。セグメントの実際の優先度レベル或いはレベルアドレスは、新エッジレコードの対応するフィールドからアクティブエッジレコード418のレベルフィールドにコピーされる。セグメントリストの次のセグメントのアドレスは、新エッジレコードの対応するフィールドから、アクティブエッジレコード418のセグメントアドレスフィールド(segment addr)にコピーされる。セグメントアドレスは、エッジレコードの終りを指示するためにもまた使用することができる。
図12Aから、他のデータ構造でも実施は可能であり、必要であること、例えば、多項式による実行が使われる場合、が理解されよう。一つの代替データ構造においては、「segment addr」フィールドはセグメントリスト内の次のセグメントのアドレスであるか、セグメントが二次式であれば、セグメントDDX値からコピーされたものかのどちらかである。後者の場合は、データ構造はセグメントが二次式セグメントであれば設定されるqフラグを持ち、そうでなければクリアされる。更なるバリエーションとして、セグメントのアドレスとDDXフィールドは、異なるフィールドに区分でき、代替的実施法の条件を満たすために、追加のフラグが提供される。
図12Bは上記の実施態様中のエッジレコードの機械でエッジ処理モジュール400に使用されているものを示している。新しいアクティブエッジレコード428、現在のアクティブエッジレコード430とスピルアクティブエッジレコード432はエッジプール412を補完するものである。図12Bに見られるように、レコード402、404、406、404’及び406’は、或る一回に描画されているエッジの数によって動的にサイズを変動する。各レコードは限界値を含み、それは新エッジリスト402の例では、LOAD_EDGES_AND_RENDER命令に組み込まれたSIZE値によって決定される。そのような命令に出合うと、SIZEはチェックされ、もし非ゼロであれば、新エッジレコードのアドレスがロードされ、リスト402、404、406、404’及び406’のそれぞれのサイズを限る限界値が計算される。
好ましい実施態様例では配列と対応するエッジレコードを取り扱うのためのポインタを使用しているが、他の例えば連結リストのような実施法も使用することができる。他の実施法はハードウエアでもソフトウエアベースでも或いはそれらの組合せでも構わない。
図8Aに示した画像78の具体的描画を次に、図10に示した走査線34、35、36関連して説明する。この例では、次の走査線に対応する新X座標の計算は、図12C〜12Iでは、エッジポール412のレジスタ428、430、432の一つから取り出された出力エッジ交差の表示について議論の正確性を期すため省略してある。
図12Cは、上記の走査線34の描画(半透明青色三角形80の頭部)終了時におけるリストの状態を示している。走査線34においては新しいエッジはなく、したがってリスト402は空白白であることに注意されたい。主エッジリスト404と次の主エッジリスト404’のそれぞれは、エッジ82と84のみを含んでいる。リストのそれぞれは、対応するポインタ434、436、440を備え、走査線34が完了すれば、対応するリスト中の次の空白レコードを指示する。リストはまた、限界値ポインタ450を含んでおり、対応するリストの終わりをポイントするのに要求される、アステリスク(*)記号によって示されている。もし連結リストが使われていたなら、連結リストが対応する機能を実行する空白ポインタの終結指示器を含んでいるので、そのようなものは要求されなかっただろう。
上に触れたとおり、各走査線の開始点で次の主エッジリスト404’と主エッジリスト404は交換され、新エッジが新エッジリストの内に受け取られる。残りのリストはクリアされ、ポインタのそれぞれは各リストの最初の内容メンバに設定される。走査線35の開始に対して、好ましい実施態様ではそのとき図12Dに見られるように現れる。図12Dに明らかなように、そのレコードは図10から、エッジ92、94、84及び82に対応していると見られる、四つのアクティブエッジを含んでいる。
今度は、図12Eについて説明すると、描画が始まると、新エッジレコード402の最初のセグメントはアクティブエッジレコード428にロードされ、主エッジリスト404とスピルエッジリスト406の最初のアクティブエッジレコードはそれぞれレコード430と432にコピーされる。この例では、スピルエッジリスト406は空白であり、従って何のロードも行われない。レコード428、430、432内のエッジのX位置が次に比較され、最小のX位置を持つエッジにエッジ交差が出力される。この場合は、発生エッジは、エッジ92に対応するその優先度値と共に出力される。ポインタ434、436、438は次にリストの次のレコードに向けて更新される。
エッジ交差が出力されたエッジは、次に更新され(この場合はその位置にDX=0を加算して)、エッジプール412に、この例では、三つのエッジレコードを維持するために、更新され、バッファーされる。そこから出力されたエッジが立ち上がるリスト(この例ではリスト402)の次の記入欄は対応するレコード(この例ではレコード428)にロードされる。これが図12Fに見られる。
更に、図12Fから明らかなように、レジスタ428、430、432間の比較は、次の適切なエッジ交差(X=85,P=2)として出力される最小X値を持つエッジを再び選択する。加えて、選択された出力エッジは更新され、エッジプール412に加えられ、すべての適切なポインタは増分される。この場合更新された値はX ← X + DXで与えられ、84 = 85 - 1として評価される。同じく見られるように、新エッジポインタ434がこの例では新エッジリスト402の最後に移される。
図12Gにおいて、最小の現在X値を持っていると識別された次のエッジは、再びエッジ交差(X = 115, P = 2)として出力される、レジスタ430から取得されたその値である。そのエッジの更新は、示されたように、エッジプール412に加えられる値と共に再び生じる。今回は、エッジプール412は満杯で、そこから最小のX値を持つエッジが選択され、出力リスト404’に出力され、対応する限界ポインタがそれに従って移動されるのが分かる。
図12Hに見られるように、次の最低のエッジ交差はレジスタ428からのそれで、出力は(X=160 P=1)になる。エッジプール412は再び更新され、次に小さいX値が出力リスト404’に向かって出力される。
走査線35の最終で、図121に見られるように、エッジプール412の内容は出力リスト404’に最小X値の順に洗い流される。図12Jに見られるように、次の主エッジリスト404’と主エッジリスト404は、次の走査線36の描画を見込んで、それらのポインタを交換することにより交換される。交換後、図12Jから主エッジリスト404の内容がX位置の順に並んだ走査線36上にある全てのエッジを含んでおり、それによって描画を容易にするそれらの便利なアクセスを許していることが見られる。
通常は、新しいエッジはエッジ処理モジュール400によってX位置の増加順に受け取られる。新エッジが到着すると、その位置が更新され(次に描画される走査線のために計算される)、これは次の更なるアクションを決定する。
(a) 更新位置が線498上の最後のX位置の出力以下であれば、新エッジは主スピルリスト406に挿入分類され対応する限界レジスタが更新される
(b) そうでなければ、もしスペースがあれば、それはエッジプール412の中に維持される。
前記から明らかなように、エッジプール412はリストの更新を次のラスタ化された走査線を見込んで整然と助けている。更に、エッジプール412のサイズはより多くの順序付けられていないエッジに対応するため変動できる。しかし、エッジプール412は実際上は、一般的には処理スピードと画像処理システムに使える記憶容量によって、限界を持つことが理解されよう。極限の意味では、通常ならば次の出力エッジリスト404’に挿入分類されるための更新されたエッジを要求するエッジプール412は省略することができる。しかし、好ましい実施態様では、上記のスピルリストの使用を通じる通常の発生事態としては、この状況は避けられている。スピルリストの準備は好ましい実施態様を実際的なサイズのしかしかなり複雑なエッジ交差をソフトウエア集約的なソート手順に頼ることなく実施することを可能にしている。エッジプールとスピルリストが共に複雑なエッジ交差に十分対応できない例は少ないが、それらの場合はソート法を使うことができる。
スピルリスト手順が何処で使用されるかが、三つの任意のエッジ60,61,63が任意のエッジ62と走査線AとB間の相対位置で交わっている例を図14Aに示す。更に実際に表示された走査線A,Bのそれぞれに対する画素位置64が示されており、それは画素位置をCからJにまたがっている。上記の例では、エッジプール412が三つのエッジレコードを維持するために、そのような実施態様だけでは、図14Aに示された隣接する走査線間に生じる、三つのエッジ交点を収容するには不十分であることが明白である。
図14Bは走査線上のエッジ60,61,63描画後のエッジレコードの状態を示している。エッジ交差Hは最新の発生例でありエッジプール412は次の走査線、線Bに対して更新されたそれぞれエッジ60,61,63に対応するX値、E,G,Iで満杯である。エッジ62は現在アクティブなエッジレコード430にロードされエッジプール412が満杯なので、エッジ60に対応する、最低のX値が出力エッジリスト404’に出力されている。
図14Cでは、次のエッジ交差が出力され(X=Jエッジ62に対し)、対応する更新値、この例では走査線Bに対してX=C、が決定されている。最新更新値X=Cが、出力リスト404’にコピーされた最近値X=Eより小さいので、現在のエッジレコードとその対応する新更新値は出力スピルリスト406’に直接転送される。
図14Dは走査線Bの始まりで、主要及び出力リストとそれらの対応するスピル構成要素が交換されているのが見られるエッジレコードの状態を示している。最初に出力されたエッジを決定するため、エッジ60が現在アクティブなエッジレジスタ430にロードされ、エッジ62がスピルアクティブなエッジレジスタ432にロードされる。X値は比較され、最小のX値(X=C)を持つエッジ62が出力され、更新され、エッジプール412にロードされる。X値は比較され、最小のX値(X=C)を持つエッジ62が出力され、更新され、そしてエッジプール412にロードされる。
エッジの発生と更新は主エッジリスト404の残っているエッジに対して続けられ、走査線の最終で、エッジプール412は図14Eに示された状況を顕すために流しだされる。そこではエッジ60から63のそれぞれが次の走査線上の描画のために、適切に整列されていること、正しく出力され走査線B上に描画されているのが見られる。
前記から明らかなように、スピルリストは、複雑なエッジ交差状況が存在するときは、エッジのラスタ化順序を維持することを可能にする。更に、リストのサイズがダイナミックに変動することから、エッジ交点数の大きな変化と複雑性は、例外的に複雑なエッジ交点を除くすべての場合に、ソート手順の必要なく、取り扱うことができる。
好ましい実施態様では、エッジプール412は八つのエッジレコードを維持するためにサイズ調整され、リスト404、404’はそれぞれのスピルリスト406、406’と共に512バイトの基準サイズ(最低)を持っており、ダイナミックに変動し、それによって複雑なエッジ交差要求を有する大きな画像を扱うのに充分な範囲を供給する。
3.3 優先度決定モジュールの概要
図5に関して、今度は、優先度決定モジュール500の動作を説明する。優先度決定モジュール500の主要機能は、現在走査中の画素に対して寄与するオブジェクトを決定し、それらの寄与オブジェクトをそれらの優先度レベルに従って整列し、画素合成モジュール700に命令するカラー合成メッセージを生成し、現在の画素に対して要求されるカラーと不透明度値を生成するため、順序付けられたオブジェクトを合成することである。
優先度決定モジュール500は、エッジ処理モジュール400から入力メッセージ498を受け取る。これらの入力メッセージは、load priority data message、load fill data message、edge crossing message、end of scanline messageを含むことができる。これらのメッセージは、優先度更新モジュール506によって読み取られる前に、入力順出力(FIFO)バッファー518を通過する。そのFIFOバッファー518は、エッジ処理モジュール400と優先度決定モジュール500の動作の連結解除の働きをする。FIFO518は、エッジ処理モジュール400からの受け取りが可能で、エッジ交差の全走査線を一回の働きで転送できるよう、サイズ調整されるのが好ましい。そうすることは、優先度決定モジュール500に、同一画素(X)位置での多数のエッジ交差を、正しく取り扱うことを可能にする。
優先度決定決定モジュール500は、優先状態テーブル502と優先度データテーブル504へのアクセス向きに適合されている。これらのテーブルは各優先度の情報を維持するために使用される。優先度状態と優先度データテーブル502と504は、図3が示すように、一つのテーブル34に統合されることが好ましい。代替的には、これらのテーブル502、504は別個に維持できる。
優先度特性状態テーブル34は、図18に示されているように、優先度レベル毎に、少なくとも次のフィールドを含んでいることが好ましい。
(i) この優先度が、偶数・奇数フィルルール又は非ゼロ巻上げルールの適用によって内部対外部の状態を判定するか否かを指示するフィルルールフラグ(FILL_RULE_IS_ODD_EVEN)、
(ii) この優先度が交差される都度、フィルルールによって指示された方法で修正される、現在のフィルカウントを格納するためのフィルカウンタ(FILLCOUNT)、
(iii) この優先度がクリッピング又はフィリングに使用されるか否かを指示するクリッパフラグ(CLIPPER)、
(iv) クリッパフラグセットを有するエッジに対し、そのクリッピングタイプが「クリップイン」か「クリップアウト」のどちらかを記録するクリップタイプフラグ(CLIP_OUT)、
(v) 現在のクリップカウントを、この優先度を果たすクリップインタイプ域が入
場・退場された時、この優先度を果たすクリップアウトタイプ域が入場・退場された時増減される、クリップカウンタ(CLIP_COUNT)、
(vi) この優先度が「要下位」と呼ぶその下位優先度レベルの計算を先に
要求するか否かのフラグ(NEED_BELOW)、
(vii) この優先度のフィルが格納されているアドレスを指示するフィルテーブル
アドレス(FILL_INDEX)、
(viii) フィルタイプ(FILL_TYPE)、
(ix) ラスタ演算コード(COLOR_OP)、
(x) 三つのフラグ、(LAO_USE_D_OUT_S,LAO_USE_S_OUT_D, LAO_USE_S_ROP_D)から成るアルファチャネル演算コード(ALPHA_OP)、
(xi) スタック演算コード(STACK_OP)、
(xii) この優先度のカラーが、与えられたYに対して、一定か否かを記録するここでは[x-independent]フラグと呼ぶフラグ(X_INDEPENDENT)、(xiii) 他の優先度についての情報(ATTRIBUTES)。
クリッピングオブジェクトは周知の技術であり、或る特定の新オブジェクトを表示するためではなく、画像内の別オブジェクトの形を修正するための働きをする。クリッピングオブジェクトは各種の視覚効果をあげるため点滅することもまたできる。例えば、図8Aのオブジェクト80は、クリッピングオブジェクト80の優先度下位にあるオブジェクト90のその部分を除くため、オブジェクト90上で働くクリッピングオブジェクトとして配置することができる。これは、クリッピングの境界内で、他の方法ではオブジェクト90の不透明度によって被覆される、オブジェクト90の下位にある任意のオブジェクト若しくは画像を顕示させる効果を持つことができる。CLIPPERフラグは、優先度がクリッピングオブジェクトであるか否かを識別するために使われる。また、CLIPフラグは優先度がクリップインかクリップアウトかを、CLIP COUNTはFILL COUNTと同じような方法で現在の画素がクリップ域の内側にあるか否かを判定するために使用される。
図13Aと13Bは、オブジェクトを活性化するための、偶数奇数と非ゼロ巻上げルールを実演している。使用される適切なルールはフィルルールフラグFILL_RULE_IS_ODD_EVENにより決定される。
非ゼロ巻上げルール上、図13Aは、オブジェクト70のエッジ71と72が、エッジがそれぞれ下向きか上向きかに応じて、どうやって理論的な方向を割り当てられるかを図解している。閉境界を作るため、エッジは境界の周りに数珠つなぎにつながっている。フィルルール(追って適用し説明される)上、エッジに与えられる方向はセグメントが定義される順序とは独立である。エッジセグメントは、それらが追跡される順に、描画の方向に対応しながら定義される。
図13Bは、二つの下向きエッジ73と76、並びに三つの上向きエッジ74、75、77を有する単体のオブジェクト(星型五角形)を示している。偶数奇数ルールは、各エッジが問題の走査線によって交差されるとFILLCOUNT内に2進値を単にトグル付けし、そのようにして、効果的にオブジェクトのカラーを点(活性化)・滅(不活性化)することによって動作する。非ゼロ巻上げルールは、交差されているエッジの方向に左右されるフィルカウンタFILLCOUNTに、格納された値を増減分する。図13Bでは、最初の二つのエッジ73と76は走査線に出会ったとき下向きであり、従ってこれらのエッジの横断線はフィルカウンタをそれぞれ+1、+2に増分する。走査線に出会った次の二つのエッジ74と77は上向きであり、従ってフィルカウントFILLCOUNTをそれぞれ+1,0減分する。非ゼロ巻上げルールは、フィルカウンタFILLCOUNTがゼロでなければ、オブジェクトのカラーを点じ(活性化する)、フィルカウンタFILLCOUNTがゼロであれば、オブジェクトのカラーを滅する(非活性化する)ことによって動作する。
優先度のためのNEED_BELOWフラグは、ドライバソフトによって立てられ、画素生成システムに、問題の優先度以下のアクティブ優先度はいずれも、そのフラグが設定されていない限り、描画中の画素に寄与しないことを伝えるために使われる。そのフラグは、適切な場合、最終結果の画素値に他には何ら寄与しない余計な合成演算を防止するためクリアされる。
ラスタ演算コード(COLOR_OP)、アルファチャネル演算(ALPHA_OP)及びスタック演算(STACK_OP)は一緒に、優先度がアクティブで描画されているとき、各画素上で画素合成モジュール700によって実行される、画素動作(PIXEL_OP)を形成する。
テーブル34に内蔵されている情報のほとんどは、ドライバソフトからの命令によってロードされることが好ましい。特に、フィルルールフラグ、クリッパフラグ、クリップタイプフラグと要下位フラグ、フィルテーブルアドレス、フィルタイプ、ラスタ演算コード、アルファチャネル演算コード、スタック演算コード、X独立フラグ、その他の属性、はこのような方法で取り扱われることが好ましい。一方、フィルカウンタとクリップカウンタは初期値がゼロであり、優先度決定モジュール500によって、エッジ交差メッセージに対応して変更される。
優先度決定モジュール500は、優先度がもしその画素がその優先度に適合する境界エッジの内側にあれば、その画素に対するフィルルールとその優先度に対するクリップカウントに従って、優先度は或る画素でアクティブであると判定する。優先度は、もしそれが最上位のアクティブ優先度であるか、又はそれより上のすべてのアクティブ優先度が、それらの対応する要下位フラグを有していれば描画される。このようにして画素値は、描画された優先度のフィルデータだけを使用して、生成することができる。オブジェクトの優先度は、オブジェクトの位置(即ちレベル)を、最後列から最前列の順に指定することに注目することが重要である。同一のフィルと合成演算を有する、オーバーラップせずかつ隣接するシーケンスを形成するオブジェクトは同一優先度を有すると指定されることが好ましい。これは、フィルテーブル内のメモリスペースを効果的に節約する。更に、オブジェクトの対応するエッジレコードは、対応するフィルと合成演算を参照するのに、対応する優先度だけを参照すれば済む。
さて図5に戻ると、優先度更新モジュール506は、それまでに処理を終えた走査線の交点座標までを記録しているカウンタ524を維持している。これは、優先度更新モジュール506の現在Xと呼ばれる。走査線の開始の初期値はゼロである。
FIFO518の始めで受け取られたエッジ交差メッセージを調べ、優先度更新モジュール506はその現在X値とエッジ交差メッセージ内のX交点値を比較する。もし、エッジ交差メッセージ内のX交点値が優先度更新モジュール506の現在X値と等しいか小さければ、エッジ交差メッセージを処理する。エッジ交差メッセージ処理は二つのフォームで行われ、「通常エッジ処理」(以下に説明)は、エッジ交差メッセージの中に、優先度によって指示された結合テーブル34の優先度状態テーブル502のレコードがこれはクリッパ優先度ではないというクリッパフラグを有していれば使用され、そうでなければ「クリップエッジ処理」(以下に説明)が実行される。
「通常エッジ処理」は、エッジ交差メッセージとその優先度によって指示される結合テーブル34のレコードフィールドに対し、
(i) 現在優先の現在フィルカウントに注目しつつ、
(ii) (a)もし現在優先度値のフィルルールが偶数・奇数であれば、フィルカウントをその現在値がゼロでなければゼロと設定、そうでなければそれに任意の非ゼロ値を設定するか
(b) もし現在優先度値のフィルルールが非ゼロの巻き上げであれば、フィルカウントを増減分(エッジ方向フラグに応じて)し、そして
(iii) 新フィルカウントを注目されたフィルカウントと比較し、もし一方がゼロで他方が非ゼロであれば、「アクティブフラグ更新」(以下に説明)動作を現在の優先度上に実行する、ステップを含んでいる。
幾つかの実施態様では、各エッジ交差メッセージの中に複数の優先度を置くよりも、各優先度に対し、別のエッジ交差メッセージを使用することもある。
アクティブフラグ更新動作は、第1に、現在の優先度に対し新アクティブフラグを立てることを含んでいる。アクティブフラグは、もしその優先度状態テーブル502内の優先度のフィルカウントが非ゼロで、優先度のクリップカウントがゼロであれば非ゼロであり、そうでなければ、アクティブフラグはゼロである。アクティブフラグ更新動作の第2ステップは、決定されたアクティブフラグを、アクティブフラグ配列508に、現在優先度によって指示された位置に格納し、それから、もし優先度状態テーブル内の現在優先度値に対して要下位フラグがゼロであれば、不透明アクティブフラグ配列510内の、現在優先度によって指示された位置にもまた格納することである。
「クリップエッジ処理」は、エッジ交差メッセージ内の最初の優先度によって指示される優先度状態テーブルレコードのフィールドに関して、
(i) 現在の優先度のフィルカウントに注目し、
(ii) (a)もし、現在優先度値のフィルルールが偶数・奇数であれば、フィルカウントを、現在非ゼロであればゼロに設定し、それ以外であればそれを任意の非ゼロ値に設定するか、
(b) もし、現在優先度値のフィルルールが非ゼロ巻き上げであれば、フィルカウントを増減分(エッジ方向フラグに応じて)するかのどちらかをし、そして
(iii) 新フィルカウントを注目されたフィルカウントと比較し、クリップデルタ値を
(a)もし、新フィルカウントと注目されたフィルカウントの両方がゼロか、又は新フィルカウントと注目されたフィルカウントの両方が非ゼロであれば、ゼロ値に、
(b) もし、現在優先度のクリップタイプフラグがクリップアウトで注目されたフィルカウントがゼロでかつ新フィルカウントが非ゼロ、又は現在優先度のクリップタイプフラグがクリップインで注目されたフィルカウントが非ゼロでかつ新フィルカウントがゼロであれば、プラス1に、どちらでもなければ、
(c) マイナス1に、設定し、そして
(iv) エッジ交差メッセージの最初に続く優先度の個々に対し、その後続する優先度によって指示された、優先度状態テーブル内のレコードのクリップカウントに決定されたクリップデルタ値を加算し、もし、クリップカウントが非ゼロからゼロに、又はゼロから非ゼロに動いていれば、アクティブフラグ更新動作を、上記のように、その後続する優先度上に実行するステップを含んでいる。各クリップカウントの初期値は前記のLOAD_PRIORITY_PROPERTIES命令によって設定されていることに注目されたい。クリップカウントは、典型的にクリップイン優先度の番号に初期設定されており、それは各優先度に影響を与える。
幾つかの実施態様では、優先度をクリップと結び付ける代わりに、エッジ交差メッセージ内に与えられる、すべての優先度のクリップカウントを直接に増減分する。この技法は、例えば、クリップの形が単純で複雑なフィルルールの適用を要求しないときに使用することができる。この特定の適用業務においては、エッジによって制御されるレベルのクリップカウントは、上向きのエッジに対して増分されるか、又は下向きのエッジに対して減分される。時計針の逆順に描かれた単純な閉曲線はクリップイン、時計針の正順に描かれた単純な閉曲線はクリップアウトの働きをする。
エッジ交差メッセージ内のX交点値が優先度更新モジュール506の現在のX値より大きいときは、優先度更新モジュール506は、エッジ交差メッセージ内のX交点値と現在X間の差異である何画素生成するかのカウントを形成し、このカウントを優先度生成メッセージにフォーマット化し、接続520経由で、優先度生成モジュール516に送る。優先度更新モジュール506は、そこで、与えられた数の画素の処理が終了したことを指示する優先度生成モジュール516からの信号522を待つ。信号522を受け取ると、優先度更新モジュール506はその現在Xをエッジ交差メッセージのX交点値に設定し、上に説明したように処理を続ける。
優先度生成メッセージ520を受け取ると、優先度生成モジュール516は、それが供給されたカウントによって指示された回数、「画素優先度生成動作」(以下に記載)を行い、それによって、信号522に優先度更新モジュール506に動作を終えたことを伝える。
各画素優先度生成動作は最初に、不透明アクティブフラグ配列510上の優先エンコーダー514(例えば4096から12ビットの優先度エンコーダー)を使用して、最高の不透明アクティブフラグの優先度値を決定する。この優先度(もしあれば)は、優先度データテーブル504をインデクス化するためと、そう参照されたレコードの内容が、優先度生成モジュール516からフィル優先度メッセージ出力598に形成され、最適化モジュール550経由でフィルカラー決定モジュール600に伝送されるために使用される。更に、優先度が前のステップで決定されていれば(つまり、少なくとも一つの不透明アクティブフラグが設定されていれば)、決定された優先度は維持され、「現在の優先度」と呼ばれる。もし、何も優先度が決定されなければ、現在の優先度はゼロに設定される。優先度生成モジュール516はそれから、アクティブフラグ配列508上の修正済み優先度エンコーダー512を、現在優先度より大きな最低アクティブフラグを判定するために繰り返し使用する。そのように決定された優先度は(もしあれば)、優先度決定テーブル34をインデクス化するのに使用され、そしてそう参照されたレコードの内容はフィル特性メッセージに形成される。このフィル優先度メッセージは、フィルカラー決定モジュール600に、最適化モジュール550経由で598に送られ、そして決定された優先度は現在の優先度を更新するために使用される。このステップは優先度がもう決定されなくなるまで(つまり、アクティブフラグ内に、現在優先度値より大きい優先度フラグ付けが何もない)、繰り返される。それから、優先度生成モジュール516は終端画素メッセージを形成し、それをフィルカラー決定モジュール600に送る。優先度決定モジュール500は、その次に、フィル優先度メッセージの別シリーズを同様に生成するために次の画素に進む。
さて図22Aに転じ、優先度決定モジュール500によって、或る単体画素に対して生成された、そのようなフィル優先度メッセージ2200別シリーズを示してある。上記のように、これらのフィル優先度メッセージ2202はSTART_OF_PIXEL命令によって先行されている。フィル優先度メッセージ2202は最劣後の描画されたアクティブ優先度レベルから始まる優先順に送られる。現在画素に対しフィル優先度メッセージ2202がもはやなくなると、優先度決定モジュール500はEND_OF_PIXELメッセージ2206を送る。
これらのフィル優先度メッセージ2202は少なくとも次のフィールドを含んでいることが好ましい:
(i) メッセージをフィル優先度メッセージとして識別する識別子FILL_PRTY 2204。このコードは、結合テーブル34内の対応するレコードに合せたインデクスLEVEL_INDEXと、このフィル優先度メッセージは、同じフィル優先度メッセージを含む画素連の先端画素に属するかどうかを指示するFIRST_PIXELをもまた含んでいる。優先度決定モジュール500は、エッジ交差メッセージによって指示された様に、エッジによって交差されたそれらすべての現在走査された画素のフィル優先度メッセージに対しFIRST_PIXELコードをアサートする。FIRST_PIXELコードは、現在走査された画素のすべてのフィル優先度メッセージに対し、もしエッジ交差メッセージによって指示された様に、その画素に交差しているエッジがなければ、非アサートされる。
(ii) フィルテーブルアドレスFILL_INDEX
(iii) フィルタイプFILL_TYPE
(iv) ラスタ演算コードCOLOR_OP
(v) アルファチャネル演算コードAlpha_OP
(vi) スタック演算コードSTACK_OP
(vii) 与えられたYに対し、この優先度のカラーが、ここで「X独立」フラグと呼ぶ、定数か否かをレコードするフラグX_IND。このフラグはこの優先度に対するカラーが一定であればアサートされる。
フィル優先度メッセージに対するフィールド(ii)から(vii)の値は、結合テーブル34内の対応レコードから取り出される。
優先度生成モジュール516は、或るシーケンスの先端画素を処理する間に、フィルカラー決定モジュール600に転送する、各フィル優先度メッセージのX独立フラグの値に注目することが好まれる。もし、すべての転送されたメッセージがX独立フラグの値を指定されていれば、隣接するすべてのエッジ交点間の画素長内のすべての後続するメッセージは、カウント-1のたった一個の繰り返し指定によって置き換えることができる。これは、繰り返しメッセージを作り、フィルカラー決定モジュール600に、このシーケンス内のすべての更なる処理に代えて、送ることによって行われる。気付かれるように、隣接するすべてのエッジ交点間の画素長内のすべての後続するすべてのフィル優先度メッセージがX独立フラグの値を指定されていれば、その画素スパン内の画素のカラーと不透明度は一定ということである。従ってこれらの場合には、画素合成モジュール700は、要求される一定のカラーと不透明度を生成しこれを画素出力モジュール800に渡すためには、画素長内の先端画素を合成するだけでよい。そうすれば、生成された繰り返し命令は画素出力モジュール800に送られ、それは、画素長内のすべての後続する画素に対し、先端画素のカラーと不透明度から、一定のカラーと不透明度を再生する。このような方法で、画素合成モジュール700によって行われる合成演算回数は削減される。
上記の基本動作に対する別の好ましい特徴としては、優先度生成モジュール516は最高の不透明度優先度をコネクション522経由で優先度更新モジュール506に各エッジ交差メッセージの後に送るということがある。優先度更新モジュール506はこれをストア526内に維持する。優先度決定モジュール506はそうすれば、メッセージ内のX交点が現在X値より大きいという単純なテストに代えて、メッセージ内のX交点が現在X値より大きく、少なくともメッセージ内のレベルの一つは最高の不透明度優先度よりも大きいか等しいかを、フィル優先度メッセージを生成する前にテストすることになる。こうすることにより、より少ない画素優先度決定演算回数が可能になり、より長い繰り返しシーケンスを生成することができる。
上記の優先度更新手順は、図8A、9A、9Bに示された画像オブジェクトの例を使用し、走査線35に対し、図12Cから12Jから見られるエッジ交差を使って、図15Aから15Eに見られる様に解説することができる。
図15Aから15Eは優先度テーブル502と504の動作を示しており、それは、好ましい実施態様では、配列508、510とエンコーダー512、514と一緒に、優先度決定テーブル34と呼ぶ単一の結合テーブル34(図18参照)に併合されている。
図15Aに見られるように、エッジ交差メッセージは走査線順にエッジ処理モジュール400から受け取られ、テーブル34にロードされるが、後者は優先順に配列されている。エッジ交差メッセージは、この例では、エッジ横断線の非ゼロ巻上げルールに従って、増加方向を含んでいる。優先テーブル34内に何の入力も設定しないことは可能である。
図34に説明されている優先度決定テーブルは、フィルカウントのための列の入力を含んでおり、それは非ゼロ巻上げルール或いは、適切な場合は、偶数-奇数ルールに従って、エッジから決定される。要下位フラグは優先度の一特性であり、LOAD_PRIORITY_PROPERTIES命令の部分として設定されている。要下位はテーブル34がロードされるとすべての優先レベルに対して設定される。「クリップカウント」や「フィルインデクステーブル」のような列も使うことができるが、この例では、説明を簡明にするため省略してある。どのレベルもアクティブでないときは入力はゼロに設定される。更に、配列510と508の値は、後続するエッジ交差を受け取った後で、テーブル34から更新される。
図15Aから、便宜上、数多くのレコードが、説明を簡明にするため省力してあることが明らかである。前に説明した様に、テーブル34の内容は、優先度決定モジュール500に使用されない場合、フィルカラー決定モジュール600のそれぞれに画素生成のため、そして、画素合成モジュール700に合成演算のためにメッセージとして伝送される。
走査線35(図12E)に対する最初のエッジ交差が、P=1に対して、フィルカウントは非ゼロ巻上げルールによって、そのエッジの値に更新されるのを、図15Aに示す。このレベルに対する「要下位」フラグは、問題のオブジェクトが不透明なので、ドライバソフトによってゼロに設定されている。
テーブル34の前状態が設定されていないので、配列510と508は未設定のままに留まり、優先度エンコーダー514は優先度の出力が不可能になっている。これは、「オブジェクトなし」(例P=0)に対し、カウントn=40(画素)を出力する優先度生成モジュール516によって、走査線35の最初の空白部分と解釈される。
図15Bは、図12Fのエッジ交差が受け取られたときの実施態様を示している。フィルカウントが更新される。配列510と508はそれから、テーブル34からの以前の最高値に設定される。この時、モジュール516は、不透明赤色オブジェクト90のエッジ96が半透明三角形80と交差する前の状態を表すカウントn=45、P=1を出力する。
図15Cは、図12Gのエッジ交差が受け取られたときの実施態様を示している。フィルカウントが、非ゼロ巻き上げルールのために、下降向きに調整されていることに注目されたい。現在エッジ交差を受け取る前に有効なオブジェクトが不透明でないことから、修正優先度エンコーダー512が優先度P=2を最高のアクティブレベルとして選択するために使用され、n=(115-85)=30画素に対する現在値として出力される。
図15Dは図12Hのエッジ交差が受け取られたときの実施態様を示している。P=2に対し前に変更された「要下位」がアクティブ配列508に転送されており、従って優先度エンコーダーに、n=(160-115)=45画素に対して値P=1を出力することを可能にしていることに注目されたい。
図15Eは、図12Iのエッジ交差が受け取られたときの結果、n=(180-160)=20画素に対しP=0の出力を供給していることを示している。
そういうものとして、優先度決定モジュール500は、画素のカウントと、走査線のすべての画素に対応する優先度表示値を出力する。
3.4 最適化モジュールの概要
パイプラインの次のモジュールは最適化モジュール550である。このモジュール550は、単一のカラーと命令に結合できる命令群(即ちフィル優先度メッセージ)を検索し、それは、画素連の先端画素について、一度計算され、画素合成モジュール700のレジスタ内に格納することができる。後続する画素については、カラーと命令は、毎回計算されるのではなく、レジスタから復元できる。例えば、或る画素に対する合成結果のカラーが画素連にまたがってx独立である状況では、最適回路はREPEAT PIXELメッセージを、後続画素に対する合成結果のカラーを復元できる合成モジュール700に送ることができる。このようにして最適化モジュールは合成モジュールによって実行される合成演算の回数を減らす。連の先端画素が或る特定レベルでx従属であるときは、REPEAT PIXELメッセージは使用できない。しかし、最適化モジュールは、以下の4.0項から4.5項及び5.0項に更に詳細に示すように、未だ合成演算の回数を減らすことができる。
3.5 フィルカラー決定モジュールの概要
今度は、図6によって、フィルカラー決定モジュール600の動作を説明する。優先度決定モジュール500からの入力メッセージ598は、フィルデータ設定メッセージ、繰り返しメッセージ、フィル優先度メッセージ、終端画素メッセージ、最終走査線メッセージを含んでおり、最初にフィル検索制御モジュール604に渡る。フィル検索制御モジュール604は、フィルカラー決定モジュール600の各種構成要素によって使用するため、X現在位置カウンタ614とY現在位置カウンタ616を維持する。
最終走査線メッセージを受け取ると、フィル検索制御モジュール604は、X現在位置カウンタ614をゼロに設定し直し、Y現在位置カウンタ616を増分する。最終走査線メッセージは次に画素合成モジュール700に渡される。
フィルデータ設定メッセージを受け取ると、フィル検索制御モジュール604は、データをフィルデータテーブル36の指定位置602に格納する。
繰り返しメッセージを受け取ると、フィル検索制御モジュール604は、X現在位置カウンタ614を、繰り返しメッセージからのカウントによって増分する。繰り返しメッセージは、次に画素合成モジュール700に渡される。
終端画素メッセージ2202を受け取ると、フィル検索制御モジュール604は再びX現在位置カウンタ614を増分し、その終端画素メッセージは次に画素合成モジュール700に渡される。
フィル優先度メッセージを受け取ると、フィル検索制御モジュール604は、次を含む動作を行う。
(i) フィル優先度メッセージからのフィルタイプは、テーブル36内のレコードサイズを選択するために使用される。
(ii) フィル優先度メッセージからのフィルテーブルアドレスと上に決定されたレコードサイズは、フィルデータテーブル36からのレコードを選択するため使用される。
(iii) フィル優先度メッセージからのフィルタイプは、フィルカラーの生成を行うため、サブモジュールを選定し決定する。サブモジュールはラスタ画像モジュール606、フラットカラーモジュール608、線形ランプカラーモジュール610、不透明度タイルモジュール612を含むことができる。
(iv) 決定されたレコードは、選択されたサブモジュール606〜612に供給される。
(v) 選択されたサブモジュール606〜612は、受け取ったデータを、カラーと不透明度値を決定するために使用する。
(vi) 決定されたカラーと不透明度は、カラー合成メッセージ2208を形成するためにフィルカラーメッセージ内の残っている情報、つまりラスタ動作コード、アルファチャネルコード、スタック演算コードと結合され、それは画素合成モジュール700に接続698経由で送られる。
こうして、図22Aと22Bに示したように、先端画素メッセージ2201から始まり、フィル優先度メッセージ2202、終端画素メッセージ2206に続くメッセージシーケンス2200は、先端画素メッセージ2201から始まり、カラー合成メッセージ2208、終端画素メッセージ2206へと続くメッセージシーケンス2212に変換される。これらのカラー合成メッセージ2202は、次の例外を除き、フィル優先度メッセージ2202と同一フィールドを含んでいることが好ましい。
(i) メッセージをカラー合成メッセージと識別するコードCLR_CMP 2210。このCLR_CMPコードは、結合テーブル34内の対応するレコードに対するインデクスをもまた含んでいる
(ii) 優先度のカラーと不透明度値を内蔵するカラーと不透明度フィールド。後者は優先度メッセージのフィルインデクスとフィルフィルタイプフィールドを置き替える
(iii) STOREとRESTOREビット。これらのビットは最適化モジュール550によって加算されるもので、以下に詳説される。
好ましい実施態様においては、決定されたカラーと不透明度は赤、緑、青であり、不透明度は8ビットの精度で通常の方法で画素当たり32ビットに4倍長化する。しかし、シアン、マジェンタ、イエロー及び黒は暗黙の不透明度で4倍長化される、或いは周知の他の多くのカラー表現法の一つを代替的に用いてもよい。以下の説明では赤、緑、青、及び不透明度が使われるが、その他の場合にも応用することができる。
今度は、ラスタ画像モジュール606、フラットカラーモジュール608、線形ランプカラーモジュール610及び不透明度タイルモジュール612の動作を説明する。フラットカラーモジュール608は、受け取ったレコードを三つの8ビットカラー構成要素(典型的に赤、緑、青構成要素として解釈される)と8ビットの不透明度値(典型的に指定カラーによって被覆される画素の部分測度として解釈される、ゼロは被覆無し、すなわち完全透明、255は完全な被覆状態、すなわち完全な不透明)を内蔵している固定フォーマットのレコードとして解釈する。このカラーと不透明度値は接続698経由で直接出力され、決定されたカラーと不透明度をそれ以上の処理をすることなく形成する。
線形ランプカラーモジュール610は、受け取ったレコードを、三つのカラーと結び付いた定数cx、cy、dと、一つの不透明度構成要素の、四セットを内蔵する固定フォーマットレコードとして解釈する。これら四セットのそれぞれに対し、合成結果の値rは、三つの定数を、現在Xカウントx、Yカウントyと結合することにより、次式を使って計算される。
r=clamp(cx*x+cy*y+d)
ここに、関数clampは次のように定義される。
{ 255 255<x
clamp(x)={[x] 0<=x<=255
{ 0 x<0
そうして生成された四つの演算結果は、一つのカラーと不透明度値に形成される。
このカラーと不透明度値は、接続698経由で直接に出力され、追加処理をすることなく決定されたカラーと不透明度を形成する。
不透明度タイルモジュール612は、受け取ったレコードを、三つの8ビットカラー構成要素、8ビット不透明度値、整数Xフェーズ、(px)、Yフェーズ、(py)、Xスケール、(sx)、Yスケール、(sy)、及び64ビットマスクを内蔵した固定フォーマットレコードとして解釈する。これらの値は、ディスプレイリスト生成に起源があり、典型的にはソースページ記述内に内蔵されている。ビットマスク内のビットアドレス、aは次式によって決定される。
a = ((x/2sx + px)mod8) + ((y/2sy + py)mod8)x8
ビットマスクのアドレス「a」に在るビットが調べられる。もし調べたビットが1であれば、そのレコードからのカラーと不透明度はモジュール612の出力に直接コピーされ、決定されたカラーと不透明度を形成する。もし調べたビットがゼロであれば、三つのゼロ構成要素値とゼロ不透明度値を有するカラーが形成され、決定されたカラーと不透明度として出力される。
ラスタ画像モジュール606は、受け取ったレコードを、六つの定数a、b、c、d、tx、ty;サンプル抽出されるラスタ画像画素データ16の各ラスタ線内のビット数(bpl)の整数カウント;及び画素タイプを内蔵する固定フォーマットとして解釈する。画素タイプは、ラスタ画像画素データ内の画素データ16が次の一つとして解釈されるべきか否かを指示する。
(i) 画素当たり1ビットの黒色画素と白色不透明画素
(ii) 画素当たり1ビットの不透明黒色又は透明画素
(iii) 画素当たり8ビットのグレースケール不透明画素
(iv) 画素当たり8ビットの黒色不透明スケール画素
(v) 画素当たり24ビットの不透明三色カラー構成要素画素
(vi) 画素当たり32ビットの三色カラー構成要素+不透明画素
その他の各種フォーマットも使用可能である。
ラスタ画像モジュール606は、画素タイプ指示器を画素サイズ(bpp)をビット数で決定するために使用する。そこで,ラスタ画像画素データ16内のビットアドレスaは、次式を有すると計算される。
a = bpp * [a * x + c * y + tx] + bpl * [b * x + d * y + ty]
レコード602から画素タイプに従って解釈された画素は、ラスタ画像画素データ16内の計算されたアドレス「a」から持って来られる。画素は必要なときは、三つの8ビットカラー構成要素と8ビットの不透明度構成要素を持つように拡張される。「拡張される」ということは、例えば、画素当たりグレイスケールの不透明ラスタ画像から、赤色、緑色、青色構成要素のそれぞれに当てられた、サンプル抽出された8ビットの値を有しているはずで、不透明度構成要素は完全不透明に設定されるということを意味している。これはそのうえ、画素合成モジュール700に対する決定されたカラーと不透明度出力698を形成する。
その結果、表示可能なオブジェクト内の有効なラスタ画素データは、メモリ16内の画素画像データに対する、マッピングの決定を通じて取得される。これは、実際上、ラスタ画素データのオブジェクトベース画像へのアファイン変換を実行することであり、画像ソースからの画素データを、画像オブジェクトとの合成ができるフレームストアに変換する、周知の技法よりも効率的に実行することになる。
上記に対する好ましい特徴として、ラスタ画像画素データ16内の画素間の補間はオプションとして、次式に従い、最初に中間の演算結果pとqを計算することによって実行できる。
p = a*x + c*y + tx
q = b*x + d*y + ty
次にラスタ画像画素データ16内のビットアドレス、a00、a01、a10とこれら四画素のすべては次式に従って決定される。
a00 = bpp*[p] + bpl*[q]
a01 = a00 + bpp
a10 = a00 + bpl
a11 = a00 + bpl + bpp
次に、結果の画素構成要素値rは、カラーと不透明度構成要素毎に、次式に従って、決定される。
r = interp(interp(get(a00),get(a01),p),interp(get(a10),get(a11),p)q)
ここに関数interpは次のように定義される。
interp(a,b,c) = a + (b-a)*(c-[c])
上記方程式において、[value] = floor(value) の表現は、フロア演算の少数部分の切り捨てを意味している。
Get関数は、与えられたビットアドレスの、ラスタ画像画素データ16からサンプル抽出した現在の画素構成要素の値を返す。何かの画像タイプの何かの構成要素に対しては、これは暗黙値であることに注意されたい。
上記に合った好ましい特徴として、画像のタイル化を、現在のXとYカウンタ、614、616から受け取ったレコードから読み取ったタイルサイズで、上記方程式式内のx値とy値を使い、モジュラス演算によって実行することがオプションとしてできる。
更に多くのそのようなフィルカラー生成サブモジュールも実施可能である。
3.6 画素合成モジュールの概要
今度は、画素合成モジュール700の動作説明に移る。画素合成モジュールの主要機能は、現在走査中の画素にアクティブに寄与する、それらの描画されたオブジェクトの、優先度すべてのカラーと不透明度値を合成することにある。
画素合成モジュール700は、コンピュータグラフィック誌、1984年版18巻3号、253〜259ページに記載のPorter,T Duff,T共著の「デジタル画像の合成」に説明されている、合成への接近法の修正形態を実施することが好ましい。Porter & Duffの合成演算例は図21に示されている。しかし、そのような接近法は、それが合成によって形成された交点地域内のソースカラーと宛先カラーしか取り扱えず、その結果、交点外の透明度の影響に対応できないことに欠陥がある。好ましい実施態様はこれを、オブジェクトに完全な透明画素を、効果的に埋め込むことで克服している。従って、全域が実質的に交点域になり、信頼性の高いPorter & Duffの合成演算を実行できる。この埋め込みは、追加の透明オブジェクト優先度を結合テーブルに加えることにより、ドライバソフトレベルで達成できる。これらのPorter & Duff合成演算は以下に図20A、20B及び19を使って更に詳細に説明されるように、適切なカラー演算を用いて実行できる。
合成される画像は、表現ツリーに基づいていることが望まれる。表現ツリーは画像を形成するために要求される合成演算を説明するために使用され、典型的には葉のノード、単項、二項ノードを含む、複数のノードから成っている。葉ノードは表現ツリーの最外部ノードであり、子孫ノードを持たず、画像のソース的構成要素を表している。単項ノードは、単項演算子以下の、ツリー部分から出てくる画素データを修正する演算を表している。二項ノードは典型的に左右のサブツリーに枝分かれする。そのなかで、各サブツリー自体が少なくとも一つの葉ノードを構成する表現ツリーである。表現ツリーの一例を図17Cに示す。図17Cに示された表現ツリーは、三つのオブジェクトA、B及びC、並びにページを表す四つの葉から成っている。図17Cの表現ツリーはまた、Porter & DuffのOVER演算を表す、二項ノードから成っている。従って、その表現ツリーは、オブジェクトAがオブジェクトBの上に合成され、その結果がオブジェクトCの上に合成され、その結果が次にページ上に合成された一つの画像を表している。
次に図17Aと17Bに転じ、表現ツリー内の典型的な二項合成演算を示す。この二項演算子は、ソースオブジェクトsrcが左ブランチ上にあり、宛先オブジェクト(dest)が右ブランチにある、ソースオブジェクト(src)と宛先オブジェクト(dest)上で動作する。その二項演算は典型的にPorter & Duff合成演算である。域src∩destはページ上でソースオブジェクトと宛先オブジェクトが交わる(つまり両方がアクティブな)域、域src∩destはsrcオブジェクトだけがアクティブな域、域src∩destはdestオブジェクトだけがアクティブな域を表している。
表現ツリーの合成演算は画素合成スタック38によって実行される。その中で表現ツリーの構造が画素合成スタック38上の適切なスタック演算によって実行される。
今度は、図23Aに転じ、画素合成モジュール700を、一つの実施態様に従って更に詳細に示す。画素合成モジュール700は、入力メッセージをフィルカラー決定モジュール600から受け取る。これらの入力メッセージは、繰り返しメッセージ、カラー合成メッセージ(図22B参照)、終端画素メッセージ及び最終走査線メッセージを含んでおり、順次処理される。
画素合成モジュール700は、入力メッセージをデコードするためのデコーダ2302、入力カラー合成メッセージ内に内蔵されているカラーと不透明度値を合成するための合成機2304から成る。画素合成モジュール700は、スタック38上に、演算結果として得られたカラーと不透明度値を置くスタック制御機2306と、合成結果のカラーと不透明度値を格納させるための出力FIFO702からもまた成っている。
画素合成モジュール700の演算中に、デコーダ2302は、カラー合成メッセージを受け取ると、ラスタ演算COLOR_OPとアルファチャネル演算コードALPHA_OPを抽出し、それらを合成機2304に渡す。デコーダ2302は、スタック演算STACK_OPと、カラー合成メッセージのカラーと不透明度値COLOR,ALPHAの抽出もまた行い、それらをスタック制御機2306に渡す。典型的に、画素合成モジュール700は、カラー合成メッセージからのラスタ演算とアルファチャネル演算に従って、カラー合成メッセージからのカラーと不透明度を、画素合成スタック38からポップしたカラーと不透明度と結合する。それは次にその結果を画素合成スタック38上にプッシュバックする。より一般的には、スタック制御機2306は指定されたスタック演算に従って、ソースカラー値(src)と宛先(dest)カラー値と不透明度値を形成する。もしこの時点で、或いは画素合成スタックのポップ中に、画素合成スタック38が空白と判れば、不透明白色値がエラー指示なしに使用される。これらのソースカラーと宛先カラーと不透明度は次に合成機2304に使用可能になり、それは、COLOR_OPとALPHA_OPコードに従って合成演算を実行する。結果(答)のカラーと不透明度はスタック制御機2306に使用可能になり、それはその結果をスタック38上に、STACK_OPコードに従って格納する。これらのスタック演算は、以下にもっと詳細に説明する。
画素合成モジュール700の演算中に、もしデコーダ2302が終端画素メッセージを受け取れば、それは次に、値スタック制御機2306に、画素合成スタック38からカラーと不透明度値をはじき出すように命令する。もしスタック38が空白であれば、不透明白色値が使用される。結果のカラーと不透明度値はそれから画素出力メッセージに形成され、それは画素出力FIFO702に転送される。もしデコーダ2302が繰り返しメッセージ又は最終走査線メッセージを受け取ると、デコーダ2302は合成機2304と値スタック制御機2306を回避し(示されていない)、そのメッセージを画素出力FIFO702に、それ以上の処理をせずに転送する。
図23Aに見られるように、中間値レジスタ2310は、デコーダ2302とスタック制御機2306にアクセスできる。スタック38からの値はレジスタ2310内に格納され、以下に更に詳細に説明されるように、後にスタック38に復元される。図23Bには別の実施態様がみられ、そこでレジスタ2310は、積算器と積算値レジスタ2320に置き換えられている。積算器2320の機能は4.5項でもっと詳細に説明する。
図24A、B、C、及びDは、画素合成スタック38上の演算を、カラー合成メッセージの各種スタック演算命令STACK_OPのそれぞれに対して示している。
図24Aは画素合成スタック38上の標準演算STD_OP2350を示し、そこではソースカラーと不透明度 (dest)がカラー合成メッセージから取得され、宛先カラーと不透明度 (dest)が画素合成スタックの天辺からポップされる。ソースカラーと不透明度 (src)は現在演算用の現在カラー合成メッセージ内の値から、宛先カラーと不透明度 (dest)はスタック38の天辺からポップする値から取られる。合成機2304によって実行されたCOLOR_OP演算の結果はスタック38にプッシュバックされる。
図24Bは画素合成スタック38上のNO_POP_DESTスタック演算を示す。ソースカラーと不透明度 (src)は、現在演算用の現在カラー合成メッセージ内の値から取られ、宛先カラーと不透明度 (dest)は、スタック38の天辺から読み取られている。合成機2304によって実行されたCOLOR_OP演算の結果は、スタック38の天辺にプッシュされる。
図24CはPOP_SRCスタック演算を示し、そこではソースカラーと不透明度は、スタックの天辺から読み取られ、宛先カラーと不透明度はスタック下方の次レベルからポップしている。合成機2304によって実行されたCOLOR_OP演算の結果は、スタックの天辺にプッシュされる。
図24DはKEEP_SRCスタック演算を示している、そこではソースカラーと不透明度は、スタックの天辺から読み取られ、宛先カラー値と不透明度値はスタック下方の次レベルからポップしている。合成機2304によって実行されたCOLOR_OP演算の結果は、スタックの天辺にプッシュされる。
その他のスタック演算も、本発明の精神から逸脱することなく、使用することができる。
合成機2304がソースカラー (src)と不透明度を宛先カラー (dest)と不透明度と結合する方法が、図7Aから7Cを参照しながら次に説明される。この説明上、カラーと不透明度値は、たとえそれらが典型的に0〜255の範囲内の8ビット値として格納されていても、0〜1の範囲(即ち基準化されている)に入ると考えられる。二つの画素を一緒に合成する上で、各画素は、一方は完全に不透明、他方は完全に透明で、不透明度値がこれら二つの域の割合を示す、二つの域に分けられているとみなされる。図7Aは、図に示されていない何かの三構成要素カラー値と不透明度値(so)を持つソース画素702を示している。ソース画素702の影付けされた域は、画素702の完全不透明部704を表している。同様に、図7A内の影付けされていない部分は、ソース画素702の完全透明と考えられるその比率706を表している。図7Bは何かの不透明度値、(do)、を有する宛先画素710を表している。宛先画素710の影付けされた域は画素710の完全不透明部分712を表している。同様に、画素710は完全透明部分714を有している。ソース画素702と宛先画素710の不透明域は結合の目的上は、互いに直交していると考えられる。これら二つの画素のオーバレイ716が図7Cに示されている。関心のある三つの域が存在し、それらはso*(1−do)域を有する宛先718外のソース、so*do域を有する宛先720に交差するソース、(1−so)*do域を有するソース722外の宛先を含んでいる。これら三域の各カラー値は概念的に独立して計算される。ソース外宛先域718はそのカラー値をソースカラー値から直接に取っている。宛先外ソース域722はそのカラー値を宛先カラー値から直接に取っている。ソース交点宛先域720はカラーをソースと宛先カラー値の結合から取っている。
ソースと宛先カラー値の結合過程は、上記に論じた他の演算と区別され、ラスタ演算と呼ばれ、画素合成メッセージからラスタ演算コードによって指定されたように、関数の集まりの一つである。好ましい実施態様に含まれているラスタ演算のいくつかを図19に示す。各関数は、ソースと宛先カラー値のカラー構成要素の各ペアに、結果のカラー内に類似の構成要素を得るために、適合される。その他多くの関数も実施可能である。
合成画素メッセージからのアルファチャネル演算もまた、ソースと宛先カラー値の結合中に考慮される。アルファチャネル演算は、LAO_USE_D_OUT_S、LAO_USE_S_OUT_D、LAO_USE_S_ROP_Dを使って実行され、それぞれの関心のある域(1-so)*do、so*(1-do)、及びso*doを、ソース画素702のオーバーレイ716と宛先画素710内に識別する。
領域のそれぞれに、もし対応するフラグが設定されていなければゼロ、そうでなければ区画の区域である域不透明度値が形成される。
合成結果の不透明度は区域不透明度の合計から形成される。合成結果のカラーの各構成要素は区域カラーと区域不透明度の各ペアの積和を合成結果の不透明度で割り算することにより形成される。
図20に示したように、Porter & Duff演算は、両演算数共にアクティブである保証があれば、適当なALPHA_OPフラグ結合とラスタ演算子COLOR_OPによって形成される。テーブルの読み取られ方から、もし一方の演算子のみがアクティブでなければ、計算は実行されないか又は間違った演算子で実行されるかのどちらかになる。従って、Porter & Duff演算を使って結合されようとするオブジェクトは透明画素で、計算中に両オブジェクトを被覆する領域に埋め込まれなければならない。他の透明演算もPorter & Duff演算と同じようにして、COLOR_OPのような異なる二項演算を使って、形成することができる。
カラーと不透明度の演算結果はスタック制御回路に送られ、画素合成スタック38上にプッシュされる。しかしながら、もしスタック演算がSTACK_KEEP_SRCならば、ソース値はカラー合成メッセージがプッシュされる前にスタック上にプッシュされる。
終端画素メッセージに出合うと、スタックの天辺のカラーと不透明度値は画素出力メッセージに形成され、画素出力モジュールに送られる。繰り返し画素メッセージは画素合成モジュールを通って画素出力モジュールに渡される。
3.7 画素出力モジュールの概要
今度は、画素出力モジュール800の動作を説明する。入力メッセージは画素出力FIFOから読み取られるが、それには画素出力メッセージ、繰り返しメッセージ、最終走査線メッセージが含まれ、順次処理される。
画素出力メッセージを受け取ると、画素出力モジュール800はその画素を格納し、またその画素を出力に転送する。繰り返しメッセージを受け取ると、最後に格納された画素は、出力898に、繰り返しメッセージからのカウントによって指定された回数だけ転送される。走査線の最終メッセージを受け取ると画素出力モジュール800はそのメッセージをその出力に渡す。
出力898は、画素の画像データを用いるどんなデバイスにも接続できる。そのようなデバイスは、ビデオ表示ユニット若しくはプリンタのような出力デバイス、又はハードディスク、ライン、バンド若しくはフレームストアを含む半導体RAMのようなメモリ格納装置、又はコンピュータネットワークを含んでいる。しかしながら、前記から明らかなように、画像オブジェクトの描画を、高機能の画像記述言語によって要求されるフル機能で、描画処理中に画素画像データの中間格納を必要としないで供給する、技法と装置が説明される。
4.0 最適化モジュールの概要
パイプライン内で、優先度決定モジュール500の後の次のモジュールは最適化モジュール550である。最適化モジュール550は、フィル決定と画素合成モジュール600と700それぞれに送るフィル優先度メッセージとカラー合成メッセージ数の最小化を捜し求め、その結果、画素合成モジュール700によって実行される合成演算回数の削減がもたらされる。
最適化モジュール550は、これを単一のカラーと不透明度に結合できるフィル優先度メッセージ群を捜し求め、、結合計算を一回で済ませ、画素連の先端画素処理中に、画素合成モジュール700内のレジスタに格納することで成し遂げる。後続する画素については、カラーと不透明度は、都度計算されるというよりも、レジスタから復元される。
前述したように、隣接エッジ交点間の画素連の先端画素の、転送されたフィル優先度メッセージのすべてが、x独立フラグをアサートされる場合がある。これらの場合には、その画素連のすべての後続するフィル優先度メッセージは、カウント-1の単一繰り返し仕様に置き換えることができる。そうすれば、画素合成モジュール700は、要求される一定のカラーと不透明度を生成し画素出力モジュール800に渡すためには、画素連の先端画素だけを合成すればよい。生成された繰り返しコマンドは、それから画素出力モジュール800に渡され、画素連の先端画素のカラーと不透明度から、その画素連のすべての後続する画素に対する一定のカラーと不透明度を復元する。このような方法で合成演算は画素連の後続する画素には要求されなくなり、その結果、画素合成モジュール700によって実行される合成演算回数は削減することができる。
一つ以上の隣接エッジ間の画素連の先端画素において、転送されたフィル優先度メッセージ内の、x独立フラグがアサートされない、その他多くの場合がある。例えば、フィル優先度メッセージと結び付いたオブジェクトの一つがビットマップであり、その結果、カラーと不透明度が画素連にまたがって変動することがある。これらの場合、最適化モジュール550は、画素連の先端画素のフィル優先度メッセージ群にx独立フラグをアサートされたものを識別し、この情報を画素合成モジュールに渡すと、それは次にそれらの結合されたカラーと不透明度を計算し、それをレジスタに格納する。後続する画素については、カラーと不透明度は、都度計算されるというよりレジスタに復元され、それ故に、合成演算回数の削減につながる。
最適化モジュール550は、幾つかの異なる方法で実施でき、その幾つかの方法を今度は説明する。図25〜29の図式的なブロック図は、ハードウエアによる五つの実施態様を説明している。
これに関して、次の最適化モジュールの第1、第2、第3及び第5の実施態様のそれぞれは、図23Aに示した画素合成モジュールと一緒に使用することが意図されていることに注目されたい。他方、最適化モジュールの第4の実施態様は、図23Bに示したように、画素合成モジュールと一緒に使用することが意図されている。
4.1 最適化モジュールの第1実施態様
次に図25に転じ、最適化モジュール550のブロック図が第1実施態様に従って示されている。最適化モジュール550は入力として、優先度決定モジュール500によって送られたメッセージを順次受け取り、それらを入力シフトレジスタ2510内に一度に一つづつ格納する。これらのメッセージは先端画素、フィル優先度、終端画素及び繰り返しメッセージ、その他を含むことができる。図25は例としてフィル優先度メッセージが入力シフトレジスタ2510に格納された状態を示している。最適化モジュール550は、これらのメッセージを、入力、出力レジスタ2510と2532が後続するクロックサイクルで同一メッセージを内蔵しているような方法で、出力シフトレジスタ2532に渡す。出力レジスタ2532は、フィル優先度メッセージでないメッセージのすべてと、後に説明するように、フィル優先度メッセージのいくつかだけをフィル決定モジュール600に出力する。これらの出力シフトレジスタ2532から出力されたフィル優先度メッセージは、STOREとRESTOREと呼ぶ2ビットを加えて修正される。図25はそのような修正されたフィル優先度メッセージが出力シフトレジスタ2532に格納された状態を例示している。これらのSTOREとRESTOREビットは初期値として非アサートされている。
前記の通り、フィル優先度メッセージは、フィル決定モジュール600内で、フィルインデクスとフィルタイプを対応するカラーと不透明度値に置き換えることにより、カラー合成メッセージに変換されている。これらのSTOREとRESTOREビットを含むカラー合成メッセージは次に、画素合成モジュール700に送られる(図23A)。
次に図23Aに転じると、STOREビットの目的は、アサートされたとき、画素合成モジュール700にスタック38の天辺のコピーを、STOREビットを有するフィル優先度メッセージに結び付いた合成演算を終えた後に、中間値レジスタ2310内に格納するよう命令することである。画素合成モジュール700は、STOREビットが非アサートされているときスタックのコピーを格納しない。RESTOREビットの目的は、アサートされているとき、画素合成モジュール700に、中間値レジスタ2310(図23A)内の内容をスタック38の天辺(図23A)にコピーするよう命令することである。画素合成モジュール700はRESTOREビットが非アサートされているときは中間値レジスタ2310内の内容をスタックにコピーしない。
図25に戻って、最適化モジュール550は、入力レジスタ2510内フィル優先度メッセージに内蔵されているスタック演算タイプをデコードするためのデコーダ2502から成っている。具体的には、デコーダ2502は、フィル優先度メッセージに内蔵されているスタック演算がNO_POP_DESTかPOP_SRCスタック演算のどちらであるかを判定する。デコーダ2502はカウンタ2504に繋げられており、スタック演算がNO_POP_DESTかPOP_SRCスタック演算のどちらかであるとき、カウンタに知らせる。カウンタ2504は画素メッセージ(示されていない)の始めに応じて1に初期設定されており、入力レジスタ2510内に格納された後続するフィル優先度メッセージ内の、各NO_POP_DESTスタック演算に対して増分し、各POP_SRCスタック演算に対し減分する。カウンタ2504の現在値は、現在フィル優先度メッセージの決定されたスタック演算を実行する結果として生成される、画素合成モジュール700内のスタック38のスタック深度を判定する。カウンタ2504は、現在のフィル優先度メッセージのスタック演算が実際に実行される前に、現在のフィル優先度メッセージと結び付いたスタック演算から結果する、スタック38の厚みを予測することに注目することが重要である。カウンタ2504はこれを、フィル優先度メッセージ内のスタック演算によって生成された、スタック深度の連続カウントを維持することによってなしている。
カウンタ2504は、カウンタ2504が1に増減分する、つまり、予測されたスタック深度が1であると検知する、比較器2506に繋がれている。比較器2506がカウントは1であると検知すると、それは第1の入力をANDゲート2508にアサートする。
最適化モジュール550は、入力レジスタ2510に現在格納されつつあるメッセージがフィル優先度メッセージであるか、先端画素メッセージか、終端画素メッセージか、などを判定するためのデコーダ2514からも成る。ラッチ2512経由で、デコーダ2514は、現在入力レジスタ2510に格納されつつあるフィル優先度メッセージが画素連の先端画素と結び付いているか、また、結合テーブル34内の対応するレコードに合せたインデクスがそのフィル優先度メッセージに結び付いているかも判定する。デコーダ2514はこの情報をメッセージ内に内蔵されている識別コードによって判定する。例えば、各フィル優先度メッセージは、メッセージをフィル優先度メッセージであると識別する識別コードFILL_PRTYを内蔵している。このコードは、結合テーブル34内の対応するレコードに合せたインデクスLEVEL_INDXと、このフィル優先度メッセージが画素連の先端画素に属するかどうかを指示するコードFIRST_PIXELをも含んでいる。
最適化モジュール550は、RSラッチ2512からも成り、それは、デコーダ2514が、入力レジスタ2510に格納されたメッセージが終端画素メッセージであると判定すると、設定し直される。ラッチ2512は、x従属フィル優先度メッセージが入力レジスタ2510内で最初に出合うと設定される。ラッチ2512は設定し直し状態で前記のANDゲート2508に向けて第2入力をアサートし、設定状態のときはANDゲート2508に向けて第2入力を非アサートする。
最適化モジュール550は、第1・第2入力を有する更なるANDゲート2522からも成る。ANDゲート2522の第1入力はANDゲート2508の出力に繋がれてあり、第2入力はデコーダ2514に繋がっている。デコーダ2514は、ANDゲート2522の第2入力に、入力レジスタ2510に現在格納されつつあるフィル優先メッセージが画素連の先端画素と結び付いているか否かを判定すると、アサートする。
ANDゲート2522の出力は、出力レジスタ2532に現在格納されつつある、フィル優先度メッセージ内にSTOREビット命令を設定するために使われる。このようなやり方で、最適化モジュール550は、もし
(1) 入力と出力レジスタ2510と2532内のメッセージが、画素連の先端画素に結び付いているフィル優先度メッセージであるとき、
(2) カウンタ2504が現在カウント1を有し、従って予測されたスタック38の深度が1であるとき、
(3) 現在格納されたフィル優先度メッセージを含め、最後の終端画素メッセージ以来、これまでに処理されたフィル優先度メッセージのすべてがx独立であるとき、このSTOREビット命令をアサートする
最適化モジュール550は、画素連の後続する画素に寄与する、最低のフィル優先度メッセージのインデクスを格納するレジスタ2524からも成っている。フィル優先度メッセージは最適化モジュールに優先度の下位から上位順に転送されていることに注目することが重要である。あるオブジェクトの優先度は、オブジェクトの最後列から最前列に至る順序において、そのオブジェクトの位置(即ちレベル)を指定する。ある画素に寄与している各オブジェクトに対応するフィル優先度メッセージは最適化モジュール550に、最後列(最劣後)から最前列(最優先)の順で、転送される。最適化モジュール550はフィル決定モジュール600に、画素連の先端画素に結び付いているフィル優先度メッセージのすべてを渡すが、しかし、その連の後続する画素の処理中は、そのフィル優先度メッセージの幾つかだけを渡す。具体的には、画素連の先端画素処理中に渡されたフィル優先度メッセージグループの同一サブグループフィル優先度メッセージは、その連の後続する各画素の処理中にパスされる。レジスタ2524は、画素連の後続する画素の処理中に送られた、このサブグループの最低優先度メッセージに対応する、結合テーブル34内のレコードにインデクスを格納する。
レジスタ2524内のこのインデクスの格納は次のような方法で達成される。デコーダ2514は、入力レジスタ2510に格納された識別メッセージをデコードし、もしそれがフィル優先度メッセージであれば、この識別器から、そのフィル優先度メッセージに結び付いた結合テーブル34内のレコードのレベルインデクスLEVEL_INDXを取得する。このレベルインデクスLEVEL_INDXはレジスタ2524の入力に送られる。もしANDゲート2522の出力がこのフィル優先度メッセージに対しSTOREビット命令をアサートすれば、それはレジスタ2525も、現在そのレジスタの2524入力上にあるレベルインデクスLEVEL_INDXを格納するよう設定する。このようにして、レジスタ2524はその中に、そのSTOREビット命令をアサートされた、現在入力レジスタ2510と2532に格納されているフィル優先度メッセージのレベルインデクスを格納し終える。もし更なるフィル優先度メッセージが現在画素に対して入力と出力レジスタ2510と2532に格納され、その優先度メッセージがそのSTOREビット命令をアサートされているならば、現在レジスタに格納されているレベルインデクスはその更なるフィル優先度メッセージと結び付いたレベルインデクスによって上書きされることに注目されたい。
他方、もしデコーダ2514が入力レジスタ内のメッセージは先端画素メッセージであり次のメッセージは画素連の先端画素と結び付いたフィル優先度メッセージであると識別すれば、デコーダはANDゲート2526の両入力にアサートし、それは次いでレジスタ2524を設定し直す。
これまでに説明した最適化モジュール550の回路は主として画素連の先端画素に結び付いた一つ以上のフィル優先度メッセージに結び付いたSTORE命令を設定することに関心を向けてきた。最適化モジュール550のこれからの説明は主として画素連の後続する画素と結び付いた一つ以上のフィル優先度メッセージのサブグループに結び付いたRESTORE命令の設定に関連するものである。
最適化モジュールは更に、現在レジスタ2524に格納されているレベルインデクスを、現在入力レジスタ2510内に格納されつつあるフィル優先度メッセージのレベルインデクスと比較する比較器2530から成っている。レベルインデクスが同一であれば、比較器2520はANDゲート2520への第1入力をアサートする。加えて、もしデコーダ2514が現在入力レジスタ2510に格納されているフィル優先度メッセージは画素連の先端画素と結び付いていると判定すれば、デコーダ2514はANDゲート2520の反転した第2入力をアサートし結果としてANDゲート2520を非アサートする。そうでなければ、それはANDゲート2520の逆転した第2入力を非アサートする。ANDゲート2520はアサートされれば、RESTOREビットに対し現在出力レジスタ2532に格納されているフィル優先度メッセージの命令をアサートする。
このような方法でANDゲート2520は、もし、
(1) 入力と出力レジスタ2510と2532内のメッセージが、画素連の先端画素に後続する画素に結び付いているフィル優先度メッセージであり、かつ
(2) 入力と出力レジスタ2510と2532内に現在格納されつつあるフィル優先度メッセージのレベルインデクスが、STOREビット命令をアサートされた最高の(最優先の)レベルインデクスを有する画素連の先端画素に後続する画素に結び付いているそのフィル優先度メッセージのレベルインデクスと等しければ、RESTOREビット命令をアサートする。
最適化モジュールは更に、現在レジスタ2524内に格納されているレベルインデクスを、現在入力レジスタ2510内に格納されつつあるフィル優先度メッセージのレベルインデクスと比較する、更なる比較器2528から成る。現在入力レジスタ2510に格納されつつあるフィルメッセージのレベルインデクスが、レジスタ2524内に現在格納されているインデクスと等しいか大きければ、比較器はORゲート2518の第1入力をアサートする。
ORゲート2518の目的は、出力レジスタ2532に内蔵されているメッセージの出力を可能にすることにある。このような方法で、画素連の先端画素に後続する画素に結び付き、そのインデクスがレジスタ2524に現在格納されていると等しいか大きいとき、すべてのフィル優先度メッセージは、出力可能になる。この出力可能になったフィル優先度メッセージは、フィル決定モジュール600に渡される。出力可能とならなかった残りのフィル優先度メッセージはフィル決定モジュール600に渡されない。また、フィル優先度メッセージでないメッセージも、フィル決定モジュール600に出力可能である。
デコーダ2514に戻ると、デコーダ2514は現在入力レジスタ2510に格納されつつあるメッセージ内の識別器を読み取り、このメッセージがフィル優先度メッセージであるか否かを判定する。そのメッセージがフィル優先度メッセージでなければ、デコーダ2514はORゲート2518の逆転入力を非アサートし、それは今度はORゲート2518にアサートし、それがまた出力レジスタ2532内に内蔵されているメッセージの出力を可能にする。このようなやり方で、フィル優先度メッセージでないすべてのメッセージは出力可能となりフィル決定モジュール600に渡される。
同様に、デコーダ2514が、入力レジスタ2510に現在格納されつつあるメッセージは画素連の先端画素に結び付いたフィル優先度メッセージであると判定すれば、デコーダはORゲート2518に別の入力をアサートする。ORゲート2518はアサートされ今度は出力レジスタ2532に内蔵されているメッセージの出力を可能とする。このような方法で、画素連の先端画素に結び付いた、すべてのフィル優先度メッセージは出力可能となり、フィル決定モジュール600に渡される。
次に、図25に関して最適化モジュール550の動作を説明する。
或る画素連の始点では、カウンタ2504は1に設定され、ラッチ2512は設定し直され、レジスタ2524はゼロに設定し直されている。
画素連の各フィル優先度メッセージが最適化モジュール550を通過すると、スタック演算はデコーダ2502によってデコードされる。もしスタック演算がNO_POP_DESTであれば、カウンタ2504は、そのような演算が画素合成モジュール700によって実行されるとスタック38の深度を1増やすので、増分される。もしスタック演算がPOP_SRCであれば、カウンタ2504は、そのような演算がスタックの深度を1減らすので、減分される。そうでなければ、カウンタ2504によって何の動きもとられない。また、X独立フラグがチェックされ、もし非アサートされていれば、ラッチ2512がアサートされる。ラッチ2512は終端画素メッセージに出会うまでアサートを維持される。
連の先端画素上に、各フィル優先度メッセージが最適モジュール550から抜け出ていくとき、STOREビットはスタック深度カウンタが1に等しい演算をアサートされ、X従属ラッチ2512は非アサートされる。STOREビットがアサートされると、最後に格納されたレベルのインデクスを内蔵しているレジスタ2524は現レベルのインデクスに上書きされる。
STOREビットがフィル優先度メッセージ内でアサートされ、そのメッセージがカラー合成メッセージとして、フィル決定モジュール600経由で画素合成モジュール700に渡されると、それは、画素合成モジュール700に、中間値レジスタ2310の中に、合成スタックの天辺の値を、演算が実行された後で、格納させる。その結果、最後に格納された値は、画素合成モジュール700内のX従属データでの最初の演算の前に、一枚の深度のスタック上の最後の値になる。また、或る演算に対しSTOREビットがアサートされていれば、次の寄与演算のレベルインデクスはレジスタ2524内に格納される。
フィル優先度メッセージのすべてが川下のモジュールに渡されると(終端画素メッセージによって指示されて)、ラッチ2512は設定し直される。
画素連の先端画素に後続する画素について、もし後続する画素と結び付いているフィル優先度メッセージがレジスタ2524内に格納されているインデクスより大きいか或いは等しいインデクス有していれば、そのフィル優先度メッセージはフィル決定モジュール600に渡される。しかし、もしフィル優先度メッセージ内のインデクスがレジスタ2524内に現在格納されているインデクスより小さければ、フィル優先度メッセージはフィル決定モジュール600に渡されない。更に、もしフィル優先度メッセージがレジスタ2524内に格納されているインデクスと等しければ、最適化モジュール550はフィル優先度メッセージ内のRESTOREビットにこのメッセージをフィル決定モジュール600に渡す前にアサートする。このRESTOREビットは画素合成メッセージ700に中間値レジスタ2310(図23A)の内容をスタック38(図23A)の天辺にコピーするよう命令する。
図25のハードウエア構成はフィル優先度メッセージのSTOREとRESTOREビットをマニュピレートする。STORE上に活動する構成要素は第1機能ユニット、RESTOREビット上に活動する構成要素は第2機能ユニットとみなされる。
今度は図30Aと30Bに転じ、それらに画素連の先端画素に対する典型的なフィル優先度メッセージの元シーケンスと後続する画素に対するフィル優先度メッセージの最適化モジュール550によって第1装置にしたがって最適化された最適シーケンス間の比較を示す。
図30Aは、隣接するエッジ間の画素連の先端画素に対して、最適化モジュール550によって出力された、フィル優先度メッセージ3001から3008の典型的なシーケンスを示している。フィル優先度決定モジュール500によって、画素連の各画素に対して、生成されたフィル優先度メッセージのシーケンスと最適化モジュール550に送られたものは同一であることを認識することが重要である。
最適化モジュール550は、画素連の先端画素に対するフィル優先度メッセージのすべてを、フィル決定モジュール600に渡す。更に、それは二つの追加ビットSTOREとRESTOREを付加する。連の先端画素の処理中に、最適化モジュールは、もしカウンタ2504が現在カウント1を有しており、したがってスタック38の予測深度が1であり、かつ、現在のフィル優先度メッセージを含みこれまで現在画素に対して処理されたフィル優先度メッセージのすべてがX独立であれば、STOREビットをアサートする。
今度は図30Aに転じる。連の先端画素のフィル優先度メッセージ3001〜3008は、最適化モジュール550に送られ、最劣後から最優先の順序で渡される。つまり、フィル優先度メッセージ3001〜3008は、3001、3002、3003、3004、3005、3006、3007、3008の順で、最適化モジュール550に送られ渡される。従って、カウンタ2504は、フィル優先度メッセージ3001〜3008のそれぞれに対し、1、2、2、1、2、2、1、1のカウントを有していることが分る。また、フィル優先度メッセージ3001〜3006は、現在のフィルメッセージを含みこれまでに処理されたフィル優先度メッセージのすべてがX独立である、という基準を満たしている。従って、STOREビットはフィルメッセージ3001と3004に対してアサートされる。RESTOREビットは、連の先端画素に結び付いたフィルメッセージ3001〜3008のすべてに対して非アサートされる。
連の先端画素に結び付いたこれらのフィル優先度メッセージ3001〜3008は、フィル決定モジュール600に渡され、カラー合成メッセージに変換され、次いで画素合成モジュール700に送られる。画素合成モジュール700は、STOREビットをアサートされたカラー合成メッセージを受け取ると、スタック38の天辺を、画素合成メッセージの合成演算の終了後、中間値レジスタ2310にコピーする。それぞれSTOREビットをアサートされたカラー合成メッセージのシーケンスを受け取ると、画素合成モジュール700は、中間値レジスタ内に前に格納された値を、後続するカラー合成メッセージに結び付いたスタック38のコピーで上書きする。この具体例では、中間値レジスタ2310は、フィル優先度メッセージ3004と結び付いた合成演算終了後の結果となる、スタック38の天辺のコピーを内蔵している。
次に図30Bに転じ、そこに最適化モジュール550によって連の先端画素に後続する各画素の処理中に渡された、フィル優先度メッセージを示す。先ず第1に、レジスタ2524(図25)は、連の先端画素のフィル優先度メッセージを送り出した後で、フィル優先メッセージ3004のレベルインデクスを内蔵していることに注目されたい。したがって、シフトレジスタ2532の出力は、連の後続する画素に対するフィル優先度メッセージが、これらのフィル優先度メッセージのインデクスがレジスタ2524内に格納されたインデクスより大きいか等しいときにのみ、送り出しが可能となる。このようにして、最適化モジュール550はこの具体例においては、連の後続する画素に対し、フィル優先度メッセージ3004〜3008だけを渡す。最適化モジュール550は、フィル優先度メッセージ3004のRESTOREビット命令もまた、この命令のレベルインデクスがレジスタ2524(図25)内に格納されたレベルインデクスと等しいので、アサートする。STOREビット命令は連の先端画素に後続する画素と結び付いたすべてのフィル優先度メッセージに対し非アサートされる。
最適化モジュール550は、フィル優先度メッセージのSTOREとRESTOREビットのみをマニュピレートし、フィル優先度メッセージ他のフィールドを無変更のままにすることに注目されたい。
これらのフィル優先度メッセージ3004〜3008は、連の先端画素に後続する各画素に対し、最適化モジュール550によって、フィル決定モジュール600に渡される。フィル決定モジュールはこれらのフィル優先度メッセージを対応するカラー合成メッセージに変換し、次に画素合成モジュール700に送る。画素合成モジュール700は、RESTOREビットをアサートされた、カラー合成メッセージを受け取ると(例えば3004)、中間値レジスタ2310内に格納されたカラーと不透明度値をスタックの天辺にコピーする。画素合成モジュール700は、次に通常の方法で、フィル優先度メッセージ3005〜3008に対応するカラー合成メッセージ内に内蔵されている命令に従って、先へ進む。
こうして、X独立合成演算群についての合成結果のカラーと不透明度は、連の先端画素処理中に完成され格納され、連の後続する画素の処理中に取り出されることが分る。
4.2 最適化モジュールの第2実施態様
今度は図26に転じ、最適化モジュール550のブロック図を示してあるが、これは第2実施態様に従って、第1実施態様の接近法に対する第2実施態様の接近法を提供するものである。最適化モジュール550は第2実施態様に従い、フィル優先度メッセージを渡し、RESTOREビット命令フィル優先度メッセージ内に、第1実施態様と実質同じ方法で設定するので、モジュールのその部分の詳細説明は省略する。これに関して、第2実施態様の第1実施態様と同じ参照番号を有する部分は、第1実施態様と同じ方法で動作する。更に、これら第1及び第2実施態様の双方と一緒に使われる画素合成モジュール700は同じ機能を有し、同じ方法で動作する。
最適化モジュール550は、第2実施態様に従い、フィル優先度メッセージ内のSTOREビットに第1実施態様のそれとは異なる方法で命令をアサートする。この例では、デコーダ2602は現在入力レジスタ2510に格納されているフィル優先度メッセージ内のスタック動作がNO_POP_DESTであるかどうかを判定し、もしそうならばORゲート2604の第1入力をアサートする。最適化モジュール550はまたフィル優先度メッセージのx独立フラグの状態をORゲート2604の逆入力に供給する。ORゲート2604の出力はRSラッチ2606のS入力に与えられる。更に、デコーダ2514からのEND_OF_PIXELメッセージはRSラッチ2606のR入力に与えられる。ラッチ2606のQ出力は、ANDゲート2522の1入力に与えられ、デコーダ2514はANDゲート2522の他の入力にFIRST_PIXELメッセージも与える。
このようにしてこの実施態様ではラッチ2606は画素の始めにおいて初期に非アサートされ、NO_POP_DESTスタック動作、又は、その画素の処理中にフィル優先度メッセージ内のX従属演算数に出合うと、ラッチ2606がアサートされる。もしラッチ2606がアサートされず、画素が連の先端画素である場合は、STOREビットがアサートされ、レジスタ2524が設定される。ラッチ2606が連の先端画素に対してアサートされると、それはその画素に対してはアサートされ続け、連のその先端画素に対して、もはやSTOREビットとレジスタ2524の設定をしない。
この第2の実施態様においては、STOREとRESTOREビット命令の決定は、第1実施態様内でのSTOREとRESTOREビット命令の決定と異なっている。この結果、最適化モジュール550によって、第2実施態様の後続する画素中に従って渡されたフィル優先度メッセージは、第1実施態様とは異なることがある。
図31Aと31Bに転じ、そこに画素連の先端画素に対するフィル優先度メッセージの典型的なオリジナルシーケンスと、後続する画素に対して、最適化モジュール550によって、第2実施態様に従って最適化されたフィル優先度メッセージの、シーケンス間の比較を示す。
図31Aに転じ、連の先端画素のフィル優先度メッセージ3101から3108は最適化モジュール550に送られ、それによって、最劣から最優先の順に渡される。つまり、フィル優先度メッセージ3101〜3108は、3101、3102、3103、3104、3105、3106、3107、3108の順で、最適化モジュール550に渡される。このようにしてSTOREビット命令は、X独立でNO_POP_DESTスタック演算を内蔵しない最優先のフィル優先度メッセージに対し、アサートされることが見てとれる。一旦フィル優先度メッセージのNO_POP_DESTスタック演算又はX従属演算数に出合うと、これに結び付いたSTOREビットは非アサートされ、残りのフィル優先度メッセージに対し優先順に非アサートされる。このようにして、STOREビットはフィルメッセージ3101と3102に対しアサートされる。RESTOREビットは連の先端画素に結び付いた3101から3108のすべてのフィルメッセージに対し非アサートされる。
今度は図31Bに転じ、そこに最適化モジュール550によって、連の先端画素に後続する各画素の処理中に渡されたフィル優先度メッセージを示す。先ず、連の先端画素のフィル優先度メッセージを送り出した後でレジスタ2524(図26)はフィル優先度メッセージ3102のレベルインデクスを内蔵していることに注目されたい。この結果、シフトレジスタ2532の出力は後続する画素のフィル優先度メッセージの送り出しが、これらのフィル優先度メッセージのインデクスがレジスタ2524内に格納されたインデクスより大きいか等しい場合にのみ、できるようになる。従って、最適化モジュール550は、この具体例においては、連の後続する画素に対し、フィル優先度メッセージ3102〜3108のみを渡す。最適化モジュール550は、この命令のレベルインデクスがレジスタ2524(図26)内に格納されたインデクスと等しいので、RESTOREビットにも命令をアサートする。STOREビットの命令は連の先端画素に後続する画素と結び付いたすべてのフィル優先度メッセージに対して非アサートされる。
このような方法で、X独立な合成演算群の合成結果のカラーと不透明度は完成し、連の先端画素処理中に画素合成モジュール内のレジスタに格納され、連の後続する画素処理中に使用のため取り出される。
4.3 最適化モジュールの第3実施態様
別の代替法は、X独立動作に出会うとスタック全体の状態を格納し、連の後続する画素についてこのストアからスタックを復元することである。これは、ハードウエアの実施態様において、それが多数のチップ上の高速メモリやレジスタを要求するとはいえ、より非制限的である。
もし、画素合成モジュール700内に充分なレジスタ又はメモリセルが使用可能であれば、スタックの状態は、X従属演算の最初の出現前に格納することができる。これはスタック深度が、状態の格納が実行されるとき1でなければならないという要件の緩和を可能にする。この場合、最適化段階でのカウンタは要求されないが、画素合成モジュールの複雑性は著しく増大する。
今度は図27に転じ、最適化モジュール550のブロック図を第3の実施態様に従って示すが、これは第1・第2実施態様とは別の接近法を実施するものである。
最適化モジュール550は、第3実施態様に従ってフィル優先度メッセージを渡し、第1・第2実施態様と実質同じ方法で、フィル優先度メッセージ内にRESTOREビット命令を設定する。そこで、モジュールのその部分の詳細説明は省略する。これに関して、第3実施態様の第1実施態様と同じ参照番号を有する部分は第1実施態様と同じ動作をする。
最適化モジュール550は第3実施態様に従って、フィル優先度メッセージ内に、第1・第2実施態様とは異なる方法で、STOREビット命令をアサートする。この例では、最適化モジュール550はフィル優先度メッセージのx独立フラグをRSラッチ2702の逆S入力とNORゲート2704の第1入力に出力する。ラッチ2702のQ出力はNORゲート2704の第2入力に送られる。デコーダ2514は、ラッチ2702を、終端画素メッセージに出合うと、そのR入力経由で、設定し直す。このようなやり方で、ラッチ2702は画素の最初のx独立フィル優先度メッセージに出合った後で、終端画素に出会って設定し直されるまで、アサートされた状態を維持する。こうして、画素連の先端画素に結び付いたx従属フィル優先度メッセージに出合うと、STOREビット命令はアサートされる。
ラッチ2702は、STOREビット命令が任意の画素連に対し一回だけアサートされることを確実にするために使われている。
この第3実施態様においては、STOREとRESTOREビット命令の決定は、第1・第2実施態様のSTOREとRESTOREビット命令の決定とは異なっている。従って、最適化モジュール550によって後続する画素の処理中に第2実施態様に従って渡されたフィル優先度メッセージは、第1・第2実施態様とは異なることがある。
最適化モジュール550のこの実施態様と一緒に使われる画素合成モジュール700は、STOREビット命令に応じてスタックの格納ができるよう修正されている。特に中間値レジスタ2310は、スタックのコピーがこれらのレジスタに格納できるように、何セットものレジスタに置き換えられている。
画素合成モジュール700は、STOREビット命令をアサートされたカラー合成メッセージを受け取ると(フィル優先度メッセージから導かれた)、合成スタックの状態をレジスタセット内に格納する。画素連の終点までの後続画素毎に、スタックは、任意の合成演算が実行される前に、その格納状態に初期設定されている。こうして、スタック格納命令前の演算は、後続する画素に対しては実行される必要がない。
もし、ラッチ2702がアサートされ、レジスタ2524が最低のアクティブレベルに等しければ、そのような最適化は不可能である。この場合、その画素連に対するすべての寄与演算は、連の後続画素毎に川下のモジュールに送られる。
今度は図32Aと32Bに転じ、連の先端画素に対するフィル優先度メッセージの典型的なオリジナルシーケンスと最適化モジュール550によって第3実施態様に従って最適化された後続画素に対するフィル優先度メッセージの最適化シーケンスの比較を示してある。この具体例では、連(図32A)の先端画素に対するフィル優先度メッセージは、STOREビット命令を除いて、図30Aに示したそれらのものと同一であることに注目されたい。
今度は図32Aに転じ、連の先端画素のフィル優先度メッセージ3201〜3208は、最適化モジュール550に送られ、それによって、最劣後から最優先の順で渡される。即ち、フィル優先度メッセージ3201〜3208は、最適化モジュール550に送られ、それによって、3201、3202、3203、3204、3205、3206、3207、3208の順で渡される。このようにして、最初に出会う、x従属でその他ではない、フィル優先度メッセージに対し、STOREビット命令がアサートされるのが理解される。したがって、STOREビットはフィルメッセージ3207に対しアサートされる。RESTOREビットは連の先端画素と結び付いたすべてのフィルメッセージ3201から3208に対して非アサートされる。
図32Bに転じて、連の先端画素に後続する各画素の処理中に最適化モジュール550によって渡されるフィル優先度メッセージを示す。第1に、連の先端画素のフィル優先度メッセージを送り出した後のレジスタ2524(図25)はフィル優先度メッセージ3207のレベルインデクスを内蔵していることに注意されたい。従って、シフトレジスタ2532の出力は、連内後続画素に対するフィル優先度メッセージが、これらのフィル優先度メッセージのインデクスがレジスタ2524に格納されているインデクスより大きいか等しいときにのみ送り出し可能になる。このようにして、この具体例において最適化モジュール550は、連内後続画素に対し、フィル優先度メッセージ3207〜3208のみを渡す。最適化モジュール550は、この命令のレベルインデクスがレジスタ2524(図27)内に格納されているレベルインデクスと等しいので、RESTOREビットフィル優先度メッセージ3207の命令もアサートする。連の先端画素に後続する画素に結び付いているすべてのフィル優先度メッセージに対し、STOREビットの命令は非アサートされる。
画素合成モジュール700のこの実施態様と結合して使われる実施は、第1・第2実施態様と結合して使われる画素合成モジュール700とは異なることに注意されたい。後者においては、RESTOREビット命令を内蔵しているカラー合成メッセージ(フィル優先度メッセージから導かれた)は、画素合成モジュール700の中間値レジスタ2310の内容をスタック38に取り出し、それから次のカラー合成メッセージの合成演算の実行に進む。他方、最適化モジュール700の第3実施態様と結合して使われる画素合成モジュール700は、レジスタセット内のスタック状態をスタック38に取り出し、次に現在のカラー合成メッセージと結び付いている合成演算を実行する。
このような方法で、一群のX独立合成合成結果のカラーと不透明度の演算結果は完成し、連の先端画素処理中に、画素合成モジュール内のレジスタに格納し、連の後続する画素の処理中に使用するため取り出すことができる。
4.4 最適化モジュールの第4実施態様
最適化モジュール550の第4実施態様は、x独立カラーの結合演算のシーケンスが一回の演算で最適化できるように、フィル優先度メッセージ内の結合的な合成演算を判定する。幾つかのレジスタが、一つの演算のストリーム内で、x独立演算の幾つかの連が最適化できるように、画素合成モジュール内の中間データを格納するために使用可能である。この実施態様では、x従属演算の存在は、最適化可能演算セットが縮小されるとしても、すべての演算が結合的であることはなく、シーケンス内のすべての演算が最適化可能であるためには同一に違いないので、後続する演算の最適化を妨げない。にもかかわらず、Porter & DuffのOVER演算は結合的であり、透明演算が支持されているシステムにおいては、OVERはもっとも普通に見られる演算である。
もし、或る演算が(AopB)opC = Aop(BopC)のように結合的であれば、そのような演算が実行されるシーケンスは、x独立な演算を最初に実行するように変更可能である。一つ以上のx独立な演算シーケンスの演算結果は、その場合、後続する画素内で使用されるレジスタに格納することができる。そのような任意の連に対して、結合演算子は数多くあるとしてもそれらは一般的に混合できないので、演算子は同一でなければならない。最適化可能であるためには、結合演算の連は完全な部分式でなければならない、従ってそれは始めと同じようなスタック深度をもって終わるはずである。
ここでASS_OPと表示する、或る特定の結合演算子を識別するために、比較が使われ、アルファとカラー演算子の可能な組合せのリストから選ばれている。ASS_OP演算はハードワイヤードされていてもレジスタ内に格納されていてもよいが、ソフトウエアドライバにどちらの演算子を使うかの判定を可能にする。
今度は図28に転じ、第4実施態様に従った、最適化モジュール550のブロック図を示す。最適化モジュール550は、入力として優先度決定モジュール500によって順次送られたメッセージを受け取り、それらを入力シフトレジスタ2810に一度に一つづつ格納する。これらのメッセージは先端画素、フィル優先度、終端画素、繰り返しメッセージなどを含むことができる。図28には、例として入力シフトレジスタ2810に格納されたフィル優先度メッセージを示す。最適化モジュール550は、これらのメッセージも、入力・出力レジスタ2810と2848がクロックサイクル順に同一メッセージを内蔵するような方法で、出力シフトレジスタ2848に渡す。出力レジスタ2848は、フィル優先度メッセージでないメッセージのすべてと、フィル優先度メッセージの幾つかのみを、追って説明するように、フィル決定モジュール600に出力する。出力シフトレジスタ2848から出力されたそれらのフィル優先度メッセージは、STORE、RESTORE、ACC_ENと呼ぶ、三つのビットを付加することにより修正される。図28は、出力レジスタ2836に格納された、そのような修正されたフィル優先度メッセージの例を示している。STORE、RESTORE、ACC_ENビットは非アサートされた状態で初期設定されている。
これまでに説明したように、フィル優先度メッセージは、フィル決定モジュール600内でフィルインデクスとフィルタイプを対応するカラーと不透明度値に置き換えることによって、カラー合成メッセージに変換される。これらのSTORE、RESTORE、ACC_ENビットを含むカラー合成メッセージは次に、図23Bに示す画素合成モジュール700に送られる。
図28に戻って、最適化モジュール550は、入力レジスタ2810に格納されているメッセージが先端画素メッセージ、終端画素メッセージ、或いはフィル優先度メッセージのどれかを判定する、デコーダ2814を含んでいる。デコーダ2814はそれらに対応する2進信号START_OF_PIXEL、END_OF_PIXEL、FILL_PRTYを出力する。メッセージがフィル優先度メッセージであれば、デコーダ2814は、そのフィル優先度メッセージが画素連の先端画素に結び付いているかもまた判定し、2進信号FIRST_PIXELを出力する。デコーダ2814は、フィル優先度メッセージ内に内蔵されている優先度レベルインデクスも判定し、そのインデクスを表すデータLEVEL_INDXを出力する。
最適化モジュール550は更に、フィル優先度メッセージ内に内蔵されたスタック演算のタイプをデコードするための、入力レジスタ2810に連結したデコーダ2802を一部として含んでいる。具体的には、デコーダ2802は、フィル優先度メッセージ内に内蔵されているスタック動作がNO_POP_DESTかPOP_SRCスタック動作のどちらかを判定する。
デコーダ2802はカウンタ2804に繋がっており、スタック動作がNO_POP_DESTかPOP_SRCスタック動作のどちらかであると、カウンタ2804に知らせる。カウンタ2804は、デコーダ2814(示されていない)から受け取るSTART_OF_PIXEL信号に対応し、1に初期設定されている。そこで、カウンタ2804は、入力レジスタ2810に格納された後続するフィル優先度メッセージ内の、各NO_POP_DESTスタック動作に対して増分され、各POP_SRCスタック動作に対して減分される。カウンタ2804の現在値は、現在のフィル優先度メッセージの判定されたスタック演算を実行する結果生成される、画素合成モジュール700内のスタック38のスタック深度を決定する。カウンタ2804は、現在のフィル優先度メッセージのスタック演算が実際に実行される前に、現在のフィル優先度メッセージと結び付いたスタック演算から結果する、スタック38の深度を予測することに注目することが重要である。カウンタ2804はこれを、フィル優先度メッセージ内のスタック動作によって生成されたスタック深度の走行中カウントを維持することによって行う。
カウンタ2804の出力は比較器2812の第1入力と繋がっている。比較器2812の他の入力は、所定のスタック深度の値R1を格納するレジスタ2814に繋がっている。カウンタ2804は、シフトレジスタ2810を通して入力されたフィル優先メッセージのシーケンスに対応して、予測されたスタック深度を増減分し、比較器2812は予測されるスタック深度が何時R1と等しくなるかを判定する。スタック深度がR1と等しくなると、比較器2812はANDゲート2816の第1入力とANDゲート2824の第1入力をアサートする。
最適化モジュールは、一つの入力がシフトレジスタ2810に繋がり、もう一つがレジスタ2818に繋がって、現在シフトレジスタ2810に内蔵されているフィル優先度メッセージの現在のcolor_opとalpha_op演算を、レジスタ2818に格納されているcolor_opとalpha_op演算ASS_OPと比較するための比較器を内部に含んでいる。それらが同一であれば、比較器2820はANDゲート2822の第1入力をアサートする。
ANDゲート2822は二つの入力、比較器2820の出力に繋がっている第1入力、シフトレジスタ2810に繋がっている第2入力を有する。シフトレジスタ2810は、この第2入力に、現在レジスタ2810に格納されているフィル優先度メッセージはx独立か否かを指示する2進信号を出力する。この結果、ANDゲート2822は、現在シフトレジスタ2810に格納されているフィル優先度メッセージのcolor_opとalpha_op演算がASS_OPと同一で、かつフィル優先度メッセージがx独立であるときにアサートされる。ANDゲート2822の出力は、ANDゲート2834の第11入力とANDゲート2824の第2入力に繋がっている。
ANDゲート2824は二つの入力を有している。これまで説明してきたように、第1は比較器2812の出力に繋がっており、第2入力はANDゲート2824の出力と繋がっている。こうして、ANDゲート2822は、現在シフトレジスタ2810に格納されているフィル優先度メッセージのcolor_opとalpha_op演算がASS_OPと同一で、かつ、フィル優先度メッセージがx独立で、予測されたスタック深度がR1に等しいときアサートされる。ANDゲート2824の出力はRSラッチ2830のS入力とORゲート2826の第1入力に繋がっている。
RSラッチ2830のR入力は、終端画素メッセージEND_OF_PIXELを出力する、デコーダ2814のその出力に繋がっている。こうして、ラッチ2830は各終端画素で設定し直され、最適化モジュール550が、次の画素に対して、color_opとalpha_op演算がASS_OPと同一で、かつ予測されたスタック深度がR1に等しい、x独立のフィル優先度メッセージと最初に出合うと設定される。ラッチ2830のQ出力はANDゲート2840の第1入力に繋がり、ラッチ2830のQ出力はORゲート2828の第1出力に繋がっている。
最適化モジュール550は、シフトレジスタ2810に繋がる、合成演算が真正プッシュ演算か否かを判定するための、更なる比較器2821を含んでいる。具体的には、比較器2821は、
[STACK_OP = NO_POP_DEST
&&COLOR_OP = LCO_COPYPEN
&&LAO_USE_SOUTD = SET
&&LAO_USE_SROPD = SET]
か否かを判定し、これがそれに該当すればORゲート2826の第2入力にアサートする。
ORゲート2826は二つの入力を有し、その第1入力はANDゲート2824の出力に、第2入力は比較器2821に繋がっている。最適化モジュール550は更に、二つの入力、一つはラッチ2830のQ出力に繋がり、他方の入力はORゲート2826の出力に繋がった、ORゲート2828から成っている。ORゲート2828の出力は更なるラッチ2832の逆S入力に繋がっている。RSラッチ2832のR入力は、終端画素メッセージEND_OF_PIXELを出力するデコーダ2814のその出力に繋がっている。
こうして、ラッチ2832のQ出力は、スタック深度R1を有する結合的、x独立のフィル優先度メッセージシーケンスに最初に出会うまで強制的にアサートされ、次に、予測されたスタック深度R1と結び付いた最初の非結合的、x従属のフィル優先度メッセージに出会うと非アサートされる。
ラッチ2832のQ出力は、ANDゲート2834の第2入力に繋がっており、その出力は今度はANDゲート2816の第2入力に繋がっている。
このようなやり方でSTOREビットは、もし
(1) 入力と出力レジスタ2810と2848内のメッセージが画素連の先端画素と結び付いたフィル優先度メッセージであるとき、
(2) そのメッセージが予測されたスタック深度R1を有しているとき、
(3) そのメッセージが、x独立で、ASS_OPのそれと同一のcolor_opとalpha_op演算を有する、フィル優先度メッセージシーケンスの一つであるとき、命令がアサートされる。しかしながら、唯一の例外として、そのシーケンスが、そのシーケンス内の最初のフィル優先度メッセージに続いて、メッセージに演算子STACK_OP = NO_POP_DEST && COLOR_OP = LCO_COPYPEN && LAO_USE_SOUTD = SET && LAO_USE_SROPD = SETを有する、フィル優先度メッセージを含むことがある。この特別なフィル優先度メッセージは、ソース値の純粋なスタックプッシュを生成する演算子の結合からなり、STOREビットをアサートされたフィル優先度メッセージのシーケンス内に含まれていることがある。そのシーケンスは、スタック深度に関係なく、x従属な値又は非結合的な演算子を有するフィル優先度メッセージに出合うと終わる。
今度は図28に戻り、RSラッチ2830のQ出力は、ANDゲート2840に繋がっている。ANDゲート2840は二つの入力を備えており、他方の入力は2進信号FIRST_PIXELを出力するデコーダ2814のその出力に繋がっている。従って、ANDゲート2840とACC_ENN命令ビットは、フィル優先度メッセージが、画素連の先端画素に結び付いた、結合演算子ASS_OPと予測されたスタック深度R1を有する、最初のx独立のフィル優先度メッセージであるときにアサートされる。後続するフィル優先度メッセージの連が終わると、ラッチ2830は、x従属フィル優先度メッセージに出会うか又は非結合的演算子に出会うかのどちらかの理由で使用不能化され、その結果ACC_EN命令ビットが非アサートされる。
最適化モジュール550は更に、デコーダ2814のLEVEL_INDX出力に繋がったデータライン、ANDゲート2840の出力に繋がった書き込み可能ライン、ANDゲート2838に繋がった設定し直しラインを備えたレジスタ2852からも成っている。ANDゲート2838は、それぞれSTART_OF_PIXELとFIRST_PIXELメッセージを出力する、デコーダ2814の出力に繋がる二つの入力を備えている。デコーダ2814がSTART_OF_PIXELメッセージとそれに続くFIRST_PIXELメッセージに出合うと、ANDゲート2838はアサートされ、レジスタ2852は空白に設定される。ANDゲート2840がアサートされると、現在シフトレジスタ2810に格納されているフィル優先度メッセージのレベルインデクスは、レジスタ2852に格納される。このような方法で、レジスタ2852は、結合演算子ASS_OPと予測されたスタック深度R1を有する、画素連の先端画素に結び付いた最初のx独立フィルメッセージのレベルインデクスを内蔵する。即ち、レジスタ2852は、STOREビット命令をアサートされたシーケンス内の最初のフィル優先度メッセージのレベルインデクスを内蔵している。
最適化モジュール550は更に、デコーダ2814のLEVEL_INDX出力に繋がったデータライン、ANDゲート2836の出力に繋がった書き込み可能ライン、ANDゲート2838に繋がった設定し直しラインを備えたレジスタ2837からも成っている。デコーダ2814が START_OF_PIXELメッセージとそれに続くFIRST_PIXELメッセージに出合うと、ANDゲート2838はアサートされ、レジスタ2837は空白に設定される。ANDゲート2836がアサートされると、現在シフトレジスタ2810に格納されているフィル優先度メッセージのレベルインデクスは、レジスタ2837に格納される。このような方法で、レジスタ2837は、STOREビット命令をアサートされたシーケンス内の最後のフィル優先度メッセージのレベルインデクスを内蔵している。ANDゲート2838はデコーダ2814のFIRST_PIXEL出力とANDゲート2816の出力の二つの入力を備えている。
最適化モジュール550は更に、比較器2844をもまた含んでいる。比較器2844はレベルレジスタ2837に繋がった一入力とLEVEL_INDX信号を出力するデコーダ2814の出力に繋がるもう一つの入力を備えている。その比較器は、現在シフトレジスタ2810に格納されているフィル優先度メッセージのレベルインデクスLEVEL_INDXと、現在レジスタ2837に格納されているレベルインデクスを比較する。これらのレベルインデクスが同一であれば、比較器2844はANDゲート2850の第1入力をアサートする。ANDゲート2850の第2(逆数の)入力は、デコーダ2814のFIRST_PIXEL出力である。ANDゲート2850の出力はレジスタ2848のRESTOREビットをアサートする。こうして、RESTOREビットは、現在ビットが画素連の先端画素でなく、比較器2844の出力がアサートされているときアサートされる。
最適化モジュール550はそのうえ、比較器2842を含んでいる。比較器2842は、現在シフトレジスタ2810に格納されている、フィル優先度メッセージのLEVEL_INDXを出力する、出力デコーダ2814に繋がる一つの入力を備えている。比較器2842は、レジスタ2852に繋がるもう一つの入力をもまた備えている。比較器2842は、現在シフトレジスタ2810に格納されているフィル優先度メッセージのレベルインデクスLEVEL_INDXと、現在レジスタ2852に格納されているレベルインデクスを比較する。現在、シフトレジスタ2810に格納されているフィル優先度メッセージのレベルインデクスが、レジスタ2852に格納されているレベルインデクスより小さいか等しければ、比較器2842はORゲート2854をアサートする。
最適化モジュール550はそのうえ更に、比較器2846を有する。比較器2846は現在シフトレジスタ2810に格納されている、フィル優先度メッセージのLEVEL_INDXを出力する、出力デコーダ2814に繋がる一つの入力を備えている。比較器2846はレジスタ2837に繋がるもう一つの入力をもまた備えている。比較器2846は、現在シフトレジスタ2810に格納されているフィル優先度メッセージのレベルインデクスLEVEL_INDXと、現在レジスタ2837に格納されているレベルインデクスを比較する。現在、シフトレジスタ2810に格納されているフィル優先度メッセージのレベルインデクスが、レジスタ2837に格納されているレベルインデクスより大きいか等しければ、比較器2846はORゲート2854をアサートする。
ORゲート2854は四つの入力、FILL_PRTY2進信号を出力するデコーダ2814の出力に向けた第1の逆数入力と、比較器2842、2844、2846にそれぞれ繋がっている第2、第3、第4の入力から成る。ORゲート2854の目的は、出力シフトレジスタ2848に内蔵されたメッセージの出力を可能にすることである。このような方法で、レジスタ2837に格納されたレベルインデクスより大きいか等しいレベルインデクス、又はレジスタ2852に格納されたレベルインデクスより小さいか等しいレベルインデクスを有する、連の先端画素に後続する画素のすべてのフィル優先度メッセージは出力が可能になる。出力可能になったフィル優先度メッセージは、フィル決定モジュール600に渡される。出力可能になっていない残りのフィル優先度メッセージは、どれもフィル決定モジュール600に渡されない。そしてまた、フィル優先度メッセージでないものも、フィル決定モジュール600に渡すことが可能になる。
今度は、第4実施態様に従った、最適化モジュール550の動作説明を行う。最初のフィル優先度メッセージが、x独立結合演算を有する連の先端画素に出合うと、画素合成モジュール700(図23B)の積算器2320は使用可能になり、カラー値をロードされる。もし、後続するレベルがx独立で結合演算を内蔵していれば、その演算は積算値上に、主スタック38上と併せて実行される。積算値は、もしスタック深度が最初の結合演算のオリジナルスタック深度と同一であれば、画素合成モジュール700(図23B)の積算器2320内の一時レジスタに格納される。
連が終わると、x従属フィルデータに出会うか、非結合演算に出会うかのどちらか理由で、画素合成モジュール700(図23B)の積算メカニズム2320は使用禁止される。最後に格納された積算値は、後続する画素上、最後に格納されたレベルと画素の始端間の演算を置き換えるために使用可能である。こうして、後続する画素について、フィルカラー決定モジュール600のためにフィル優先度メッセージを生成するとき、積算器2320からこの値を復元する命令が、最適化の済んだ命令のシーケンスに代わって使用される。この復元命令はカラー合成メッセージに含めてあり、画素合成モジュール700(図23B)に渡され、そこで、復元された値は、デコーダによって識別された結合演算を使用して画素に合成される。
結合演算子はそのコードからか、又は優先度決定モジュール500内の各レベルにフラグを加えそのレベルの結合演算子の存在を指示することにより、識別することができる。第2のオプションは、優先度決定テーブルを構築するとき、ソフトウエアプログラムに結合演算子の連を識別するための柔軟性を与え、ソフトウエアが最適化されつつあるオブジェクト群がばらばらであることを識別できるという条件付きながら、異なる演算の最適化を可能にする。
複雑性が増す犠牲を伴うが、各画素について数個の連の結合演算を格納することはできる。それは単に、各連に対し中間値を格納するための十分なレジスタを備えることと、各連が識別されたとき、その中に積算データを格納するレジスタを判定することができるように、増分されるカウンタを備える問題である。現実の世界においては、しかし、これは余分のハードウエアコストをかけるに値するほど頻繁に要求されることは少ない。
次に図33Aと33Bに転じ、画素連の先端画素に対するフィル優先度メッセージの典型的オリジナルシーケンスと、最適化モジュール550により第4実施態様に従って最適化された、後続する画素のフィル優先度メッセージの最適化されたシーケンスの比較を示す。
図33Aは、最適化モジュール550により、隣接するエッジ間の画素連の先端画素に対して出力された、フィル優先度メッセージ3301〜3308の典型的シーケンスを示している。優先度決定モジュール500によって生成された、画素連の各画素に対するフィル優先度メッセージのシーケンスと、最適化モジュール550に送られたそれとは、同一であると分かることが重要である。
最適化モジュール550は、連の先端画素に対するフィル優先度メッセージのすべてをフィル決定モジュール600に渡す。加えて、それは三つの追加ビット、STORE、ACC_EN、RESTOREを付加する。連の先端画素の処理中に、最適化モジュール550は、もしそのメッセージが、結合的ASS_OP演算子を有するx独立のフィル優先度メッセージで、スタック深度R1(この例では1に設定されている)と結び付いているメッセージシーケンスの一つであれば、STOREビットをアサートする。そのシーケンスは、x従属値又は非結合値を有するフィル優先度メッセージに出合うと終わる。しかし、唯一の特別な例外において、そのシーケンスは、シーケンス内の最初のフィル優先度メッセージに続くフィル優先度メッセージに、演算子STACK_OP = NO_POP_DEST&&COLOR_OP = LCO_COPYPEN&&LAO_USE_SOUTD = SET&&LAO_USE_SROPD = SETを有するメッセージを含むことがある。この特別なフィル優先度メッセージは、ソース値の純粋なスタックプッシュを生成し、STOREビットアサートされているフィル優先度メッセージのシーケンス内に含まれている、演算子の結合から成っている。
今度は図33Aに転じ、連の先端画素に対するフィル優先度メッセージ3301〜3308は最適化モジュール550に送られ、それによって最劣後から最優先の順に渡される。即ち、フィル優先度メッセージ3301〜3308は最適化モジュール550に送られ、それによって3301、3302、3303、3304、3305、3306、3307、3308の順で渡される。こうして、カウンタ2804はフィル優先度メッセージ3301〜3308のそれぞれに対し、1、1、1、1、2、2、1、1のカウントを有していることが分る。そしてまた、フィル優先度メッセージ3302〜3307はX独立であり、フィル優先度メッセージ3302〜3304、3306、3307は結合的ASS_OPである。こうして、STOREビットアサートされているフィル優先度メッセージのシーケンスは3302〜3304、3307となる。フィル優先度メッセージ3305は特別例外のフィル優先度メッセージであり、優先度メッセージ3306は結合的ASS_OPであるとしても、フィル優先度メッセージ3305、3306はそれらに2のスタック深度を有し、それ故にそれらのSTORE命令ビットをアサートされないことに注目されたい。そのうえ、STOREビットをアサートされたフィル優先度メッセージのシーケンスは、x従属なフィル優先度メッセージ3308で終わる。更にまた、ACC_ENビット命令は、STOREビット命令をアサートされた(即ち3302)シーケンス内の最初のフィル優先度メッセージに対してアサートされ、連の先端画素に結び付いている残りのフィル優先度メッセージに対して続くことも分る。RESTOREビットは連の先端画素に結び付いている3301〜3308のすべてのフィルメッセージに対し非アサートされる。
図33Bに転じ、最適化モジュール550によって連の先端画素に後続する各画素の処理中に渡されたフィル優先度メッセージを示す。先ず、レジスタ2852(図28)は、連の先端画素のフィル優先度メッセージを送り出した後、フィル優先度メッセージ3302のレベルインデクスを内蔵していることに注目されたい。そしてまた、レジスタ2837(図28)は、連の先端画素のフィル優先度メッセージを送り出した後、フィル優先度メッセージ3307のレベルインデクスを内蔵していることに注目されたい。従って、シフトレジスタ2848の出力は、これらのフィル優先度メッセージがレジスタ2837に格納されたインデクスより大きいか等しいインデクスを有するときか、又はレジスタ2852内に格納されたインデクスより小さいか等しいインデクスを有するときにのみ、連の後続する画素に対するフィル優先度メッセージの送り出しを可能にされる。こうして、この特例における最適化モジュール550は、連の後続する画素に対し、フィル優先度メッセージ3301、3307、3308だけを渡すことになる。最適化モジュール550は同様に、この命令のレベルインデクスがレジスタ2837(図28)内に格納されたレベルインデクスと等しいときに、フィル優先度メッセージ3307のRESTOREビット命令をアサートする。STOREビット命令は、連の先端画素に後続する画素に結び付いているすべてのフィル優先度メッセージに対し、非アサートされる。
最適化モジュール550は、STORE、ACC_EN、RESTOREビットのみをマニュピレートし、フィル優先度メッセージの他のフィールドは変更なしのままにすることに注目されたい。
これらのフィル優先度メッセージ3301、3307、3308は、最適化モジュール550によって、連の先端画素の各後続画素に対して、フィル決定モジュール600に渡される。フィル決定モジュールは、これらの優先度メッセージを、対応するカラー合成メッセージに変換し、画素合成モジュール700に送る。
こうして、X独立な合成演算群の合成結果のカラーと不透明度は完成され、連の先端画素の処理中に格納され、連内後続画素の処理中に取り出される。
4.5 最適化モジュールの第5実施態様
第5の実施態様に従った最適化モジュール550は、ツリー式(即ち、宛先がツリーのブランチに繰り返されていない)として記載できる演算に関係している。この状況において、画素合成モジュール(図23A)は、レジスタにX独立なツリーの一ブランチの演算結果を格納し、後続画素については、ブランチをレジスタから復元するように適合させてある。ツリーノードの一ブランチのX従属データの存在は、他のブランチの最適化のきっかけとなる。もし、或るノードの両ブランチがX独立であるときは、ツリーのさらに上位置によりよい最適化が得られ、もし或るノードの両ブランチがX従属であれば、そのノード上では最適化は得られないことに注目されたい。
もし、或る画素連の画像記述がツリー表現式で書き表せれば、ツリーのブランチがX独立である場合、そのブランチは一度計算され、この演算結果をその連内後続画素についてのブランチに代えて使用することができる。より一般的には、PUSH演算と、これらの演算結果をプッシュ値と結合する、対応するPOR_SRC演算間のすべての演算が、もし:
・ X独立であり、かつ
・ プッシュ値を含まなければ
これらの演算は一度計算すれば、その演算結果を、連内後続画素についてこれらの演算をする代わりに使用することができる。そのようなシーケンスには、NO_POP_DEST、KEEP_SRC、POP_SRC演算もまた含めることができ、上記の二つの条件がオリジナルのプッシュ値に関して当てはまるならば、そのような任意のシーケンスは最適化により除去できることに注目されたい。
今度は図29に転じ、第5実施態様に従って、最適化モジュール550のブロック図を示してある。図示した最適化モジュール550はスタック深度Nに対するものである。ハードウエアは、一レベルにプッシュ値を含む演算はスタックの更に下位レベルのプッシュ値には影響しないので、可能なスタック深度毎に繰り返しを要求する。そのようなスタックの上位レベルでの演算は、従って、より下位レベルスタック深度でのX独立データの最適化を妨げない。
最適化モジュール550は、入力として優先度決定モジュール550によって送られたメッセージを受け取り、それらを、前記の実施態様に関して説明した入力と出力のレジスタに対するやり方と同じように、入力と出力レジスタ2910と2948に格納する。出力シフトレジスタ2910から出力されたフィル優先度メッセージは、1系列のビットSTORE_0、STORE_1…、STORE_Nと1系列のビットRESTORE_0、RESTORE_1…、RESTORE_Nを付加することにより修正される。
図29はそのような、出力シフトレジスタ2948に格納された、修正されたフィル優先度メッセージの例を示すSTORE_NとRESTORE_Nビットだけを図解してある。STORE_xとRESTORE_xビットは非アサートに初期設定されている。図29に示した最適化モジュール550の回路はSTORE_xとRESTORE_xビットだけを修正してあることに注目されたい。図29に示したと同じような繰り返し回路は、0からN-1間の他のすべてのxに対して、他の残っているSTORE_xとRESTORE_xビットすべてを修正するために含めることができる。
STORE_xとRESTORE_xビット命令の目的は、第1・第2実施態様に関して前に説明したそれと似たようなものである。しかしながら、違いは、ツリー表現式のx独立ブランチは一度計算されれば、中間レジスタ2310(図23A)にSTORE_xビット命令によって格納され、後続画素の処理中の合成演算に使うために、RESTORE_x命令ビットによって取り出されることである。
今度は図29に戻り、最適化モジュール550は、入力レジスタ2910に格納されているメッセージがstart_of_pixelか、end_of_pixelか、或いはまたフィル優先度メッセージかを判定し、それぞれの2進信号をSTART_OF_PIXEL、END_OF_PIXEL、FILL_PRTYに出力するデコーダ2914からもまた成っている。メッセージがフィル優先度メッセージであれば、デコーダ2914は、そのフィル優先度メッセージが画素連の先端画素に結び付いているかもまた判定し、2進信号FIRST_PIXELを出力し、そしてフィル優先度メッセージに内蔵されている優先度レベルインデクスを決め、そのインデクスを表すデータLEVEL_INDXを出力する。
最適化モジュール550は、入力レジスタ2910内のフィル優先度メッセージに内蔵されているスタック演算のタイプをデコードするための、入力レジスタ2910に繋がったデコーダ2902を更に含んでいる。具体的には、デコーダ2902は、フィル優先度メッセージに内蔵されているスタック演算がNO_POP_DESTかPOP_SRCスタック演算のどちらかを判定する。
デコーダ2902は、カウンタ2904に繋がっており、スタック演算がNO_POP_DESTかPOP_SRCスタック演算のどちらかであるときそのカウンタに知らせる。カウンタ2904は、デコーダ2914(示されていない)から受け取るSTART_OF_PIXEL信号に対応して1に初期設定されている。カウンタ2904は、各NO_POP_DESTスタック演算に対して増分され、入力レジスタ2910内に格納されている、後続フィル優先度メッセージ内の各POP_SRCスタック演算に対して減分される。カウンタ2904の現在値は、現在のフィル優先度メッセージの決定されたスタック演算を実行する結果生成される、画素合成モジュール700内のスタック38のスタック深度を判定する。カウンタ2904は、現在のフィル優先度メッセージのスタック演算が実際に実行される前に、現在のフィル優先度メッセージに結び付いたスタック演算の結果生じるスタック38の深度を予測することに注目することが重要である。カウンタ2904は、これを、そのフィル優先度メッセージのスタック演算の走行カウントを維持することにより行う。
カウンタ2904は、カウンタ2904があらかじめ決定されたスタック深度Nに対し増減分するとき、つまり予測スタック深度がNであるときを検知する比較器2912に繋がっている。比較器2912の出力はANDゲート2918の第1入力に繋がっているが、それについては以下に論ずる。カウンタ2904は、予測スタック深度がNより大きいときを検知する比較器2916にもまた繋がっている。
比較器2912は、カウントがNに等しいと検知すると、ANDゲート2906の第1入力にアサートする。さらに、デコーダ2902は、スタック演算がPOP_SRCスタック演算であると検知すると、ANDゲート2906の第2入力にアサートする。こうして、ANDゲート2906は、カウント= Nでかつスタック演算がPOP_SRCのときアサートされる。
最適化モジュールは更にRSラッチ2908もまた含み、それはEND_OF_PIXEL信号(デコーダ2914によって取得される)によりR入力経由で設定し直され、S入力経由でANDゲート2906によって設定される。こうして、RSラッチ2908のQ出力は、Nがスタック深度Nに増分されるまで、常に非アサートされる。RSラッチ2908のQ出力はANDゲート2918の逆数第2入力に繋がっている。
最適化モジュール550は、入力レジスタ2910のフィル優先度メッセージの合成演算が表現ツリーの有効なブランチであるブランチに所属しているか否かを判定する、デコーダ2920からもなる。それはこれを2進信号INVOLVES_PUSHEDを生成することにより行う。ここに
(STACK_OP = NO_POP_DEST)&& (COLOR_OP = LCO_COPYPEN)、
又は
(STACK_OP = STD_OP)、
又は
(STACK_OP = POP_SRC)に対し、
INVOLVES_PUSHED = FALSE (ゼロ) である。
2進信号INVOLVES_PUSHEDが偽(ゼロ)であれば、そのブランチは有効なブランチであり、従って最適化に適し、そうでなければそのブランチは無効で最適化には適しない。
デコーダ2920は、ANDゲート2922の第1入力に繋がっており、そこへINVOLVES_PUSHED信号を供給する。更に、比較器2916はANDゲート2922の逆数第2入力に繋がっている。こうして、ANDゲート2922はINVOLVED_PUSHEDが真でカウント<= Nであるときアサートされる。ANDゲート2922の出力はANDゲート2924の逆数第1入力に繋がっている。更に、ANDゲート2924はシフトレジスタ2910に繋がった第2入力を備えている。ANDゲート2924は入力レジスタに格納されているフィル優先度メッセージがx独立でかつ次の条件が真でない:INVOLVED_PUSHED = TRUE、かつカウント <= Nのとき、アサートされる。ANDゲートの出力はANDゲート2918の第3入力に繋がっている。
最適化回路550は設定し直し入力Rと逆数設定S入力を有するRSラッチ2928からもまた成っている。RSラッチ2928はR入力経由でORゲート2926によって設定し直され、逆S入力経由で、ANDゲート2924によって設定される。ORゲート2926の第1入力は比較器2912の出力に繋がっており、ORゲート2926の第2入力はデコーダ2914に繋がっている。ORゲート2926は入力レジスタ2910に格納されたメッセージがend_of_pixelメッセージかカウント = Nのどちらかであればアサートされる。従って、ラッチ2928はフィル優先度メッセージがx従属でかつINVOLVED_PUSHED = TRUEでカウント <= Nであるとき、設定される。ラッチ2928のQ出力は、ANDゲート2918の第4入力に繋がっている。更に、ANDゲート2918はデコーダ2914に繋がった(示されていない)第5入力を有し、そこでは2進信号FIRST_PIXELがその第5入力に送られる。
このようなやり方で、最適化モジュール550は、もし、
(1) 入力と出力レジスタ2910と2948内のメッセージが画素連の先端画素と結び付いたフィル優先度メッセージであり、
(2) カウンタ2904が現在カウントNを有し、従って予測されたスタック38の深度がNであり、
(3) (a)レジスタ2910と2948のフィル優先度メッセージが、画素メッセージの終り以来、これまでに出会った最初のフィル優先度メッセージがX独立であり、又はもしそうでなければ
(b) 前記最初のx独立なフィル優先度メッセージ以来、これまでに処理されたフィル優先度メッセージのすべてがX独立であり、かつ
(4) 格納されたフィル優先度メッセージが有効なブランチの一部であれば(即ち、INVOLVES_PUSHED=FALSE)、このSTORE_Nビット命令をアサートする。
最適化モジュール550は、ANDゲート2918に繋がった第1入力と、FIRST_PIXEL信号を出力するデコーダ2914の出力に繋がった第2入力を備えた、ANDゲート2930からも成る。ANDゲート2930は、シフトレジスタ2910と2948に内蔵されたメッセージが画素連の先端画素のフィル優先度メッセージであり、かつそのフィル優先度メッセージに結び付いたSTORE_Nビット命令がアサートされているとき、アサートされる。
最適化モジュール550は更に、LEVEL_INDXデータを出力するデコーダ2914のその出力に繋がったデータ入力ラインと、ANDゲート2930の出力に結び付いた書き込み可能ラインと、ANDゲート2950に繋がった設定し直しラインを備えたレジスタ2932からも成る。ANDゲート2950はそれぞれSTART_OF_PIXELとFIRST_PIXELメッセージを出力するデコーダ2914の出力部に繋がった二つの入力を備えている。デコーダ2914がSTART_OF_PIXELと後続するFIRST_PIXELメッセージに出合うと、ANDゲート2950はアサートされ、レジスタ2932はNullに設定される。更に、レジスタ2932は、ANDゲート2930がアサートされると、シフトレジスタ2910と2948に格納されたフィル優先度メッセージのLEVEL_INDXデータを格納する。こうして、レジスタ2932は、以前の何時でも、そのSTORE_Nビット命令をアサートされた、最後のフィル優先度メッセージのLEVEL_INDXを格納している。
最適化モジュール550は、ANDゲート2924に繋がった第1入力を備えたANDゲート2927と比較器2912に繋がった第2入力からも成る。ANDゲート2927はSTORE_Nビット命令がアサートされているとき、アサートされる。
最適化モジュール550は更に、LEVEL_INDXデータを出力するデコーダ2914のその出力部に繋がったデータ入力を備えたレジスタ2934からも成る。レジスタ2934は、ANDゲート2950のその出力にも繋がっており、START_OF_PIXEL信号と後続のFIRST_PIXEL信号に出合うと、レジスタ2934をNullに設定し直す。レジスタ2934はANDゲート2927がアサートされると、現在出力されたLEVEL_INDXデータを格納する。このようなやり方で、レジスタ2934は最初のSTORE BIT命令ビットをアサートされた連内最初のその画素のフィル優先度メッセージのLEVEL_INDXデータを格納する。つまり、レジスタ2932はそのSTORE_Nビットをアサートされた最後のフィル優先度メッセージのレベルインデクスを格納するのに対し、レジスタ2934は、連の先端画素に対し、そのSTORE_Nビットをアサートされた最初のフィル優先度メッセージのレベルインデクスを格納する。
最適化モジュール550は更に、比較器2936からも成る。比較器2936は、レベルレジスタ2932と繋がった一入力とLEVEL_INDX信号を出力するデコーダ2914のその出力に繋がったもう一つの入力から成っている。比較器はシフトレジスタ2910に現在格納されているレベルインデクスLEVEL_INDXとレジスタ2932に現在格納されているレベルインデクスを比較する。これらのレベルインデクスが同じであれば比較器2936はANDゲート2950の第1入力のアサートを行う。
ANDゲート2950は、デコーダ2914のその出力と繋がった、FIRST_PIXEL信号を出力する第2の逆数入力もまた備えている。こうして、ANDゲート2950は、RESTORE_Nビット命令を、レジスタ2932内に現在格納されているレベルインデクスと同じレベルインデクスを有する、画素連の先端画素に後続するそのフィル優先度メッセージに対しアサートする。
最適化モジュール550は更に、比較器2938からも成る。比較器2938は、シフトレジスタ2910内に現在格納されているフィル優先度メッセージのLEVEL_INDXを出力する、出力デコーダ2914と繋がった一つの入力から成っている。比較器2938はレジスタ2932に繋がったもう一つの入力からも成る。比較器2938は、シフトレジスタ2910に現在格納されているフィル優先度メッセージのレベルインデクスLEVEL_INDXと、レジスタ2932内に現在格納されているレベルインデクスを比較する。シフトレジスタ2910に現在格納されているフィル優先度メッセージのレベルインデクスがレジスタ2932内に現在格納されているレベルインデクスより大きいか等しければ、比較器2936は、ORゲート2946をアサートし、それは今度はORゲート2952をアサートする。
最適化モジュール550はそのうえ更に比較器2940からも成る。比較器2940はシフトレジスタ2910内に現在格納されているフィル優先度メッセージのLEVEL_INDXを出力する、出力デコーダ2914と繋がった一つの入力を含んでいる。比較器2940はレジスタ2934に繋がったもう一つの入力からも成る。比較器2940は、シフトレジスタ2910に現在格納されているフィル優先度メッセージのレベルインデクスLEVEL_INDXと、ラッチ2934内に現在格納されているレベルインデクスを比較する。シフトレジスタ2910に現在格納されているフィル優先度メッセージのレベルインデクスがレジスタ2934内に現在格納されているレベルインデクスより小さいか等しければ、比較器2936は、ORゲート2946をアサートし、それは今度はORゲート2952をアサートする。
ORゲート2952は三つの入力、ORゲート2946と繋がった第1入力、FIRST_PIXEL信号を出力するデコーダ2914の出力と繋がった第2の入力、FILL_PRTY信号を出力するデコーダ2914の出力と繋がった第3の逆数入力から成る。ORゲート2952の目的は、出力レジスタ2948に内蔵されているメッセージの出力を可能にすることである。このような方法で、レジスタ2932内に格納されたレベルインデクスより大きいか等しいレベルインデクスを有するか、又はレジスタ2934に格納されたレベルインデクスより小さいか等しいレベルインデクスを有する、連の先端画素に後続するすべてのフィル優先度メッセージは出力を可能とされる。出力可能となったフィル優先度メッセージはフィル決定モジュール600に渡される。出力可能になっていない残されたフィル優先度メッセージはフィル決定モジュール600に渡されない。そのうえ、フィル優先度メッセージでないものもフィル決定モジュール600に渡すことが可能になる。
今度は、第5実施態様に従った最適化モジュールの動作について説明する。先端画素に対するフィル優先度メッセージが処理されると、カウンタ2904はスタック深度を監視するために使われ、比較器2912はスタック深度がNに等しいと出力可能になる。スタック演算と画像演算はデコーダ2920によってスタック演算がプッシュ値(つまり、INVOLVES_PUSHED=FALSE)を含むかどうかを判定するためデコードされる。結果として生じるSTORE_Nビット命令は、スタック深度がNより大きいと、スタック深度がNに戻るとき、より高いスタック深度でのX独立データが最適化から除かれるように不能化される。
STORE_N信号はアサートされ始め、カラー値がx独立で、かつNより小さい予測スタック深度でのプッシュ値を含む演算に出会わなければアサートされ続ける。もし予測されたスタック深度がNを超えて増えれば格納は不能化されるが、上記のどちらの条件も生じなければ、再び格納可能化できる。そのうえ、STORE_N信号がアサートされ始めたときの優先度レベルはレジスタ2934に格納され、STORE_N信号が非アサートされているときの優先度レベルはレジスタ2932に格納される。
STORE_N信号は、スタック38の天辺の値を中間値レジスタ2310(図23A参照)にレベルNで格納させる。この実施態様に従った中間値レジスタ2310は、スタック深度N毎に一つの入力から成っている。やがて明らかになるように、ある特定レベルのxに対するSTORE_X信号がないときはレジスタ2310のレベルxでの入力には何の値も格納されない。
STORE_N信号は、そのレベルの格納された値の存在を指示するために、REG_N_USEDラッチ2908によってラッチされる。POP_SRCを有するフィル優先度メッセージが次にスタック深度=Nに出会うと、REG_N_USEDラッチ2908はレベルNに対するレジスタへの格納をSTORE_Nを不能化することにより不能化し、そしてPOP_SRC前の最後の値は上書きできなくなる。自身のSTORE_xビット命令をアサートされた最初のフィル優先度メッセージはレジスタ2934内のレベルデータの存在によって指示され、自身のSTORE_xビット命令をアサートされた最後のフィル優先度メッセージはレジスタ2932内のレベルデータの存在によって指示される。後続する画素に対しては、これらの最初と最後間のフィル優先度メッセージの演算結果は、レベルNで、中間値レジスタ2310内に格納された値に置き換えることができる。こうして、後続する画素の合成モジュールに対して合成命令を生成するとき、この値をレベルNに対して中間値レジスタ2310から復元する命令は、フィル優先度メッセージのシーケンスに代えて使用され、それらは最適化から除かれる。格納された値はカラー、不透明度、スタック演算が実行される前にスタック上にプッシュされる。
今度は図34Aと34Bに転じ、画素連の先端画素に対するフィル優先度メッセージの典型的オリジナルシーケンスと、最適化モジュール550によって、第5実施態様に従って最適化された、後続画素に対するフィル優先度メッセージのシーケンスを示す。
図34Aは、隣接するエッジ間の画素連の先端画素に対して最適化モジュール550によって出力されたフィル優先度メッセージ3401〜3410の典型的シーケンスを示す。優先度決定モジュール500によって生成された、画素連の各画素に対するフィル優先度メッセージのシーケンスと、最適化モジュール550に送られたそれとは同じものであることを認識することが重要である。
最適化モジュール550は、画素連の先端画素に対するフィル優先度メッセージのすべてをフィル決定モジュール600に渡す。更に、それは六つの追加ビットSTORE_0、STORE_1、STORE_2、とRESTORE_0、RESTORE_1、RESTORE_2(後の三つは図34Aに、前の三つは図34Bに示されていない)を付加する。STORE_0、STORE_1、STORE_2ビット命令はカウンタ2904がスタック深度をそれぞれ1、2、3と初期設定したの繰り返し回路に対応するものである。RESTORE_xビット命令に対しても同様である。
連の先端画素の処理中に、最適化モジュールは上記のテスト条件に従ってSTORE_Nビットをアサートする。
今度は図34Aに転じ、連の先端画素のフィル優先度メッセージ3401〜3410は、最適化モジュール550に送られ、それによって、最劣後から最優先の順に渡される。つまり、フィル優先度メッセージ3401〜3410は、最適化モジュール550に送られ、それによって、3401、3402、3403、3404、3405、3406、3407、3408、3409、3410の順に渡される。
最初に、初期設定されたスタック深度1とSTORE_0命令を検討する。カウンタ2904はこうして、フィル優先度メッセージ3401〜3410それぞれに対し、カウント1、1、1、2、2、2、3、2、1、1を有していることが確かめられる。そのうえ、フィル優先度メッセージ3401、3402は、フィル優先度メッセージがX独立フィル優先度メッセージの最初の連続した連であるという基準を満たしている。フィル優先度メッセージ3404〜3409は、そのスタック深度でx従属なフィル優先度メッセージが存在するため、前記のテスト条件を満たさないことに注目されたい。更に、フィルメッセージ3401〜3406と3408〜3410はINVOLVED_PUSHED=FALSEという基準を満たしていることが分る。従って、フィルメッセージ3401と3402に対するSTORE_0ビット命令(即ちスタック深度1)は、スタック深度1に対してアサートされる。同じ方法で、STORE_1ビット命令(スタック深度2)は、フィルメッセージ3404〜3406と3408に対してアサートされることが分る。そのうえ、STORE_2(即ちスタック深度3)は何もアサートされないことが分る。RESTORE_xビットは、連の先端画素に結び付いたフィルメッセージ3001〜3008に対し非アサートされるが、図34Aには示されていない。
これらの連の先端画素に結び付いたフィル優先度メッセージ3401〜3410は、フィル決定モジュール600に渡され、カラー合成メッセージに変換され、次に画素合成モジュール700に送られる。画素合成モジュール700は、STORE_xビットをアサートされたカラー合成メッセージを受け取ると、スタック38の天辺を、中間値レジスタ2310のレベルxへ、画素合成メッセージの合成演算完了後にコピーする。それぞれが同レベルのSTORE_xビットをアサートされたカラー合成メッセージのシーケンスを受け取った場合は、画素合成モジュール700は中間値レジスタ内に格納された以前の値を、後続カラー合成メッセージと結び付いたスタック38のコピーで上書きする。この具体例では、中間値レジスタ2310は、レベル1(スタック深度1に対応する)に、フィル優先度メッセージ3402に結び付いた合成演算の完了後に結果として生じる、スタック38の天辺のコピーを内蔵している。中間値レジスタ2310は、レベル2(スタック深度2に対応)に、フィル優先度メッセージ3408に結び付いた合成演算の完了後に結果として生じる、スタック38の天辺のコピーもまた内蔵している。
今度は図34Bに転じ、連の先端画素に後続する各画素の処理中に最適化モジュール550によって渡されるフィル優先度メッセージを示す。先ず、レジスタ2932(図29)は後続画素処理中に、そのストアビットをアサートされた連内最後のフィル優先度メッセージ3402のレベルインデクスを内蔵していることに注目されたい。そしてまた、レジスタ2934(図29)は、後続画素処理中に、そのストアビットをアサートされた連内最初のフィル優先度メッセージ3402のレベルインデクスを内蔵していることに注目されたい。従って、シフトレジスタ2948の出力は、これらのフィル優先度メッセージのインデクスが、レジスタ2932と2934に格納されているレベルインデクスの中間かそれに等しいインデクスレベルを有しているときにのみ、連内後続画素のフィル優先度メッセージの送り出しを可能化される。こうして、最適化モジュール550は、この具体例においては、連内後続画素に対して、フィル優先度メッセージ3402、3403、3408〜3410のみを渡すことになる。最適化モジュール550は、このフィル優先度メッセージのレベルインデクスがレジスタ2932(図29)に格納されているレベルインデクスと等しいので、フィル優先度メッセージ3402のRESTORE_0ビット命令もまたアサートする。同じ方法で、最適化モジュール550は、フィル優先度メッセージ3408のRESTORE_1ビット命令もまたアサートする。
STORE_xビット命令は、連の先端画素に後続する画素と結び付いたすべてのフィル優先度メッセージに対して非アサートされる。最適化モジュール550は、フィル優先度メッセージのSTORE_xとRESTORE_xビットだけをマニュピレートし、フィル優先度メッセージの他のフィールドは変更無しのままにしておくことに注目されたい。
これらのフィル優先度メッセージ3402、3403、3408、3409、3410は、最適化モジュール550によって、連の先端画素に後続する各画素に対し、フィル決定モジュール600に渡される。フィル決定はこれらのフィル優先度メッセージを対応するカラー合成メッセージに変換し、次に画素合成モジュール700に送る。画素合成モジュール700は、RESTORE_xビットをアサートされたカラー合成メッセージ(例3402)を受け取ると、中間値レジスタ2310にそのレベルxで格納されたそのカラーと不透明度値をスタックの天辺にコピーする。画素合成モジュール700は、次に、通常の方法で、フィル優先度メッセージ(例3403、3408、3409、3410)に対応するカラー合成メッセージに内蔵されている命令に従って進む。
前記実施態様の更なる変形版において、装置は実施態様の機能を実行するモジュールとサブモジュールとして配置することができる。
そのうえの更なる変形版としては、前記装置の二つ以上を結合することが可能である。
そのまた更なる実施態様としては、最適化モジュール550は、優先度決定モジュール500内に、結合テーブル34からのフィル優先度メッセージの縮小セットを直接生成する目的を持って、組み込まれる。このような方法で、フィル優先度メッセージのスループットは減らされる。
5.0 合成モジュール
合成モジュール700は、優先度決定モジュール500からフィルカラー決定モジュール600経由で自身に渡されたカラー合成メッセージを受け取り、color_opとそのメッセージのアルファフィールドに指定されたカラーと不透明度演算と、そのメッセージのスタック演算フィールド内に指定されたスタック演算を実行する。
合成モジュール700は、最適化されたシーケンスの中間結果格納のために使用されるレジスタを含み、最適化回路550によって発信されるメッセージに従って、これらのレジスタに格納・復元されるメッセージを受け入れることが好ましい。
第1実施態様に従った最適化モジュール550は、図23Aに示したように、画素合成モジュール700と一緒に使われる。この場合、STOREビットを設定されたカラー合成メッセージは、合成モジュール700(図23A)に、カラー合成メッセージ内に指定されたカラー、不透明度、及びスタック演算を実行する前に、スタック38の天辺の値をレジスタ2310に格納させる。逆に、RESTOREビットを設定されたカラー合成メッセージに出合うと、このレジスタ2310内の値は、カラー合成メッセージ内に指定されたカラー、不透明度、及びスタック演算を実行する前に、レジスタ2310からスタック38の天辺へコピーされる。第2実施態様に従った最適化モジュール550は、図23Aに示したように、画素合成モジュール700と一緒にもまた使用され、同様なやり方で動作する。
第3実施態様に従った最適化モジュール550は、図23Aに示したように、一つの修正を加えて、画素合成モジュール700と一緒に使用される。この修正において、画素合成モジュール700は、一レジスタ2310に代わるレジスタのセットから成る。この場合、STORE命令ビットをアサートされたカラー合成メッセージは、合成モジュール700に、カラー合成メッセージ内に指定されたカラー、不透明度、スタック演算を実行する前に、スタック38の状態をレジスタのセットへ格納させる。逆に、RESTORE命令ビットをアサートされたカラー合成メッセージに出合うと、スタック38は、カラー合成メッセージ内に指定されたカラー、不透明度、スタック演算を実行する前に、これらのレジスタセットに格納されていた元の状態に戻される。
第4実施態様に従った最適化モジュール550は、図23Bに示したように、画素合成モジュール700と一緒に使用される。この場合、結合演算の存在は、スタック自身の上のカラー合成メッセージ内に指定されたカラー、不透明度、スタック演算の実行に加えて、積算器2320上のこの演算の実行のきっかけとなる。もしSTOREビットをアサートされたカラー合成メッセージに出合うと、積算器の値は積算器2320の一時レジスタに格納される。逆に、RESTOREビットをアサートされたカラー合成メッセージに出合うと、一時レジスタ2320内の値は現在の宛先値と合成され、カラー合成メッセージ内に指定されたカラー、不透明度、スタック演算はその後で実行される。多数の一時レジスタを使用する場合は、格納・復元されるレジスタのインデクスは、カラー合成メッセージ内に含めることができる。
第5実施態様に従った最適化モジュール550は、図23Aに示したように、幾つかの修正を加えて、画素合成モジュール700と一緒に使用される。レジスタ2310は、異なる優先度でのカラーと不透明度値のリストを格納するために適合される。この場合、優先度決定モジュール500から生成されたカラー合成メッセージは、使用されるレジスタ2310のxレベルに対応するSTORE_xビットを含んでいる。STORE_xビットをアサートされたカラー合成メッセージは、スタック38の天辺の値を、カラー合成メッセージ内に指定されたカラー、不透明度、スタック演算が実行された後で、カラー合成メッセージ内に指定されたレベルxでレジスタ2310に格納させる。RESTORE_Xビットをアサートされたカラー合成メッセージは、その格納された値を、カラー合成メッセージ内に指定されたカラー、不透明度、スタック演算が実行された後で、スタックの天辺にプッシュさせる。
これらの最適化のそれぞれは、画素単位で実行しなければならない幾つかのカラー合成メッセージを、スタックの値又は状態を復元するために、単一のカラー合成メッセージに置き換える(平均して)。こうして、各画素に同じ合成演算の実行を要求する画素連に出合うと、これらの最適化は、実行しなければならない画素当たりの処理量を縮小し、合成する画素をより少ない演算回数で行うことを、平均して、可能にすることになる。最適化の方法の選択は主に、或る特定のシステム設計に許容できる複雑さの程度に左右される。
当業者にはこれらの最適化法のどれも、この発明の原理から逸脱しないで、画素順次描画装置の実施態様をソフトウエアにより行うことができることが明白であろう。
これまでに説明した、コンピュータシステム1によって実施される本発明の好ましい処理法は、特定の制御の流れから成っている。本実施態様には、本発明の精神或いは範囲から逸脱することなく、異なる制御の流れを使用するその他多くの変形版がある。更に、好ましい実施態様のステップの一つ以上は、順次ではなく並行的に実行することも可能である。