(57)【要約】【課題】多大な計算量を要することなく高速な描画を実行することのできるベクトル図形描画装置を得る。【解決手段】交点算出部２は、エッジ分割部１が生成したエッジとスキャンラインとの交点座標をサブピクセル精度で求めた値をエッジデータとして算出し、エッジデータリスト３に登録する。マスク生成部４は、エッジデータリスト３からエッジデータをサブスキャンライン単位で取得し、図形のマスク情報を生成する。内外判定部５は、マスク生成部４が生成したマスク情報を元に、図形の内外判定を行ってカバレッジ情報に変換する。塗潰し処理部６は、カバレッジ情報に基づき、図形の内部と判定された領域に対して塗潰し処理を実行する。【選択図】図１
2008009897.tif 000002
【特許請求の範囲】
【請求項１】
ベクトル図形の少なくとも頂点座標を含むベクトル図形のデータを入力し、前記入力データが曲線である場合には、当該曲線を微小な線分であるエッジに分割するエッジ分割部と、
前記エッジ分割部が生成したエッジとスキャンラインとの交点座標をサブピクセル精度で求めた値をエッジデータとして算出する交点算出部と、
前記算出されたエッジデータをサブスキャンライン単位で取得し、図形のマスク情報を生成するマスク生成部と、
前記マスク生成部が生成したマスク情報を元に、図形の内外判定を行ってカバレッジ情報に変換する内外判定部と、
前記内外判定部のカバレッジ情報に基づき、前記図形の内部と判定された領域に対して塗潰し処理を実行する塗潰し処理部とを備えたベクトル図形描画装置。
【請求項２】
交点算出部は、交点座標の算出時にピクセル内部におけるエッジとサンプル点との位置関係を判定し、当該判定結果と交点座標の整数部およびエッジの向きの情報をエッジデータとして算出することを特徴とする請求項１記載の図形描画装置。
【請求項３】
マスク生成部は、サブピクセル毎に、エッジの向きに基づいたスキャンラインとの交差回数を保持する１ライン分のスキャンラインバッファを備えたことを特徴とする請求項２記載のベクトル図形描画装置。
【請求項４】
内外判定部は、サブスキャンライン単位で１ピクセル分のカバレッジをカウントしたそれぞれのピクセルの値を保持するための１ライン分のカバレッジバッファを備え、当該カバレッジバッファを用いてカバレッジ情報を保持することを特徴とする請求項３記載のベクトル図形描画装置。
【請求項５】
コンピュータを、請求項１から請求項４のうちのいずれか１項記載のベクトル描画装置として機能させるためのベクトル図形描画装置のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、ベクトル図形を描画するベクトル図形描画装置及びこの機能をコンピュータに実現させるベクトル図形描画装置のプログラムに関するものである。
【背景技術】
【０００２】
従来、ベクトル図形を描画する図形描画装置においては、輪郭線のデータが曲線（ベジェ曲線等）で与えられた場合には、曲線を微小な線分（エッジ）に分割した後、多角形の描画と同様の手法で描画されるのが一般的である。エッジの分割数を増加させるほど、ベクトル図形の輪郭を曲線に近いものに近似できるが、頂点数が増大し複雑な図形となってしまう場合が多い。
【０００３】
また、ベクトル図形の輪郭線が途中で交差するような場合には、図形の内外を区別するため一般に、イーブンオッド規則、ノンゼロ規則の２つの塗潰し規則が定められている。これらの規則に対応する方法の例としては、オーダードエッジリスト方式があり、走査線に交差する輪郭線を抽出し、この交差する位置を走査方向にソートして、交差する順番に走査線を辿り、交差位置に辿り着いた場合に、輪郭線のベクトル方向によって加算器に＋１（または−１）し、加算結果に従って走査線方向に向かって塗潰しを行うものが提案されている。この方式では、Ｘ座標ソートに多大な負荷を必要とするため、例えば特許文献１で示されているように、傾き情報の比較を行うことでソート処理の負荷を削減する方式が開示されている。
【０００４】
また、ベクトル図形の輪郭部分にジャギーが発生せず滑らかに表示されるようなベクトル図形を得るためには、アンチエイリアス処理が必要である。このようなアンチエイリアス処理に関する技術として、例えば特許文献２では、ベクトル図形の輪郭線の、サブピクセル分割法によるアンチエイリアス処理の方法として、エッジ部分にある判定されたピクセルのみ濃度を算出し、エッジに挟まれた部分は最高濃度値で設定することにより、アンチエイリアス処理を効率化する手法について開示されている。
【０００５】
【特許文献１】特開平１０−１４３６７６号公報
【特許文献２】特開平６-６８２７１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
オーダードエッジリスト方式による多角形描画方式では、輪郭線との交点を走査線毎に毎回抽出し、その交点を走査方向にソートしなければならず、この処理に大きく処理時間を割いてしまうという課題があった。このような課題に対して、例えば、特許文献１に開示される技術においても、ソート回数は削減されても、複雑な図形を描画する場合には、依然として処理負荷を要するという問題点があった。
【０００７】
また、特許文献２に開示される技術においても、交点Ｘ座標値の小さい順に配列する必要があり、１ライン上の交点数が増大した場合には描画処理の度に多大なソート処理を必要とするという課題がある。更に、ノンゼロ規則の塗潰しへの対応については開示されていない。
このように、従来のベクトル図形描画技術では、多大な計算量を要することなく高速な描画を実行することが困難であった。
【０００８】
この発明は上記のような課題を解決するためになされたもので、多大な計算量を要することなく高速な描画を実行することのできるベクトル図形描画装置及びそのプログラムを得ることを目的とする。
【課題を解決するための手段】
【０００９】
この発明に係るベクトル図形描画装置は、ベクトル図形のデータにおける曲線を微小な線分であるエッジに分割するエッジ分割部と、エッジ分割部が生成したエッジとスキャンラインとの交点座標をサブピクセル精度で求めた値をエッジデータとして算出する交点算出部と、算出されたエッジデータをサブスキャンライン単位で取得し、図形のマスク情報を生成するマスク生成部と、マスク生成部が生成したマスク情報を元に、図形の内外判定を行ってカバレッジ情報に変換する内外判定部と、内外判定部のカバレッジ情報に基づき、図形の内部と判定された領域に対して塗潰し処理を実行する塗潰し処理部とを備えたものである。
【発明の効果】
【００１０】
この発明のベクトル図形描画装置は、エッジデータをサブスキャンライン単位で取得して図形のマスク情報を生成し、このマスク情報に基づいて図形の内外判定を行いカバレッジ情報に変換するようにしたので、多大な計算量を要することなく高速な描画を実行することができる。
【発明を実施するための最良の形態】
【００１１】
実施の形態１．
図１は、この発明の実施の形態１によるベクトル図形描画装置を示す構成図である。
図において、ベクトル図形描画装置１００は、エッジ分割部１、交点算出部２、エッジデータリスト３、マスク生成部４、内外判定部５、塗潰し処理部６を備えている。
【００１２】
エッジ分割部１は、ベクトル図形の少なくとも頂点座標と描画色を含むベクトル図形のデータを入力し、その入力データが曲線であるか否かを判定して、曲線である場合には、微小な線分であるエッジに分割する手段である。即ち、エッジ分割部１は、電子データとして入力されたベクトル図形の輪郭データが曲線で入力された場合には、曲線を微小な線分に近似する。以後、この分割された線分のことをエッジと呼ぶ。
【００１３】
交点算出部２は、エッジ分割部１が生成したエッジとスキャンラインとの交点Ｘ座標をサブピクセル精度で求めてエッジデータをエッジデータリスト３に登録する手段である。即ち、交点算出部２は、算出した交点座標をエッジの向きの情報と合わせて、エッジデータリスト３に保存する。この時、エッジと走査線との交差回数をライトポインタに保存する。また、交点算出部２は、ベクトル図形の輪郭線の始点から開始して終点に達するまで同様の処理を繰り返し行う。
エッジデータリスト３は、交点算出部２が算出したベクトル図形の始点から終点までエッジデータのリストである。
【００１４】
マスク生成部４は、交点算出部２が算出したエッジデータをエッジデータリスト３から走査線（サブスキャンライン）単位で読み出し、図形のマスク情報を生成する手段であり、このマスク情報を生成するためのスキャンラインバッファ（以降、ＳＬＢと表記する）を有している。このＳＬＢとは、各サブピクセル毎に、エッジとの交差回数（エッジの向きに基づいてインクリメント／デクリメントした合計値）の情報を有するものである。
【００１５】
内外判定部５は、マスク生成部４が生成したマスク情報を元に、図形の内外判定を行ってカバレッジ情報に変換する手段である。即ち、内外判定部５は、サブスキャンライン単位で１ピクセル分のカバレッジをカウントしたそれぞれのピクセルの値を保持するための１ライン分のカバレッジバッファ（以降、ＣＶＢと表記する）を備え、図形の内部と判定した場合は、このＣＶＢを用いてカバレッジ（占有率）をカウントするよう構成されている。
塗潰し処理部６は、内外判定部５のカバレッジ情報に基づき、図形の内部と判定された領域に対して塗潰し処理を実行する手段である。
フレームバッファ７は、ベクトル図形描画装置１００が生成したベクトル図形のピクセルデータを保持するものである。
【００１６】
また、ベクトル図形描画装置１００の構成要素であるエッジ分割部１、交点算出部２、マスク生成部４、内外判定部５及び塗潰し処理部６は、本発明の趣旨に従う図形描画プログラムをコンピュータに読み込ませてその動作を制御することにより、そのコンピュータ上でソフトウエアとハードウェアが協働した具体的な手段として実現することもできる。即ち、上記エッジ分割部１〜塗潰し処理部６の各構成は、それぞれの機能に対応したプログラムと、これらプログラムを実行するためのＣＰＵやメモリといったハードウェアから実現することができる。
また、このコンピュータには、通信機能を有し、上記の図形描画プログラムを実行することができる携帯電話や携帯情報端末も含まれる。尚、コンピュータ自体の構成及びその基本的な機能については、当業者が当該技術分野の技術常識に基づいて容易に認識できるものであり、本発明の本質に直接関わるものでないので詳細な記載は省略する。
【００１７】
次に、実施の形態１の動作について説明する。
ベクトル図形描画装置１００は、この図形描画装置１００が搭載されたシステムのＣＰＵから入力されたベクトル図形の情報として、頂点座標、曲線の制御点の座標、描画色等の情報が設定され、起動命令を受けることにより動作を開始する。起動命令を受けると、エッジ分割部１が起動し、輪郭線が曲線である場合には曲線を直線に近似してエッジ単位に分割する。例えば、図２に示すような図形内部の塗潰しを行う場合、エッジ分割部１は輪郭線を微小なエッジに分割する。描画開始位置の頂点座標をｖ（０）、ｉ番目の頂点座標をｖ（ｉ）、頂点数をｎと表すと、エッジ分割部は、
ｖ（０）ｖ（１）、ｖ（１）ｖ（２）、ｖ（２）ｖ（３）、・・・、ｖ（ｉ）ｖ（ｉ＋１）、・・・、ｖ（ｎ−１）ｖ（０）
という順序でエッジを生成する。
【００１８】
尚、本発明のベクトル図形描画装置で描画するベクトル図形は、輪郭線が途中で交差してもよいが、必ず描画開始位置に戻ってくるような閉じた図形の集合であることが前提である。ここで、それぞれの閉じた図形のことをパスと呼ぶことにする。本発明のベクトル図形描画装置では、複数のパスの集合を１つの図形として扱うことも可能である。
【００１９】
また、図３に示すように図２の図形の輪郭線をＣＰＵから指定された線幅だけ太らせたような図形の描画方法の一例としては、図２の図形を中心として、内側と外側にそれぞれ線幅の２分の１の距離だけ離れた点の座標を算出し、図３の拡大図に示すように四角形を連続して描画する方法がある。この時、それぞれの四角形がパスに対応し、複数のパスをまとめたものが描画する図形となる。
図３では、描画開始位置の頂点座標をｖ（０）、ｉ番目の頂点座標をｖ（ｉ）、頂点数をｎと表すと、エッジ分割部は、
ｖ（０）ｖ（１）、ｖ（１）ｖ（３）、ｖ（３）ｖ（２）、ｖ（２）ｖ（０）、
ｖ（２）ｖ（３）、ｖ（３）ｖ（５）、ｖ（５）ｖ（４）、ｖ（４）ｖ（２）・・・
という順序でエッジを生成する。尚、ここで示した順序は一つの例であり、更に輪郭線が滑らかに繋がるように、別の図形を挿入することも可能である。
以上で示したようにエッジ分割部１は、エッジの始点、終点の座標を交点算出部に対して随時出力する。この時、出力するエッジが図形の中間エッジ（０）であるか最終エッジ（１）であるかという判定フラグも一緒に出力する。
【００２０】
交点算出部２は、エッジ分割部１から出力されたエッジと、スキャンラインとの交点座標を算出する。エッジの両端の座標をｖ０（ｘ０，ｙ０）、ｖ１（ｘ１，ｙ１）、スキャンラインのＹ座標をｙとする場合、スキャンラインとエッジとの交点Ｘ座標ｘｓ（ｙ）は、以下の式（１）で求めることができる。ただし、（ｙ０＝ｙ１）の時には、交点座標の算出は行わない。
ｘｓ（ｙ）＝ｘ０＋（ｘ１−ｘ０）／（ｙ１−ｙ０）×（ｙ−ｙ０）…（１）
【００２１】
ここで、本発明では、ベクトル図形の輪郭線部分のアンチエイリアス処理をサブピクセル分割法を利用して行う。サブピクセル分割法では、各ピクセルに対して、図形内部に含まれるサンプリング点の個数をカウントすることによりピクセル単位のカバレッジを算出する。
【００２２】
図４に４×４および２×２のサブピクセル分割の例を示す。
図４では、点線で示す図形を描画する場合に、図形内部に含まれるサブピクセルを黒丸、図形外部のサブピクセルを白丸で示している。１ピクセル当たりのサンプル数を多く取るほどカバレッジの精度が向上する。一般にｓｘ×ｓｙのサブピクセル分割においてＸ方向のサブピクセル分割数（ｓｘ）と、Ｙ方向のサブピクセル分割数（ｓｙ）の値が互いに異なっていてもよい。
従って、上式（１）においては、ｙの値をＹ方向のサンプル数（ｙｓｕｂ）を考慮した値として、次の式（２）、（３）で表せる値とする。但し、ｉｙ０はエッジの最小Ｙ座標の整数部、ｉｙ１はエッジの最大Ｙ座標の整数部、ｎは整数とする。式（２）で表されるｄｙがＹ方向の刻み幅を表す。また、ｙｓｕｂの値は１以上の任意の整数値でよいが、２のべき乗で表される値とするのが望ましい。
ｄｙ＝１／（２×ｙｓｕｂ）                                            …（２）
ｙ＝ｉｙ０＋（２ｎ＋１）×ｄｙ                                        …（３）
ｉｙ０≦ｙ≦ｉｙ１  かつ  ｍｉｎ（ｙ０，ｙ１）≦ｙ＜ｍａｘ（ｙ０，ｙ１）…（４）
以降、式（３）で表すことのできる各Ｙ座標のことをサブスキャンラインと呼ぶ。
【００２３】
交点算出部２は、ｙの値が式（４）の条件を満たす範囲内で式（１）〜（３）に従って、サブスキャンラインのＹ座標を２ｄｙずつ変化させながら、エッジとの交点を順次求める。全ての交点座標の算出が終了した後、エッジ分割部１から出力された判定フラグの値が最終エッジ（１）である場合には、マスク生成部４を起動する。中間エッジ（０）である場合には、エッジ分割部１から次のエッジの座標と判定フラグを受け取り、同様の処理を繰り返す。
【００２４】
エッジデータリスト３は、交点算出部２が算出したサブスキャンラインとエッジとの交点情報を保存するためのリストである。本発明では、アンチエイリアス処理に対応するため、エッジデータリスト３のエッジデータを、エッジの向き、交点Ｘ座標の整数部、サンプル数の３つの情報で構成する。
【００２５】
エッジの向きは、イーブンオッド規則、ノンゼロ規則に対応するために必要となる。エッジの向きの定義は、エッジの両端のＹ座標を比較して（ｙ０＜ｙ１）ならば上向き（ＵＰ）、（ｙ０＞ｙ１）ならば下向き（ＤＯＷＮ）とする。交点Ｘ座標の整数部の値をエッジデータリスト３に保存し、小数点以下の情報は、サブピクセル分割の精度に応じて最低限必要な精度をサンプル数としてエッジデータリスト３に保存する。
【００２６】
サンプル数とは、処理中のサブスキャンライン上において各ピクセル内部でエッジの右側にあるサンプル点の個数を表す。
図５に４×４のサブピクセル分割の例を示す。図５（ａ）、（ｂ）において、斜線付きの丸印で示したのがピクセル内部でエッジの右側に位置するサンプル点である。このようなサンプル点の個数を各サブスキャンライン（ｙｓｕｂ０〜ｙｓｕｂ３）でカウントする。サンプル点の中心がエッジ上にある場合には、エッジの右側にあるとして判定する。また、エッジが図５（ｂ）に示すようにピクセルの境界をまたぐような場合には、サブスキャンライン単位で交点Ｘ座標の整数部の値が異なることになる。
【００２７】
以上で示したエッジの向き、交点Ｘ座標の整数部、サンプル数の３つのデータを組として、エッジデータリスト３に登録する。
図６は、エッジデータリスト３のデータ構成を示す（Ｙ方向のサブピクセル分割数＝２の場合）。
各サブスキャンラインはＹ座標（ｙ）と、サブピクセルカウンタ（ｙｓｕｂ）の値によって決まる。各行のデータが当該サブスキャンラインとエッジとの交点座標の数に対応している。各データは、（エッジの向き（０：ＤＯＷＮ、１：ＵＰ），交点Ｘ座標の整数部，サンプル数）を２つずつ組にしたものである。２つのデータでエッジの向きは、どちらか一方がＤＯＷＮ、もう一方がＵＰとなる。また１サブスキャンライン上に含まれるエッジデータは必ず偶数個となる。図６の方式は１つの例であり、他のデータ構成とすることも当然可能である。
【００２８】
マスク生成部４は、交点算出部２からの起動命令を受けると、エッジデータリスト３に保存された交点情報を随時読み出し、アンチエイリアス処理のためのマスク情報を生成する。従来技術では、各サブスキャンライン上の交点座標を小さいものから順にソートする必要があったが、本発明の方式ではＸ座標のソートを必要としない。本発明では、１サブスキャンライン分の図形のマスク情報を格納できるＳＬＢを利用し、１サブスキャンラインの処理が終わる度にこのバッファをクリアして繰り返し利用する。
【００２９】
更に、ノンゼロ塗潰し規則にも対応するため、ＳＬＢの各アドレスに複数ビットを割り当てる。ビット数はエッジとスキャンラインとの交差回数に依存し、例えば、ビット数を８とした場合にはエッジとスキャンラインとの交差回数（エッジの向きに基づきインクリメントおよびデクリメントした合計値）が２５５の図形まで対応することができる。
従って、ＳＬＢのサイズは、最大で（フレームバッファ７のＸ方向サイズ×Ｘ方向サブピクセル数×ビット数）だけ必要である。
【００３０】
次に、ＳＬＢのリニアアドレスと、Ｘアドレスとの対応を図７に示す。Ｘアドレスは、Ｘ方向サンプル数（ｘｓｕｂ）に応じて動的に変化させる。（ｘｓｕｂ）が１の場合には、アンチエイリアス処理は無効となる。
ＳＬＢの０番地がＸ座標の０に対応するとすれば、図７においてＳＬＢのｉ番地が以下のＸ座標に対応する。記号（＞＞）は右方向へのビットシフト演算子を表す。
例１．  Ｘ方向サンプル数＝１の場合、ＳＬＢのｉ番地がＸ座標ｉに対応する。
例２．  Ｘ方向サンプル数＝２の場合、ＳＬＢのｉ番地がＸ座標（ｉ＞＞１）に対応する。
例３．  Ｘ方向サンプル数＝４の場合、ＳＬＢのｉ番地がＸ座標（ｉ＞＞２）に対応する。
【００３１】
ＳＬＢのＸ座標の基準値は０としてもよいが、例えば、図８に示すベクトル図形の包含矩形の最小Ｘ座標（ｘｍｉｎ）を基準値としてＳＬＢの容量を節約することもできる。この時必要となるＳＬＢのサイズは、（包含矩形の幅×Ｘ方向サブピクセル数×ビット数）だけ必要である。
【００３２】
次に、ＳＬＢの状態の一例を図９を用いて説明する。図９（ａ）はＳＬＢにおける値の一例を示している。また、このようなＳＬＢの値となる図形としては例えば図１０に示すような図形である。尚、図９の例ではＸ方向サブピクセル分割数（ｘｓｕｂ）は２としている。
【００３３】
図９（ａ）において、例えば、Ｘ座標（Ｘアドレス）が２の位置において、上向きのエッジとスキャンラインとが交差し、ＳＬＢの値は「＋１」となる。尚、図１０において、＋１，＋１，＋２，…といった位置がサブピクセルの位置に相当している。次に、Ｘ座標が３の位置において、同様に、上向き（ＵＰ）のエッジとスキャンラインとが交差するため、ＳＬＢの値はインクリメントされ「＋２」となる。そして、次のＸ座標が４の位置ではサブピクセル毎に上向きのエッジと交差するため、ｘｓｕｂ＝０のＳＬＢの値が「＋３」、ｘｓｕｂ＝１の値が「＋４」となる。そして、次のＸ座標が５の位置のサブピクセルｘｓｕｂ＝０では下向き（ＤＯＷＮ）のエッジと交差するためデクリメントされて「＋３」となり、更にｘｓｕｂ＝１でも下向きのエッジと交差することから「＋２」となる。
【００３４】
このように、Ｘ座標の増加する向きにスキャンラインを辿っていき、エッジと交差する度に、上向きエッジではＳＬＢの値を＋１とし、下向きエッジではその値を−１する。
【００３５】
内外判定部５は、ＳＬＢを随時読み出し、ピクセル単位のカバレッジ情報に変換する。内外判定方法は以下の通りとする。
（１）塗潰し規則がイーブンオッド規則の場合は、ＳＬＢの値が奇数の時に図形の内部であると判定する。
（２）塗潰し規則がノンゼロ規則の場合は、ＳＬＢの値が０以外であった時に図形の内部であると判定する。
このような規則に従って内外判定を行うと、例えば、図９および図１０の図形では、図形の内部と判定される領域は、イーブンオッド規則では、＋１と＋３で示した領域であり、ノンゼロ規則では、＋１，＋２，＋３，＋４で示した領域となる。
【００３６】
本発明では、１スキャンライン分のピクセル単位のカバレッジ情報を格納できるＣＶＢを利用する。ＣＶＢの各ピクセルのビット数は、サブピクセル分割数をカウントできるだけのビット数を確保する。例えば、２×２のサブピクセル分割の時は０〜４を表現するための３ビット、４×４のサブピクセル分割の時は０〜１６表現するための５ビットが必要である。
【００３７】
内外判定部５は、１サブスキャンラインの処理が終わる度に図形の内部と判定された領域に対応するＣＶＢの値をインクリメントする。また、１スキャンライン上に含まれるＹ方向サブピクセル分割数分のサブスキャンラインの処理が終わる度にＣＶＢをクリアして繰り返し利用する。尚、ＣＶＢのＸアドレスの基準値は０としてもよいが、ベクトル図形の包含矩形の最小Ｘ座標を基準値とすれば、ＣＶＢの容量を節約できる。
【００３８】
次に、図９を参照し、ＳＬＢの情報から、内外判定を行う具体例について説明する。図９の例では、上述したように、Ｘ方向サブピクセル分割数（ｘｓｕｂ）は２としており、このようなｘｓｕｂの値を考慮して、ＳＬＢのサブピクセルｘｓｕｂ個分の情報を１ピクセルのカバレッジに変換する。例えば、ＳＬＢの値が（＋２）および（＋４）のサブピクセルは、イーブンオッド規則では図形の外部となるため、図９（ｂ）に示すように、ＣＶＢの値はＸアドレスが３では「０」、Ｘアドレスが４では一つのサブピクセルが奇数であるため、「＋１」となる。また、ノンゼロ規則ではＳＬＢの値がゼロ以外のサブピクセルは図形の内部となるため、図９（ｃ）に示すように、ＣＶＢの値はＸアドレス２からＸアドレス５までが「＋２」、Ｘアドレス６では、一方のサブピクセルのみがゼロ以外であるため、その値は「＋１」となる。
【００３９】
塗潰し処理部６は、内外判定部５によって図形の内部と判定された領域内を塗潰すように順次ピクセルを生成する。ピクセルの描画色ｃ（Ｒ、Ｇ、Ｂの各成分に対応）はＣＰＵから設定された描画色をｓｒｃ、既にフレームバッファに書かれている色をｄｓｔとおくと、内外判定部５によって算出されたカバレッジの値（ｃｖ）を用いて以下の式（５）によって計算されるのが一例である。
ｃ＝ｓｒｃ×ｃｖ＋ｄｓｔ×（１−ｃｖ）                …（５）
これにより、ベクトル図形の輪郭線にアンチエイリアス処理を施して描画することができる。
【００４０】
また、透過色を扱う場合には、一般的なアルファブレンド式を用いて、以下のように計算できる。但し、描画色のアルファ成分をｓｒｃａ、アルファブレンド結果をｂとおく。
ｂ＝ｓｒｃ×ｓｒｃａ＋ｄｓｔ×（１−ｓｒｃａ）        …（６）
ｃ＝ｂ×ｃｖ＋ｄｓｔ×（１−ｃｖ）                    …（７）
また、ピクセル単位でカラー勾配を計算してグラデーション塗潰しを実現したり、テクスチャアドレスを計算してテクスチャ貼り付けを行ったりすることも可能である。
【００４１】
次に、実施の形態１によるベクトル図形描画処理の動作の詳細について説明する。
図１１及び図１２は、実施の形態１のベクトル図形描画装置によるベクトル図形描画処理の流れを示すフローチャートであり、以下、これらの図に沿って説明する。
先ず、エッジ分割部１は、図形の輪郭線が曲線であるか否かを判定する（ステップＳＴ１）。図形の輪郭線が曲線である場合には、微小線分（エッジ）に分割を行う（ステップＳＴ２）。輪郭線が直線である場合には、直線をそのままエッジとして扱う。
【００４２】
次に、交点算出部２は、エッジとサブスキャンラインが交差するか否かを判定する（ステップＳＴ３）。判定結果がＹＥＳである場合には、サブスキャンラインとエッジとの交点座標を式（１）を用いて算出し、交点座標を算出後、前述したエッジの向き、交点Ｘ座標の整数部、サンプル数をエッジデータリスト３に保存する（ステップＳＴ４）。判定結果がＮＯである場合には、交点座標の算出とエッジデータの登録は行わない。
次に、処理しているエッジがベクトル図形の最終エッジであるかを判定し（ステップＳＴ５）、そうでない場合は上記のステップＳＴ３に戻って同様の処理を繰り返す。一方、ステップＳＴ５において、最終エッジである場合には、塗潰しを開始する。塗潰し開始後のフローチャートは図１２に示すものである。
【００４３】
図１２において、塗潰しが開始されると、マスク生成部４は、Ｙ座標カウンタ（ｙ）の初期値を図形の包含矩形の最小Ｙ座標（ｙｍｉｎ）に、Ｙ方向サブピクセルカウンタ（ｙｓｕｂ）を０に設定する（ステップＳＴ６）。次に、マスク生成部４は、エッジデータリスト３のＹ座標カウンタの値に対応するアドレスからエッジデータを１組読み出す（ステップＳＴ７）。上述したように１組のエッジデータは、一方がＵＰエッジの情報、もう一方がＤＯＷＮエッジの情報となっている。
【００４４】
続いて、以下の条件に従ってＳＬＢ判定フラグ（ｘｆｌａｇ）を生成する（ステップＳＴ８）。但し、読み出したｉ番目のエッジデータの整数Ｘ座標をそれぞれｘ（ｉ）、ｘ（ｉ＋１）として、これらの大小比較結果から以下の（Ａ）、（Ｂ）の条件に従ってＳＬＢを更新する範囲（ｘｌｅｆｔ、ｘｒｉｇｈｔ）とＳＬＢ判定フラグを定める。
【００４５】
（Ａ）ｘ（ｉ）＜ｘ（ｉ＋１）の時
ｘｌｅｆｔ＝ｘ（ｉ）、ｘｒｉｇｈｔ＝ｘ（ｉ＋１）
ｉ番目のエッジデータの向きがＵＰである場合、ｘｆｌａｇ＝１
（Ｂ）ｘ（ｉ）≧ｘ（ｉ＋１）の時
ｘｌｅｆｔ＝ｘ（ｉ＋１）、ｘｒｉｇｈｔ＝ｘ（ｉ）
ｉ＋１番目のエッジデータの向きがＵＰである場合、ｘｆｌａｇ＝１
【００４６】
マスク生成部４は、生成したＳＬＢ判定フラグの値を判定し（ステップＳＴ９）、ＳＬＢ判定フラグが１である場合には、ｘｌｅｆｔ≦ｘ≦ｘｒｉｇｈｔの範囲のＳＬＢをインクリメントする（ステップＳＴ１０）。一方、ＳＬＢ判定フラグが０である場合には、ｘｌｅｆｔ≦ｘ≦ｘｒｉｇｈｔの範囲のＳＬＢをデクリメントする（ステップＳＴ１１）。
但し、ｘ＝ｘｌｅｆｔの位置においては、サンプル点がエッジの右側にあるサブピクセルに対応するＳＬＢだけインクリメントする。ｘ＝ｘｒｉｇｈｔの位置においては、サンプル点がエッジの左側にあるサブピクセルの位置に対応するＳＬＢのみをインクリメントする。
次に、マスク生成部４は、最終エッジデータかを判定し（ステップＳＴ１２）、最終エッジデータでなかった場合はステップＳＴ７に戻って、これらの処理を繰り返し、最終エッジデータであった場合は、内外判定部５を起動し、ステップＳＴ１３に移行する。
【００４７】
ステップＳＴ１３において、内外判定部５は、処理中のサブスキャンライン上におけるＳＬＢの情報を読み出し、前述した内外判定規則に従って、ピクセル単位のカバレッジに変換する。次に、処理中のサブスキャンラインが最終サブスキャンラインである、即ち、Ｙ方向サブピクセルカウンタが（ｙｓｕｂ＝（Ｙ方向サンプル数−１））の条件を満たすか否かを判定する（ステップＳＴ１４）。最終サブスキャンラインでない場合は、Ｙ方向サブピクセルカウンタ（ｙｓｕｂ）をインクリメントした後（ステップＳＴ１５）、ステップＳＴ７に戻ってこれ以降の処理を繰り返す。一方、ステップＳＴ１４において、最終サブスキャンラインであった場合には、スキャンラインｙ上のピクセル生成を開始する（ステップＳＴ１６）。
【００４８】
図１３〜図１６に４×４のサブピクセル分割時の図形描画例を示す。
図１３は、１スキャンライン上の３ピクセル分をサブピクセル単位で表したものである。また、図１４はスキャンライン上のエッジデータを示す図である。１スキャンラインは４つのサブスキャンラインで構成される。ｙｓｕｂ＝０〜２のサブスキャンラインは、エッジとの交差回数がそれぞれ４回であり、ｙｓｕｂ＝３のサブスキャンラインは、エッジとの交差回数が２回である。マスク生成部４及び内外判定部５は、図１４に示すエッジデータを元に、図１３に黒丸で示しているサブピクセルが図形の内部に含まれるようにするため、以下の手順に従って判定を行う。
【００４９】
図１５は、ｙｓｕｂ＝０のサブスキャンラインの処理手順を例として示す説明図であり、図中の（１）〜（３）の状態が以下の（１）〜（３）の説明に対応している。
（１）マスク生成部４は、図１４のｙｓｕｂ＝０に対応するアドレスからエッジデータ０、１を読み出した結果、前記判定条件（Ｂ）により
ｘｌｅｆｔ＝ｘｒｉｇｈｔ＝ｐ＋１、ｘｆｌａｇ＝１となるので
ｘ＝ｐ＋１の範囲のＳＬＢをインクリメントする。
【００５０】
（２）図１４のｙｓｕｂ＝０に対応するアドレスからエッジデータ２、３を読み出した結果、前記判定条件（Ｂ）により
ｘｌｅｆｔ＝ｐ−１、ｘｒｉｇｈｔ＝ｐ、ｘｆｌａｇ＝１となるので
ｐ−１≦ｘ≦ｐの範囲のＳＬＢをインクリメントする。
【００５１】
（３）ｙｓｕｂ＝０のサブスキャンライン上では、エッジデータ２、３の組が最終なのでＳＬＢへのマスク生成を終了し、内外判定部５は、４サブピクセル分の内外判定結果を１ピクセル分のカバレッジ情報として変換し、ＣＶＢをインクリメントする（ｙｓｕｂ＝０であるから、ＣＶＢは０クリアされている）。その後、ＳＬＢをクリアし、ｙｓｕｂ＝１のサブスキャンラインを同様に処理する。
【００５２】
そして、ｙｓｕｂ＝１、ｙｓｕｂ＝２のサブスキャンラインに対しても同様の処理を行った後、ｙｓｕｂ＝３の最終サブスキャンラインの処理を開始する。
【００５３】
図１６は、ｙｓｕｂ＝３のサブスキャンラインの処理手順を例として示す説明図であり、図中の（４）〜（６）の状態は以下の（４）〜（６）の説明に対応している。
（４）ｙｓｕｂ＝２のサブスキャンラインの処理が終了した時点でＣＶＢは図１６の（４）に示す状態になっている。
【００５４】
（５）次いで、マスク生成部４は、図１４のｙｓｕｂ＝３に対応するアドレスからエッジデータ０と３を読み出した結果、前記判定条件（Ｂ）により
ｘｌｅｆｔ＝ｐ−１、ｘｒｉｇｈｔ＝ｐ＋１、ｘｆｌａｇ＝１となるので
ｐ−１≦ｘ≦ｐ＋１の範囲のＳＬＢをインクリメントする。
【００５５】
（６）ｙｓｕｂ＝３のサブスキャンライン上では、エッジデータ０、３の組が最終なのでＳＬＢへのマスク生成を終了し、内外判定部５は、４サブピクセル分の内外判定結果を１ピクセル分のカバレッジ情報として変換し、ＣＶＢをインクリメントする。最終サブスキャンラインであるから、ＣＶＢのアドレスをＸ座標、ＣＶＢに保存されている値をカバレッジ、Ｙ座標カウンタの値をＹ座標として、１スキャンライン分のピクセルデータ生成を開始する。カバレッジが０のピクセルは描画する必要がない。
【００５６】
図１２に戻り、ピクセル生成が開始されると、塗潰し処理部６は、内外判定部５で図形の内部と判定された領域に含まれるピクセルを順次生成して塗潰し処理を行う（ステップＳＴ１６）。その後、１スキャンライン上で図形の内部に含まれる全てのピクセルの塗潰し処理が終了すると、Ｙ座標が最終値（ｙｍａｘ）であるか否かの判定を行う（ステップＳＴ１７）。Ｙ座標が最終値でない場合には、Ｙ座標カウンタｙのインクリメント、Ｙ方向サブピクセルカウンタ（ｙｓｕｂ）のリセットを行った後（ステップＳＴ１８）、ステップＳＴ７に戻り、これ以降の処理を繰り返す。ステップＳＴ１７において、Ｙ座標が最終値（ｙｍａｘ）である場合には、ベクトル図形の描画を終了する。
【００５７】
以上のように、この実施の形態１のベクトル図形描画装置によれば、ベクトル図形の少なくとも頂点座標を含むベクトル図形のデータを入力し、入力データが曲線である場合には、この曲線を微小な線分であるエッジに分割するエッジ分割部と、エッジ分割部が生成したエッジとスキャンラインとの交点座標をサブピクセル精度で求めた値をエッジデータとして算出する交点算出部と、算出されたエッジデータをサブスキャンライン単位で取得し、図形のマスク情報を生成するマスク生成部と、マスク生成部が生成したマスク情報を元に、図形の内外判定を行ってカバレッジ情報に変換する内外判定部と、内外判定部のカバレッジ情報に基づき、前記図形の内部と判定された領域に対して塗潰し処理を実行する塗潰し処理部とを備えたので、ベクトル図形描画装置として多大な計算量を要することなく高速な描画を実行することができる。
【００５８】
また、実施の形態１のベクトル図形描画装置によれば、交点算出部は、交点座標の算出時にピクセル内部におけるエッジとサンプル点との位置関係を判定し、この判定結果と交点座標の整数部およびエッジの向きの情報をエッジデータとして算出するようにしたので、アンチエイリアス処理を実現する際に、多大な計算量を要することなく高速な描画を実行することができる。
【００５９】
また、実施の形態１のベクトル図形描画装置によれば、マスク生成部は、サブピクセル毎に、エッジの向きに基づいたスキャンラインとの交差回数を保持する１ライン分のスキャンラインバッファを備えたので、イーブンオッド規則やノンゼロ規則といった塗潰し規則に対応することができる。
【００６０】
また、実施の形態１のベクトル図形描画装置によれば、内外判定部は、サブスキャンライン単位で１ピクセル分のカバレッジをカウントしたそれぞれのピクセルの値を保持するための１ライン分のカバレッジバッファを備え、このカバレッジバッファを用いてカバレッジ情報を保持するようにしたので、アンチエイリアス処理を施した任意のベクトル図形を塗潰し規則（イーブンオッド規則、ノンゼロ規則）を考慮した上で、それぞれ１ライン分のスキャンラインバッファ及びカバレッジバッファを繰り返し利用することにより、単純な処理で高速に描画することができる。
【００６１】
また、実施の形態１のベクトル図形描画装置のプログラムによれば、コンピュータを上記いずれかのベクトル描画装置として機能させるようにしたので、多大な計算量を要することなく高速な描画を実行することができるベクトル図形描画装置をコンピュータ上に実現することができる。
また、実施の形態１のベクトル図形描画装置によれば、ベクトル図形描画装置のハードウェア化を行う場合でも回路規模を最小限に抑えることができる。
更に、スキャンラインとエッジとの交差回数が多い図形を扱ったり、アンチエイリアス処理のサンプル数を変化させたりする場合でも、エッジデータリストの構成およびスキャンラインバッファのアドレス割り当てを変えることによって柔軟に対応することが可能である。
【００６２】
実施の形態２．
上記実施の形態１では、図形に含まれるエッジ分割部１が生成したエッジとスキャンラインとの交点座標を全てエッジデータリスト３に保存してからベクトル図形の塗潰しを開始していたが、エッジとスキャンラインとの交点座標の算出を１スキャンライン分行う度に１スキャンライン分の塗潰しを行い、同様の処理をベクトル図形の包含矩形のＹ方向サイズ分だけ繰り返すようにしてもよく、これを実施の形態２として以下説明する。
【００６３】
図面上の構成は実施の形態１と同様であるため、図１を援用して説明する。
実施の形態２の交点算出部２は、エッジ分割部１が生成したエッジとスキャンラインとの交点Ｘ座標をサブピクセル精度で求めた値をエッジデータとして算出してエッジデータリスト３に登録し、また、マスク生成部４は、エッジデータリスト３に登録されているエッジデータをサブスキャンライン単位で取得し、図形のマスク情報を生成するよう構成されている。また、内外判定部５及び塗潰し処理部６は、１スキャンライン分の値が得られる度に処理を行うようになっている。
【００６４】
次に、実施の形態２の動作について説明する。
図１７は、実施の形態２によるベクトル図形描画処理の塗潰し開始までの流れを示すフローチャートである。
最初にＹ座標カウンタを最小Ｙ座標、Ｙ方向サブピクセルカウンタｙｓｕｂを０に設定する（ステップＳＴ１０１）。エッジ分割部１は、図形の輪郭線が曲線であるか否かを判定する（ステップＳＴ１０２）。図形の輪郭線が曲線である場合には、微小線分（エッジ）に分割を行う（ステップＳＴ１０３）。輪郭線が直線である場合には、直線をそのままエッジとして扱う。
【００６５】
次に、交点算出部２は、入力されたエッジがＹ座標カウンタの値に対応するサブスキャンラインと交差するか否かを判定する（ステップＳＴ１０４）。判定結果がＹＥＳである場合、交点算出部２は、実施の形態１で説明した式（１）〜（３）に従って、Ｙ座標カウンタの値に対応するサブスキャンラインとエッジとの交点座標を算出し、実施の形態１と同様に、エッジの向き、交点Ｘ座標の整数部、サンプル数をエッジデータリスト３に保存する（ステップＳＴ１０５）。判定結果がＮＯである場合、交点Ｘ座標の算出およびエッジデータリスト３へのエッジデータの登録は行わない。
【００６６】
次に、処理中のサブスキャンラインが最終サブスキャンラインである、即ち、Ｙ方向サブピクセルカウンタが（ｙｓｕｂ＝（Ｙ方向サンプル数−１））の条件を満たすか否かを判定する（ステップＳＴ１０６）。最終サブスキャンラインでない場合は、Ｙ方向サブピクセルカウンタ（ｙｓｕｂ）をインクリメントした後（ステップＳＴ１０７）、ステップＳＴ１０４に戻り、ステップＳＴ１０４以降の処理を繰り返す。
【００６７】
ステップＳＴ１０６において、最終サブスキャンラインである場合には、処理中のエッジが図形の最終エッジであるか否かを判定する（ステップＳＴ１０８）。ここでの判定結果がＮＯである場合は次のエッジに対してステップＳＴ１０４以下の処理を繰り返す。判定結果がＹＥＳである場合には、１スキャンライン分の塗潰しを開始する（ステップＳＴ１０９）。１スキャンライン分の塗潰し手順は、実施の形態１における図１２においてｙｍｉｎ、ｙｍａｘに対して現在処理中のスキャンラインＹ座標の値を代入したものと等しい。図１２のステップＳＴ１７に達すると、必ず１スキャンライン分の塗潰しが終了する。
【００６８】
１スキャンライン分の塗潰しが終了すると、Ｙ座標が最終値（ｙｍａｘ）であるか否かの判定を行う（ステップＳＴ１１０）。Ｙ座標が最終値でない場合には、Ｙ座標カウンタ（ｙ）のインクリメント、Ｙ方向サブピクセルカウンタ（ｙｓｕｂ）のリセットを行った後（ステップＳＴ１１１）、ステップＳＴ１０４以下の処理を繰り返す。Ｙ座標が最終値（ｙｍａｘ）である場合には、ベクトル図形の描画を終了する。
【００６９】
以上のように、実施の形態２のベクトル図形描画装置によれば、エッジとスキャンラインとの交点座標の算出を１スキャンライン分行う度に１スキャンライン分の塗潰しを行い、同様の処理をベクトル図形の包含矩形のＹ方向サイズ分だけ繰り返すようにしたので、エッジデータリストの使用領域を節約することができ、ベクトル図形描画装置としての回路規模を更に抑えることができる。
【図面の簡単な説明】
【００７０】
【図１】この発明の実施の形態１によるベクトル図形描画装置を示す構成図である。
【図２】ベクトル図形の塗潰しを行う場合のエッジ分割方式の説明図である。
【図３】ベクトル図形の輪郭線の太線化を行う場合のエッジ分割方式の説明図である。
【図４】サブピクセル分割によるアンチエイリアス処理の説明図である。
【図５】エッジとサンプル点の位置関係の判定方法を示す説明図である。
【図６】エッジデータリストの構成を示す説明図である。
【図７】スキャンラインバッファのＸアドレスの割り当てを示す説明図である。
【図８】ベクトル図形の描画例と包含矩形を示す説明図である。
【図９】スキャンラインバッファの情報を元に内外判定によりカバレッジを求める方法を示す説明図である。
【図１０】図９のスキャンラインバッファの値となる図形を示す説明図である。
【図１１】実施の形態１によるベクトル図形描画処理の塗潰し開始までの流れを示すフローチャートである。
【図１２】実施の形態１によるベクトル図形描画処理の塗潰し開始以降の流れを示すフローチャートである。
【図１３】４×４のサブピクセル分割で図形を塗潰す場合の一例を示す説明図である。
【図１４】図１３の図形を描画する場合に各エッジから生成されるエッジデータを示す説明図である。
【図１５】図１３の図形を描画する場合に、ｙｓｕｂ＝０のサブスキャンラインの処理手順を示す説明図である。
【図１６】図１３の図形を描画する場合に、ｙｓｕｂ＝３のサブスキャンラインの処理手順を示す説明図である。
【図１７】実施の形態２によるベクトル図形描画処理の流れを示すフローチャートである。
【符号の説明】
【００７１】
１  エッジ分割部、２  交点算出部、３  エッジデータリスト、４  マスク生成部、５  内外判定部、６  塗潰し処理部、１００  ベクトル図形描画装置。
【図１】
2008009897.tif 000003
【図２】
2008009897.tif 000004
【図３】
2008009897.tif 000005
【図４】
2008009897.tif 000006
【図５】
2008009897.tif 000007
【図６】
2008009897.tif 000008
【図７】
2008009897.tif 000009
【図８】
2008009897.tif 000010
【図９】
2008009897.tif 000011
【図１０】
2008009897.tif 000012
【図１１】
2008009897.tif 000013
【図１２】
2008009897.tif 000014
【図１３】
2008009897.tif 000015
【図１４】
2008009897.tif 000016
【図１５】
2008009897.tif 000017
【図１６】
2008009897.tif 000018
【図１７】
2008009897.tif 000019