(57)【特許請求の範囲】
【請求項１】
閉領域を構成するパスとスキャンラインとの交点における前記パスの進行方向を特定する特定手段と、
前記特定手段が特定した前記進行方向に応じてＷｉｎｄｉｎｇ値を算出する算出手段と、
前記スキャンラインが前記交点において前記パスを通過する際に前記Ｗｉｎｄｉｎｇ値が所定の値に近づくか否かに基づいて、前記パスのずらし方向を決定する決定手段と、
前記決定されたずらし方向に基づいて、前記パスにおける制御点の位置を前記閉領域の内側から前記閉領域の外側に移動する移動手段と、を有することを特徴とする情報処理装置。
【請求項２】
前記制御点は、頂点を含むことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記移動手段によって前記制御点の位置が移動された後の前記パスのレンダリングを行うレンダリング手段を有する請求項１又は２に記載の情報処理装置。
【請求項４】
閉領域を構成するパスとスキャンラインとの交点における前記パスの進行方向を特定する特定工程と、
前記特定手段が特定した前記進行方向に応じてＷｉｎｄｉｎｇ値を算出する算出工程と、
前記スキャンラインが前記交点において前記パスを通過する際に前記Ｗｉｎｄｉｎｇ値が所定の値に近づくか否かに基づいて、前記パスのずらし方向を決定する決定工程と、
前記決定されたずらし方向に基づいて、前記パスにおける制御点の位置を前記閉領域の内側から前記閉領域の外側に移動する移動工程と、を有することを特徴とする情報処理方法。
【請求項５】
請求項１乃至３の何れか１項の各手段としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、パスの変形処理に関する。
【背景技術】
【０００２】
複数の頂点（制御点）を順に結ぶパスで定義される閉領域を塗りつぶしてフォントを形成するグリフパスがある。このグリフパスを太くするボールド処理が特許文献１に開示される。特許文献１では、パスの進行方向に応じた法線方向に各制御点を移動することでパスの形状を一回り大きくし、そのパスで定義される閉領域を塗りつぶすことでグリフパスのボールド処理が行われる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平８−１０１６７５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、特許文献１では、フォントを構成する閉領域が複数ある場合に、各閉領域を定義する各パスの進行方向は同一であることを前提としている。そのため、閉領域によってパスの進行方向が異なる場合に、制御点を移動すべき法線方向が閉領域によって異なってしまい、閉領域によっては面積が小さくなってしまうことがあった。すなわち、グリフパスの一部が細くなる場合があった。
【０００５】
例えば図８（ａ）に示されるように、文字「ニ」のグリフパスの上部の閉領域を定義するパスの進行方向は時計回り（右回り）であり、下部の閉領域を定義するパスの進行方向は反時計回り（左回り）である。この場合、法線方向は、パスの進行方向に関して左側であるという設定であれば、上部の閉領域は面積が大きくなるように変形されるが、下部の閉領域は面積が小さくなるように変形されてしまう。
【課題を解決するための手段】
【０００６】
本発明は、閉領域を構成するパスとスキャンラインとの交点における前記パスの進行方向を特定する特定手段と、前記特定手段が特定した前記進行方向に応じてＷｉｎｄｉｎｇ値を算出する算出手段と、前記スキャンラインが前記交点において前記パスを通過する際に前記Ｗｉｎｄｉｎｇ値が所定の値に近づくか否かに基づいて、前記パスのずらし方向を決定する決定手段と、前記決定されたずらし方向に基づいて、前記パスにおける制御点の位置を前記閉領域の内側から前記閉領域の外側に移動する移動手段と、を有することを特徴とする。
【発明の効果】
【０００７】
閉領域によってパスの進行方向が異なるようなグリフパスでも、適切にボールド処理を行える。
【図面の簡単な説明】
【０００８】
【図１】本実施例の情報処理装置のハードウェア構成を示すブロック図。
【図２】本実施例の情報処理装置のソフトウェアモジュールの構成を示すブロック図。
【図３】グリフパスに対する処理を示すフローチャート。
【図４】パスに対するボールド処理を示すフローチャート。
【図５】Ｗｉｎｄｉｎｇ値を算出する処理を示すフローチャート。
【図６】パスのずらし方向を決定する処理を示すフローチャート。
【図７】パスの各頂点を移動する処理を示すフローチャート。
【図８】閉領域によってパスの進行方向が異なるグリフパスの例を示す図。
【図９】２つのパスによって１つの閉領域が定義されるグリフパスの例を示す図。
【図１０】ボールド処理の結果を示す図。
【発明を実施するための形態】
【０００９】
（実施例１）
図１は、本実施例の情報処理装置１０１のハードウェア構成を示すブロック図である。情報処理装置１０１は、ＣＰＵ１０２、ＲＯＭ１０３、ＲＡＭ１０４、ＨＤＤである記憶部１０５、ＬＡＮ１０７と情報処理装置１０１とを接続するためのインターフェースである通信部１０６、とを備える。
【００１０】
記憶部１０５は、情報処理装置１０１を制御するための各プログラムを記憶している。例えば記憶部１０５は、図３（後述）の処理フローを実行するためのプログラムを記憶している。
【００１１】
通信部１０６は、ＬＡＮ１０７を介して、情報処理装置１０１とは別の外部装置から、ＰＤＦ（Ｐｏｒｔａｂｌｅ  Ｄｏｃｕｍｅｎｔ  Ｆｏｒｍａｔ）やＸＰＳ（ＸＭＬ  Ｐａｐｅｒ  Ｓｐｅｃｉｆｉｃａｔｉｏｎ：登録商標）などのＰＤＬデータ２０１を受信する。
【００１２】
ＣＰＵ１０２は、ＲＯＭ１０３、ＲＡＭ１０４、記憶部１０５、通信装置１０６を統括的に制御する。例えばＣＰＵ１０２は、ＲＡＭ１０３やＲＯＭ１０４を利用して、記憶部１０５に記憶されているプログラムを実行することで、通信部１０６で受信されたＰＤＬデータ２０１に対して図３（後述）の処理フローを実行する。
【００１３】
図２は、図３（後述）の処理フローを実行するためのプログラムをＣＰＵ１０２が実行した場合に実現されるソフトウェアモジュールの構成を示すブロック図である。情報処理装置１０１のＣＰＵ１０２は、グリフパス取得部２０２、ボールド処理部２０９、レンダリング部２０７として機能する。グリフパス取得部２０２は、通信部１０６で受信されたＰＤＬデータ２０１に含まれるグリフパスを取得する。ボールド処理部２０９は、取得されたグリフパスに対してボールド処理を行う。レンダリング部２０７は、ボールド処理後のグリフパスのレンダリング（ラスタライズ）を行って、ラスターデータ２０８を生成する。なおボールド処理部２０９は、Ｗｉｎｄｉｎｇ値（ワインディング値）算出部２０３、パスずらし方向決定部２０５、パス生成部２０６で構成され、各部の処理については後述する。
【００１４】
図３は、ＣＰＵ１０２が記憶部１０５に記憶されているプログラムをＲＯＭ１０３、ＲＡＭ１０４を利用して実行することで実現される処理フローである。この処理フローは、通信部１０６で受信されたＰＤＬデータ２０１に含まれるグリフパスに対してボールド処理およびレンダリングを行うための処理フローである。なお以下で説明するのは、ＰＤＬデータ２０１に含まれる１つのグリフパスについてであるが、複数のグリフパスがＰＤＬデータ２０１に含まれる場合には、グリフパスの数だけ各処理が繰り返される。またグリフパス以外のグラフィカルオブジェクトについては図３の処理フローは実行されない。
【００１５】
ステップＳ１００１において、グリフパス取得部２０２は、通信部１０６が外部装置からＬＡＮ１０７を介して受信したＰＤＬデータ２０１を解析することで、ＰＤＬデータ２０１に含まれるグリフパスを取得する。この取得について説明する。ＰＤＬデータ２０１には、複数のグラフィカルオブジェクトの描画命令が含まれており、グリフパス取得部２０２は、その複数の描画命令のうちから、グリフパスを示す識別子によって区別される描画命令（グリフパス描画命令）を判定する。そしてグリフパス取得部２０２は、グリフパス描画命令の情報をＲＡＭ１０４に記憶する。
【００１６】
図８、図９にグリフパスおよびグリフパス描画命令の一例を示す。グリフパスは複数の頂点を含む。
【００１７】
図８（ａ）は、４つの頂点で構成されるパス２つで表される１つのグリフパスの例である。頂点Ｐ１、Ｐ２、Ｐ３、Ｐ４は、頂点Ｐ１、Ｐ２、Ｐ３、Ｐ４の順序で結ばれ、時計回りに進む第１のパスを構成し、第１の閉領域を定義する。頂点Ｐ５、Ｐ６、Ｐ７、Ｐ８は、頂点Ｐ５、Ｐ６、Ｐ７、Ｐ８の順序で結ばれ、反時計回りに進む第２のパスを構成し、第２の閉領域を定義する。つまりこのグリフパスでは、閉領域によって、パスの進行方向が異なる。各パスで定義される２つの閉領域が指定の色で塗り潰されることで文字「二」が形成される。この文字「ニ」を表すグリフパスにおける２つのパスおよび閉領域は、重なりを持たない。なお、図示こそしないが、２つのパスが重なりを持つような場合（例えばベジエ曲線を表す頂点および制御点を順に結ぶパスが、他のパスと重なりを持つような場合）、各パスの進行方向が同一である場合に限り、本実施例の以下の処理フローで適切なボールド処理を行うことができる。
【００１８】
図９（ａ）は、４つの頂点で構成されるパス２つで表される１つのグリフパスの例である。頂点Ｐ１、Ｐ２、Ｐ３、Ｐ４は、頂点Ｐ１、Ｐ２、Ｐ３、Ｐ４の順序で結ばれ、時計回りに進む第１のパスを構成し、頂点Ｐ５、Ｐ６、Ｐ７、Ｐ８は、頂点Ｐ５、Ｐ６、Ｐ７、Ｐ８の順序で結ばれ、反時計回りに進む第２のパスを構成する。第１のパスおよび第２のパスはそれぞれ１つの閉領域の外縁および内縁に相当する。各パスで定義される１つの閉領域が指定の色で塗り潰されることで文字「ロ」が形成される。この文字「ロ」を表すグリフパスにおける２つのパスは、重なりを持たない。
【００１９】
図８（ｂ）は、図８（ａ）のグリフパスを表現するグリフパス描画命令の例である。グリフパス描画命令４００は、図８（ｂ）に示されるように、グリフパスを示す識別子すなわち要素名「Ｐａｔｈｓ」の開始タグ４０１（＜Ｐａｔｈｓ＞）および終了タグ４０８（＜／Ｐａｔｈｓ＞）の間に含まれる１つ以上のパスによって表される。
【００２０】
開始タグ４０１には複数の属性が含まれる。Ｉｄ属性とＰａｔｈＮｕｍ属性である。Ｉｄ属性はグリフパスを一意に識別するための識別番号を示し、ＰａｔｈＮｕｍ属性はそのグリフパスに含まれるパスの数を示す。開始タグ１６０１内のＩｄ属性の属性値は「１」であり、ＰａｔｈＮｕｍ属性の属性値は「２」であるため、グリフパスの識別番号が「１」であり、グリフパスに含まれるパスの数が「２」である。開始タグ１６０１および終了タグ４０２の間に含まれるＰａｔｈｓ要素の内容には、第１のＰａｔｈ要素の開始タグ４１０、そのＰａｔｈ要素の内容（４つのＰｏｉｎｔ要素の空タグ４１１〜４１４）、第１のＰａｔｈ要素の終了タグ４１５、第２のＰａｔｈ要素の開始タグ４２０、そのＰａｔｈ要素の内容（４つのＰｏｉｎｔ要素の空タグ４２１〜４２４）、第２のＰａｔｈ要素の終了タグ４２５が含まれる。すなわち、Ｐａｔｈｓ要素の内容には、グリフパスに含まれるパス数分の各パスが表されている。
【００２１】
第１のＰａｔｈ要素の開始タグ４１０には、Ｉｄ属性、ＰｏｉｎｔＮｕｍ属性が含まれる。Ｉｄ属性はグリフパスに含まれるパスを一意に識別するための識別番号を示し、ＰｏｉｎｔＮｕｍ属性はＩｄ属性の識別番号によって識別されるパスの頂点（あるいは制御点）の数を示す。以降では、制御点も頂点と表記する。Ｐａｔｈ要素の内容には、そのパスの各頂点の座標を示す情報が含まれる。すなわち、Ｐｏｉｎｔ要素の空タグ４１１〜４１４である。
【００２２】
４つのＰｏｉｎｔ要素の空タグ４１１〜４１４のそれぞれには、Ｉｄ属性、Ｘ属性、Ｙ属性が含まれる。Ｉｄ属性は、パスの頂点を一意に識別するための識別番号を示す。Ｘ属性およびＹ属性のそれぞれは、頂点のＸ座標およびＹ座標を示す。例えばＰｏｉｎｔ要素の空タグ４１１は、識別番号「１」の頂点の座標が（Ｘ、Ｙ）＝（４０、３０）であることを示す。他のＰｏｉｎｔ要素の空タグ４１２〜４１４についても同様である。
【００２３】
また、第２のＰａｔｈ要素の開始タグ４２０、内容（Ｐｏｉｎｔ要素の空タグ４２１〜４２４）についても、第１のＰａｔｈ要素と同様である。
【００２４】
図８（ｂ）のグリフパス描画命令４００に含まれるＰｏｉｎｔ要素の空タグは、図８（ａ）のグリフパスの頂点に対応する。すなわち、Ｐｏｉｎｔ要素の空タグ４１１〜４１４によって示される頂点のそれぞれは頂点Ｐ１〜Ｐ４に対応し、Ｐｏｉｎｔ要素の空タグ４２１〜４２４によって示される頂点のそれぞれは頂点Ｐ５〜Ｐ８に対応する。
【００２５】
図９（ｂ）は、図８（ｂ）と同様に、図９（ａ）のグリフパスを表現するグリフパス描画命令１６００である。
【００２６】
グリフパス取得部２０２は、Ｐａｔｈｓ要素をＰＤＬデータ２０１から特定することで、グリフパス描画命令を特定し、そのグリフパス描画命令の情報をリンク形式でＲＡＭ１０４に記憶する。
【００２７】
グリフパス取得部２０２は、例えばグリフパス描画命令４００の情報を、図８（ｃ）に示されるリンク形式でＲＡＭ１０４に記憶する。まずグリフパス取得部２０２は、Ｐａｔｈｓ構造体４４１を生成する。構造体４４１には、ＩｄとＰａｔｈＮｕｍが含まれる。ＩｄおよびＰａｔｈＮｕｍは、Ｐａｔｈｓ要素の開始タグ４０１のＩｄ属性値およびＰａｔｈＮｕｍ属性値と等しい。そしてグリフパス取得部２０２は、Ｐａｔｈ構造体４５１を生成する。構造体４５１には、ＩｄとＰｏｉｎｔＮｕｍの組が１つ以上含まれる。一組のＩｄおよびＰｏｉｎｔＮｕｍは、１つのＰａｔｈ要素開始タグ（４１０や４２０）のＩｄ属性値およびＰｏｉｎｔＮｕｍ属性値と等しい。グリフパス取得部２０２は、Ｐａｔｈｓ構造体４４１とＰａｔｈ構造体４５１とをリンクで結ぶ。
【００２８】
そしてグリフパス取得部２０２は、グリフパスに含まれる各パスに対応するＰｏｉｎｔ構造体を生成する。例えばグリフパス取得部２０２は、Ｐａｔｈ構造体４５１のＩｄ「１」のレコードに対応するＰｏｉｎｔ構造体４６１を生成し、Ｐａｔｈ構造体４５１のＩｄ「２」のレコードに対応するＰｏｉｎｔ構造体４６２を生成する。構造体４６１や４６２には、Ｉｄ、Ｘ、Ｙが含まれる。Ｉｄ、Ｘ、Ｙは、Ｐａｔｈ要素の開始タグ４１０、４６２の内容であるＰｏｉｎｔ要素の空タグのＩｄ属性値、Ｘ属性値、Ｙ属性値と等しい。１つのＰｏｉｎｔ構造体は、１つのパスに対応しており、そのパスの各頂点の情報（Ｉｄ、Ｘ座標、Ｙ座標）が記憶される。例えば構造体４６１にはＩｄ１〜４を持つ複数のレコードが記憶され、各レコードは、図８（ａ）のグリフパスの頂点Ｐ１〜Ｐ４に対応している。また例えば構造体４６２にはＩｄ１〜４を持つ複数のレコードが記憶され、各レコードは、図８（ａ）のグリフパスの頂点Ｐ５〜Ｐ８に対応している。グリフパス取得部２０２は、このＰｏｉｎｔ構造体（４６１、４６２）のそれぞれを対応するＰａｔｈ構造体４５１のレコードとリンクで結ぶ。
【００２９】
以上説明した図８（ｃ）のリンク形式の情報が、ＲＡＭ１０４に記憶される。なお、ＰＤＬデータ２０１にグリフパス描画命令１６００が含まれる場合には、図９（ｃ）のリンク形式の情報が、ＲＡＭ１０４に記憶される。
【００３０】
図３の処理フローの説明に戻る。ステップＳ１００２において、ボールド処理部２０９は、ステップＳ１００１で取得されたグリフパスに含まれるパスの数を取得する。具体的には、ボールド処理部２０９は、ＲＡＭ１０４に記憶された情報から、Ｐａｔｈｓ要素のＰａｔｈＮｕｍ属性の属性値Ｎを取得する。図８の例では、「２」が取得され、図９の例では、「２」が取得される。
【００３１】
ステップＳ１００３において、ボールド処理部２０９は、処理済みのパス数をカウントするためのカウンタｉを０で初期化する。
【００３２】
ステップＳ１００４において、ボールド処理部２０９は、グリフパスに含まれる全てのパスに対してボールド処理を行ったかを判定する。全てのパスに対してボールド処理が行われていると判定された場合に処理はステップＳ１００７へ進み、そうでない場合に処理はステップＳ１００５へ進む。具体的には、ボールド処理部２０９は、カウンタｉがステップＳ１００２で取得された属性値Ｎよりも小さいか否かを判定する。カウンタｉが属性値Ｎよりも小さい場合に処理はステップＳ１００５へ進み、そうでない場合に処理はステップＳ１００７へ進む。
【００３３】
ステップＳ１００５において、ボールド処理部２０９は、カウンタｉに対応するパス（すなわち現在の対象パス）についてボールド処理を行う。詳細は図４〜７を用いて後述する。
【００３４】
ステップＳ１００６において、ボールド処理部２０９は、カウンタｉを１つインクリメントし、ステップＳ１００４の処理を繰り返す。
【００３５】
ステップＳ１００７において、レンダリング部２０７は、レンダリング部２０７は、ボールド処理後のグリフパスのレンダリング（ラスタライズ）を行って、フォントのラスターデータ２０８を生成する。このレンダリングは、ペインターズアルゴリズムなどの公知の方法によって行われる。
【００３６】
以上で１つのグリフパスに対する図３の処理フローが終了する。
【００３７】
以下では、ステップＳ１００５の現在の対象パスに対するボールド処理について説明する。本実施例のボールド処理は、図４に示される４つのステップＳ１１０１〜Ｓ１１０４に大別される。
【００３８】
ステップＳ１１０１において、Ｗｉｎｄｉｎｇ値算出部２０４は、現在の対象パスを構成する頂点のうち、最もＸ座標が小さいもの（最左端の点）を特定する。具体的にはＷｉｎｄｉｎｇ値算出部２０４は、現在の対象パスについてのＲＡＭ１０４に記憶されているＰｏｉｎｔ要素のうち、Ｘ属性の属性値が最も小さいものを特定する。このとき属性値が等しいＰｏｉｎｔ要素が複数あれば、Ｗｉｎｄｉｎｇ値算出部２０４は、その複数のＰｏｉｎｔ要素のうちのいずれか１つを選択する。たとえばＹ属性の属性値が最も小さいものが選択される。
【００３９】
図８に示されるグリフパスのＩｄ属性値「１」で識別されるパスについては、Ｐｏｉｎｔ要素のＩｄ属性値「２」で識別される点Ｐ２が特定される。図８に示されるグリフパスのＩｄ属性値「２」で識別されるパスについては、Ｐｏｉｎｔ要素のＩｄ属性値「４」で識別される点Ｐ８が特定される。図９に示されるグリフパスのＩｄ属性値「１」で識別されるパスについては、Ｐｏｉｎｔ要素のＩｄ属性値「２」で識別される点Ｐ２が特定される。図９に示されるグリフパスのＩｄ属性値「２」で識別されるパスについては、Ｐｏｉｎｔ要素のＩｄ属性値「４」で識別される点Ｐ８が特定される。
【００４０】
ステップＳ１１０２において、Ｗｉｎｄｉｎｇ値算出部２０４は、図５の処理フローを実行する。
ステップＳ１１０３において、パスずらし方向決定部２０５は、図６の処理フローを実行する。
ステップＳ１１０４において、パス生成部２０６は、図７の処理フローを実行する。
以上のステップＳ１１０１〜Ｓ１１０４の一連の処理フローが図４のボールド処理である。
【００４１】
図５を用いて、Ｗｉｎｄｉｎｇ値算出部２０４によって実行されるステップＳ１１０２の処理フローについて説明する。図５は、現在の対象パスについてのＷｉｎｄｉｎｇ値を算出する処理のフローである。
【００４２】
ステップＳ１３０１において、Ｗｉｎｄｉｎｇ値算出部２０４は、Ｗｉｎｄｉｎｇ値を「０」で初期化する。
【００４３】
ステップＳ１３０２において、Ｗｉｎｄｉｎｇ値算出部２０４は、ステップＳ１１０１で特定された頂点（現在の対象パスにおける最左端の点）を通るスキャンラインを決定する。すなわち特定された頂点のＹ座標を通るＸ軸に平行なスキャンラインを決定する。このスキャンライン上のＷｉｎｄｉｎｇ値が後述の処理で算出される。そしてＷｉｎｄｉｎｇ値算出部２０４は、現在の対象パスを含むグリフパスに含まれる全てのパスについて、決定されたスキャンラインと交差する点（以下、交点という）を求める。そして、Ｗｉｎｄｉｎｇ値算出部２０４は求められた交点の数をカウントし、それを交点の数Ｎとする。
【００４４】
現在の対象パスが図８（ｃ）のＰａｔｈ構造体４５１のＩｄ「１」のパスである場合、決定されたスキャンラインはＹ＝２０であり、全てのパスとスキャンラインとの交点の座標は（４０、２０）、（８０、２０）である。交点数Ｎは「２」となる。
【００４５】
現在の対象パスが図８（ｃ）のＰａｔｈ構造体４５１のＩｄ「２」のパスである場合、決定されたスキャンラインはＹ＝５０であり、全てのパスとスキャンラインとの交点の座標は（２０、５０）、（１００、５０）である。交点数Ｎは「２」となる。
【００４６】
現在の対象パスが図９（ｃ）のＰａｔｈ構造体４５１のＩｄ「１」のパスである場合、決定されたスキャンラインはＹ＝１０であり、全てのパスとスキャンラインとの交点の座標は（１０、１０）、（６０、１０）である。交点数Ｎは「２」となる。
【００４７】
現在の対象パスが図９（ｃ）のＰａｔｈ構造体４５１のＩｄ「２」のパスである場合、決定されたスキャンラインはＹ＝２０であり、全てのパスとスキャンラインとの交点の座標は（１０、２０）、（２０、２０）、（５０、２０）、（６０、２０）である。交点数Ｎは「４」となる。
【００４８】
ステップＳ１３０３において、Ｗｉｎｄｉｎｇ値算出部２０４は、カウンタｉを「０」で初期化する。
【００４９】
ステップＳ１３０４において、Ｗｉｎｄｉｎｇ値算出部２０４は、Ｓ１３０２で求められた全ての交点について処理を完了したかを判定し、全ての交点の処理が完了した場合に本処理フローは終了し、完了していない場合に処理はステップＳ１３０５へ進む。具体的にはＷｉｎｄｉｎｇ値算出部２０４は、カウンタｉと交点数Ｎとを比較し、カウンタｉが交点数Ｎ以上であれば本処理フローを終了し、そうでなければ処理はステップＳ１３０５へ進む。
【００５０】
ステップＳ１３０５において、Ｗｉｎｄｉｎｇ値算出部２０４は、カウンタｉによって特定される現在の対象交点のＸ座標が、ステップＳ１１０１で特定された頂点（現在の対象パスにおける最左端の点）のＸ座標以下であるかを判定する。すなわち、この処理は、現在の対象パスにおける最左端の点よりも左側にスキャンラインとの交点を持つパス（左側に存在するパス）に対してのみ、ステップＳ１３０６以降の処理を行うようにするための判定処理である。Ｓ１３０６以降の処理に進む対象を限定することで、処理量を減らすことができる。しかしこのステップＳ１３０５の判定は必須ではない。現在の対象交点のＸ座標がステップＳ１１０１で特定された頂点のＸ座標以下である場合、処理はステップＳ１３０６へ進む。そうでない場合、処理はステップＳ１３０９へ進む。
【００５１】
ステップＳ１３０６において、Ｗｉｎｄｉｎｇ値算出部２０４は、現在の対象交点における、対象交点の属するパスの進行方向を特定する。すなわち交差の仕方が特定される。例えば対象交点の属するパスを構成する点を順につないだときに点Ａから点Ｂへのパス上に対象交点があるとする。このとき点ＡのＹ座標＜点ＢのＹ座標であれば進行方向は上向き（第１の方向）であり、点ＡのＹ座標＞点ＢのＹ座標であれば進行方向は下向き（第２の方向）である。進行方向が上向きであれば、ステップＳ１３０７へ処理が進む。そうでなければ、ステップＳ１３０８へ処理が進む。
【００５２】
ステップＳ１３０７において、Ｗｉｎｄｉｎｇ値算出部２０４は、その対象交点に現在のＷｉｎｄｉｎｇ値と、Ｗｉｎｄｉｎｇ値の変化を示す情報とを関連付けてから、Ｗｉｎｄｉｎｇ値を１だけ加算する。ここで変化を示す情報とは、現在のＷｉｎｄｉｎｇ値に１を加算した場合に、加算結果は「０」に近づくのかそうでないのかを示す情報である。
【００５３】
ステップＳ１３０８において、Ｗｉｎｄｉｎｇ値算出部２０４は、その対象交点に現在のＷｉｎｄｉｎｇ値と、Ｗｉｎｄｉｎｇ値の変化を示す情報と関連付けてから、Ｗｉｎｄｉｎｇ値を１だけ減算する。ここで変化を示す情報とは、現在のＷｉｎｄｉｎｇ値に１を減算した場合に、加算結果は「０」に近づくのかそうでないのかを示す情報である。
【００５４】
ステップＳ１３０７、Ｓ１３０８について、現在の対象パスの最左端の頂点にＷｉｎｄｉｎｇ値と前記の情報が関連付けられる。言い換えると、Ｗｉｎｄｉｎｇ値算出部２０４は、現在の対象パスに対して、最左端の頂点におけるＷｉｎｄｉｎｇ値と前記の情報を関連付ける。
【００５５】
ステップＳ１３０９において、Ｗｉｎｄｉｎｇ値算出部２０４は、カウンタｉを１インクリメントする。
【００５６】
以上が図５のＷｉｎｄｉｎｇ値を算出する処理フローである。
【００５７】
図６を用いて、パスずらし方向決定部２０５によって実行されるステップＳ１１０３の処理フローについて説明する。図６は、現在の対象パスについてのパスのずらし方向を決定する処理のフローである。
【００５８】
ステップＳ１４０１において、パスずらし方向決定部２０５は、ステップＳ１１０１で特定された頂点（現在の対象パスにおける最左端の点）に関連付けられたＷｉｎｄｉｎｇ値を参照する。言い換えれば、パスずらし方向決定部２０５は、現在の対象パスに関連付けられたＷｉｎｄｉｎｇ値を参照する。そして、そのＷｉｎｄｉｎｇ値が「０」であるかを判定する。この判定によって、閉領域を定義する現在の対象パスが、その閉領域の外縁を定義しているのか否かが判定される。Ｗｉｎｄｉｎｇ値が「０」である場合、現在の対象パスは閉領域の外縁に相当する。現在の対象パスにおける最左端の点のＷｉｎｄｉｎｇ値が「０」であると判定された場合、処理はステップＳ１４０３に進み、そうでない場合に、処理はＳ１４０２へ進む。図８（ｃ）のＰａｔｈ要素のＩｄ「１」、「２」で特定されるパス、および、図９（ｃ）のＰａｔｈ要素のＩｄ「１」で特定されるパスでは、Ｗｉｎｄｉｎｇ値が「０」であるので、処理はステップＳ１４０３へ進む。図９（ｃ）のＰａｔｈ要素のＩｄ「２」で特定されるパスでは、Ｗｉｎｄｉｎｇ値が「−１」であるので、処理はステップＳ１４０２へ進む。
【００５９】
ステップＳ１４０２において、パスずらし方向決定部２０５は、ステップＳ１３０７あるいはステップＳ１３０８で関連付けられた情報を参照する。言い換えれば、パスずらし方向決定部２０５は、現在の対象パスに関連付けられた情報を参照する。そして、参照される情報が、Ｗｉｎｄｉｎｇ値が「０」に近づくことを示す第１の情報であるか否かを判定する。参照される情報が、Ｗｉｎｄｉｎｇ値が、「０」に近づくことを示す場合に処理はステップＳ１４０４へ進み、そうでない場合に処理はステップＳ１４０５へ進む。つまり参照される情報が「０」から遠ざかることを示す第２の情報である場合にステップＳ１４０５の処理が行われる。この判定によって、閉領域を定義する現在の対象パスが、その閉領域の内縁を定義しているのか、外縁を定義しているのかが判定される。参照される情報が、Ｗｉｎｄｉｎｇ値が「０」に近づくことを示す場合、現在の対象パスは閉領域の内縁に相当する。例えば図９（ｃ）のＰａｔｈ要素のＩｄ「２」で特定されるパスでは、Ｗｉｎｄｉｎｇ値が「０」に近づくことを示す情報が関連付けられているので、処理はステップＳ１４０４へ進む。
【００６０】
ステップＳ１４０３において、パスずらし方向決定部２０５は、現在の対象パスのずらし方向を、ステップＳ１１０１で特定された頂点においてＸ軸で負方向（左方向）となる方向に決定し、その決定されたずらし方向を現在の対象パスに関連付ける。例えば現在の対象パスの進行方向が時計回りであれば、ずらし方向を、パスの進行方向に関して左方向に決定される。現在の対象パスの進行方向が反時計回りであれば、ずらし方向を、パスの進行方向に関して右方向に決定される。例えば図８（ｃ）のＰａｔｈ要素のＩｄ「１」で特定されるパスのずらし方向は、パスの進行方向が時計回りであるので、進行方向に関して左方向となる。また図８（ｃ）のＰａｔｈ要素のＩｄ「２」で特定されるパスのずらし方向は、パスの進行方向が反時計回りであるので、進行方向に関して右方向となる。また図９（ｃ）のＰａｔｈ要素のＩｄ「１」で特定されるパスのずらし方向は、パスの進行方向が時計回りであるので、進行方向に関して左方向となる。
【００６１】
ステップＳ１４０４において、パスずらし方向決定部２０５は、現在の対象パスのずらし方向を、ステップＳ１１０１で特定された頂点においてＸ軸で正方向（右方向）となる方向に決定し、その決定されたずらし方向を現在の対象パスに関連付ける。例えば現在の対象パスの進行方向が時計回りであれば、ずらし方向を、パスの進行方向に関して右方向に決定される。現在の対象パスの進行方向が反時計回りであれば、ずらし方向を、パスの進行方向に関して左方向に決定される。例えば図９（ｃ）のＰａｔｈ要素のＩｄ「２」で特定されるパスのずらし方向は、パスの進行方向が反時計回りであるので、進行方向に関して左方向となる。
【００６２】
ステップＳ１４０５において、パスずらし方向決定部２０５は、ステップＳ１４０３と同じ処理を行う。
【００６３】
以上がパスのずらし方向の決定処理である。
【００６４】
図７は、現在の対象パスについてのボールド処理のフローである。
【００６５】
ステップＳ１５０１において、パス生成部２０６は、現在の対象パスに含まれる頂点の数Ｍを取得する。
ステップＳ１５０２において、パス生成部２０６は、処理済みの頂点数のカウンタｉを「０」で初期化する。
【００６６】
ステップＳ１５０３において、パス生成部２０６は、現在の対象パスに含まれる全ての頂点について処理したかを判定する。全ての頂点を処理した場合に処理は終了し、そうでない場合には処理は現在の対象パスに含まれる未処理の頂点を１つ選びステップＳ１５０４に進む。具体的には、パス生成部２０６は、カウンタｉが頂点数Ｍ未満かを判定し、カウンタｉが頂点数未満であれば現在の対象パスに含まれる未処理の頂点を１つ選び、処理はステップＳ１５０４に進み、そうでなければ処理は終了する。
【００６７】
ステップＳ１５０４において、パス生成部２０６は、現在の対象パスに関連付けられているずらし方向に基づいて、現在の対象頂点の移動ベクトルを求める。例えば、パス生成部２０６は、現在の対象頂点に接続する各パスの法線ベクトルのうち、関連付けられているずらし方向側の法線ベクトルの合成ベクトルを求め、その合成ベクトルに所定係数をかけたベクトルを移動ベクトルとして求める。そしてパス生成部２０６は、対象頂点の位置を移動ベクトル分だけ平行移動させる。
【００６８】
ステップＳ１５０５において、パス生成部２０６は、カウンタｉを＋１だけインクリメントし、処理をステップＳ１５０３に進める。
【００６９】
以上のように、パスの各頂点を移動することで、閉領域の面積を大きくすることができる。
【００７０】
図１０に図８、９のグリフパスの各頂点を本実施例のボールド処理に従って移動させた結果を示す。
【００７１】
図１０（ａ）は、図８に示された文字「ニ」の２つのパスを構成する各頂点を移動させた結果を示す。移動前の各頂点は、破線の丸印で示されており、グレーで塗り潰されているのが、頂点の移動前の閉領域を示す。破線の矢印が本実施例によって求まる移動ベクトルであり、移動ベクトルに従って移動された頂点が黒く塗りつぶした丸印によって示される。このように閉領域によって逆方向の進行方向を持つパスであっても正しくボールド処理を行うことができる。
【００７２】
また図１０（ｂ）は、図９に示された文字「ロ」の２つのパスを構成する各頂点を移動させた結果を示す。図１０（ｂ）でも図１０（ａ）と同じく、正しくボールド処理を行うことができる。
【００７３】
（その他の実施例）
本発明は、上述の実施形態の１以上の機能を実現するプログラムを、ネットワーク又は記憶媒体を介してシステム又は装置に供給し、そのシステム又は装置のコンピュータにおける１つ以上のプロセッサーがプログラムを読出し実行する処理でも実現可能である。また、１以上の機能を実現する回路（例えば、ＡＳＩＣ）によっても実現可能である。
【図１】
0006642964.tif 000002
【図２】
0006642964.tif 000003
【図３】
0006642964.tif 000004
【図４】
0006642964.tif 000005
【図５】
0006642964.tif 000006
【図６】
0006642964.tif 000007
【図７】
0006642964.tif 000008
【図８】
0006642964.tif 000009
【図９】
0006642964.tif 000010
【図１０】
0006642964.tif 000011