(57)【特許請求の範囲】
【請求項１】
文字フォントをドットマトリクス状のビットマップデータとして持ち、その文字フォントを印刷もしくは表示する文字出力装置で実行されるアウトラインスムージング処理方法において、
前記ビットマップデータに対し、あらかじめ規定された条件に従いベクトルの始点となる座標を求める始点検索のための処理工程と、
前記始点から順にドットの変化方向を調べ、上下左右４方向の直交ベクトル行列に変換すると共に、そのドットがベクトル化済みであることを示すベクトル化済み情報を更新する直交ベクトルへの変換のための処理工程と、
前記変換された直交ベクトル行列の連続する複数のベクトルの変化量から、あらかじめ斜線化すべきパターンが定義される斜線化テーブルを参照して斜線ベクトル行列に変換する斜線ベクトルへの変換のための処理工程と、
拡大加工されたビットマップ領域に対し、前記斜線ベクトル行列から基準となるアウトライン座標を求めると共に、前記斜線ベクトル行列の連続する複数のベクトルの変化量からあらかじめ定義される補正データを参照して前記基準となるアウトライン座標をドット単位で補正して線引きを行う線引きのための処理工程と、
前記ベクトル化済み情報を参照して新たな始点がなくなるまで前記始点検索、直交ベクトルへの変換、斜線ベクトルへの変換、線引きのための各処理工程を繰り返し、生成された線データの内部を塗り潰す塗り潰しのための処理工程と、
を備えて成ることを特徴とするアウトラインスムージング処理方法。
【請求項２】
前記始点検索のための処理工程は、マトリクス座標を所定の方向に順次スキャンし、前記ベクトル化済み情報の対応するドットがセットされておらず、かつ、隣接するビットマップデータが変化するドット位置を始点検索のための条件とすることを特徴とする請求項１に記載のアウトラインスムージング処理方法。
【請求項３】
前記直交ベクトルへの変換のための処理工程は、
ベクトル化するドット位置を始点からベクトルの方向に移動する工程と、
移動したドット位置の周辺ドットを調べ、ベクトル値を決定する工程と、
次にベクトル化するドット位置をベクトル方向に移動する工程と、
ベクトル化したドット位置が始点候補になり得る場合前記ベクトル化済み情報をセットする工程と、
ベクトル化するドット位置が始点に戻るまで、前記ベクトル値決定、移動、ベクトル化済み情報セットのための各処理工程を繰り返す工程と、
を更に備えて成ることを特徴とする請求項１または２に記載のアウトラインスムージング処理方法。
【請求項４】
前記ベクトル化によって太くなった線幅を細くするための線幅補正のための処理工程を更に備えたことを特徴とする請求項１ないし３のいずれかに記載のアウトラインスムージング処理方法。
【請求項５】
前記線幅補正のための処理工程は、座標を縦方向にスキャンし、現座標ドットが「黒」で、次座標ドットが「白」であった場合に当該現座標ドットを「白」とし、横方向に座標をスキャンし、現座標ドットが「黒」であり、次座標ドットが「白」であった場合に当該現座標ドットを「白」とし、ベクトル化により縦横両方向に１ドット分太くなったビットマップをそれぞれ１ドット分削除することを特徴とする請求項４に記載のアウトラインスムージング処理方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、テープ印刷装置、ワープロやパソコンにおける印刷装置または表示装置等、ビットマップフォントを持つ文字出力装置に用いて好適な、アウトラインスムージング処理方法に関する。
【０００２】
【従来の技術】
従来、様々なサイズの文字を印刷あるいは表示する方法に、
（１） 対象となる文字データを全て持つ方法、
（２） ビットマップフォントを持ち、拡大縮小する方法、
（３） アウトラインフォントを持ち、拡大縮小する方法、
があった。
【０００３】
【発明が解決しようとする課題】
しかしながら（１）については、データ量が膨大となり現実的でない。（２）については、（１）に比べて印刷品質が劣り、その欠点を解消しようとした場合にはソフトウェアにかかる負担が大きくなってその処理に時間を要す。
【０００４】
具体的に、ビットマップフォントを持つ印刷装置において、印字品質向上のための処理として、文字の拡大時における「段差」の平滑化処理がある。ここで、「段差」とは、ビットマップフォントの斜め方向において隣接するドット配列が不連続となり、文字の拡大に伴ってくずれが生じる部分である。
従来は平滑化のためにこの「段差」を検出し、拡大時にその「段差」を埋めるように補正ドットを追加していた。
【０００５】
ところが、この平滑化処理において、補正ドットを多くすると文字の輪郭がくずれてデザインが損なわれ、また、補正ドットの数を少なくすれば凹凸が残り、拡大率が大きくなるほど補正のための効果がさほど得られないという欠点があった。
【０００６】
一方、（３）については、（２）に比べてシステム規模が大きくなり、また、データ量も大となり、たとえばテープ印刷装置のような比較的規模の小さい印刷装置においては、処理時間、価格のいずれかを犠牲にしていたものである。
【０００７】
本発明は上述した諸々の欠点を解消するためになされたものであり、ビットマップフォントを持つ印字、表示等のための文字出力装置において、ビットマップフォントを一旦ベクトルデータに置換し、ベクトルデータ上での平滑化により、拡大率が大きくなっても滑らかなフォントを再現できるアウトラインスムージング処理方法ならびに装置を提供することを目的とする。
【０００８】
【課題を解決するための手段】
本発明のアウトラインスムージング処理方法は、文字フォントをドットマトリクス状のビットマップデータとして持ち、その文字フォントを印刷もしくは表示する文字出力装置で実行されるアウトラインスムージング処理方法において、前記ビットマップデータに対し、あらかじめ規定された条件に従いベクトルの始点となる座標を求める始点検索のための処理工程と、前記始点から順にドットの変化方向を調べ、上下左右４方向の直交ベクトル行列に変換すると共に、そのドットがベクトル化済みであることを示すベクトル化済み情報を更新する直交ベクトルへの変換のための処理工程と、前記変換された直交ベクトル行列の連続する複数のベクトルの変化量から、あらかじめ斜線化すべきパターンが定義される斜線化テーブルを参照して斜線ベクトル行列に変換する斜線ベクトルへの変換のための処理工程と、拡大加工されたビットマップ領域に対し、前記斜線ベクトル行列から基準となるアウトライン座標を求めると共に、前記斜線ベクトル行列の連続する複数のベクトルの変化量からあらかじめ定義される補正データを参照して前記基準となるアウトライン座標をドット単位で補正して線引きを行う線引きのための処理工程と、前記ベクトル化済み情報を参照して新たな始点がなくなるまで前記始点検索、直交ベクトルへの変換、斜線ベクトルへの変換、線引きのための各処理工程を繰り返し、生成された線データの内部を塗り潰す塗り潰しのための処理工程と、を備えて成ることを特徴とする。
【００１２】
本発明は、上述した構成により、フォントメモリに用意されたビットマップデータを一旦ベクトルデータに置き換え、ベクトルデータ上での平滑化により、拡大率が大きくなっても滑らかなフォントを再現することを特徴とする。このためにビットマップを８方向のベクトル（上下左右４方向と斜め４方向）で表現し、連続する６ベクトルの変化量から最適なベクトル方向を決定し、更に、６ベクトルの変化量から、ベクトルで表現しきれない１ドット単位での補正を行う。
【００１３】
本発明によれば、拡大しても品質の良い印刷もしくは表示が可能である他、ビットマップフォントを使用しているため圧縮が可能である。通常、アウトラインフォントを搭載する機器においても解像度の低い小さなサイズの文字を扱う場合、印刷品位劣化のためにビットマップフォントを用いて印字することがあるが、本発明によれば、文字の大小にかかわらず同じ品質で文字の印刷が可能となる。
【００１４】
【発明の実施の形態】
以下、図面を参照しながら本発明の一実施形態について詳細に説明する。
【００１５】
図１は、本発明が採用される文字出力装置の内部構成を示すブロック図である。本発明実施形態では、文字出力装置としてテープ印刷装置を例示して説明する。テープ印刷装置は、キー入力した所望の文字などに基づいて作成した印刷画像をカートリッジ内のテープにサーマル方式で印刷すると共にそのテープの印刷部分を切断してラベルを作成するものである。
【００１６】
図１に示すように、テープ印刷装置は、基本的な構成として、ＣＰＵを制御中枢とする制御部１、キーボードやディスプレイを持ちユーザとのインタフェースとなる操作部２、サーマル式の印刷ヘッドによりテープカートリッジにあるテープに印刷を行う印刷部３から成る。操作部２と印刷部３は、各種ドライバを内蔵して各部回路を駆動する駆動部４を介して制御部１に接続される。操作部２、印刷部３、駆動部４については本発明の主旨とは直接関係しないためこれ以上の詳細説明は省略する。
【００１７】
制御部１は、ＣＰＵ１１、プログラムメモリ１２、ワークＲＡＭ１３、フォントメモリ１４、入出力制御部１５から構成され、これら各ブロック１１，１２，１３，１４，１５は、双方向の内部バス１６を介して共通に接続される。ＣＰＵ１１は、プログラムメモリ１２に格納された後述する各プログラムに従いワークＲＡＭ１３を使用して本発明のアウトラインスムージング処理装置として機能する他、テープ印刷装置全体の制御を行う。
【００１８】
ワークＲＡＭ１３は作業領域として使用され、プログラムによるアウトラインスムージング処理の経過データが都度書き込まれる。フォントメモリ１４には、文字等のフォントデータがドットマトリクス状のビットマップ形式で格納され、文字等を特定するコードデータが与えられたときに対応するフォントデータを出力する。
【００１９】
入出力制御部（ＩＯＣ）１５は、ＣＰＵ１１の機能を補うとともに、各種周辺回路とのインタフェース信号を扱うための論理回路が、ゲートアレイやカスタムＬＳＩなどにより構成され組み込まれている。例えば、キーボードからの各種指令や入力データなどをそのまま、あるいは加工して内部バス１６に取込むとともに、ＣＰＵ１１と協動してＣＰＵ１１により内部バス１６に出力されたデータや制御信号を、そのまま、あるいは加工して駆動部４に出力する。
【００２０】
図２は、図１に示す制御部１が持つ機能をメモリ上に展開して示した図である。上述したように、制御部１はアウトラインスムージング処理装置として機能し、ここでは、文字フォントの加工時、そのビットマップデータに基づき一旦ベクトルデータに変換し、ビットマップデータの斜め方向において隣接するデータ配列が不連続となる部分を含み、ベクトルの始点からそのベクトル方向の終点に向かって線引きを行なってドット補正を施し、かつ、内部を塗り潰してビットマップデータを再生成して印刷もしくは表示出力を行なうための制御を行う。
【００２１】
図２に示すように、本発明のアウトラインスムージング処理装置（制御部１）は、フォントメモリ１４と、フォント加工装置（ＣＰＵ１１）と文字出力部２０で構成される。フォント加工装置１１は、機能的に、始点検索・決定部１１１、直交ベクトル抽出部１１２、斜線ベクトル化変換部１１３、線引き処理部１１４、塗り潰し処理部１１５、線幅補正処理部１１６で構成される。これら各ブロック１１１〜１１６は後述するロジックに従うプログラムによって動作する。
【００２２】
始点検索・決定部１１１は、フォントメモリ１４にあるビットマップデータに対し、あらかじめ規定された条件に従いベクトルの始点となる座標を求め、直交ベクトル抽出部１１２に供給する。直交ベクトル抽出部１１２は、始点検索・決定部１１１によって出力される始点座標から順にドットの変化方向を調べ、上下左右４方向の直交ベクトル行列に変換すると共に、そのドットがベクトル化済みであることを示すベクトル化済み情報（フラグメモリ１３１）の内容を更新する。
【００２３】
斜線ベクトル変換部１１３は、変換された直交ベクトル行列の連続する６ベクトルの変化量から、あらかじめ斜線化すべきパターンが定義される斜線化判定テーブル１３２の内容を参照して斜線ベクトル行列に変換して線引き処理部１１４へ供給する。
【００２４】
線引き処理部１１４は、拡大等加工されたビットマップ座標に対し斜線ベクトル行列の連続する６ベクトルの変化量からあらかじめ定義される補正データを参照して線引きを行う座標をドット単位で補正し、補正されたアウトライン座標間を線で結ぶ。線引き処理部１１４は、変換されたベクトル行列から基準となるアウトライン座標を求める基準アウトライン演算部と、連続したベクトル値のパターンによってあらかじめ定義される補正データが設定される補正テーブルと、前記補正テーブルを参照することにより前記基準となるアウトライン座標を補正し、この補正されたアウトライン座標間を線で結ぶ線分生成部を備えている。ここでアウトライン座標として、外枠用線と塗り潰し用線の２種類が生成される。
【００２５】
塗り潰し処理部１１５は、先のアウトライン座標補正を行うことにより得られるフィルラインの内側を塗り潰した後、フォント外枠が描画されているワークメモリ１３のアウトライン用描画領域ならびにフィルライン用描画領域（いずれもビットマップ領域１３４）に展開された内容を論理和演算して重ね合わせる処理を行う。
【００２６】
線幅補正処理部１１６は、線引き処理部１１４によって生成されたビットマップデータを追って定義するＸＹ両方向にそれぞれ１ドット分削除することによってベクトル化によりＸＹ方向に１ドット分太くなったビットマップの線幅補正を行う。
【００２７】
文字出力部２０は、印刷のためにワーク用ビットマップ領域１３４からから所望のビットマップを読み出しドット展開して入出力制御部１５、駆動部４を介し印字部３に出力する。
【００２８】
尚、上述した各処理部１１１〜１１６の詳細なロジックはフローチャートを使用して以降詳細に説明する。
【００２９】
本発明の動作説明に先立ち、以降に説明する座標とビットマップデータの定義について図３を参照しながら説明する。図３では、座標とビットマップの定義を（ａ）に、ベクトルの定義を（ｂ）に示してある。
【００３０】
図３（ａ）に示すように、座標ＸとＹを定義し、以降で座標値を表す場合、［Ｘ，Ｙ］で表記する。また、便宜上、Ｘの正方向を「右」、負方向を「左」、Ｙの正方向を「下」、負方向を「上」と表現する。ビットマップデータは、白が０ｘ０（「０」を１６進表記したもの），黒が０ｘ１（「１」を１６進表記したもの）とし、与えられたビットマップデータの座標外（［０，−１］など）は白（０ｘ０）であるとする。
【００３１】
ベクトルの向きと番号は図３（ｂ）で示すように定義される。すなわち、ベクトルは上下左右０〜７の８方向で表現され、従って下に示すように表記されるものとする。尚、ベクトルの１と５、３と７は１文字では区別できないため、脇に「’」または「．」を付して区別するものとする。
【００３２】
図５３にベクトル定義が示されている。図５３に（ａ）で示されるように、ベクトルは有向線分ＯＰで表され、ベクトルを太字表現するのが一般的であるが、ここでは↑ａで表記する。また、図５３に（ｂ）で示すように、Ｘ−Ｙ座標上のベクトル↑ｖは、基本ベクトル↑ｉ、↑ｊを使用して、↑ｖ＝ｘ・↑ｉ＋ｙ・↑ｊで表される。ここでは単に↑ｖと表記する。また、図５３に（ｃ）で示すように、各方向ベクトルを定義し、それぞれが行列に置換される。この各ベクトルの集合をベクトル空間、ベクトル群といい、↑ｖｃｔと表すこととする。
【００３３】
各方向ベクトルについて、ｘ軸を基準とした回転角度は以下のようになる。
∠（↑ａ）＝０，∠（↑ｂ）＝π／４，∠（↑ｃ）＝π／２，
∠（↑ｄ）＝３π／４，∠（↑ｅ）＝π，∠（↑ｂ）＝π／４，
∠（↑ｆ）＝５π／４，∠（↑ｇ）＝３π／２，∠（↑ｈ）＝７π／４
各ベクトル間の回転角度は、上記各値の減算で求められ、
∠（↑ｆ−↑ｄ）＝∠（↑ｆ）−∠（↑ｄ）＝π／２となる。
【００３４】
ここで、回転角度の計算等を簡単にするため、各ベクトルに「シンボル」として、０〜７の数字を割り当てる。すなわち、以下のような割り当てがなされる。
↑ａ→“０” ↑ｂ→“１” ↑ｃ→“２” ↑ｄ→“３” ↑ｅ→“４”
↑ｆ→“５” ↑ｇ→“６” ↑ｈ→“７”
この場合、上述した↑ｖｃｔは以下のようになる。
0003791259.tif 000002
ベクトル群↑ｖｃｔのｎ番目のベクトルは、↑ｖｃｔ［ｎ］と表記し、例えば、↑ｖｃｔ［２］＝↑ｃ＝“２”となる。
【００３５】
図４は、本発明実施形態による処理とデータの流れをフローチャートで示した図である。以下、動作の流れを概略説明する。
【００３６】
まず、始点検索・決定部１１１は、文字フォントメモリ１４から読み出されたビットマップデータに対し、ベクトルの始点候補となる座標を求める。また、そのビットマップと後述するベクトル化済み情報から新たなベクトルの始点座標を求め、その始点座標を都度直交ベクトル抽出部１１２へ渡す（ステップＳ４１，Ｓ４２）。
【００３７】
直交ベクトル抽出部１１２は、始点からビットマップをスキャンし、上下左右４方向の直交ベクトル行列に置換することにより始点から１周分の直交ベクトルを抽出し、抽出された直交ベクトル行列を斜線ベクトル変換部１１３へ渡す（ステップＳ４３）。斜線ベクトル変換部１１３は、得られた直交ベクトル行列の連続する６ベクトルの変化量から後述する斜線化判定テーブル１３２を参照し、斜線ベクトル行列に変換し、線引き処理部１１４に処理を委ねる（ステップＳ４４）。この時点で上下左右４方向に斜め４方向を加えた８方向のベクトルになる。
【００３８】
線引き処理部１１４は、座標を補正しながらアウトラインを作成するもので、拡大加工したビットマップ座標に対してベクトルを辿って線を引く際、得られた斜線ベクトル行列の連続する６ベクトルの変化量から後述する補正テーブル１３３を参照し、線を引く座標を１ドット単位で補正する（ステップＳ４５）。ここで、線は外枠用線と塗り潰し用の線の２種類を作成し、この線データは、全ての始点に対する処理が終了するまでワーク用ビットマップ領域１３４に保持される。このように、斜線ベクトルからアウトライン座標に補正を加えて線引きを行う。そして、再度ベクトル始点の検索（ステップＳ４１）を行い、新たな始点が無くなるまで上述したステップＳ４１〜Ｓ４５に示す処理を繰り返し、塗り潰し処理部１１５へ処理を委ねる。
【００３９】
塗り潰し処理部１１５は、線引き処理部１１４により生成される塗り潰し用の線の内部を塗り潰した後、外枠用の線と重ね合わせる（ステップＳ４６）。線幅補正処理部１１６は、ベクトル化により全体に線幅が太くなるため縦横１ドット線を細くするための処理を行う（ステップＳ４７）。
【００４０】
以下、ベクトル始点の検索（ステップＳ４１）から線幅補正処理（ステップＳ４７）に至る処理の詳細について図５〜図１０に示す詳細フローチャートを参照しながら説明する。
【００４１】
まず、始点検索・決定部１１１による始点検索・決定のための処理（図４におけるステップＳ４１，Ｓ４２）から説明する。
【００４２】
図５に、始点検索・決定のための処理手順がフローチャートで示されている。ここでは、まず、座標［０，０］から始点検索を開始する（ステップＳ４１１）。そして、Ｘ方向に座標をスキャンし、１ドットずつ始点の条件に合うか否かをチェックする（ステップＳ４１２）。
【００４３】
始点の条件としては、現座標位置ドット（［Ｘ，Ｙ］）が黒、１ドット前（［Ｘ−１，Ｙ］）が白であって、フラグメモリ１３１に設定されてあるベクトル化済み情報の対応するドットがセットされていない、いわゆる未だベクトル化が済んでいないドットを始点とする。尚、フラグメモリ１３１に設定されるベクトル化済み情報は、後述する直交ベクトル抽出処理（ステップＳ４３）において更新される。初期値は全てクリアされているものとする。
【００４４】
そして上述した始点条件に合ったドットを始点とし、後述する直交ベクトルの抽出処理に進む。ここで、始点が見つからなければＹを＋１（Ｙが端の座標まで到達しているときにはＸを＋１、Ｙ＝０に）更新して（ステップＳ４１３）、ステップＳ４１１以降の処理を繰り返す。
【００４５】
始点決定の例につき、図１１に示すビットマップを参照しながら説明する。図１１において、（ａ）は１回目、（ｂ）は２回目、（ｃ）は３回目の始点検索の場合におけるビットマップとベクトル化済み情報のそれぞれを示している。
【００４６】
１回目の検索では、フラグメモリ１３１におけるベクトル化済み情報が全てクリアされているため、最初に「白→黒」となり、ここでは［６，２］が始点となる。２回目の検索の場合、［６，２］に対する直交ベクトル化により、「ベクトル化済み情報」が更新されている。「白→黒」となるドット［６，３］［６，４］［６，５］［６，６］等はベクトル化済み情報がセットされているため始点にはならない。従って、条件に合う最初のドット［１５，５］が始点となる。３回目の検索の場合、１，２回目の直交ベクトル化により、「白→黒」となるドットは全て「ベクトル化済み情報」としてフラグメモリ１３１にセットされる。従って、３回目の始点は無しと判断され、後述する塗り潰し処理（ステップＳ４６）に進む。
【００４７】
次に、直交ベクトル抽出部１１２による直交ベクトルへの変換処理（図４ステップＳ４２）について詳細に説明する。図６に直交ベクトル変換処理のための手順がフローチャートで詳細に示されている。
【００４８】
以下、図６に示すフローチャートを参照しながら詳細に説明する。直交ベクトルへの変換処理とは、ビットマップを直交ベクトル値（→、↓、←、↑の４種）に変換する処理をいい、始点から順にドットの変化方向を調べ、ベクトル化されたデータは、↑ＶＣＴ＝［０，０，２，４，．．．．］のような行列となって位置情報は無くなる。
【００４９】
まず、始点のベクトル値を求める（ステップＳ４３１）。次にベクトル化するドット位置を始点からベクトル方向に移動（ステップＳ４３２）して移動したドット位置の周辺ドットを調べ、ベクトル値を決める（ステップＳ４３３）。そして、ベクトル化するドット位置をベクトル方向に移動（ステップＳ４３４）してベクトル化したドット位置が始点候補になり得る場合（ステップＳ４３５）、ベクトル化済み情報をセットし（ステップＳ４３６）、そうでなければ、ドット位置の移動以降（ステップＳ４３２〜Ｓ４３５）を繰り返す。
【００５０】
尚、始点のベクトル値の決定は、図１２に示す＜表１＞に従って決定し、ドット位置を始点からベクトル方向に移動する。ここでは、現位置ドットに対してベクトル値を決定するものであり、１つ前のベクトル値からベクトル検索方向パターン順序を決め、その順序に従い各ベクトル検索方向のパターンの条件を調べ、最初に一致した条件に対応する値をベクトル値としている。図１３に、１つ前のベクトルと検索順位の関係が、図１４に検索順位と検索方向パターンの条件との関係が、それぞれ、＜表２＞＜表３＞として示されている。
【００５１】
尚、検索条件は、排他的でなく、ベクトル０と４、また、２と６が決定される条件は両立する。従って、検索条件に従って処理を進めないと正しいベクトルは得られない。ここでの検索順序は、ベクトルが「左に回転する方を優先」するように決められている。
【００５２】
ところで、現位置ベクトル値が上方向“６”である場合、上方向へ移動したドットは始点候補となる。従って、始点の検索処理でこのドットは除外する必要があるため、フラグメモリ１３１に「ベクトル化済み情報」としてセットする。ベクトル方向へのドット移動は、図１５に示す＜表４＞に従う。つまり、＜表４＞に従いベクトル化を行うドット座標位置を移動する。そして、ベクトル化するドット位置が始点に戻るまで上述したステップＳ４３２〜Ｓ４３６の処理を繰り返す（ステップＳ４３７）。
【００５３】
図１６を参照しながら直交ベクトル化の例を説明する。対応する「ベクトル化済み情報」は、上述した始点検索の例として示し、（ａ）は１回目の始点検索時、（ｂ）は２回目の始点検索時における、それぞれの直交ベクトルデータ、直交ベクトル変換終了時における「ベクトル化済み情報」が示されている。
１回目は始点［６，２］、直交ベクトルデータ↑ＶＣＴ１＝［０，０，０，０，０，０，０，０，０，２，０，０，２，０，２，０，２，２，０，２，２，２，２，２，２，２，２，４，２，２，４，２，４，２，４，４，２，４，４，４，４，４，４，４，４，４，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６］、２回目は、始点［１５，５］、直交ベクトルデータ↑ＶＣＴ２＝［４，４，４，４，４，４，２，２，２，２，２，２，２，２，２，２，２，２，０，０，０，０，０，０，６，０，６，０，６，６，６，６，６，６，６，６，４，６，４，６］となる。
【００５４】
次に斜線ベクトルへの変換部１１３による斜線ベクトルへの変換処理について説明する。図７に斜線ベクトル変換のための処理手順がフローチャートで示されている。以下、図７に示すフローチャートを参照しながら斜線ベクトル変換処理について詳細に説明する。
【００５５】
ここでは、直交ベクトル↑ＶＣＴ＝｛ ．．． ，ＶＣＴ［ｎ−２］，ＶＣＴ［ｎ−１］，ＶＣＴ［ｎ］，ＶＣＴ［ｎ＋１］，ＶＣＴ［ｎ＋２］， ．．． ｝において、ＶＣＴ［ｎ−２］とＶＣＴ［ｎ−１］や、ＶＣＴ［ｎ］とＶＣＴ［ｎ＋１］などの連続する２つのベクトル要素の変化方向につき、図１７に示す＜表５＞のように定義する。尚、同じ値である場合には同方向と定義する。
【００５６】
ここで、ベクトル行列の最終要素と初期要素は、連続しているものとする。例えば、ベクトル行列↑ＶＣＴ＝｛ＶＣＴ［０］，ＶＣＴ［１］， ．．． ，ＶＣＴ［ｎ−２］，ＶＣＴ［ｎ−１］，ＶＣＴ［ｎ］｝において、ＶＣＴ［ｎ］とＶＣＴ［０］は連続した要素である。
【００５７】
また、直交ベクトル行列↑ＶＣＴ＝｛ ．．． ，ＶＣＴ［ｎ−２］，ＶＣＴ［ｎ−１］，ＶＣＴ［ｎ］，ＶＣＴ［ｎ＋１］，ＶＣＴ［ｎ＋２］，ＶＣＴ［ｎ＋３］， ．．． ｝において、ＶＣＴ［ｎ−２］＝Ｖｎ２（２つ前の直交ベクトル），ＶＣＴ［ｎ−１］＝Ｖｎ１（１つ前の直交ベクトル），ＶＣＴ［ｎ］＝Ｖ０（現直交ベクトル），ＶＣＴ［ｎ＋１］＝Ｖ１（１つ先の直交ベクトル），ＶＣＴ［ｎ＋２］＝Ｖ２（２つ先の直交ベクトル），ＶＣＴ［ｎ＋３］＝Ｖ３（３つ先の直交ベクトル）と定義する。
【００５８】
斜線ベクトル変換部１１３は、直交ベクトルの左方向変化個所で条件に合う場合、斜線ベクトル（右上ベクトル、右下ベクトル、左下ベクトル、左上ベクトル）に置換する機能を持つ。置換の様子を図１８に＜表６＞として示す。ここでの処理は、２直交ベクトルを１斜線ベクトルに変換するため、変換した分だけベクトルが少なくなる。
【００５９】
変換条件は以下のとおりである。すなわち、まず、連続したベクトル要素Ｖｎ２〜Ｖ３について変化方向を調べ、Ｖ０→Ｖ１が左回転で、かつ、各ベクトル要素の変化が図１９に＜表７＞で示す条件に一致した場合にＶ０とＶ１を斜線ベクトルに変換する。上述した変換条件をＶ０＝「↓」のときのベクトルパターンとしたのが図２０に＜表８＞として示してある。
【００６０】
ここでベクトル演算方法について説明する。直交ベクトル抽出部１１２によって作成された直交ベクトル行列に対して斜線化条件を調べ、新たな斜線化ベクトル行列に出力するものである。斜線化されたベクトルは、次の斜線化条件には影響しない。
【００６１】
図７に示すフローチャートを参照しながらベクトル演算のための処理の流れを説明する。ベクトル演算は直交ベクトル行列の先頭位置から開始する（ステップＳ４４１）。Ｖｎ２〜Ｖ２の位置は↑ＶＣＴ＝｛Ｖ０，Ｖ１，Ｖ２， ．．． ，Ｖｎ２，Ｖｎ１｝となる。次に、Ｖ０→Ｖ１の回転方向を調べる（ステップＳ４４２）。ここで、左回転ならばステップＳ４４４以降の処理に進み、左回転以外の場合、現直交ベクトル値Ｖ０を斜線化ベクトル値とし、検査する直交ベクトル行列の要素位置を次のベクトルに移動する（ステップＳ４４３）。
【００６２】
例えば、Ｖｎ２〜Ｖ２の位置を↑ＶＣＴ＝｛Ｖ０，Ｖ１，Ｖ２， ．．． ，Ｖｎ２，Ｖｎ１｝から、↑ＶＣＴ＝｛Ｖｎ１，Ｖ０，Ｖ１，Ｖ２， ．．． ，Ｖｎ２｝のように１つシフトする。
【００６３】
ステップＳ４４４では、Ｖｎ２〜Ｖ３のベクトルの変化方向を以下の演算式（１）により算出する。
ｄｒ（Ｖ［ｎ−１］→Ｖ［ｎ］）＝
（Ｖ［ｎ］−Ｖ［ｎ−１］＋１０）ＡＮＤ ０ｘ０７ …（１）
演算の結果、“０”は左回転、“２”は同方向、“４”は右回転、“６”は反対（ありえない）を意味する。
【００６４】
次に、変化方向を現ベクトルの前後に分け、以下の演算式（２）（３）に従い重み付けを行う（ステップＳ４４５）。
・後方向の変化重みＷ１＝
｛ｄｒ（Ｖ１−Ｖ２）×３＋ｄｒ（Ｖ２→Ｖ３）｝／２、     …（２）
・前方向の変化重みＷ２＝
｛ｄｒ（Ｖｎ１−Ｖ０）×３＋ｄｒ（Ｖｎ２→Ｖｎ１）｝／２  …（３）
【００６５】
そして、このｗ１、ｗ２に対する斜線化判定テーブル１３２の値を調べる（ステップＳ４４６）。ここで、値を調べ（ステップＳ４４７）、“１”の場合、現ベクトルを斜線化して斜線化ベクトル行列に入れる。演算式は以下の（４）に従う。
斜線化ベクトル値＝（現ベクトル値＋０ｘ０７）ＡＮＤ ０ｘ０７  …（４）
【００６６】
このことにより、“０”は“７”、“２”は“１”、“４”は“３”、“６”は“５”に変換される。また、斜線化対象になった直交ベクトル配列要素の次の要素は斜線化ベクトルに含まれるため、検査する直交ベクトル行列の要素位置を２つ移動する（ステップＳ４４８）。
【００６７】
一方、値が“０”の場合、現直交ベクトル値Ｖ０を斜線化ベクトル値とし、検査する直交ベクトル行列の要素位置を次のベクトルに移動する（ステップＳ４４９）。そして、直交ベクトルの先頭位置に戻るまで上述したステップＳ４４１〜ステップＳ４４９までの処理を繰り返す（ステップＳ４５０）。
【００６８】
尚、最終ベクトルを斜線化した場合の始点の移動処理に関し、直交ベクトル行列の最後のベクトルと先頭ベクトルが斜線化対象となった場合（↑ＶＣＴ＝｛Ｖ１，Ｖ２， ．．． ，Ｖｎ２，Ｖｎ１，Ｖ０｝においてＶ０−Ｖ１が斜線化される場合）、斜線化ベクトル行列に入れた先頭ベクトルを削除し、始点座標から、削除した先頭ベクトル方向に移動した座標を新たな始点とする。
【００６９】
斜線化判定テーブル１３２の内容を図２１に示す。斜線化判定テーブル１３２には、上述したように重み付け演算して得られるｗ１，ｗ２が示す値に対して斜線化するか否かのデータが設定される。このテーブル値を変更することによって斜線化するパターンを変更できる。
【００７０】
ベクトル斜線化の例につき、図２２を参照しながら説明する。図２２において、（ａ）は、１回目の始点決定時、（ｂ）は、２回目の始点決定時における斜線化ベクトルデータが示されている。
【００７１】
（ａ）は、始点［６，２］、斜線化ベクトルデータ↑ＶＣＴ１Ｂ＝［０，０，０，０，０，０，０，０，０，１，０，１，１，２，１，２，２，２，２，２，２，２，２，３，２，３，３，４，３，４，４，４，４，４，４，４，４，４，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６］である。
【００７２】
（ｂ）は、初期始点が［１５，５］、斜線化ベクトルデータ↑ＶＣＴ２Ｂ＝［４，４，４，４，４，２，２，２，２，２，２，２，２，２，２，２，２，０，０，０，０，０，７，７，７，６，６，６，６，６，６，５，５，５］となっている。
【００７３】
ここでは、最終ベクトルと先頭ベクトルが斜線化され削除された先頭ベクトルは“４”、従って、始点は［−１，０］移動し、新始点は［１４，５］になる。
【００７４】
次に、線引き処理部１１４によるドット補正を含む線引き処理（図４におけるステップＳ４５）について説明する。ここで、線引き処理は、アウトラン座標補正のための処理と、補正によって選られる座標間の線引きするまで処理を含むものとする。図８に線引き処理のための処理手順がフローチャートで示されている。以下、フローチャートを参照しながら詳細に説明する。
【００７５】
まず、アウトライン座標補正のための処理から説明する。ここでは、基のビットマップから抽出された斜線化ベクトル行列から、ベクトルの始点、終点座標を求め、Ｘ方向、Ｙ方向に拡大した新たなビットマップ領域（ワーク用ビットマップ１３４）にアウトライン（線）を描画する。ベクトルの始点、終点座標は、斜線化ベクトル領域の連続する６つの要素を参照することによって１ドット単位で補正を加えるものである。ここではアウトラインとして、外枠用線と塗り潰し用線の２種類を作成する。従って、拡大加工処理のためのビットマップ領域を２つ必要とする。
【００７６】
まず、始点とベクトル値から基準となるアウトライン座標を決める（ステップＳ４５１）。ここでは、補正データを参照する前の基準となるアウトライン座標を求めるために演算を行う。
【００７７】
具体的に、Ｘ，Ｙ方向の倍率をそれぞれＢＸ、ＢＹとし、元の始点をＸ０，Ｙ０とした場合、拡大加工後の始点［Ｘ１，Ｙ１］は、［ＢＸ×Ｘ０，ＢＹ×Ｙ０］で求める。以降の基準アウトライン座標の演算は、前の座標（最初は始点座標）から斜線化ベクトル値に応じた移動量を加えた値を次の座標位置とする。斜線化ベクトル値と移動量の関係を図２３に＜表９＞として示す。
【００７８】
アウトライン基準座標の例を以下に示す。すなわち、斜線化ベクトル変換部１１３により作成された斜線化ベクトル行列を、ＢＸ＝２，ＢＹ＝３で拡大したアウトライン座標は、始点座標［Ｘ０，Ｙ０］を［６，２］、斜線化ベクトル行列↑ＶＣＴ１Ｂ＝［０，０，０，０，０，０，０，０，０，１，０，１，１，２，１，２，２，２，２，２，２，２，２，３，２，３，３，４，３，４，４，４，４，４，４，４，４，４，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６］として、拡大後の始点座標［Ｘ１，Ｙ１］は［１２，６］となり、始点座標以降の座標演算は図２４に＜表１０＞で示すようになる。
【００７９】
アウトラインからビットマップデータを得るためには、図２５に＜表１１＞として示す座標間に順に線引きを行うことになる。しかしながら、これだけでは単に斜め線を４５度方向にしただけであって、ビットマップデータは滑らかにならない。そこで、以下に説明するように、各座標を前後のベクトルデータを参照することにより、１ドット座標単位で補正を加えてより滑らかなビットマップデータとなるように配慮がなされている。
【００８０】
すなわち、基準となるアウトライン座標を決めた後、ステップＳ４５２以降の補正データによる基準座標の補正処理が行われる。ここでは上述のようにして求めた基準アウトライン座標に対し、前後のベクトル値を参照して補正データにより補正を加えた線引き用アウトライン座標を求める。補正には、基準座標をそのまま線引き用座標とする「補正なし」と、その基準座標は線引きに使用せず、次回以降の線引き処理に含める「スキップ」と、基準座標に対し、１ドット単位で座標位置を移動する「ドット補正」の３種類がある。尚、補正データは前後のベクトル値のパターンによって個々に決められた値であって補正テーブル１３３にその値が設定される。
【００８１】
以下、補正データの参照方法について説明する。説明に先立ち、現ベクトルとその周辺ベクトルを以下のように定義する。すなわち、斜線化ベクトル行列↑ＶＣＴＢ＝｛ ．．． ，ＶＣＴＢ［ｎ−３］，ＶＣＴＢ［ｎ−２］，ＶＣＴＢ［ｎ−１］，ＶＣＴＢ［ｎ］，ＶＣＴＢ［ｎ＋１］，ＶＣＴ［ｎ＋２］， ．．． ｝において、連続する６つのベクトル要素、ＶＣＴＢ［ｎ−３］をＶｎ３（３つ前のベクトル）、ＶＣＴＢ［ｎ−２］をＶｎ２（２つ前のベクトル），ＶＣＴＢ［ｎ−１］をＶｎ１（１つ前のベクトル），ＶＣＴＢ［ｎ］をＶ０（現ベクトル），ＶＣＴＢ［ｎ＋１］をＶ１（１つ先のベクトル），ＶＣＴＢ［ｎ＋２］をＶ２（２つ先のベクトル）と定義する。
【００８２】
この場合、まず、現ベクトルＶ０が直交ベクトル（０，２，４，６）か斜線化ベクトル（１，３，５，７）かを調べる。直交ベクトルの場合、フラグａ０を“０”とし、斜線ベクトルの場合、フラグａ０を“１”にセットする。
【００８３】
そして、Ｖｎ２〜Ｖ３のベクトルの変化方向を以下の演算式（５）により算出する（ステップＳ４５２）。
0003791259.tif 000003
ここで、ｄｒの演算結果が“０”のとき左回転、“１”のとき左４５度回転、“２”のとき同方向、“３”のとき右４５度回転、“４”のとき右回転、“５”のとき右１３５度回転（ありえない）、“６”のとき反対（ありえない）、“７”のとき左１３５度回転（ありえない）とする。
【００８４】
次に、以下の演算式（６）により、現ベクトルに対応する補正データが設定されたテーブル１３２のアドレスａｄｄｒを算出する（ステップＳ４５３）。
0003791259.tif 000004
【００８５】
そして、補正データＨのａｄｄｒバイト目のデータとして求める。ここで補正データＨは、“０”〜“８”の９値をとるものとする。Ｈが“０”の場合、「補正なし」（ステップＳ４５６）、Ｈが“８”の場合、現ベクトルにより決められた基準座標は線引きに使用せず、次回以降の線引き処理に含める「スキップ」（ステップＳ４５８）、Ｈが“１”〜“７”の場合、後述するアウトライン座標補正処理を行い１ドット単位で座標位置を補正する。補正データＨと補正方向の関係は、図２６に＜表１２＞として示されている。
【００８６】
アウトライン座標補正処理方法について説明する。補正の方向Ｈｄｒは、以下の演算式（６）を演算することにより決定する（ステップＳ４５７）。
Ｈｄｒ＝（Ｈ＋Ｖ０＋７）ＡＮＤ ７    …（６）
【００８７】
そして、図２７に示す＜表１３＞に従いＸＹ方向の補正ドット数を求める（ステップＳ４５９）。ここで、ＨＸ、ＨＹは、拡大倍率毎に定める補正ドット数であり、補正後に隣の線とつながってしまわないように拡大倍率の１／２以下とする。図２８に＜表１４＞として倍率毎の補正ドット数が参考値として示されている。現ベクトルによって確定された基準座標に対して補正ドット数だけ移動した座標を線引き用座標とする（ステップＳ４８０）。
【００８８】
尚、上述したベクトル計算は、補正データを格納しているテーブル１３２のアドレスを求めているにすぎず、ここでは、補正データそのものは計算で求めておらず、連続したベクトル値のパターンによって個々に補正データを決めておき、その補正データの集合体である補正テーブル１３２を参照する形式を採用している。これは、例えば、フォント書体別に補正データを差し替えることによって書体の特徴を生かしたアウトラインスムージング処理を可能にするものである。
【００８９】
ドット補正の例について２つ例示して説明する。図２９に＜表１５＞として示す例は、始点座標［Ｘ０，Ｙ０］を［６，２］、斜線化ベクトル行列↑ＶＣＴ１Ｂ＝［０，０，０，０，０，０，０，０，０，１，０，１，１，２，１，２，２，２，２，２，２，２，２，３，２，３，３，４，３，４，４，４，４，４，４，４，４，４，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６，６］、Ｘ方向３倍、Ｙ方向４倍の拡大文字につき、Ｘ方向補正ドット値“１”、Ｙ方向補正ドット値“２”で線引きするケースを例示している。表中、ＬＩＮＥ｛（Ｘ１，Ｙ１）−（Ｘ２，Ｙ２）｝は、座標（Ｘ１，Ｙ１）−（Ｘ２，Ｙ２）間に線を引くための処理を示す。また、ＬＩＮＥ ＳＫＩＰは、線を引く処理をスキップすることを示す。
【００９０】
図３０に＜表１６＞として示す例は、始点［１４，５］、斜線化ベクトルデータ↑ＶＣＴ２Ｂ＝［４，４，４，４，４，２，２，２，２，２，２，２，２，２，２，２，２，０，０，０，０，０，７，７，７，６，６，６，６，６，６，５，５，５］、Ｘ方向３倍、Ｙ方向４倍の拡大加工文字につき、Ｘ方向補正ドット値“１”、Ｙ方向補正ドット値“２”で線引きするケースを例示している。
【００９１】
ステップＳ４８０以降の線引きについて詳細説明を行う。ここでいう線引き処理は、基のビットマップデータサイズにＸ，Ｙ方向の拡大率を乗じたサイズのデータ領域を２つ確保し、上述したように決められた線引き用座標の２点間に外枠用線、及び塗り潰し用線としてドット補間して描画するものである。ここでは、外枠用線をストロークライン、外枠用描画領域をストローク領域、塗り潰し用線をフィルライン、塗り潰し用描画領域をフィル領域と呼称して説明を継続する。また、線を引く対象の２点をＰ１＝（Ｘ１，Ｙ１）、Ｐ２＝（Ｘ２，Ｙ２）とする。
【００９２】
まずストロークライン処理から説明する。ここでは、ストローク領域にフォント外枠用線として上述のように決められた線引き用座標の２点間にドットを補間して描画する。このとき、滑らかな線を得るために、線の傾きによっては基準軸を入れ替え（ステップＳ４８２）ドット補間する。
【００９３】
具体的には、線引き基準軸決定のために、Ｘ、Ｙの変化量の大きい方を基準軸とし、２点間のＸ，Ｙの差分ΔＸ＝ＡＢＳ（Ｘ２−Ｘ１）、ΔＹ＝ＡＢＳ（Ｙ２−Ｙ１）を求め、ΔＸ≧ΔＹのときＸ軸基準としてＸ方向をスキャンし、ΔＸ＜ΔＹのときＹ軸を基準としてＹ方向をスキャンする。ここでＡＢＳは絶対値を求めるための関数である。
【００９４】
Ｘ軸基準線引き処理（Ｘ方向スキャン）において、Ｘ１、Ｘ２を比較し、Ｘ座標の小さいほうから順にドットを描画する。ここでＸ１≧Ｘ２のとき、Ｐ２→Ｐ１順に描画（開始点ＰＳ＝Ｐ２、終了点ＰＥ＝Ｐ１）し、Ｘ１＜Ｘ２のとき、Ｐ１→Ｐ２の順に描画（開始点ＰＳ＝Ｐ２、終了点ＰＥ＝Ｐ２）する。
【００９５】
Ｙ軸基準線引き処理（Ｙ方向スキャン）において、Ｙ１、Ｙ２を比較し、Ｙ座標の小さい方から線を引く。ここで、Ｙ１≧Ｙ２のとき、Ｐ２→Ｐ１順に描画（開始点ＰＳ＝Ｐ２、終了点ＰＥ＝Ｐ１）し、Ｙ１＜Ｙ２のとき、Ｐ１→Ｐ２の順に描画（開始点ＰＳ＝Ｐ２、終了点ＰＥ＝Ｐ２）する。
【００９６】
ストロークライン処理は、始点、終点、補間点全てにドットを描画し、描画されるドットは、ストローク領域のデータとの論理和（ＯＲ）演算とする（ステップＳ４８３）。
【００９７】
次にフィルライン処理について説明する。ここでは、フィル領域にフォント塗り潰し用線として、上述のようにして決められた線引き用座標の２点間にドットを補間して描画する。ドット補間のための基準軸はＸ方向のみとする。
【００９８】
具体的に、Ｘ軸基準線引き処理（Ｘ方向スキャン）は、Ｘ１、Ｘ２を比較し、Ｘ座標の小さい方から順にドットを描画する（ステップＳ４８４）。Ｘ１≧Ｘ２のときにＰ２→Ｐ１順に描画（開始点ＰＳ＝Ｐ２、終了点ＰＥ＝Ｐ１）し、Ｘ１＜Ｘ２のとき、Ｐ１→Ｐ２の順に描画（開始点ＰＳ＝Ｐ２、終了点ＰＥ＝Ｐ２）する。フィルライン処理は、始点、補間点にドットを描画し、終点は未処理とする。また、描画されるドットは、フィル領域のデータとの排他的論理和（ＸＯＲ）演算とする（ステップＳ４８５）。
【００９９】
上述したストロークライン、フィルライン処理において、２点間に直線を描画するアルゴリズムについて図３１〜図４１を参照しながら詳細に説明する。
図３１に示す＜グラフ１＞において、２点間（図中★印）に直線を引く場合、グラフ上に直線を描くかのようにメモリ上に小数点付きの値の座標にドットを描画することはできない。実際には、図中、●で示すように、２点間の直線に最も近い整数値の座標上にドットを補間することになる。
【０１００】
このような補間点群は、図３２に＜リスト１＞として示すアルゴリズムにより順に求めることができる。ここで、補間点群は、（ｘ＋ｘ１，ｙ）で表される。つまり、ｘが１ステップカウントされる毎に、小数点付きの座標値を最も近い整数へ丸める演算（ｒｏｕｎｄ関数）を行う。図３２に示す例では整数への丸め関数ｒｏｕｎｄを使用したが、これを通常の四則演算に置き換えた場合は図３３に＜リスト２＞で示すアルゴリズムが得られる。ここで補間点群は（ｘ，ｙ）である。
【０１０１】
実際、図３３に示す演算式をプログラムで実行する場合は別として、ハードウェアで実現しようとした場合、ｄｙ／ｄｘの除算、小数点付き変数１，１／２との比較などを含んでいることがネックとなる。このため、図３４または図３５に、それぞれ＜リスト３＞＜リスト４＞として示すようにアルゴリズムを変形しておく。図３２〜３５にリスト表示したアルゴリズムについては本発明要旨と直接関係しないためここでの説明は省略する。
【０１０２】
尚、これまでの説明はｄｘ＞＝ｄｙとして説明してきた。これは、「ｘを１ステップカウントインクリメントする毎にｙを１ステップカウントインクリメントするか否か」という判断をしているためであり、増分ｄｙ／ｄｘが１ステップカウント以上になる場合には適用できない。試しに、ｄｘ＜ｄｙの場合で実行してみれば図３６にグラフ表示（＜グラフ２＞）したようになってしまう（Ｙ座標正方向＝下方向）。
【０１０３】
これを回避するためには、１とｄｘとの比較を繰り返し処理に変更すればよい。このためのアルゴリズムは図３７に＜リスト５＞として示すようになる。このアルゴリズムによって、増分ｄｙ／ｄｘが１より大きい場合でも図３８にグラフ表示（＜グラフ３＞）するように直線に最も近い座標点群が得られる。
【０１０４】
ところで、ｄｘ＜ｄｙの場合の処理は、上述したアルゴリズムで問題なく直線生成アルゴリズムになる。しかしながら、ｄｘがｄｙに対してより大きな値（傾きが急な場合）は、図３９にグラフ表示（＜グラフ４＞）するように補間されるドットが極端に少なくなってしまう。
【０１０５】
実際、塗り潰し用のアルゴリズムとしては有用である。しかしながら、フォント外枠を得るための線引きとして用いた場合は、図３９に示すように、ドットが密の部分とドットが疎の部分と入り混じり奇麗な外形を持つフォントにはならない。
【０１０６】
線の傾きによらず、補間点群が密になるようにするには、ｄｘ，ｄｙの大小によってケース分けを行う。ｄｘ＜ｄｙの場合は、ちょうどＸ軸とＹ軸を入れ替えて演算するような処理を行う。つまり、ｙを１ステップカウントインクリメントする毎にｘを１ステップカウントインクリメントするか否かの判断を行ない、増分ｄｙ／ｄｘまたはｄｘ／ｄｙを１以下に正規化する。この場合、アルゴリズムは、図４０に＜リスト６＞として示す形態となる。このアルゴリズムによれば、結果、図４１に示すようにグラフ表示（＜グラフ５＞）され、ドットが密に描画される。
【０１０７】
以上まとめると、ストロークライン（外枠用線引き）用アルゴリズムは以下のようになる。つまり、ｄｘ＞＝ｄｙの場合、ｘを１ステップカウントインクリメントする毎にｙをインクリメントするか否かの判断を行う処理（Ｘスキャン線引き処理）が行われる。ｄｘ＜ｄｙの場合、ｙを１ステップカウントインクリメントする毎にｘをインクリメントするか否か判断する処理（Ｙスキャン線引き処理）が行われ、始点、終点、補間点は、ストローク領域データと論理和（ＯＲ）演算が行われる。
【０１０８】
次にストロークラインを用いた塗り潰し処理について説明する。塗り潰しのアルゴリズムは、図４２に＜リスト７＞として示されるように、Ｙ方向の１つ前のドットとの排他的論理和（ＸＯＲ）演算を行うことにより実現される。これを図４３（ａ）に示す図形（＜グラフ６＞）の例で実行した場合、図４３（ｂ）のようになり、特に問題は生じない。
【０１０９】
次に、ストロークライン処理を使って描かれた図４４（ａ）の例（＜グラフ７＞）で実行した場合、結果は図４４（ｂ）のようになり、うまく塗り潰しが行われない。同じく図４５（ａ）に示す長方形（＜グラフ８＞）を使って実行した場合、図４５（ｂ）のようになり、辺ａ−ｄ、辺ｂ−ｃ間の塗り潰しがうまくできない。
【０１１０】
これらの原因として、塗り潰しアルゴリズムが１つの点から１つの点の間を埋める処理を目的とするのに対して、例では、線分ａ−ｃ，ｂ−ｃ，ａ−ｄ，ｂ−ｃが塗り潰し方向であるＹ方向からみて１ドット以上の点で描かれているためである。
【０１１１】
線分ａ−ｃ，ｂ−ｃが１ドット以上の点で描かれるのは、それらがＸスキャン線引き処理で描かれたためであるため、この問題を解決するためには、線分の傾きに関係なく、Ｘスキャン線引き処理を行えばよい。
【０１１２】
座標点間を単純にＸスキャン線引き処理を行った例、図４６（ａ）を例示（＜グラフ９＞）して塗り潰しを行ってみる。この場合、図４６（ｂ）に示すように、Ｘスキャン、Ｙスキャン線引き処理を併用した例より改善はされたが、頂点Ａ，Ｂが１ドットのみであったために、塗り潰し終点が存在せず、線を引いてしまう。
【０１１３】
フィルライン（塗り潰し用線引き）処理について説明する。図４６（ｂ）において、点Ａ，Ｂは図形の頂点であり、塗り潰す終点を描くことは難しい。そのために、頂点Ａ，Ｂには、線引き処理において、黒点を描かずに白点にすればよいが、単純に線引き処理の始点、終点を白点にするような処理では、頂点Ｃまでも白点になってしまい、今度は点Ｃ以降に線が引かれてしまう。
【０１１４】
そこで、線引き処理の始点、終点は、前回または次回の線引きと重なり、２回処理されることを利用して、始点から終点の１つ前の補間点群については、フィル領域のデータと排他的論理和演算、終点については未処理とすることで、頂点を白点にすることができる。フィルラインの補間点群生成アルゴリズムは、図４７にリスト形式で示すようになる。
【０１１５】
フィルライン処理によって図４８＜グラフ１０＞における△図形（頂点Ａ，Ｂ，Ｃ）は以下の手順に従う。すなわち、図４８（ａ）におけるフィルラインＡ−Ｂ処理で、Ａ点に黒点、Ｂ点は未処理（白点）、フィルラインＣ−Ｂ処理で、Ｃ点に黒点、Ｂ点は未処理（白点）、フィルラインＡ−Ｃ処理で、Ａ点は排他的論理和演算で白点、Ｃ点は未処理で黒点となる。図４８（ａ）で示す△図形に塗り潰し処理を施すと図４８（ｂ）のようになる。
【０１１６】
フィルライン（塗り潰し用線引き）アルゴリズムについてまとめると以下のようになる。すなわち、２点間の座標のうち、Ｘ座標が小さい方を開始点とする。そして、ｘを１ステップカウントインクリメントする毎に、ｙをインクリメントするか否かを判断（Ｘスキャン線引き処理）する。始点、補間点群はフィル領域データと排他的論理和演算を実行する。終点は未処理とする。
【０１１７】
次に塗り潰し処理部１１５による塗り潰し処理（図４におけるステップＳ４６）について説明する。図９に処理手順がフローチャートで示されている。以下、図９に示すフローチャートを参照しながら説明する。
【０１１８】
塗り潰し処理部１１５では、線引き処理部１１４により作成されたフィルラインの内側を塗り潰す。フィルラインの塗り潰しは、Ｙ方向の１つ前のドットとの排他的論理和演算ＸＯＲを実行（ステップ゜Ｓ４６１）することによりなされる。アルゴリズムを図４９にリスト形式（＜リスト９＞）で示す。
【０１１９】
ストローク領域、フィル領域の重ね合わせについて説明する。ここでは、フォント外枠が描かれているストローク領域と、塗り潰しフォントが描かれているフィル領域の内容を論理和演算することによって重ね合わせる（ステップＳ４６２）。この模様は図５０に動作概念図として示されている。
【０１２０】
最後に、線幅補正処理部１１６による太さ補正処理（図４におけるステップＳ４７）について説明する。図１０に処理手順がフローチャートで示されている。ここでは、線引き処理部１１４により作成されたビットマップは、ベクトル化によりＸ方向、Ｙ方向共に１ドット分太くなってしまうことから、ビットマップをＸ，Ｙ両方向にそれぞれ１ドツト分削除する機能を実行する。
【０１２１】
処理方法について具体的に説明する。まず、Ｙ方向に座標をスキャン（ステップＳ４７１）し、ドット削除の条件を調べ（ステップＳ４７２）、以下に示す条件のドットを「白」にする（ステップＳ４７３）。ここで、ドット削除の条件とは、現座標ドットが「黒」、次座標ドット（＝Ｙ＋１）が「白」であって、座標端のドットについては未処理とする。
【０１２２】
次に、Ｘ方向に座標をスキャン（ステップＳ４７２）し、ドット削除の条件を調べ（ステップＳ４７２）、以下の条件のドットを「白」にする（ステップＳ４７３）。ここで、ドット削除の条件とは、現座標ドットが「黒」、次座標ドット（＝Ｘ＋１）が「白」であって、座標端のドットについては未処理とする。
【０１２３】
太さ補正の例につき、図５１に示すビットマップを参照しながら説明する。図５１（ａ）に示すビットマップ例につき、アウトラインを抽出して拡大する。ここでは、ベクトルデータ↑ＶＣＴ１＝［０，０，２，２，０，０，２，２，４，４，４，４，６，６，６，６］とする。そして、Ｘ方向２倍、Ｙ方向２倍として、線引き、塗り潰し、重ね合わせ処理を実行すると、それぞれ、図５１（ｂ）のようになってしまう。
【０１２４】
図５１（ｂ）は、Ｘ方向２倍、Ｙ方向２倍に拡大して描画したときのビットマップである。Ｘ，Ｙ方向に２倍した場合、図形の大きさは本来、４×２の８ドット分であるはずであるが、ベクトル化した場合、図のように＋１ドット分太くなってしまう。ここで、＋１ドットは、この例に限らず、また、拡大率の値によることなく一律である。尚、ＬＩＮＥ｛（Ｘ１，Ｙ１）−（Ｘ２，Ｙ２）｝は、座標（Ｘ１，Ｙ１）から座標（Ｘ２，Ｙ２）に向けて線分を引く処理を示す。
【０１２５】
このため、太さ補正処理を行うが、ここではまず、Ｙ方向に座標をスキャンし、Ｆ［ｘ，ｙ］＝０ｘ１（黒）、Ｆ［ｘ，ｙ＋１］＝０ｘ０（白）の場合、Ｆ［ｘ，ｙ］＝０ｘ０（白）に置換する。このことにより、図５１（ｃ）に示すビットマツプが生成される。具体的に、□で表されるドットが補正される。
【０１２６】
続いてＸ方向に座標をスキャンし、Ｆ［ｘ，ｙ］＝０ｘ１（黒）、Ｆ［ｘ，ｙ＋１］＝０ｘ０（白）の場合、Ｆ［ｘ，ｙ］＝０ｘ０（白）に置換する。このことにより、図４９（ｄ）に示すビットマツプが生成される。具体的に、◇で表されるドットが補正される。この太さ補正を行った結果、ＸＹ方向に２倍した図形の大きさは本来の４×２の８ドットになる。
【０１２７】
次に、太さ補正の例外処理（ステップＳ４７４）について図５２に示すビットマツプを参照しながら説明する。基のビットマップデータが図５２（ａ）に示すように、２４×２４ドットフォントサイズの端に接している場合について太さ補正をかけるものとする。
【０１２８】
Ｘ方向Ｙ方向共に２倍として、線引き、塗り潰し、重ね合わせ処理を実行すると図５２（ｂ）に示すようなビットマップになる。線引き処理において、終点座標が拡大後のビットマップサイズを超えた座標は描画されないため、図形の大きさは、１ドット分大きくなる個所とならない個所が存在する。
【０１２９】
単純に太さ補正処理を行うと図５２（ｃ）に示すビットマップになる。基の図形がビットマツプサイズの端にある場合は、拡大後に１ドット分小さくなってしまう。これは線引き処理を行う際に、拡大後のビットマップサイズの座標範囲外の点を描画しないために起こる。拡大後の図形でビットマップの座標端にあるドットについて未処理とした場合、図５２（ｄ）に示すビットマップになる。図５２（ｃ）（ｄ）において、□は補正されるドットを示す。
【０１３０】
【発明の効果】
以上説明のように、本発明は、フォントメモリに用意されたビットマップデータを一旦ベクトルデータに置き換え、ベクトルデータ上での平滑化により、拡大率が大きくなっても滑らかなフォントを再現するものである。このためにビットマップを８方向のベクトル（上下左右４方向と斜め４方向）で表現し、連続する６ベクトルの変化量から最適なベクトル方向を決定し、更に、６ベクトルの変化量から、ベクトルで表現しきれない１ドット単位での補正を行う。
【０１３１】
本発明によれば、拡大しても品質の良い印字もしくは表示が可能である他、ビットマップフォントを使用しているため圧縮が可能であり、算術符号化による圧縮アルゴリズムにより、文字サイズ等にもよるが、例えば４０％程度の圧縮ができる。通常、アウトラインフォントを搭載する機器においても解像度の低い小さなサイズの文字を扱う場合、印字品位劣化のためにビットマップフォントを用いて印字することがあるが、本発明によれば、文字の大小にかかわらず同じ品質で文字の印刷が可能となり、また、メモリ容量の節約も可能となるものである。
【０１３２】
また、ワープロやパソコン等の印刷装置、表示装置への適用は勿論のこと、テープ印刷装置等比較的装置規模の小さい機種においても、印字品位、処理速度、価格のいずれも犠牲にすることなく、文字拡大時における滑らかなアウトラインスムージング処理が可能となる。
【図面の簡単な説明】
【図１】  本発明の実施形態を示すブロック図である。
【図２】  図１における制御部の詳細を示すブロック図である。
【図３】  本発明実施形態において使用される座標、ベクトルの定義を説明するために引用した図である。
【図４】  本発明実施形態の処理手順を説明するために引用したフローチャートである。
【図５】  図４におけるベクトルの始点検索処理の具体的な処理手順を示すフローチャートである。
【図６】  図４における直交ベクトルへの変換処理の具体的な処理手順を示すフローチャートである。
【図７】  図４における斜線ベクトルへの変換処理の具体的な処理手順を示すフローチャートである。
【図８】  図４における線引き処理の具体的な処理手順を示すフローチャートである。
【図９】  図４における塗り潰し処理の具体的な処理手順を示すフローチャートである。
【図１０】  図４における線幅補正処理の具体的な処理手順を示すフローチャートである。
【図１１】  始点検索決定の例をビットマップ上に展開して示した図である。
【図１２】  始点ベクトル決定のための条件とベクトル値との関係を表形式（＜表１＞）で示した図である。
【図１３】  １つ前のベクトルと検索順位との関係を表形式（＜表２＞）で示した図である。
【図１４】  検索方向パターンと条件、ベクトルの関係を表形式（＜表３＞）で示した図である。
【図１５】  ベクトルとベクトル化位置との関係を表形式（＜表４＞）で示した図である。
【図１６】  直交ベクトル化の例をビットマップ上に展開して示した図である。
【図１７】  ベクトル変化方向と連続する２つのベクトルとの関係を表形式（＜表５＞）で示した図である。
【図１８】  直交ベクトルと変換された斜線ベクトルとの関係を表形式（＜表６＞）で示した図である。
【図１９】  ベクトル変換条件を表形式（＜表７＞）で示した図である。
【図２０】  変換条件をベクトルパターンとして表形式（＜表８＞）で示した図である。
【図２１】  斜線化判定テーブルの内容を示した図である。
【図２２】  ベクトル斜線化の例をビットマップ上に展開して示した図である。
【図２３】  ベクトル値と座標移動量との関係を表形式（＜表９＞）で示した図である。
【図２４】  ベクトル値と前回座標からの移動量、アウトライン基準座標との関係を表形式（＜表１０＞）で示した図である。
【図２５】  線引き座標を表形式（＜表１１＞）で示した図である。
【図２６】  補正データと補正方向の関係を表形式（＜表１２＞）で示した図である。
【図２７】  補正方向と座標移動量との関係を表形式（＜表１３＞）で示した図である。
【図２８】  拡大倍率と補正ドット数との関係を表形式（＜表１４＞）で示した図である。
【図２９】  ドット補正の例を表形式（＜表１５＞）で示した図である。
【図３０】  ドット補正の例を表形式（＜表１６＞）で示した図である。
【図３１】  ドット補間を説明するために例示したグラフ（＜グラフ１＞）である。
【図３２】  補間点群演算アルゴリズムをリスト形式（＜リスト１＞）で示す図である。
【図３３】  補間点群演算アルゴリズムをリスト形式（＜リスト２＞）で示す図である。
【図３４】  補間点群演算アルゴリズムをリスト形式（＜リスト３＞）で示す図である。
【図３５】  補間点群演算アルゴリズムをリスト形式（＜リスト４＞）で示す図である。
【図３６】  ドット補間を説明するために例示したグラフ（＜グラフ２＞）である。
【図３７】  補間点群演算アルゴリズムをリスト形式（＜リスト５＞）で示す図である。
【図３８】  ドット補間を説明するために例示したグラフ（＜グラフ３＞）である。
【図３９】  ドット補間を説明するために例示したグラフ（＜グラフ４＞）である。
【図４０】  補間点群演算アルゴリズムをリスト形式（＜リスト６＞）で示す図である。
【図４１】  ドット補間を説明するために例示したグラフ（＜グラフ５＞）である。
【図４２】  ストロークラインの塗り潰しアルゴリズムをリスト形式（＜リスト７＞）で示す図である。
【図４３】  ストロークラインを用いた塗り潰しを説明するために例示したグラフ（＜グラフ６＞）である。
【図４４】  ストロークラインを用いた塗り潰しを説明するために例示したグラフ（＜グラフ７＞）である。
【図４５】  ストロークラインを用いた塗り潰しを説明するために例示したグラフ（＜グラフ８＞）である。
【図４６】  Ｘスキャン線引き処理を用いたた塗り潰しを説明するために例示したグラフ（＜グラフ９＞）である。
【図４７】  フィルラインの補間点群発生アルゴリズムをリスト形式（＜リスト８＞）で示す図である。
【図４８】  フィルライン処理による塗り潰しを説明するために例示したグラフ（＜グラフ１０＞）である。
【図４９】  フィルライン塗り潰しのためのアルゴリズムをリスト形式（＜リスト９＞）で示す図である。
【図５０】  ストローク領域とフィル領域の重ね合わせをグラフ表示した動作概念図である。
【図５１】  太さ補正の例をビットマップ上に展開して示した図である。
【図５２】  太さ補正の例外処理をビットマップ上に展開して示した図である。
【図５３】  本発明実施形態において使用されるベクトル定義の更に詳細な例を示す図である。
【符号の説明】
１…制御部、２…操作部、３…印字部、４駆動部、１１ＣＰＵ（フォント加工装置）、１２プログラムメモリ、１３ワークＲＡＭ、１４文字フォントメモリ１５入出力制御部（ＩＯＣ）、１６内部バス、２０…文字出力部、１１１…始点検索・決定部、１１２…直交ベクトル抽出部、１１３…斜線ベクトル変換部、１１４…線引き処理部、１１５…塗り潰し処理部、１１６…線幅補正処理部、１３１…フラグメモリ（ベクトル化済み情報）、１３２…斜線化判定テーブル、１３３…補正テーブル、１３４…ワーク用ビットマップ領域
【図１】
0003791259.tif 000005
【図２】
0003791259.tif 000006
【図３】
0003791259.tif 000007
【図４】
0003791259.tif 000008
【図５】
0003791259.tif 000009
【図６】
0003791259.tif 000010
【図７】
0003791259.tif 000011
【図８】
0003791259.tif 000012
【図９】
0003791259.tif 000013
【図１０】
0003791259.tif 000014
【図１１】
0003791259.tif 000015
【図１２】
0003791259.tif 000016
【図１３】
0003791259.tif 000017
【図１４】
0003791259.tif 000018
【図１５】
0003791259.tif 000019
【図１６】
0003791259.tif 000020
【図１７】
0003791259.tif 000021
【図１８】
0003791259.tif 000022
【図１９】
0003791259.tif 000023
【図２０】
0003791259.tif 000024
【図２１】
0003791259.tif 000025
【図２２】
0003791259.tif 000026
【図２３】
0003791259.tif 000027
【図２４】
0003791259.tif 000028
【図２５】
0003791259.tif 000029
【図２６】
0003791259.tif 000030
【図２７】
0003791259.tif 000031
【図２８】
0003791259.tif 000032
【図２９】
0003791259.tif 000033
【図３０】
0003791259.tif 000034
【図３１】
0003791259.tif 000035
【図３２】
0003791259.tif 000036
【図３３】
0003791259.tif 000037
【図３４】
0003791259.tif 000038
【図３５】
0003791259.tif 000039
【図３６】
0003791259.tif 000040
【図３７】
0003791259.tif 000041
【図３８】
0003791259.tif 000042
【図３９】
0003791259.tif 000043
【図４０】
0003791259.tif 000044
【図４１】
0003791259.tif 000045
【図４２】
0003791259.tif 000046
【図４３】
0003791259.tif 000047
【図４４】
0003791259.tif 000048
【図４５】
0003791259.tif 000049
【図４６】
0003791259.tif 000050
【図４７】
0003791259.tif 000051
【図４８】
0003791259.tif 000052
【図４９】
0003791259.tif 000053
【図５０】
0003791259.tif 000054
【図５１】
0003791259.tif 000055
【図５２】
0003791259.tif 000056
【図５３】
0003791259.tif 000057