フォントマネージャは、外殻の一部として位置付けられ、 文字描画に使用されるフォントデータの登録 / 削除 / 情報の問い合わせ / データの読み出し等の機能を持ち、 マルチプロセスの環境下での柔軟なマルチフォントの機能を提供している。
フォントマネージャは、 スクリーン表示およびイメージ転送方式によるプリントに使用されるフォント、 即ちシステムに内蔵されるフォントのみを対象とし、 プリンタ等の外部機器に組み込まれているフォントに関しては対象としていない。
通常のアプリケーションは、実際の文字描画を行う場合は、 ディスプレイプリミティブとして提供されている文字描画関数を使用すればよく、 フォントマネージャの関数を使用する必要はない。 フォントの一覧取り出しを行う場合のみフォントマネージャの関数を使用する。 フォントの登録、削除等はフォントマネージャの関数を使用するが、 通常のアプリケーションは行う必要はなく、 主としてシステムアプリケーションが行うことになる。
ディスプレイプリミティブは、フォントマネージャを使用してフォントに関する情報および実際のフォントのイメージを取り出した後、 必要に応じたイメージの後処理 ( 変形 / 拡大 / 縮小 / 回転等 ) を行ない、文字の描画を行なうことになる。
フォントデータは、ROM またはファイルの形式で供給されることになり、 そのデータ形式としていくつかの標準形式が規定されるが、 フォントデータの形式は基本的にフォントマネージャ以外には見えない。
なお、フォントを作成するためのツールとしてのフォントエディタは 1 つの独立したアプリケーションとして位置付けられ、 フォントマネージャの機能には含まれない。
フォント ( 書体 ) とは、 目に見える形の文字表現(文字体)の集合である。
フォントは、その文字表現の基本的なデザインの違いによりフォントファミリーに体系付けられる。
フォントファミリーは、12 文字 ( 12 文字に満たない場合は後ろに 0 が詰められる ) のフォントファミリー名により区別される。 また、フォントファミリーには、 文字体の特徴を表わすフォントクラスが対応づけられる。
一つのフォントファミリーは、 一つもしくは複数のフォントデータ群から構成される。 異なる文字セットのフォントデータも一つのフォントファミリーに属することができる。
最初に登録したフォントファミリーがシステムのデフォルトフォントファミリーとなる。 デフォルトフォントファミリーは文字セットごとに決定される。 デフォルトフォントファミリーには、 ある文字セットの標準規格において規定されている全ての文字が、 一般的なデザインにより定義されていると期待してよい。
フォントクラスは、文字体の特長を表わす以下に示すデータである。
フォントクラスの各ビットに対応した基準は、上位のビットが最も類似度が高く、 下位にビットが最も類似度が低いため、フォントファミリーの類似度は、 フォントクラスを上位のビットから比較して、最初に異なったビットの位置により判断することができる。
フォントクラスは、フォントファミリーをその特徴により指定する場合、 または、特定のフォントファミリーが存在しない時に最も良く似ている代替フォントファミリーを選択するために使用される。 即ち、文字セットIDが同一でかつ、 フォントクラスの上位ビット側から最も多くのビットが一致しているフォントクラスに対応するフォントファミリーが代替フォントファミリーとなる。
同一のフォントファミリー名を持つフォントデータは、 同一のフォントクラスでなくてはいけないが、 異なるフォントファミリー名を持つフォントデータが、 同一のフォントクラスであってもよい。この場合、 その 2 つのフォントファミリーの文字体はかなり似ているが微妙に違うということになる。
FTC_DEFAULT ( = 0x80000000 )
は、
常にデフォルトフォントファミリーに対応する特別なフォントクラスである。
同一フォントファミリーの内で、 主として加工による文字体の相違はフォント属性により区別される。 フォントのバリエーションは基本的には無限とも言えるが、 大部分のバリエーションは以下に定義されるフォント属性により区別可能となる。
フォントデータにはフォントファミリーを示すフォント名が付けられているが、 さらにフォント属性等の意味を付加した 20 文字の詳細フォント名を定義される。 この詳細フォント名はフォント情報の表示にのみ使用される。
フォントデータはフォントを定義している実際のデータの集まりの単位であり、
対象とする文字セットで定義されている文字コード範囲内の 1 つの連続範囲に対して定義され、
その範囲を定義域と呼ぶ。
定義域は第 1 バイトと第 2 バイトの値を座標値とする
(0, 0)
〜 (255, 255)
の矩形領域中の 1 つの矩形領域となる。
フォントデータは文字の大きさ毎に定義される。 文字の大きさは、ポイント数、級数等の実スケールではなく、 最終的に得られる文字の高さのビットマップイメージ上でのドット数で表わされ、 これをフォントサイズと呼ぶ。なお、実スケールとドット数との変換は上位レベルで行なわれるものとする。
従って、1 つのフォントファミリーは以下に示す複数のフォントデータ群から構成されることになる。
フォントファミリーの例として以下のものがあげられる。
ファミリー:XX明朝体 24ドット第一水準フォントデータ 24ドット第二水準フォントデータ 24ドットボールドかなフォントデータ 32ドット第一水準フォントデータ 32ドット第二水準フォントデータ 第一水準フォントデータ(スケーラブル) 第二水準フォントデータ(スケーラブル)
フォントマネージャは、フォントファミリーを 1 つの単位として取り扱い、
要求された文字セット、フォント属性、フォントサイズ、
および文字コードに適用できるフォントデータをファミリー内から選択して使用する。
フォント属性、フォントサイズが適合するフォントが存在しない場合は、
所望のフォントを各種の変形処理、拡大 / 縮小 / 回転処理により機械的に発生させることが最も容易なフォントデータを選択することになる。
フォントファミリーで定義されていない文字コードに対して、 他のフォントファミリーを適用するように指定することが可能である。 この場合、そのフォントファミリーを部分フォントファミリーと呼び、 未定義文字コードを適用するフォントをベースフォントファミリーと呼ぶ。 なお、ベースフォントファミリーの適用は 1 レベルのみに限られ、 多重のベースフォントファミリーの適用は行なわれない。
部分フォントファミリーは、ある特定の文字コード領域のフォントのみを変更するために使用する。 例えば、ひらがな、カタカナだけを定義する「丸文字」のフォントファミリーに対して「丸ゴシック」 のベースフォントが定義されている場合、 「丸文字」フォントファミリーを指定したときには、 ひらがな、カタカナの文字コードに対しては「丸文字」が適用され、 それら以外の文字コードに対しては「丸ゴシック」が適用されることになる。
フォントデータは、メモリ上のデータまたはファイルとして存在し、 基本的に以下の 4 つのデータブロックにより構成される。
フォント定義データは、フォントデータに関する各種の定義データ、 共通データを含むもので以下に示す内容を持つ。
typedef struct { SCRIPT script; /* 文字セット(スクリプト)指定 */ FCLASS fclass; /* フォントクラス */ FATTR attr; /* フォント属性 */ UB size; /* フォントサイズ (文字枠の最大高さ) */ UB width; /* 文字枠の最大幅 */ UB base; /* ベース位置 */ UB leading; /* レディング */ TC name[12]; /* フォントファミリー名 */ FCLASS baseclass; /* ベースフォントクラス */ TC basename[12]; /* ベースフォントファミリー名 */ TC fullname[20]; /* 詳細フォント名 */ TC topcode; /* 最初の文字コード */ TC lastcode; /* 最後の文字コード */ UB sheight; /* 基準文字高さ */ UB swidth; /* 基準文字幅 */ H rsv[2]; /* 予約 */ UB imgform; /* 文字イメージの形式 */ UB widform; /* 文字幅等データの形式 */ W datasize; /* データ全体のバイトサイズ */ OFFSET offimage; /* 文字イメージへのオフセット */ OFFSET offwidth; /* 文字幅等データへのオフセット */ OFFSET offnote; /* 注釈データへのオフセット */ } FDEF;
script
:
文字セットを示すIDである。
TRON 多国語コードの基本言語面の場合は 0x0021
である。
fclass
:
フォントクラスを示す。
1 つのフォントファミリー内では、
fclass
はすべて一致していなくてはいけない。
name
:
フォント ( ファミリー ) 名を示す。 12 文字に満たない場合は後ろに 0 が詰められる。
attr
:
フォント属性を示す。
フォントサイズ ( 文字枠の最大高さ ) のドット数 ( 0 〜 255 ) を示す。 ベクトル形式フォント等の任意のフォントサイズが適用可能な場合は 0 となる。
width
:
文字枠の最大幅のドット数 ( 0 〜 255 ) を示す。 任意フォントサイズの場合は0となる。
base
:
文字描画のベースライン ( 基準位置 ) からの文字枠の高さのドット数 ( 0 〜 255 ) を示す。 任意フォントサイズの場合は 0 となる。
leading
:
シングルスペースの行間のドット数 ( 0 〜255 ) を示す。 任意フォントサイズの場合は 0 となる。
baseclass
:
ベースフォントのフォントクラスを示す。 部分フォントでない場合は意味を持たない。
basename
:
ベースフォント ( ファミリー ) 名を示す。
12 文字に満たない場合は後ろに 0 が詰められる。
部分フォントでない場合は、すべて 0 が詰められる。
先頭の文字が 0 か否かにより、部分フォントか否かの区別が行なわれる。
1 つのフォントファミリー内では、baseclass, basename
はすべて一致していなくてはいけない。
fullname
:
詳細フォント名を示す。20文字に満たない場合は後ろに0が詰められる。
これは、参照用としてのみ使用される。
topcode
:
lastcode
:
フォントデータで定義している文字コードの最小値、
および最大値を示す。topcode
の ( 第 1 バイト, 第 2 バイト)
で示される点と、lastcode
の ( 第 1 バイト, 第 2 バイト)
で示される点で囲まれる矩形領域が定義域となる。
swidth
:
sheight
:
サイズの基準となる文字枠の幅/高さのドット数 ( 1 〜 255 ) を示す。
文字サイズ指定時に参照される。
ベクトル形式フォント等の任意のフォントサイズが適用可能な場合は、
フォントサイズに関らず sheight : swidth
が 文字枠の 縦 : 横
の比とみなされる。
どちらかの値が0の場合は、size, width
の値と等しいとみなされる。
imgform
:
文字イメージデータの形式を示す。
0〜63 : 標準形式 0 : ドット形式 (固定イメージサイズ) 1 : ドット形式 (可変イメージサイズ) 2 : ベクトル形式(アウトライン) 3 : TrueType形式(アウトライン) 4〜: 予約 64〜 : 特殊形式
widform
:
文字幅等データの形式を示す。
0〜63 : 標準形式 0 : 文字幅データ 1 : 文字幅/インデックスデータ 2 : イメージ幅付き文字幅データ 3〜:予約 64〜 : 特殊形式
datasize
:
フォント定義データを除いた、 フォントデータの全体のバイトサイズ、 即ち、文字イメージデータ、文字幅データ、 注釈データのバイトサイズの合計を示す。
offimage
:
offwidth
:
offnote
:
それぞれフォント拡張定義データ、文字イメージデータ、
文字幅データ、
注釈データの先頭アドレスへのフォント定義データの先頭からのバイトオフセットを示す。
0 の場合はそのデータが存在しない事を示す。
文字イメージデータは必ず存在する。
offimage
が 0 〜 127 の場合は、
特別に文字イメージデータのレコードサブタイプを表わす。
0 の場合は、レコードサブタイプに関係なく最初の文字イメージデータレコードが対象となる。
1 〜 127 の場合は、
該当するレコードサブタイプを持つ文字イメージデータレコードが対象となる。
文字イメージデータ、および文字幅等データの形式は、
imgform
および widform
により規定され、
いくつかの標準データ形式が規定される。
注釈データは、最後が TNULL(0)
で終了している 1 つの文字列である。
フォントを使用するためには、そのフォントデータをあらかじめ登録しておく必要がある。
登録したフォントデータはフォントID ( ≧ 0
) により識別される。
フォントID は登録した順に 0 からの連続番号が付けられる。
文字セットごとに、最初に登録したフォントデータの属するフォントファミリーが、 デフォルトフォントファミリーとして登録される。
すでに登録されているフォントとフォントファミリー、 フォント属性が同じで、定義域が重なるフォントを登録した場合、 後から登録したフォントデータの文字が優先される。 既に登録されているフォントデータと同一のフォントデータは登録できない。
システムのスタートアップ直後は、 フォントデータが 1 つも登録されていない状態であり、 システムの初期化処理、およびユーザの切換処理として必要なフォントデータの登録が行なわれる。 登録はシステムで標準的に使用するフォントデータを先に行ない、 特にデフォルトフォントファミリーとして使用するフォントデータは一番最初に登録しなくてはならない。 なお、フォントの登録は初期化以外の任意の時点でも可能である。
フォントデータには、すべてのユーザに共通な共通フォントと、 ユーザ毎に定義される個別フォントの 2 種類がある。 共通フォントは、すべてのユーザの初期化処理で登録され、 個別フォントはユーザに応じて登録される点が異なるだけであり、 一度登録されたフォントは、 実行時のプロセスのユーザ情報に無関係にすべてのプロセスから使用可能となる。
フォントデータは、その所在により以下に示す2つのタイプに分類される。
固定フォントの登録は、そのメモリアドレスを、
動的フォントの登録は、そのファイルを、
それぞれフォントマネージャに通知することにより行なわれる。
即ち、以下に示す FLOC
構造体により、フォントの所在を指定して登録する。
typedef union { LINK *lnk; -- フォントファイル指定(動的フォント) FDEF *addr; -- メモリ上のフォントデータ指定(固定フォント) } FLOC;
固定フォントは、システム空間上のメモリ領域に存在しなければいけない。
動的フォントは、必要に応じてメモリ領域に読み込まれる。 フォントデータがフォントマネージャに登録されている状態で、ファイルを操作してはいけない。
フォントの文字イメージへのアクセスは、フォントセットを介して行う。 フォントセットは、ある特定のフォント属性/大きさに変形され、 ある条件に基づいて選択されたフォントファミリーの集合である。 フォントファミリーの実体は、 あるフォントファミリーに属するフォントデータの集合であるので、 フォントセットの実体は複数のフォントデータの集合である。
フォントセットは動的に生成され、 フォントディスクリプタという正の整数値が割り当てられる。 実際のフォントへのアクセスはフォントディスクリプタを使用する。
フォントセットはそれを生成したプロセスに属しておらず、 生成したプロセスの終了時にも解放されずに残る。 アプリケーションがフォントセットを生成した場合、 責任をもって削除する必要がある。
フォントセットを生成した時点では、以下のデフォルト値が設定される。
FSSPEC : name : 空文字列 fclass : FTC_DEFAULT ( = 0x80000000 ) attr : 0 size : (16, 16) angle : 0
フォントの文字イメージにアクセスするには、
最初に目的とするフォントの情報をフォントセットに設定する。
設定には、以下に示す FSSPEC
構造体を使用する。
typedef struct FontSetSpecifier { TC name[12]; /* フォントファミリー名 */ UW fclass; /* フォントクラス */ UW attr; /* フォント属性 */ SIZE size; /* 文字サイズ */ } FSSPEC;
name
:
目的とするフォントのフォントファミリー名を指定する。 フォントクラスのみによる指定を行う場合は、空文字列とする。
fclass
:
name
で指定したフォントファミリーが存在しない場合に、
代替フォントファミリーを検索するためのフォントクラスを指定する。
ただし、fclass
が FTC_DEFAULT ( = 0x80000000 )
の場合は、
デフォルトフォントファミリーが代替フォントファミリーとして選択される。
attr
:
目的とするフォントのフォント属性を指定する。
size
:
目的とするフォントのサイズを指定する。
size.c.v -- 目的とするフォントの基準文字高さのドット数 size.c.h -- 目的とするフォントの基準文字幅のドット数
name
で指定したフォントファミリーが、
実際に存在するかどうかは環境に依存する。
fclass
は代替フォントファミリーの検索にのみ使用される。
目的のフォントとしてデフォルトフォントファミリーを指定したい場合は、
name
として空文字列を、
fclass
として FTC_DEFAULT ( 0x80000000 )
を指定すればよい。
目的のフォントファミリーが存在しない場合に、
任意のフォントファミリーではなくデフォルトフォントファミリーを代替フォントファミリーとして指定したい場合は、
name
として目的のフォントファミリー名を、
フォントクラスとして FTC_DEFAULT ( 0x80000000 )
を指定すればよい。
実際の文字イメージへのアクセスは、 フォントセット、文字セット、文字コードを指定して行う。 実際に文字イメージが生成されるまでのロジックを以下に述べる。
システムに登録されたフォントファミリーの中から、 フォントセットで指定されたフォントファミリーを選択する。
指定されたフォントファミリーが環境に存在しない場合、 もしくはフォントセットで指定されたフォントファミリー名が空文字列の場合は、 フォントセットで指定されたフォントクラスに基づいて最も近似したフォントファミリーを検索し、 代替フォントファミリーとして選択する。
選択されたフォントファミリーの中から、 指定された文字コードが定義されたフォントデータを選択する。
フォントデータが複数登録されている場合、 フォントセットで指定されたフォント属性/フォントサイズに適合するフォントデータを検索して選択する。
適合するものがない場合は、 各種の変形処理、拡大/縮小/回転処理により機械的に発生させることが最も容易なフォントデータを選択する。
選択されたフォントデータから、文字イメージを生成する。
選択されたフォントファミリーの中に、 指定された文字コードが定義されたフォントデータが存在しない場合、 ベースフォントファミリーが定義されていれば、 第 2 のフォントファミリーとしてベースフォントファミリーを選択する。
ベースフォントファミリー名で指定されたフォントファミリーそのものが存在しない場合でも、 ベースフォントクラスによる代替フォントファミリーの検索を行う。
ベースフォントファミリーとして選択されたフォントファミリーに対し、 3 〜 6 の処理を行う。
ベースフォントファミリーが定義されていない場合、 もしくはベースフォントファミリーにも指定された文字コードが定義されたフォントデータが存在しない場合、 第 3 のフォントファミリーとしてデフォルトフォントファミリーを選択する。
デフォルトフォントファミリーとして選択されたフォントファミリーに対し、 3 〜 6 の処理を行う。
デフォルトフォントファミリーにも指定された文字コードが定義されたフォントデータが存在しない場合、 未定義文字イメージが生成される。未定義文字イメージの詳細はフォントマネージャの実装に依存する。
フォントセットには、文字イメージの回転角度を指定することができる。
文字描画位置を中心として、 反時計方向に任意の角度回転させた文字イメージを取得することができる。 回転角度は、0 〜 の度単位の非負の数値で指定し、360 の剰余が有効となる。
フォントマネージャから得られる文字イメージは、フォントデータの文字イメージデータ構造とは無関係に、 常にビットマップデータ形式として、以下に示す形で得られる。
文字枠は、ある1つの文字を描画する場合に文字が占める仮想的な矩形領域であり、
その幅が文字幅、その高さが文字高さとなる。
フォントデータ内に含まれるすべての文字の文字枠の最大高さ ( size
)、
最大幅 ( width
) がフォントデータの定義データに設定される。
また、文字枠は、フォントの属性により以下のようになる。 横書きの場合は、文字描画の起点に文字幅を加えた位置が文字間ギャップ 0 の場合の次の文字描画の起点となり、 縦書きの場合は、文字描画の起点に文字高さを加えた位置が文字間ギャップ 0 の場合の次の文字描画の起点となる。
ベース位置は、横書きの場合に文字を揃える位置であり、 文字枠の上端からのドット数で表わされる。 これは、フォントデータに固定の値である。この値は縦書きでは使用しない。
イメージ枠は、実際に得られるビットマップ形式の文字イメージを囲む矩形枠である。
文字枠と同じとは限らず、文字枠をはみだす場合もある。
文字枠をはみだす場合直前/直後の文字に重なることになる。
これは英文字の飾りヒゲ ( kerning
) や斜体などに使用される
( 図 131 : フォントの文字イメージ2参照)。
文字枠より小さい場合は、文字枠の残りの部分は背景部分となる。
イメージオフセットはイメージ枠が文字枠のどの部分に位置するかを示すデータであり、 文字枠左上からの相対座標で示される。 イメージオフセットは回転角度の影響を受ける。 回転した文字イメージを取り出す場合、 文字枠に対して回転操作を行った後の文字枠左上からの相対座標となる。
フォントマネージャは、指定されたフォントセット、 属性、サイズ、文字セット、 文字コードに対する文字イメージの情報を提供するだけであり、 ディスプレイプリミティブが、 これらの情報をもとに実際の文字描画領域、文字描画位置を計算して文字描画を行なうことになる。
指定したフォントセットに対応するフォントディスクリプタを使用して、 文字セット、文字コードを指定することにより対応する文字イメージを取り出すことができる。
要求したフォント属性、フォントサイズ、 回転角度と完全に一致するイメージが取り出せた場合は文字イメージに対する後処理は不用であるが、 取り出せなかった場合は、取り出した文字イメージに対して拡大 / 縮小 / 変形 / 回転の後処理を行なう必要がある。
ビットマップ形式のフォントデータの場合、 フォントマネージャはイメージに対する処理を行わない。 アウトライン形式フォントの場合は、 フォントマネージャは指定されたサイズの文字イメージとして展開するので拡大 / 縮小の後処理は不要である。 フォントマネージャが変形 / 回転を行うかどうかは実装に依存する。
取り出す文字イメージは以下に示す 2 種のデータ構造により表現される。
typedef struct { RECT frame; /* イメージ枠 */ H width; /* 文字幅 */ H height; /* 文字高さ */ PNT imgofs; /* イメージオフセット */ UH family; /* フォントファミリーの種別 */ UH fid; /* フォントID */ } FCDATA;
typedef struct { /* イメージ取り出し用データ定義 */ UW attr; /* フォント属性 */ UH height; /* 文字枠の最大高さ */ UH width; /* 文字枠の最大幅 */ UH base; /* ベース位置 */ UH leading; /* レディング */ H fkind; /* 線種の変形係数 */ H fslope; /* 傾斜の変形係数 */ H fweight; /* 太さの変形係数 */ H fwidth; /* 幅の変形係数 */ H rowbytes; /* ビットマップの幅 */ UH resv; /* 予約 */ SIZE asize; /* フォントの文字サイズ */ UH aangle; /* フォントの回転角度 */ UH pixbits; /* ビットマップのピクセルビット数 */ UB *image; /* ビットマップ開始アドレス */ FCDATA ch[1]; /* 実際は指定した文字数個の配列 */ } FDATA;
rowbytes
:
文字イメージが格納されているビットマップの幅のバイト数を示し、
必ず偶数の値となる。
なお、文字幅/高さのみの取り出し時には、この値は保証されない。
pixbits
:
文字イメージが格納されているビットマップのピクセルビット数を示す。
通常は 0x0101
である。
グレースケールによる文字イメージの取り出しを行った場合のピクセルビット数は実装に依存するが、
通常は 0x0808
( 白黒 256 階調 ) とする。
なお、文字幅 / 高さのみの取り出し時には、
この値は保証されない。
image
:
文字イメージが格納されているビットマップの先頭アドレスを示す。
このビットマップは、プレーン = 1
であり、
左上の座標は常に ( 0, 0 )
となる。
ドット形式フォントの場合、イメージ枠の外側には他の文字の文字イメージが存在するので、
無視しなければいけない。
なお、文字幅 / 高さのみの取り出し時には、この値は保証されない。
attr
:
得られた文字イメージのフォント属性を示す。 フォントセットで指定したフォント属性と一致するとは限らない。
height
:
width
:
base
:
leading
:
得られた文字イメージの属するフォントデータの最大文字高さ ( フォントサイズ )、
最大文字幅、ベース位置、レディングである。
これらの値は適用したフォントデータの生のデータであり、asize
による拡大 / 縮小が必要となる。
可変フォントサイズのフォントデータの場合、
フォントデータ全体を取り出した文字イメージのフォントサイズに展開した場合の値となる。
asize
:
得られた文字イメージの実際のサイズを示す。
文字描画を行なう場合には、
フォントセット設定時に指定した size
と asize
の比率に応じた拡大 /
縮小を行なう必要がある。
即ち、以下の倍率で拡大 / 縮小を行なう必要がある。
size.c.v / asize.c.v -- 縦の倍率 size.c.h / asize.c.h -- 横の倍率
aangle
:
得られた文字イメージの実際の回転角度を示す。
文字描画を行なう場合には、
フォントセット設定時に指定した angle
と aangle
の差に応じた回転を行う必要がある。
fkind
:
fslope
:
fweight
:
fwid
:
それぞれ得られた文字イメージに対して後処理として必要な文字の変形処理を示す。
これらの値は、フォントセット設定時に指定したフォント属性と実際に得られたフォント属性
( attr
) との違いにより、
フォントサイズに対応した適当な値が設定される。
後処理は、asize
による拡大 / 縮小処理を行なう以前に行なわれる。
いずれも 0 の場合は、対応する後処理が不要なことを示す。
fkind
:
>0の場合は、要求する文字種が袋文字または影付きの場合で、
得られた文字イメージが通常文字の場合で、
下位 8 ビットが右下のアウトラインのドット数を示し、
上位 8 ビット( 実際は 7 ビット ) が左上のアウトラインのドット数を示す。
袋文字の場合は、右下と左上のアウトラインのドット数は等しくなるが、
影付きの場合は、右下のドット数が大きくなる。
< 0
の場合は、
上記以外で要求する文字種と得られた文字イメージの文字種が異なる場合であり、
後処理は不可能であることを示す。
fslope
:
> 0
の場合は水平傾斜を示し、
上辺を右方向へずらすドット数を示す。
< 0
の場合は垂直傾斜を示し、
左辺を下方向へずらすドット数を示す。
fweight
:
> 0
の場合は ( 右方向へ ) 太くするドット数を示し、
< 0
の場合は ( 右側を ) 細くするドット数を示す。
ただし、細くする後処理は無理な場合が多く、
処理方法はインプリメントに依存する。
fwid
:
> 0
の場合は幅を広げるドット数を示し、
< 0
の場合は、幅を狭めるドット数を示す。
ch
:
指定した文字コードに対する情報であり、
文字列を指定した場合は、文字数分の配列が得られることになる。
この場合、文字列の途中で適用すべきフォントデータが切り換わった結果、
asize, fweight
等の、
inf
以外の共通情報が変化するような場合は、
そこまでの文字の情報のみが得られる。
frame
:
image, rowbytes, pixbits
で示されるビットマップ上の文字イメージ矩形を示す。
通常は、1 文字単位に独立したイメージ矩形となるが、
ベクトル形式のフォント等の場合は、
文字列中の連続した複数文字のイメージを 1 つのイメージ矩形の中にまとめて取り出す場合もある。
この場合は、先頭の文字に対するイメージ矩形が全体の矩形領域を示し、
続く文字のイメージ矩形は lefttop = rightbot
となり、
lefttop
の点がその文字のイメージ矩形の左上の位置を示すことになる。
なお、文字幅 / 高さのみの取り出し時には、この値は保証されない。
width
:
height
:
それぞれ、文字の文字幅、文字高さを示す。 横書きの場合の文字高さは、最大文字高さに固定である。 縦書きの場合は、文字幅/文字高さ共に可変となる。 文字イメージの回転の影響は受けない。
imgofs
:
イメージオフセットを示す。
文字枠の左上を原点とした場合の、
イメージ枠 ( frame
) の相対位置を示す。
なお、文字幅 / 高さのみの取り出し時には、この値は保証されない。
family
:
得られた文字イメージのフォントファミリーの種類を示す。
0 : 対象フォントファミリー 1 : 対象フォントファミリー(代替) 2 : ベースフォントファミリー 3 : ベースフォントファミリー(代替) 4 : デフォルトフォントファミリー -1 : 未定義文字 fid: 得られた文字イメージのフォントIDを示す。
typedef struct ExtendFontSpecifier { TC name[12]; /* フォントファミリー名 */ UW fclass; /* フォントクラス */ UW attr; /* フォント属性 */ SIZE size; /* 文字サイズ */ } FSSPEC; /* フォント属性:幅 */ #define FT_REGULAR 000000 /* 通常: regular */ #define FT_COND 000001 /* 圧縮: condense */ #define FT_XCOND 000002 /* 極圧縮: extra condense */ #define FT_UCOND 000003 /* 超圧縮: ultra condense */ #define FT_WIDE 000005 /* 幅広: wide */ #define FT_XWIDE 000006 /* 極幅広: extra wide */ #define FT_UWIDE 000007 /* 超幅広: ultra wide */ /* フォント属性:太さ */ #define FT_MIDI 000000 /* 中字: midium */ #define FT_XLIGHT 000010 /* 極細字: extra light */ #define FT_LIGHT 000020 /* 細字: light */ #define FT_DBOLD 000040 /* 中太字: demi bold */ #define FT_BOLD 000050 /* 太字: bold */ #define FT_XBOLD 000060 /* 極太字: extra bold */ #define FT_UBOLD 000070 /* 超太字: ultra bold */ /* フォント属性:斜体 */ #define FT_RIGHT 000000 /* 正体: right */ #define FT_HSLOPE1 000100 /* 水平斜体 : italic */ #define FT_HSLOPE2 000200 /* 水平斜体 */ #define FT_HSLOPE3 000300 /* 水平斜体 */ #define FT_VSLOPE1 000500 /* 垂直斜体 */ #define FT_VSLOPE2 000600 /* 垂直斜体 */ #define FT_VSLOPE3 000700 /* 垂直斜体 */ /* フォント属性:線種 */ #define FT_SOLID 000000 /* 通常: solid */ #define FT_OUTLINE 001000 /* 袋文字: out line */ #define FT_SHADOW 002000 /* 影付文字: shadow */ #define FT_WSHADOW 003000 /* 白影付文字: white shadow */ /* フォント属性:方向 */ /* FontDirectionAttribute */ #define FT_HDRAW 0x0000 /* 横書き文字 */ #define FT_VDRAW 0x4000 /* 縦書き文字 */ /* フォント属性:ピッチ */ #define FT_FIXED 0x0000 /* 固定ピッチ */ #define FT_PROP 0x8000 /* 比例ピッチ */ /* フォント属性:階調 */ #define FT_BW 0x0000 /* 白黒二値 */ #define FT_GRAYSCALE 0x10000 /* グレースケール */ /* フォント定義データ */ typedef struct { SCRIPT script; /* 文字セット(スクリプト)指定 */ FCLASS fclass; /* フォントクラス */ FATTR attr; /* フォント属性 */ UB size; /* フォントサイズ (文字枠の最大高さ) */ UB width; /* 文字枠の最大幅 */ UB base; /* ベース位置 */ UB leading; /* レディング */ TC name[12]; /* フォント(ファミリー)名 */ FCLASS baseclass; /* ベースフォントクラス */ TC basename[12]; /* ベースフォント(ファミリー)名 */ TC fullname[20]; /* 詳細フォント名 */ TC topcode; /* 最初の文字コード */ TC lastcode; /* 最後の文字コード */ H rsv[3]; /* 予約 */ UB imgform; /* 文字イメージの形式 */ UB widform; /* 文字幅等データの形式 */ W datasize; /* データ全体のバイトサイズ */ OFFSET offimage; /* 文字イメージへのオフセット */ OFFSET offwidth; /* 文字幅等データへのオフセット */ OFFSET offnote; /* 注釈データへのオフセット */ } FDEF; /* 文字イメージ形式 */ #define FT_FIXIMG 0 /* 固定イメージ幅形式 */ #define FT_VALIMG 1 /* 可変イメージ幅形式 */ #define FT_VECTOR 2 /* ベクトル形式(アウトライン) */ #define FT_TRUETYPE 3 /* TrueType形式 */ /* 文字幅等データ形式 */ #define FT_SIMPLEWDATA 0 /* 文字幅データ */ #define FT_INDEXWDATA 1 /* 文字幅/インデックスデータ */ #define FT_IMGWDATA 2 /* イメージ幅付き文字幅データ */ /* フォント所在指定 */ #define FT_MEM 0 /* 固定フォント */ #define FT_FILE 1 /* 動的フォント */ #define FT_SYSTEM 2 /* システムフォント */ /* フォント所在情報 */ typedef union { LINK *lnk; /* フォント実身ポインタ(動的フォント) */ FDEF *addr; /* メモリ上のフォントデータポインタ (固定フォント) */ } FLOC; /* フォント常駐指定 */ #define FT_RES 0x0100 /* 常駐タイプ指定 */ /* フォント一覧指定 */ #define FT_FONT 0 /* 同一フォントファミリーの一覧 */ #define FT_SCALL 1 /* 同一文字セットの一覧 */ #define FT_SCFAMILY 2 /* 同一文字セットの 異なるフォントファミリーの一覧 */ #define FT_LOC 3 /* 同一ファイルの一覧 */ #define FT_ALL -1 /* すべての一覧 */ #define FT_FAMILY -2 /* 異なるフォントファミリーの一覧 */ /* フォントクラス */ #define FTC_MINCHO 0x000060c6 #define FTC_DEFAULT 0x80000000 /* インデックスデータ形式 */ #define FT_IDXNONE 0 /* インデックスデータなし */ #define FT_IDXINDIRECT 1 /* 間接インデックス形式 */ /* フォント一覧 */ typedef struct { FID fid; /* フォントID */ SCRIPT script; /* 文字セット(スクリプト)指定 */ FCLASS fclass; /* フォントクラス */ FATTR attr; /* フォント属性 */ UB size; /* フォントサイズ */ UB width; /* 文字枠の最大幅 */ UB base; /* ベース位置 */ UB leading; /* レディング */ TC name[12]; /* フォント(ファミリー)名 */ H swidth; /* 基準文字幅 */ H sheight; /* 基準文字高さ */ } FLIST; /* 文字イメージデータ */ typedef struct { RECT frame; /* イメージ枠 */ H width; /* 文字幅 */ H height; /* 文字高さ */ PNT imgofs; /* イメージオフセット */ UH family; /* フォントファミリーの種別 */ UH fid; /* フォントID */ } FCDATA; /* フォントファミリー種別 */ #define FT_TARGET 0 /* 対象フォントファミリー */ #define FT_ALTTARGET 1 /* 対象フォントファミリー(代替) */ #define FT_BASE 2 /* ベースフォントファミリー */ #define FT_ALTBASE 3 /* ベースフォントファミリー(代替) */ #define FT_DEFAULT 4 /* デフォルトフォントファミリー */ #define FT_UNDEF -1 /* 未定義文字 */ /* イメージ取り出し用データ定義 */ typedef struct { UW attr; /* フォント属性 */ UH height; /* 最大文字高さ */ UH width; /* 最大文字幅 */ UH base; /* ベース位置 */ UH leading; /* レディング */ H fkind; /* 線種の変形係数 */ H fslope; /* 傾斜の変形係数 */ H fweight; /* 太さの変形係数 */ H fwidth; /* 幅の変形係数 */ H rowbytes; /* ビットマップの幅 */ UH resv; /* 予約 */ SIZE asize; /* フォントの文字サイズ */ UH aangle; /* フォントの回転角度 */ UH pixbits; /* ビットマップのピクセルビット数 */ UB *image; /* ビットマップ開始アドレス */ FCDATA ch[1]; /* 実際は指定した文字数個の配列 */ } FDATA; /* fget_img() 時のオプション */ #define FT_IMAGE 0x00000001 /* イメージの取り出しを指定 */ #define FT_SYS 0x00000002 /* (システムで使用) */ /* 標準フォントデータ構造の定義 */ /* 固定イメージサイズ形式ヘッダ */ typedef struct { UB height; /* 文字高さ */ UB width; /* 文字幅 */ H rowbytes; /* ビットマップ横バイト数 */ H margin; /* ビットマップ左端マージン */ UH offset; /* イメージデータオフセット */ } FIDATA; /* 可変イメージサイズ形式ヘッダ */ typedef struct { UB height; /* 文字高さ */ UB width; /* 文字幅 */ H rowbytes; /* ビットマップ横バイト数 */ UH offset; /* イメージデータオフセット */ UH pos[1]; /* 文字位置テーブル */ } VIDATA; /* イメージヘッダ */ typedef union { FIDATA fidata; /* 固定イメージサイズ形式 */ VIDATA vidata; /* 可変イメージサイズ形式 */ } IMGH; /* 文字幅/高さデータ */ typedef struct { B offset; /* 文字オフセット */ UB hw; /* 文字幅/高さ */ } HW; /* 文字幅データ */ typedef struct { UH s; /* 開始インデックス */ UH e; /* 終了インデックス */ H hwdata[1]; /* 文字幅/高さデータ */ } WDATA; /* インデックス文字幅データ */ typedef struct { UB widform; /* 文字幅等データの形式 */ UB idxform; /* インデックスデータ形式 */ UB rsv[2]; /* 予約 */ OFFSET offwidth; /* 文字幅データへのオフセット */ OFFSET offidxtable; /* インデックスデータへのオフセット */ } IDXWDATA; /* イメージ幅付き文字幅データ */ typedef struct { UH s; /* 開始インデックス */ UH e; /* 終了インデックス */ struct _imgwd { B offset; /* 文字オフセット */ UB hw; /* 文字幅(高さ) */ UB imghw; /* イメージ幅(高さ) */ } i[1]; } IMGWDATA;
|
WERR fdef_fnt(FLOC loc, W spec)
FLOC loc フォントの所在 W spec ::= ( FT_MEM ‖ FT_FILE ) | ( FT_RES ) | ( FT_SYSTEM ) FT_MEM : loc はフォントデータへのポインタとなる FT_FILE : loc はフォントファイルのリンクを示す。 FT_RES : 常駐フォントとして登録する。 FT_SYSTEM : システムフォントとして登録する。
≧0 正常(関数値はフォントID) <0 エラー(エラーコード)
loc
で指定したフォントデータを登録し、
そのフォントIDを関数値として戻す。
ファイル指定の場合は、 指定したファイルに含まれるフォントレコードタイプのレコードの内容をフォントデータとして登録することになる。 複数のフォントレコードが含まれる場合は、 すべてのフォントデータを登録し、最後に登録したフォントIDを関数値として戻す。
FT_RES
指定を行なった場合は、
フォントデータを常駐フォントとして登録する。
常駐フォントとして登録されたフォントデータは、
メモリ上にロードされ高速にアクセスされることが期待できる。
実際にフォントデータがメモリ上にロードされ常駐するかどうかはマネージャの実装に依存する。
ロードするメモリ領域が不足した場合は、EX_NOSPC
のエラーとなり、登録されない。
FT_SYSTEM
指定を行なった場合は、
フォントデータをシテムフォントとして登録する。
システムフォントとして登録されたフォントデータは、決して登録を削除することができない。
指定したフォントが既に登録済みの場合は、
特に何もせず、そのフォントIDを関数値として戻す。
また、フォントデータの形式が不正、
またはサポートしていない形式の場合は、EX_FTFMT
のエラーとなる。
EX_ADR : アドレス(loc.addr)のアクセスは許されていない。 EX_FONT : ファイルはフォントファイルではない。 EX_FTFMT : フォントデータの形式が不正/サポートしていない。 EX_FTID : フォントID/フォントは存在しない。 EX_LIMIT : システムの制限を超えた(登録可能な数をオーバー)。 EX_NOSPC : システムのメモリ領域が不足した。 EX_PAR : パラメータが不正である(specが不正)。
|
ERR fdel_fnt(FID fid)
FID fid フォントID
=0 正常 <0 エラー(エラーコード)
fid で指定したフォントデータの登録を削除して、以後は使用できない状態とする。
なお、指定したフォントデータが現在選択されている場合にも登録は削除され、 以後使用できなくなってしまうため、注意が必要である。
fid <0
の場合は、
システムフォントを除いて登録してあるフォントデータをすべて削除する。
EX_FTID : フォントID/フォントは存在しない。
|
WERR fdel_loc(FLOC loc, W spec)
FLOC loc フォントの所在 W spec ::= ( FT_MEM ‖ FT_FILE ) FT_MEM : loc はフォントデータへのポインタとなる FT_FILE : loc はフォントファイルのリンクを示す。
≧0 正常(関数値は削除したフォントデータの個数) <0 エラー(エラーコード)
loc
で指定したフォントデータを削除して、
以後は使用できない状態とする。
ファイル指定の場合は、 指定したファイルに含まれるフォントレコードタイプのレコードから登録されたフォントデータをすべて削除する。 フォントデータが登録されていなければ何もしない。
なお、指定したフォントデータが現在選択されている場合にも登録は削除され、 以後使用できなくなってしまうため、注意が必要である。
削除したフォントデータの数を関数値として戻す。 一つも削除しなかった場合は、0 を返す。
EX_ADR : アドレス(loc.addr)のアクセスは許されていない。 EX_PAR : パラメータが不正である(specが不正)。
|
WERR fget_def(FID fid, FDEF *def)
FID fid フォントID FDEF *def フォント定義データ
≧0 正常(関数値は FT_FILE | FT_MEM) <0 エラー(エラーコード)
fid
で指定したフォントデータの定義データを取り出し、
def
で指定した領域に格納する。
def
の領域はあらかじめ確保されていなくてはいけない。
def
内に得られた
FDEF
データの
offimage, offwidth, offnote
の値は意味を持たないため、参照してはならない。
EX_ADR : アドレス(buff)のアクセスは許されていない。 EX_FTID : フォントID / フォントは存在しない。
|
WERR fget_not(FID fid, B *buff, UW len)
FID fid フォントID B *buff 注釈データ格納領域 UW len buff のバイト数
≧0 正常(関数値は注釈データの文字数) <0 エラー(エラーコード)
fid
で指定したフォントデータの注釈データ ( 文字列 ) を取り出し、
buff
で指定した領域に格納する。
len
は buff
の領域の文字数を示し、
注釈データの文字数が len
以上の場合は len
文字数のみ格納され、
最後の TNULL
は格納されない。
関数値として注釈データの文字数が戻る。 関数値 0 は、 注釈データが存在しないことを意味する。
buff = NULL
、
または
len = 0
の場合は、
注釈文字列は格納されずに、その文字数が関数値として戻る。
EX_ADR : アドレス(buff)のアクセスは許されていない。 EX_FTID : フォントID/フォントは存在しない。 EX_PAR : パラメータが不正である(len<0)。
|
WERR flst_fon(FID fid, W mode, FLIST *buff, UW len)
FID fid フォントID W mode フォントデータ一覧条件
FT_FONT (0)
:
fid
で指定したフォントデータと同一フォントファミリーのフォントデータの一覧を取り出す
( 指定したフォントを含む ) 。
FT_ALL (-1)
:
すべてのフォントデータの一覧を取り出す。fid
の指定は無視される。
FT_FAMILY(-2)
:
異なるフォントファミリーの一覧を取り出す
( 各フォントファミリーの中から 1 つのフォントデータのみを取り出す)。
fid
の指定は無視される。
FT_SCALL (1)
:
fid
で指定したフォントデータと同一文字セットのフォントデータの一覧を取り出す。
FT_SCFAMILY(2)
:
fid
で指定したフォントデータと同一文字セットで、
異なるフォントファミリーの一覧を取り出す
( 各フォントファミリーの中から 1 つのフォントデータのみを取り出す )。
FT_LOC (3)
:
fid
で指定したフォントデータと同一ファイルのフォントデータ一覧を取り出す。
FLIST *buff フォントデータ一覧格納領域 UW len buff の要素数
≧0 正常(関数値は対象とするフォントデータ個数) <0 エラー(エラーコード)
現在登録してあるフォントデータの内、
fid, mode
で指定した条件に適合するフォントデータの一覧を取り出し、
buff
で示される領域に格納する。
関数値として、対象とするフォントデータの個数が戻る。
対象とするフォントデータの個数が、
len
より大きい場合は、len
で示される個数の一覧のみ取り出される。
buff = NULL
、または len = 0
の場合は一覧は格納されずに、
対象とするフォントデータの個数が関数値として戻る。
EX_ADR : アドレス(buff)のアクセスは許されていない。 EX_FTID : フォントID/フォントは存在しない。 EX_PAR : パラメータが不正である(len<0, modeが不正)。
|
WERR fopn_fon()
なし
≧0 正常(関数値はフォントディスクリプタ) <0 エラー(エラーコード)
フォントセットを生成する。関数値としてそのフォントディスクリプタが戻る。
EX_NOMEM : メモリ領域が不足した。
|
ERR fcls_fon(W fdesc)
W fdesc フォントディスクリプタ
=0 正常 <0 エラー(エラーコード)
fdesc
で指定されたフォントセットを削除する。
EX_FTD : フォントディスクリプタは存在しない。
|
ERR fset_fon(W fdesc, FSSPEC *spec)
W fdesc フォントディスクリプタ FSSPEC *spec フォント指定
=0 正常 <0 エラー(エラーコード)
fdesc
で指定されたフォントセットに
*spec
で指定したフォント情報
(フォントファミリー、属性、サイズ)を設定する。
EX_ADR : アドレス(fspec)のアクセスは許されていない。 EX_FTD : フォントディスクリプタは存在しない。 EX_PAR : パラメータが不正である(文字サイズが不正)。
|
ERR fget_fon(W fdesc, FSSPEC *spec)
W fdesc フォントディスクリプタ FSSPEC *spec フォント指定を格納する領域
=0 正常 <0 エラー(エラーコード)
fdesc
で指定されたフォントセットのフォント情報を取り出し、
*spec で指定した領域に戻す。
EX_ADR : アドレス(fspec)のアクセスは許されていない。 EX_FTD : フォントディスクリプタは存在しない。
|
ERR fset_ang(W fdesc, W ang);
W fdesc フォントディスクリプタ W ang 回転角度
=0 正常 <0 エラー(エラーコード)
fdesc
で指定されたフォントセットに回転角度を設定する。
EX_FTD : フォントディスクリプタは存在しない。 EX_PAR : パラメータが不正である(angが不正)。
|
WERR fget_ang(W fdesc);
W fdesc フォントディスクリプタ
≧0 正常(回転角度) <0 エラー(エラーコード)
fdesc
で指定されたフォントセットの回転角度
( 0 〜 359 の度単位の非負の数値 ) を取り出す。
EX_FTD : フォントディスクリプタは存在しない。
|
WERR fget_fam(W fdesc, W script, FNTINFO *inf);
≧0 正常(フォントID) <0 エラー(エラーコード)
フォントディスクリプタから、
script
で指定した文字セットのフォントファミリーのフォント情報を
inf
で指定した領域に取り出す。
inf
の内容は、
FSSPEC
で指定した文字サイズにスケーリングされた値である。
通常、フォントファミリーは複数のフォントデータから構成されるが、 いずれのフォントデータの情報が取り出されるかはインプリメントに依存する。
フォントデータの選択によっては、
fget_fam()
で取り出したフォント情報と fget_img()
で取り出したフォント情報とは異なる場合がある。
script
で指定した文字セットのフォントデータが存在しない場合、
EX_FTID
のエラーとなる。
この場合でも inf
には有効な内容が格納される。
EX_ADR : アドレス(inf)のアクセスは許されていない。 EX_FTID : フォントID/フォントは存在しない。 EX_FTD : フォントディスクリプタは存在しない。
|
WERR fget_img(W fdesc, FDATA *cimg, W size, W script, TC ch, UW mode)
W fdesc フォントディスクリプタ FDATA *cimg 文字イメージ情報 W size cimgで指定した領域のバイトサイズ W script 文字セット TC ch 文字コード W mode 取り出す内容の指定
mode & FT_IMAGE = 0
:
ch
で指定した文字の実際の文字イメージビットマップ以外のイメージ情報
( 即ち、文字幅 / 高さの情報 ) を取り出す。
mode & FT_IMAGE != 0
:
ch
で指定した文字の実際の文字イメージビットマップを含む全てのイメージ情報を取り出す。
mode & FT_SYS = 0
:
文字イメージビットマップは cimg
で指定した領域に格納される。
mode & FT_SYS != 0
:
文字イメージビットマップはマネージャが管理する領域に格納される。
≧0 正常(関数値は情報を取り出した文字数 ( = 1 ) ) <0 エラー(エラーコード)
fdesc
で選択したフォントセットの、
script
で指定した文字セット,
ch
で指定した文字コードのイメージ情報を取り出して、
cimg
で指定した領域に格納する。
関数値は情報が得られた文字数として常に 1 が戻る。
cimg
で指定した FDATA
の構造体のサイズは、
inf
配列の要素数が 1 のサイズである必要がある。
size
が sizeof ( FDATA )
に満たない場合はエラー ( EX_PAR )
となり、
文字のイメージ情報は一切取り出されない。
mode & FT_IMAGE = 0
の場合、
cimg
に戻される内容の
rowbytes, pixbits, image,ch[].frame, ch[].imgofs
の値は保証されないため image
で示されるメモリを参照してはならない。
mode & FT_IMAGE != 0
の場合、
cimg
の指す領域は FDATA
構造体とともに実際の文字イメージビットマップを格納できる大きさでなければならない。
size
が文字イメージビットマップを格納できる大きさに満たない場合はエラー
( EX_PAR
) となる。
mode & FT_SYS != 0
の場合、
得られたビットマップは、フォントマネージャが管理するメモリ領域上に存在する。
同一のフォントディスクリプタによる新たな文字イメージのアクセスを行なうまでは存在していることが保証される。
通常のアプリケーションは FT_SYS
を指定してはいけない。
script
指定した文字セットのフォントデータが存在しない場合、
エラーとはならないが、すべての文字コードに対して未定義文字イメージが返る。
EX_ADR : アドレス(cimg)のアクセスは許されていない。 EX_FTD : フォントディスクリプタは存在しない。 EX_PAR : パラメータが不正である(sizeが不正)。 EX_NOSPC : システムのメモリ領域が不足した。
固定フォントの場合は、フォントデータの全体の形式は以下の通りであり、 各データブロックの順序、位置は任意である。
動的フォント、即ちフォントファイルの場合は、 ファイルはフォント定義データおよび文字イメージデータのいずれかあるいは両方を含む一つ以上のレコードにより構成される。
レコードは、先頭がフォント定義データで始まるデータを格納したレコードタイプ 11 ( フォントデータレコード ) のレコード、 および文字イメージのみを格納したレコードタイプ 15 〜 31 ( システムデータ / アプリケーションレコード ) のいずれかである。
一つのフォントデータレコードには一つのフォント定義データを格納することができ、 一つのフォントファイル中には複数のフォントデータレコードを格納することができる。 通常は一つのフォントファイルには一つのフォントデータを格納するが、 複数のフォントデータが一つの文字イメージを共有する場合、 あるいは関連の強いフォントデータである場合は、 一つのフォントファイル中に複数のフォントデータを格納する。
動的フォントの場合、文字イメージデータをフォント定義データとは別のレコードに格納することができる。
この場合、文字イメージデータのレコードタイプは
レコードサブタイプ
フォント定義データの offimage
が 0 〜 127 の場合、
レコードタイプ 15 〜 31 ( システムデータ / アプリケーションレコード ) とする。
複数の文字イメージデータレコードを格納する場合は、レコードサブタイプにより区別する。
TrueType 形式の文字イメージデータの場合、 複数の文字イメージデータが一つの文字イメージデータレコードに含まれる場合がある。 この場合は、フォント定義データのレコードサブタイプにより区別する。
標準ドット形式の文字イメージデータは以下の2種類に分類される。
このうち、以下に示す固定イメージサイズ形式のみが使用できる。
固定イメージサイズ形式の文字イメージデータは以下に示す形式となる。
即ち、ビットマップ上に、固定サイズの枠が規則正しく並んでいることになる。
横に並ぶ文字数は ( rowbytes × 8 - margin ) ÷ width
となり、
右端に空きがある場合もある。
offset
は文字イメージデータの先頭からのバイトオフセットとなる。
TrueType 仕様の規定に従う。
TrueType は Apple Computer, Inc の登録商標である。
文字幅データは、 比例ピッチフォントの場合に各文字の文字幅 ( または高さ ) と文字イメージオフセットを示すデータであり、以下に示す形式である。
このデータはフォントの定義域のすべての文字ではなく、 定義域内の 1 つの連続した範囲に対して定義される。 定義されていない文字に対しては、文字幅は最大文字幅、文字オフセットは 0 とみなされる。
イメージ幅付き文字幅データは、 比例ピッチフォントの場合に各文字の文字幅 ( または高さ ) と文字イメージオフセット、およびイメージ枠の幅 ( または高さ ) を示すデータであり、以下に示す形式である。
このデータはフォントの定義域のすべての文字ではなく、 定義域内の 1 つの連続した範囲に対して定義される。 定義されていない文字に対しては、 文字幅は最大文字幅、文字オフセットは 0 、 イメージ枠は文字幅と等しいとみなされる。
イメージ枠の幅は最大文字幅を超えてはいけない。
文字幅/インデックスデータは、 各文字の文字幅を示すデータおよび文字コードと文字イメージデータ内のインデックスの対応を定義するデータである。 インデックスの定義が必要な場合に使用する。
文字幅は、文字幅/インデックスデータの先頭からのバイトオフセットにより、文字幅データ等を指定する。
インデックスデータは、定義域内での文字の順序と、文字イメージデータ内での文字の順序が異なる場合に、 文字コードと文字インデックスの対応を格納したデータを、文字幅/インデックスデータの先頭からのバイトオフセットにより指定する。
インデックスデータが存在する場合、 文字コードから計算した文字インデックスによりインデックスデータを参照し、 それにより得られた文字インデックスを使用して文字イメージデータ内の文字イメージにアクセスすることになる。 インデックスデータ形式として、 以下の間接インデックス形式がサポートされている。
間接インデックス形式は、フォント定義データが指定する最初の文字コードから、
定義域内の文字全てについて文字インデックスを格納した配列である。
特別に、文字インデックスが 0xffff
の場合は、その文字が未定義であることを表す。