(57)【要約】      （修正有）【課題】レンダリングする目的でサンプリンググリッドにストロークを自動的にアラインする方法を提供する。【解決手段】文字のスケルトンをトレースするオリジナルの均一幅の経路が、オリジナルの座標を有する入力ペンコマンドによって指定され、オリジナルの経路の幅が最も近い整数に四捨五入され、ヒンティングされた幅が生成される。オリジナルの幅が、入力ペンコマンドを使用してトラバースされ、経路のセグメントが識別され、セグメントはアレイに格納される。アレイの各セグメントについて、ヒンティングされた座標が求められ、アレイがソートされ、非循環有向グラフ(ＤＡＧ)が構成される。セグメントがサンプリンググリッドにフィッティングされ、その結果が出力ペンコマンドに格納され、それによって、文字のスケルトンがサンプリンググリッドにアラインされる。【選択図】図２Ｂ
2010170097.tif 000002
【特許請求の範囲】
【請求項１】
文字を画像のサンプリンググリッドにアラインする方法であって、前記文字のスケルトンをトレースするオリジナルの経路が、オリジナルの座標を有する入力ペンコマンドによって指定され、前記オリジナルの経路は均一幅を有し、該方法を実行するためのプロセッサを備え、該方法は、
前記オリジナルの経路の幅を最も近い整数に四捨五入することによって、ヒンティングされた経路の幅を求めるステップと、
前記入力ペンコマンドを使用して前記オリジナルの経路をトラバースして前記オリジナルの経路のセグメントを識別すると共に、該セグメントをアレイに格納するステップと、
前記アレイの各前記セグメントのヒンティングされた座標を求めるステップと、
前記アレイを昇順にソートしてソートされたアレイを得るステップと、
前記ソートされたアレイの前記セグメントから非循環有向グラフ(ＤＡＧ)を構成するステップと、
前記ソートされたアレイ、前記ＤＡＧ、及び前記ヒンティングされた経路の前記幅を使用して前記セグメント間の衝突を解消するステップと、
前記セグメントを前記サンプリンググリッドにフィッティングすると共に、前記ヒンティングされた座標を有する出力ペンコマンドに該フィッティングの結果を格納し、前記文字の前記スケルトンを整数サンプリンググリッドにアラインするステップと、
前記ヒンティングされた経路の前記幅が偶整数である場合にのみ、各前記出力ペンコマンドの各前記ヒンティングされた座標に０．５を加え、前記文字の前記スケルトンを半整数サンプリンググリッドにアラインするステップと、
を含む方法。
【請求項２】
前記出力ペンコマンドをレンダリングすること、をさらに含む請求項１に記載の方法。
【請求項３】
前記ヒンティングされた経路の前記幅は、少なくとも１ピクセルである請求項１に記載の方法。
【請求項４】
前記ソートが、減少しないオリジナルの座標によるものである請求項１に記載の方法。
【請求項５】
前記ソートにおいて、前記ソートされたアレイの各前記セグメントの子セグメントを識別する請求項１に記載の方法。
【請求項６】
前記解消するステップは、２つのセグメントの前記ヒンティングされた座標間の差が、前記ヒンティングされた経路の前記幅に２ピクセルを加えたもの以下である場合に、前記２つのセグメント間の衝突を検出すること、をさらに含む請求項１に記載の方法。
【請求項７】
前記解消するステップは、前記ＤＡＧを欲張りボトムアッププロセスでトラバースする、請求項１に記載の方法。
【請求項８】
前記解消するステップは、前記差が、少なくとも前記ヒンティングされた経路の前記幅に１ピクセルを加えたものであることを確実にする、請求項６に記載の方法。
【請求項９】
垂直セグメントに近接しｙ方向において該垂直セグメントに重なるペンコマンドのｘ座標は該垂直セグメントにアラインされ、水平セグメントに近接しｘ方向において該水平セグメントに重なるペンコマンドのｙ座標は該水平セグメントにアラインされ、ペンコマンドの他のすべてのｘ座標は、ｘに近接した最小垂直アンカセグメントと最大垂直アンカセグメントとの間でｘ方向に直線補間され、ペンコマンドの他のすべてのｙ座標は、ｙに近接した最小水平アンカセグメントと最大水平アンカセグメントとの間でｙ方向に直線補間され、座標がセグメントから所定の距離内にある場合に、該座標は該セグメントに近接している、請求項６に記載の方法。
【請求項１０】
最の上側の水平セグメント及び最も下側の水平セグメント並びに最も左側の垂直セグメント及び最も右側の垂直セグメントは、前記サンプリンググリッドの最も近接したグリッド点にアラインされる、請求項１に記載の方法。
【請求項１１】
前記アラインにおいて、前記オリジナルの座標を前記ヒンティングされた座標において１．５ピクセルよりも大きく移動させない、請求項１に記載の方法。
【請求項１２】
水平セグメント及び垂直セグメントは並列に処理される、請求項１に記載の方法。
【請求項１３】
前記サンプリンググリッドは前記画像のピクセルグリッドであり、該画像はスクリーン上に表示される、請求項１に記載の方法。
【請求項１４】
前記サンプリンググリッドは前記画像のサブピクセルグリッドであり、該画像はスクリーン上に表示される、請求項１に記載の方法。
【請求項１５】
前記文字は、スタイル化されたストロークを備え、
各前記スタイル化されたストロークの輪郭から代表的な経路幅を求めること、
をさらに含む請求項１に記載の方法。
【請求項１６】
前記代表的な経路幅は、各前記スタイル化されたストロークの平均幅である、請求項１５に記載の方法。
【請求項１７】
前記代表的な経路幅は、各前記スタイル化されたストロークの公称幅である、請求項１５に記載の方法。
【請求項１８】
前記求めるステップは、前記輪郭をサンプリングして前記代表的な経路幅を求める、請求項１５に記載の方法。
【請求項１９】
前記求めるステップは、前記輪郭の解析的記述を使用して前記代表的な経路幅を求める、請求項１５に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、包括的には、文字をレンダリングすることに関し、より詳細には、均一幅ストロークを有する文字をグリッドアライン(grid align)することに関する。
【背景技術】
【０００２】
グリッドフィッティング
文字又はグリフを表示及び印刷のためにレンダリングすることは、特に文字が複雑である場合に問題が多い。これは、中国語、日本語、及び韓国語(ＣＪＫ)の文字セットに特に当てはまる。これについては、図１Ａを参照されたい。図示する文字は、均一幅ストロークを有する。この発明の目的は、レンダリングする目的でサンプリンググリッド(例えば、ピクセルグリッド又はサブピクセルグリッド)にストロークを自動的にアラインすることである。
【０００３】
ヒント
ヒントは、各グリフと共に格納される一組のルール又は手順であり、レンダリング中にそのグリフをどのように修正して、対称性、ストロークの太さ、及びタイプフェースのすべてのグリフにわたる均一な外観のような特徴を保つべきかを指定する。ヒンティングには、文字のエッジをサンプリンググリッドにアラインすることが必要とされる。アンチエイリアシングを有しようが有しまいが、小さなスクリーンサイズでは、ヒンティングは、人間の読み手にとって明瞭で読みやすいテキストを生成するのに極めて重要である。ヒンティングは、手動、自動、又はそれらの組み合わせとすることができる。
【０００４】
手動ヒンティングは、多くの労力を必要とし且つ費用を要する。例えば、日本語又は中国語のフォントは１万を超えるグリフを有する可能性があり、これらのフォントの良好にヒンティングされた(well-hinted)タイプフェースを開発するには、数年を要する可能性がある。ヒンティングは、本文活字(body type)のレンダリング品質を改善することに重点を置いているので、ヒントは、任意の経路に沿って配置される活字及びアニメ化された活字には有効ではない傾向がある。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
自動ヒンティングについての現在の方法は、ラテン語のような単純なスクリプトについては妥当な結果を生み出すが、中国語及び日本語のような複雑なスクリプトについては不十分である。その結果、複雑なグリフを有効に取り扱うことができる自動ヒンティング方法が必要とされている。自動ヒンティングでは、労働コストが省かれ、フォントファイルに格納される手動ヒントがもはや必要とされないので、フォントサイズが大幅に削減される。
【０００６】
この発明の目的は、レンダリングする目的でサンプリンググリッドにストロークを自動的にアラインすることである。
【課題を解決するための手段】
【０００７】
方法は、文字を画像のサンプリンググリッドにアラインする。文字のスケルトンをトレースするオリジナルの均一幅の経路が、オリジナルの座標を有する入力ペンコマンドによって指定される。
【０００８】
オリジナルの経路の幅が最も近い整数に四捨五入され、ヒンティングされた幅が生成される。オリジナルの経路が、入力ペンコマンドを使用してトラバースされ、経路のセグメントが識別される。セグメントはアレイに格納される。
【０００９】
アレイの各セグメントについて、ヒンティングされた座標が求められる。アレイがソートされ、非循環有向グラフ(ＤＡＧ)が構成される。セグメント間の衝突が、ソートされたアレイ、ＤＡＧ，及びヒンティングされた経路の幅を使用して解消される。セグメントがサンプリンググリッドにフィッティングされ、その結果が、ヒンティングされた座標を有する出力ペンコマンドに格納され、文字のスケルトンが整数サンプリンググリッドにアラインされる。ヒンティングされた経路の幅が偶整数を有する場合、各出力ペンコマンドの各ヒンティングされた座標に０．５が加えられて、文字のスケルトンが半整数サンプリンググリッドにアラインされる。
【図面の簡単な説明】
【００１０】
【図１Ａ】この発明の実施の形態に従ってアラインされる均一幅ストロークを有する文字の図である。
【図１Ｂ】文字の相対的アラインメントを有するサンプリンググリッドの概略図である。
【図１Ｃ】この発明の実施の形態に従ってアラインされる文字を示す。
【図２Ａ】この発明の実施の形態による均一幅のストロークベースの文字をアラインする方法のフロー図である。
【図２Ｂ】この発明の実施の形態による均一幅のストロークベースの文字をアラインする方法のフロー図である。
【図３】四捨五入する前及び四捨五入した後のセグメントアラインメントの図である。
【図４】四捨五入する前及び四捨五入した後、並びに衝突解消後のセグメントアラインメントの図である。
【図５】この発明の実施の形態に従ってアラインされるスタイル化されたストローク文字の概略図である。
【発明を実施するための形態】
【００１１】
アラインメント及びグリッドフィッティング
図１Ｂは、この発明の実施の形態によるアラインメント(位置調整)を有しないサンプリンググリッド上の中国語文字１１１及びアラインメントを有するサンプリンググリッド上の中国語文字１１２を示す。この発明は、文字の複数のゾーンを検出及びアラインするので、この方法は、複数アラインメントゾーン(multiple alignment zone)(ＭＡＺ)と呼ばれる。
【００１２】
図１Ｃは、この発明の実施の形態に従ってアラインされる文字を示す。この文字は、経路又はスケルトン(骨格)１２１によって表される。経路は、後述するように、ペンコマンドを含む。ペンコマンドは、経路の(ｘ，ｙ)座標１２２を指定する。ストローク(筆使い)の幅１２３は均一である。
【００１３】
図２Ａ及び図２Ｂに示すように、文字をサンプリンググリッド(例えば、スクリーン上に表示される画像のピクセルグリッド又はサブピクセルグリッド)にアラインする方法は、文字のスケルトンをトレースするペンコマンドを入力２１３として取り込む。この方法は、ペンコマンドのオリジナルの座標を「ヒンティング」された座標に修正する。
【００１４】
経路
レンダリングされる文字は、経路によって表される。この発明の実施の形態による経路は、例えば、moveto、lineto、及びcurvetoといったペンコマンドのシーケンスで構成される。これらのペンコマンドは、均一幅のストロークベースの文字の一組のストロークスケルトンを定義する。ストロークベースの文字のスケルトンは、例えば「ｕ」の場合のように開くこともできるし、「ｏ」の場合のように閉じることもできる。経路表現によって、任意の拡大縮小、回転、及び他の変換が可能になる。
【００１５】
ペンコマンドのシーケンスは、スケルトンをトレースする仮想ペンの移動及び描画を指定し、線セグメント及びベジェ曲線セグメントの双方の描画を可能する。各セグメントの終点及び制御点(control vertex)は、浮動小数点画像単位で指定される。
【００１６】
例示のペンコマンドは、以下の通りである。なお、すべての座標(すなわち、ｘ、ｙ、ｃｘ、及びｃｙ)は浮動小数点画像単位で指定されることに留意されたい。
【００１７】
moveto x y -- 新しい経路(すなわち、新しいストロークスケルトン)を開始する。このコマンドは、現在の点を(ｘ，ｙ)に設定する。
【００１８】
lineto x y -- 直線セグメントを現在(すなわち、現在のストロークスケルトン)の経路に追加する。この線セグメントは、現在の点から(ｘ，ｙ)へ延びる。線セグメントを構成した後、(ｘ，ｙ)が新しい現在の点となる。
【００１９】
curveto cx cy x y - ベジェ制御点として(ｃｘ，ｃｙ)を使用して、現在の点と(ｘ，ｙ)との間に二次ベジェ曲線セグメントを現在の経路(すなわち、現在のストロークスケルトン)に追加する。曲線セグメントを構成した後、(ｘ，ｙ)が新しい現在の点となる。
【００２０】
アラインメント方法の概観
複数アラインメントゾーン(ＭＡＺ)検出及びグリッドフィッティングの方法への入力２１３は、(１)ストロークベースの文字を表すペンコマンドのシーケンス、(２)オリジナルの経路幅、及び(３)文字をレンダリングするのに使用されるエム(em)当たりのピクセル(ｐｐｅｍ(pixels per em))数、すなわち文字のスケールである。ペンコマンドの(ｘ，ｙ)座標は、サンプリンググリッドにアラインされる。すなわち、自動的にヒンティングされる。
【００２１】
定義
以下の定義及び用語は、この発明のこの説明の理解を容易にするためにいくつかのカテゴリーに編成されている。
【００２２】
ペンコマンドのシーケンスが与えられると、終点が同一のｙ座標を有するlinetoコマンドは、「水平セグメント」を定める。同様に、終点が同一のｘ座標を有するlinetoコマンドは、「垂直セグメント」を定める。一般的な用語「セグメント」は、水平セグメント又は垂直セグメントのいずれかを指すことができる。簡単にするために、セグメントが水平セグメントである場合には、そのセグメントを「水平」と呼ぶことができる。同様に、セグメントが垂直セグメントである場合には、そのセグメントを「垂直」と呼ぶことができる。
【００２３】
(１)２つのセグメントＳ１及びＳ２が共に水平であり且つＳ１及びＳ２の双方と交差する垂直線が存在する場合、又は(２)Ｓ１及びＳ２が共に垂直であり且つＳ１及びＳ２の双方と交差する水平線が存在する場合のいずれかの場合に、２つのセグメントＳ１及びＳ２は「重なり合う(overlap)」。
【００２４】
水平セグメントＨの「オリジナルの座標」は、実数値の画像座標におけるＨのオリジナルのｙ座標、すなわち、グリッドフィッティングが適用される前のｙ座標である。垂直セグメントＶの「オリジナルの座標」は、実数値の画像座標におけるＶのオリジナルのｘ座標、すなわち、グリッドフィッティングが適用される前のｘ座標である。
【００２５】
水平セグメントＨの「ヒンティングされた座標」は、グリッドフィッティングが適用された後の実数値の画像座標におけるＨのｙ座標である。垂直セグメントＶの「ヒンティングされた座標」は、グリッドフィッティングが適用された後の実数値の画像座標におけるＶのｘ座標である。
【００２６】
Ｓ１及びＳ２を、それぞれオリジナルの座標ｃ１及びｃ２を有するセグメントであるとする。Ｓ１及びＳ２は、ｃ１がｃ２以下である場合には「昇順」にあり、ｃ１がｃ２以上である場合には「降順」にある。用語「昇順」及び「降順」は、一般に任意の個数のセグメントに適用される。
【００２７】
Ｓ１、Ｓ２、及びＳ３を昇順のセグメントであるとする。Ｓ１がＳ２に重なり合い且つＳ２がＳ３に重なり合う場合に且つその場合に限り、Ｓ２はＳ１とＳ３との「間」にある。
【００２８】
セグメントＣは、次の条件、すなわち、(１)Ｃのオリジナルの座標がＳのオリジナルの座標以下である、(２)ＣがＳに重なり合う、及び(３)ＣとＳとの間にセグメントがない、の３つすべてが満たされる場合に且つその場合に限り、セグメントＳの「子(child)」又は「子セグメント」である。
【００２９】
セグメントＳは、ＣがＳの子である場合に且つその場合に限り、セグメントＣの「親」又は「親セグメント」である。Ｓが複数の子セグメントを有する場合、それら子セグメントは、Ｓの「子(children)」と呼ばれる。
【００３０】
(１)セグメントＤがセグメントＳの子であるか、又は(２)ＤがＳ１の子であり、Ｓ｛ｉ｝がＳ｛ｉ＋１｝の子であり(ここで、ｉは１以上ｎ未満である)、ＳｎがＳの子である(ここで、ｎは１以上である)ようなセグメントＳ１、Ｓ２、…、Ｓｎの或る順序シーケンスが存在する場合に且つその場合に限り、セグメントＤは、セグメントＳの「子孫」である。ＤがＳの子孫である場合、ＳはＤの「先祖」である。
【００３１】
「セグメントツリー」は、セグメントＳ及びＳのすべての子孫によって定義されるセグメントの集合である。セグメントＳは、セグメントツリーの「ルートセグメント」である。セグメントツリーは、セグメントの非循環有向グラフ(ＤＡＧ)を形成する。
【００３２】
Ｓを、オリジナルの座標ｏ及びヒンティングされた座標ｈをそれぞれ有するセグメントであるとする。ｃを、次のように定義される整数とする。ヒンティングされた経路幅が奇整数である場合、ｃは、ｏよりも大きくない最大整数であり、すなわちｃ＝ｆｌｏｏｒ(ｏ)である。この関数フロアは、ｏ以下の最大整数を生成する。
【００３３】
ヒンティングされた経路幅が偶整数である場合、ｃは、ｏを最も近い整数に四捨五入してその結果から１を減算することによって求められた整数であり、すなわちｃ＝ｒｏｕｎｄ(ｏ)−１である。ｈ＝ｃ＋１の場合には、ｓは「切り上げられる」といい、ｈ＝ｃの場合には、Ｓは「切り捨てられる」という。セグメントツリーのあらゆるセグメントが切り上げられる場合、そのセグメントツリーは切り上げられるという。同様に、セグメントツリーのあらゆるセグメントが切り捨てられる場合、そのセグメントツリーは切り捨てられるという。
【００３４】
或るセグメントＳ１が、別のセグメントＳ２と同じヒンティングされた座標を有する場合、Ｓ１はＳ２に「アライン」されているという。
【００３５】
セグメントＳがその子セグメントの少なくとも１つにアラインされた場合、セグメントＳは「折り畳みされている(collapsed)」という。セグメントＳがその子セグメントのいずれにもアラインされていない場合、セグメントＳは「非折り畳みされている(non-collapsed)」という。
【００３６】
(１)２つのセグメントＳ１及びＳ２が重なり合い、(２)それらのヒンティングされた座標が異なり、且つ(３)それらのヒンティングされた座標が、実数値の画像座標において多くともＷ単位だけ異なる場合、２つのセグメントＳ１及びＳ２は「衝突している(collide)」という。ここで、Ｗはヒンティングされた経路幅である。
【００３７】
Ｓ１及びＳ２が衝突し、且つ(２)それらのヒンティングされた座標が実数値の画像座標において正確にＷ単位だけ異なる場合、Ｓ１及びＳ２は「わずかに衝突している(barely collide)」という。ここで、Ｗはヒンティングされた経路幅である。
【００３８】
「近接セグメントｘ座標(near-segment x coordinate)」は、(１)ｘ座標が垂直セグメントＶのオリジナルの座標と一致するか、又は垂直セグメントＶのオリジナルの座標の小さな所定の値「イプシロン」の範囲内にあり且つ(２)ペンコマンドＰのｙ座標がｙ方向においてＶと重なるようなペンコマンドＰのｘ座標である。
【００３９】
「近接セグメントｙ座標(near-segment y coordinate)」は、(１)ｙ座標が垂直セグメントＨのオリジナルの座標と一致するか、又は垂直セグメントＨのオリジナルの座標の小さな所定の値「イプシロン」の範囲内にあり且つ(２)ペンコマンドＰのｘ座標がｘ方向においてＨと重なるようなペンコマンドＰのｙ座標である。
【００４０】
より一般的に言えば、用語「近接セグメント座標(near-segment coordinate)」は、近接セグメントｘ座標又は近接セグメントｙ座標のいずれかを指すことができる。
【００４１】
「非セグメント座標(non-segment coordinates)」は、「近接セグメント」座標でないペンコマンドの座標である。すなわち、近接セグメント座標の集合及び非セグメント座標の集合は、相互に排他的であり、合わさってペンコマンド座標の完全な集合を構成する。
【００４２】
「半整数」は、或る整数ｋについてｎ＝ｋ＋０．５となるような実数の集合の要素ｎである。例えば、−２．５、−１．５、−０．５、０．５、１．５、２．５、及び３．５は、すべて半整数である。
【００４３】
「整数ピクセルグリッド」は、(ｘ，ｙ)の少なくとも一方の要素が整数であるような、実数ｘ及びｙの順序対(ｘ，ｙ)の集合である。例えば、座標(０，０)、(１．５，０)、及び(１．９７，３)は、整数ピクセルグリッド上にあるが、(１．７，１１．２)は、整数ピクセルグリッド上にない。幾何学的には、整数ピクセルグリッドは、例えばｙ＝−２、ｙ＝−１、ｙ＝０、ｙ＝１、及びｙ＝２といった整数水平線の集合、並びに例えばｘ＝−２、ｘ＝−１、ｘ＝０、ｘ＝１、及びｘ＝２といった整数垂直線の集合を含むグリッドである。
【００４４】
「半整数ピクセルグリッド」は、(ｘ，ｙ)の少なくとも一方の要素が半整数であるような、実数ｘ及びｙの順序対(ｘ，ｙ)の集合である。例えば、(０，０．５)、(１．５，０)、及び(１．９７，２．５)は、半整数ピクセルグリッド上にあるが、(１．７，１１．２)は、整数ピクセルグリッド上にない。幾何学的には、半整数ピクセルグリッドは、例えばｙ＝−２．５、ｙ＝−１．５、ｙ＝−０．５、ｙ＝０．５、ｙ＝１．５及びｙ＝２．５といった半整数水平線の集合、並びに例えばｘ＝−２．５、ｘ＝−１．５、ｘ＝−０．５、ｘ＝０．５、ｘ＝１．５、及びｘ＝２．５といった半整数垂直線の集合を含むグリッドである。
【００４５】
「ｘ座標の最小アンカセグメント(minimal anchor segment)」は、ｘ以下の最大のオリジナルの座標を有する非折り畳みの垂直セグメントである。「ｘ座標の最大アンカセグメント(maximal anchor segment)」は、ｘ以上の最小のオリジナルの座標を有する非折り畳みの垂直セグメントである。同様に、「ｙ座標の最小アンカセグメント」は、ｙ以下の最大のオリジナルの座標を有する非折り畳みの水平セグメントであり、「ｙ座標の最大アンカセグメント」は、ｙ以上の最小のオリジナルの座標を有する非折り畳みの水平セグメントである。
【００４６】
グリッドフィッティング中、非セグメント座標は、それらの対応するアンカセグメント間で直線補間される。少なくとも１つのアンカセグメントを欠いている非セグメント座標は、その文字のバウンディングボックスの「最小」エッジ又は「最大」エッジを「仮想」アンカセグメントとして使用することにより特別な場合として取り扱われる。最小エッジ及び最大エッジは、非セグメントｘ座標については、バウンディングボックスの左側のエッジ及び右側のエッジにそれぞれ対応し、最小エッジ及び最大エッジは、非セグメントｙ座標については、バウンディングボックスの下側のエッジ及び上側のエッジにそれぞれ対応する。
【００４７】
以下の一般的な注釈が、後述するこの方法に当てはまる。
【００４８】
この方法は、レンダリング中に動的に起動される。したがって、この方法は、高品質、少ないメモリ消費、及び計算効率性の間の好都合なバランスを達成するように設計される。
【００４９】
この方法は、任意の均一幅のストロークベースの文字に対して起動することができるが、ＣＪＫ文字用に設計及び最適化されている。
【００５０】
均一幅のストロークベースの文字は、主として、水平ストローク及び垂直ストロークで構成される。したがって、この方法は、文字の水平の特徴及び垂直の特徴を検出し、それらをサンプリンググリッドにアラインする。この方法は、例えば曲線又は対角線といった他の特徴をサンプリンググリッドにアラインする努力は行わない。サンプリンググリッドにアラインされない座標は、その代わりに、補間を使用してヒンティングされる。この詳細については以下を参照されたい。この全体的な方策によって、高品質及び高ランタイム性能という競合する目標の釣り合いが取れる。
【００５１】
この方法は、ストローク間の「衝突」を検出して解消し、それによって、重要な特徴が視覚的に区別することができなくなることを防止する。この詳細については以下を参照されたい。衝突解消は、結果の品質に有意な役割を果たす。この方法は、欲張り法を使用して衝突を解消する。この欲張り法は、計算効率は良いが、常に最適なグリッドフィッティング構成を見つけることができるとは限らない。しかしながら、実際には、この欲張り法は、広範囲の文字にわたって高品質な結果を生み出す。衝突解消中、この方法は、セグメント間のオリジナルの間隔又はセグメント間のオリジナルの間隔比率を保つ試みは行わない。
【００５２】
複数の文字にわたって外観の一貫性を改善するために、この方法は、常に、最も上側の水平セグメント及び最も下側の水平セグメントをグリッドにおいて最も近接したピクセルにアラインする。同様に、この方法は、常に、最も左側の垂直セグメント及び最も右側の垂直セグメントをグリッドにおいて最も近接したピクセルにアラインする。この手法によって、例えば衝突解消に起因するさらなるグリッドフィッティング調整が、文字のエッジにおける重要な水平特徴及び垂直特徴に影響を与えることが防止され、その結果、複数の文字を同じページで観察するときに、それら複数の文字間でのこれらの特徴のアラインメントがより良好なものとなる。
【００５３】
結局のところ、グリッドフィッティングには、ペンコマンドのオリジナルの座標を、アラインされたペンコマンド又はヒンティングされたペンコマンドに修正することが必要とされる。文字の形状の歪を最小にするために、この方法は、座標をそのオリジナルの値から１．５ピクセルよりも大きく移動させることは決してしない。
【００５４】
この方法のステップ２〜６(以下を参照)は、オリジナルの経路を使用してグリッドフィッティングを行う。ステップ７までオリジナルのペンコマンドに対して変更は行われない。
【００５５】
この方法は、オリジナルの経路幅を最も近い整数に四捨五入しその幅を少なくとも１ピクセルに固定することによって経路幅をヒンティングする。ヒンティングされた経路幅が偶整数である場合、ストロークスケルトンは、半整数ピクセルグリッドにアラインされる。ヒンティングされた経路幅が奇整数である場合、ストロークスケルトンは、整数ピクセルグリッドにアラインされる。この規則によって、レンダリングされた文字のエッジは、サンプリンググリッド上に確実に位置付けられ、それによって、エッジコントラストが最大にされる。
【００５６】
性能を最適化し且つ浮動小数点の実施態様と固定小数点の実施態様との間のコード再利用を最大にするために、この方法のステップのほとんどは、ヒンティングされた経路幅が偶数であるのか又は奇数であるのかに関わらず、整数ピクセルグリッドを使用してグリッドフィッティングを行う。ヒンティングされた座標に調整を行ってヒンティングされた経路幅に対応することは、最終ステップ９まで延期される。
【００５７】
以下で説明するこの方法のステップ２〜８は、この実施態様では、水平セグメントについて１回及び垂直セグメントについて１回の計２回有効に適用される。この方法は、水平セグメントと垂直セグメントとの間に依存関係を含まないことに留意されたい。その結果、この方法のハードウェアの実施態様及びマルチコアの実施態様は、水平セグメント及び垂直セグメントを完全に並列に処理することができる。
【００５８】
方法ステップ
この方法への入力は、(１)オリジナルの座標２１３’を有するペンコマンド２１３のシーケンス、(２)オリジナルの経路幅、及び(３)文字をレンダリングするのに使用されるエム当たりのピクセル(ｐｐｅｍ)数、すなわち文字のスケールである。
【００５９】
ステップ１：オリジナルの経路幅を最も近い整数に四捨五入することによってヒンティングされた経路の幅２１１を求める(２０１)。ヒンティングされた経路幅が少なくとも１ピクセルであることを確実にする。ストローク幅は、例えば３％又は５％といったエムボックス(em box)の割合として指定することができる。幅が偶数である場合には、スケルトンを半整数(０．５、１．５、２．５、…)にアラインし、奇数である場合には、スケルトンを整数(０、１、２、…)にアラインする。
【００６０】
ステップ２：入力ペンコマンド２１３をトラバースして、経路のセグメントを識別する(２０２)。これらのセグメントは、順序付けられていないセグメントアレイ２１２に格納される。
【００６１】
ステップ３：セグメントアレイにおける各セグメントのヒンティングされた座標２１５を求める(２０３)。ヒンティングされた経路幅が奇整数である場合、オリジナルの座標を最も近い整数に四捨五入することによって、ヒンティングされた座標を求める。ヒンティングされた経路幅が偶整数である場合、オリジナルの座標のフロアを計算することによって、ヒンティングされた座標を求める。いずれの場合も、ヒンティングされた座標は、以下で、衝突を解消するように修正することができ(ステップ６を参照)、また、ヒンティングされた経路幅に対応するように修正することができる(ステップ９を参照)。
【００６２】
ステップ４：セグメントアレイのセグメントを昇順にソートして(２０４)、ソートされたアレイ２１２’を得る。すなわち、オリジナルの座標が減少しない順序でソートする。
【００６３】
ステップ５：ＤＡＧを構成する(２０５)。ソートされたセグメントアレイ２１２’において各セグメントの子セグメントを識別し、非循環有向グラフ(ＤＡＧ)２１４を構成する(２０５)。ＤＡＧは、各セグメントをその子セグメントにリンクすることによって暗黙的に表される。
【００６４】
このＤＡＧを構成する目的は、次のステップにおいてセグメント間の衝突を検出し解消するためである。セグメントＳと子セグメントＣとの間の衝突は、Ｐ及びＣの現在のヒンティングされた座標がＷ＋２ピクセルよりも大きく異なっている場合には、衝突解消中に発生する可能性はない。ここで、Ｗは、ヒンティングされた経路幅２１１である。したがって、ランタイム効率を改善するために、Ｓ及びＣのヒンティングされた座標がＷ＋２ピクセル又はそれ未満異なる場合に且つその場合に限り、ＳとＣとの間にＤＡＧのリンクが追加される。
【００６５】
ステップ６：欲張りボトムアッププロセスを使用して、ステップ３におけるヒンティングに起因した衝突セグメントを検出し、衝突を解消する(２０６)。視覚的には、衝突セグメントは、２つの別個のストロークではなく、単一の太いストロークであるように見える。衝突は、いくつかの場合には、２つのセグメントが少なくともＷ＋１ピクセル離れるように、それらセグメントの一方のヒンティングされた座標に＋１又は−１を加えることによって解消することができる。ここで、Ｗは、ステップ１において求められたヒンティングされた経路幅２１１である。これについては、以下の詳細及び図４を参照されたい。
【００６６】
衝突は、欲張り法を使用して解消される。欲張り法は、ボトムアップ順で、すなわち最も下側の子孫から最も上側の先祖へ向けて、ＤＡＧ２１４をトラバースする。セグメントは、ステップ４において昇順にソートされるので、このボトムアップのトラバースは、セグメントアレイの最初のセグメントから開始してセグメントアレイの各セグメントを訪問し、セグメントアレイの最後のセグメントで終了することにより達成される。
【００６７】
Ｍ１及びＭ２を、セグメントアレイにおける最初のセグメントの現在のヒンティングされた座標及び最後のセグメントの現在のヒンティングされた座標であるとする。複数の文字にわたり重要な特徴の一貫したアラインメントを得るために、現在のヒンティングされた座標がＭ１に等しいすべてのセグメントは、引き続きＭ１に固定される。すなわち、これらのセグメントは、衝突解消による影響を受けない。同様に、現在のヒンティングされた座標がＭ２に等しいすべてのセグメントは、引き続きＭ２に固定される。
【００６８】
セグメントアレイのボトムアップトラバース中に訪問された各セグメントＳについて、以下のステップを適用する。
【００６９】
ステップ６ａ：Ｓの現在のヒンティングされた座標がＭ１に等しい場合、次のセグメントに進む。
【００７０】
ステップ６ｂ：Ｓの現在のヒンティングされた座標がＭ２に等しい場合、Ｓと衝突するＳの各子Ｃについて以下のステップを適用する。
【００７１】
ステップ６ｂ１：ＣがＳとわずかに衝突する場合、ステップ(６ｂ２)に進む。そうでない場合、ステップ(６ｂ４)に進む。
【００７２】
ステップ６ｂ２：Ｃが切り上げられるが、その子のいずれとも衝突することなく切り捨てられることができる場合、Ｃを切り捨て、ステップ(６ｂ５)に進む。例えば、Ｃのオリジナルの座標が２．６であり、ヒンティングされた経路幅が１ピクセルである場合、Ｃのヒンティングされた座標は、通常、３．０に「切り上げられる」。切り上げる代わりに「切り捨てる」ことによって、整数２．０が生成される。上記の専門用語のセクションの「切り上げ」及び「切り捨て」の定義を参照されたい。このステップは、衝突の除去を試み、あらゆる新しい衝突の導入を常に回避する。
【００７３】
ステップ６ｂ３：Ｃが切り上げられるが、ルートＣを有するセグメントツリーを、セグメントツリーにおける衝突を何ら生み出すことなくＣを切り捨てることができる場合、セグメントツリーを切り捨て、ステップ(６ｂ５)に進む。このステップは、衝突の除去を試み、あらゆる新しい衝突の導入を常に回避する。
【００７４】
ステップ６ｂ４：ＳがまだＣと衝突する場合、ＣをＳにアラインする。例えば、Ｃのヒンティングされた座標が４．０であり、Ｓのヒンティングされた座標が５．０であり、ヒンティングされた経路幅が１ピクセルである場合、Ｃを５．０にアラインする。
【００７５】
ステップ６ｂ５：終了。
【００７６】
ステップ６ｃ：Ｓの現在のヒンティングされた座標がＭ１とＭ２との間にある場合、Ｓと衝突するＳの各子Ｃについて以下のステップを適用する。
【００７７】
ステップ６ｃ１：ＣがＳとわずかに衝突する場合、ステップ(６ｃ２)に進む。そうでない場合、ステップ(６ｃ５)に進む。
【００７８】
ステップ６ｃ２：Ｃが切り上げられるが、その子のいずれとも衝突することなく切り捨てることができる場合、Ｃを切り捨て、ステップ(６ｃ６)に進む。例えば、Ｃのオリジナルの座標が２．６であり、ヒンティングされた経路幅が１ピクセルである場合、Ｃのヒンティングされた座標は、通常、３．０に「切り上げられる」。切り上げる代わりに「切り捨てる」ことによって、整数２．０が生成される。このステップは、衝突の除去を試み、あらゆる新しい衝突の導入を常に回避する。
【００７９】
ステップ６ｃ３：Ｃが切り上げられるが、ルートＣを有するセグメントツリーを、セグメントツリーにおける衝突を何ら生み出すことなく切り捨てることができる場合、セグメントツリーを切り捨て、ステップ(６ｃ６)に進む。このステップは、衝突の除去を試み、あらゆる新しい衝突の導入を常に回避する。
【００８０】
ステップ６ｃ４：Ｓが切り捨てられる場合、Ｓを切り上げて、ステップ(６ｃ６)に進む。例えば、Ｓのオリジナルの座標が５．８であり、ヒンティングされた経路幅が２ピクセルである場合、Ｓのヒンティングされた座標は、通常、５．０、すなわちｆｌｏｏｒ(５．８)＝５．０＝ｒｏｕｎｄ(５．８)−１に切り捨てられる。切り捨てる代わりに切り上げることによって、整数６．０が生成される。このステップは、衝突の除去を試みるが、ＳとＳの親との間の衝突を導入する可能性がある。この起こり得る衝突は、ＤＡＧ２１４のボトムアップトラバースの後続の繰り返しにおいてＳの親を処理する時に除去される。
【００８１】
ステップ６ｃ５：ＳをＣにアラインする。例えば、Ｃのヒンティングされた座標が４．０であり、Ｓのヒンティングされた座標が５．０であり、ヒンティングされた経路幅が１ピクセルである場合、Ｓを４．０にアラインする。
【００８２】
ステップ６ｃ６：終了。
【００８３】
ステップ(６ｂ２)〜(６ｂ３)及びステップ(６ｃ２)〜(６ｃ４)は、セグメントＣ及びＳが少なくともＷ＋１ピクセル離れるようにそれらセグメントを四捨五入することを試みる。ここで、Ｗはヒンティングされた経路幅２１１である。しかしながら、この方法によって衝突を解消することができないいくつかの場合がある。Ｃ及びＳは、これらの場合に視覚的に区別することができないので、ステップ(６ｂ４)及び(６ｃ５)は、Ｓ及びＣをアラインし、それによって、２つのセグメントを同じ座標にアラインすることにより文字の外見を単純にする。ステップ(６ｂ４)とステップ(６ｃ５)との間の相違は、前者のステップでは、ＣがＳにアラインされるのに対して、後者のステップでは、ＳがＣにアラインされるということであることに留意されたい。
【００８４】
図３は、サンプリンググリッドの最も近接したグリッド線(例えば、画像の最も近接したピクセル走査線又はサブピクセル走査線)に四捨五入する前３０１及び四捨五入した後３０２を示す。
【００８５】
図４は、サンプリンググリッドの最も近接したグリッド線に四捨五入する前３０１及び四捨五入した後３０２、並びに衝突解消後４０１を示す。
【００８６】
ステップ７：近接セグメント座標に対してグリッドフィッティングを行い(２０７)、その結果を出力ペンコマンド２３３に格納する。垂直セグメントに近接しているペンコマンドのｘ座標及びｙ方向においてその垂直セグメントに重なるペンコマンドのｘ座標は、その垂直セグメントにアラインされる。同様に、水平セグメントに近接しているペンコマンドのｙ座標及びｘ方向においてその水平セグメントに重なるペンコマンドのｙ座標は、その水平セグメントにアラインされる。
【００８７】
ステップ８：非セグメント座標に対してグリッドフィッティングを行い(２０８)、その結果を出力ペンコマンド２３３に格納する。ペンコマンドの非セグメントｘ座標は、ｘに近接した最小垂直アンカセグメントと最大垂直アンカセグメントとの間でｘ方向に直線補間される。同様に、ペンコマンドの非セグメントｙ座標は、ｙに近接した最小水平アンカセグメントと最大水平アンカセグメントとの間でｙ方向に直線補間される。
【００８８】
ステップ９：ヒンティングされた経路幅が偶整数である場合、各ペンコマンドの各座標に０．５を加える(２０９)。このステップは、ストロークスケルトンを半整数ピクセルグリッドに有効にアラインする。
【００８９】
均一文字ストロークの出力ペンコマンド２３３は、この時点で、サンプリンググリッドにアラインされ、レンダリング２４０を開始することができる。
【００９０】
ベジェ曲線セグメントを使用してペンコマンド２１３を規定することでこの方法を説明してきたが、例えば、エルミートスプライン、キャットマル−ロムスプライン、及びＢスプラインといった任意の種類の曲線セグメントを使用することができることに留意されたい。
【００９１】
スタイル化されたストローク文字のアラインメント
この発明の別の実施の形態は、スタイル化されたストローク文字をサンプリンググリッドにアラインする方法を提供する。
【００９２】
スタイル化されたストロークフォント(ＳＳＦ)は、ストロークが可変の太さ及びスタイリッシュなストローク端部を有する高度化されたストロークベースのフォントである。これについては、Elena J. Jakubiak, Ronald N. Perry及びSarah F. Frisken「An Improved Representation for Stroke-based Fonts」(SIGGRAPH 2006 Conference Abstracts and Applications)を参照されたい。ＳＳＦは、フォント内の形状の繰り返しを利用するモジュール形式の構造を用い、ＳＳＦが、アウトラインフォントの表現を、現在の均一幅ストロークフォントに相当するメモリフットプリントと調和させることを可能にする。
【００９３】
図５に示すように、ＳＳＦストロークの構造は、毛筆の動作を反映する。ストロークの本体は、中心線５０１及び輪郭５０２を含む。中心線５０１は筆の経路を反映し、輪郭５０２は展開に沿った筆の圧力の変化を反映する。ＳＳＦストロークの末端５０３は、筆の先端がページ上に置かれページから離れた時の筆の移動の開始及び終了のスタイル化された表現である。各中心線５０１及び各末端５０３は、線セグメント及びベジェ曲線の開いた区部的に連続な経路によって表される。輪郭５０２は、一組のベジェ曲線によって表される。この一組のベジェ曲線は、ストロークの中心線からストロークの双方のエッジへの垂直距離を規定する。
【００９４】
この実施の形態では、この方法は、まず、スタイル化されたストローク文字の代表的なストローク幅を求める。この代表的なストローク幅は、いくつかの方法で求めることができる。例えば、スタイル化されたストローク文字の輪郭５０２を一連のサンプル点でサンプリングすることができる。これらのサンプル点は、次に、平均ストローク幅を求めるのに使用される。別の例では、輪郭５０２を解析的に解析して代表的なストローク幅を求めることができる。さらなる例として、スタイル化されたストローク文字のユーザ指定の公称ストローク幅を代表的なストローク幅として使用することができる。
【００９５】
上述した方法ステップ１〜９が、次に、スタイル化されたストローク文字に対して起動される。代表的なストローク幅は、オリジナルの経路幅を規定し、スタイル化されたストローク文字の中心線５０１は、ペンコマンド２１３を規定する。出力ペンコマンド２３３は、スタイル化されたストローク文字のアラインされた中心線を規定し、それによって、スタイル化されたストローク文字がサンプリンググリッドにアラインされる。
【００９６】
動作環境
この発明は、多数の汎用又は専用のコンピューティングシステム環境又はコンピューティングシステム構成で動作可能である。この発明と共に使用するのに適した既知のコンピューティングシステム、コンピューティング環境、及び／又はコンピューティング構成の例には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルド装置又はラップトップ装置、マルチプロセッサシステム又はマルチコアシステム、グラフィックス処理ユニット(ＧＰＵ)、特定用途向け集積回路(ＡＳＩＣ)、フィールドプログラマブルゲートアレイ(ＦＰＧＡ)、マイクロコントローラベースシステム、セットトップボックス、プログラマブル民生用電子機器、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、上記システム又は装置の任意のものを含む分散コンピューティング環境等が含まれるが、これらに限定されるものではない。モニタ及び他のタイプの表示装置が、上記システムの任意のものに接続されて、この発明のアラインメントの表示が可能にされる。
【００９７】
上述したように、この方法は、水平セグメントと垂直セグメントとの間の依存関係を含まない。その結果、この方法のハードウェアの実施態様及びマルチコアの実施態様は、水平セグメント及び垂直セグメントを完全に並列に処理することができる。例えば、マルチコアプロセッサの或るコアは、水平セグメントのアラインメントを行うことができ、マルチコアプロセッサの別のコアは、垂直セグメントのアラインメントを行うことができる。
【図１Ａ】
2010170097.tif 000003
【図１Ｂ】
2010170097.tif 000004
【図１Ｃ】
2010170097.tif 000005
【図２Ａ】
2010170097.tif 000006
【図２Ｂ】
2010170097.tif 000007
【図３】
2010170097.tif 000008
【図４】
2010170097.tif 000009
【図５】
2010170097.tif 000010
【外国語明細書】
2010170097.tif 000011
2010170097.tif 000012
2010170097.tif 000013
2010170097.tif 000014
2010170097.tif 000015
2010170097.tif 000016
2010170097.tif 000017
2010170097.tif 000018
2010170097.tif 000019
2010170097.tif 000020
2010170097.tif 000021
2010170097.tif 000022
2010170097.tif 000023
2010170097.tif 000024
2010170097.tif 000025
2010170097.tif 000026
2010170097.tif 000027
2010170097.tif 000028
2010170097.tif 000029
2010170097.tif 000030
2010170097.tif 000031
2010170097.tif 000032
2010170097.tif 000033
2010170097.tif 000034
2010170097.tif 000035
2010170097.tif 000036
2010170097.tif 000037
2010170097.tif 000038
2010170097.tif 000039
2010170097.tif 000040
2010170097.tif 000041
2010170097.tif 000042
2010170097.tif 000043
2010170097.tif 000044
2010170097.tif 000045
2010170097.tif 000046