この章の目次にもどる
前頁:3.8 実身/仮身マネージャにもどる
次頁:3.10 TCP/IPマネージャにすすむ

3.9 フォントマネージャ

3.9.1 フォントマネージャの機能

3.9.1.1 概要

フォントマネージャは、外殻の一部として位置付けられ、 文字描画に使用されるフォントデータの登録 / 削除 / 情報の問い合わせ / データの読み出し等の機能を持ち、 マルチプロセスの環境下での柔軟なマルチフォントの機能を提供している。

フォントマネージャは、 スクリーン表示およびイメージ転送方式によるプリントに使用されるフォント、 即ちシステムに内蔵されるフォントのみを対象とし、 プリンタ等の外部機器に組み込まれているフォントに関しては対象としていない。

通常のアプリケーションは、実際の文字描画を行う場合は、 ディスプレイプリミティブとして提供されている文字描画関数を使用すればよく、 フォントマネージャの関数を使用する必要はない。 フォントの一覧取り出しを行う場合のみフォントマネージャの関数を使用する。 フォントの登録、削除等はフォントマネージャの関数を使用するが、 通常のアプリケーションは行う必要はなく、 主としてシステムアプリケーションが行うことになる。

ディスプレイプリミティブは、フォントマネージャを使用してフォントに関する情報および実際のフォントのイメージを取り出した後、 必要に応じたイメージの後処理 ( 変形 / 拡大 / 縮小 / 回転等 ) を行ない、文字の描画を行なうことになる。

フォントマネージャとディスプレイプリミティブ
図 125 : フォントマネージャとディスプレイプリミティブ

フォントデータは、ROM またはファイルの形式で供給されることになり、 そのデータ形式としていくつかの標準形式が規定されるが、 フォントデータの形式は基本的にフォントマネージャ以外には見えない。

なお、フォントを作成するためのツールとしてのフォントエディタは 1 つの独立したアプリケーションとして位置付けられ、 フォントマネージャの機能には含まれない。

3.9.1.2 フォント

フォント

フォント ( 書体 ) とは、 目に見える形の文字表現(文字体)の集合である。

フォントは、その文字表現の基本的なデザインの違いによりフォントファミリーに体系付けられる。

フォントファミリー

フォントファミリーは、12 文字 ( 12 文字に満たない場合は後ろに 0 が詰められる ) のフォントファミリー名により区別される。 また、フォントファミリーには、 文字体の特徴を表わすフォントクラスが対応づけられる。

一つのフォントファミリーは、 一つもしくは複数のフォントデータ群から構成される。 異なる文字セットのフォントデータも一つのフォントファミリーに属することができる。

最初に登録したフォントファミリーがシステムのデフォルトフォントファミリーとなる。 デフォルトフォントファミリーは文字セットごとに決定される。 デフォルトフォントファミリーには、 ある文字セットの標準規格において規定されている全ての文字が、 一般的なデザインにより定義されていると期待してよい。

フォントクラス

フォントクラスは、文字体の特長を表わす以下に示すデータである。

フォントクラス
図 126 : フォントクラス

フォントクラスの各ビットに対応した基準は、上位のビットが最も類似度が高く、 下位にビットが最も類似度が低いため、フォントファミリーの類似度は、 フォントクラスを上位のビットから比較して、最初に異なったビットの位置により判断することができる。

フォントクラスは、フォントファミリーをその特徴により指定する場合、 または、特定のフォントファミリーが存在しない時に最も良く似ている代替フォントファミリーを選択するために使用される。 即ち、文字セットIDが同一でかつ、 フォントクラスの上位ビット側から最も多くのビットが一致しているフォントクラスに対応するフォントファミリーが代替フォントファミリーとなる。

同一のフォントファミリー名を持つフォントデータは、 同一のフォントクラスでなくてはいけないが、 異なるフォントファミリー名を持つフォントデータが、 同一のフォントクラスであってもよい。この場合、 その 2 つのフォントファミリーの文字体はかなり似ているが微妙に違うということになる。

FTC_DEFAULT ( = 0x80000000 )は、 常にデフォルトフォントファミリーに対応する特別なフォントクラスである。

フォント属性

同一フォントファミリーの内で、 主として加工による文字体の相違はフォント属性により区別される。 フォントのバリエーションは基本的には無限とも言えるが、 大部分のバリエーションは以下に定義されるフォント属性により区別可能となる。

フォント属性
図 127 : フォント属性

フォントデータにはフォントファミリーを示すフォント名が付けられているが、 さらにフォント属性等の意味を付加した 20 文字の詳細フォント名を定義される。 この詳細フォント名はフォント情報の表示にのみ使用される。

3.9.1.3 フォントデータ

フォントデータ

フォントデータはフォントを定義している実際のデータの集まりの単位であり、 対象とする文字セットで定義されている文字コード範囲内の 1 つの連続範囲に対して定義され、 その範囲を定義域と呼ぶ。 定義域は第 1 バイトと第 2 バイトの値を座標値とする (0, 0)(255, 255) の矩形領域中の 1 つの矩形領域となる。

フォントデータは文字の大きさ毎に定義される。 文字の大きさは、ポイント数、級数等の実スケールではなく、 最終的に得られる文字の高さのビットマップイメージ上でのドット数で表わされ、 これをフォントサイズと呼ぶ。なお、実スケールとドット数との変換は上位レベルで行なわれるものとする。

従って、1 つのフォントファミリーは以下に示す複数のフォントデータ群から構成されることになる。

フォントファミリーの例として以下のものがあげられる。

    ファミリー:XX明朝体
            24ドット第一水準フォントデータ
            24ドット第二水準フォントデータ
            24ドットボールドかなフォントデータ
            32ドット第一水準フォントデータ
            32ドット第二水準フォントデータ
            第一水準フォントデータ(スケーラブル)
            第二水準フォントデータ(スケーラブル)

フォントマネージャは、フォントファミリーを 1 つの単位として取り扱い、 要求された文字セット、フォント属性、フォントサイズ、 および文字コードに適用できるフォントデータをファミリー内から選択して使用する。
フォント属性、フォントサイズが適合するフォントが存在しない場合は、 所望のフォントを各種の変形処理、拡大 / 縮小 / 回転処理により機械的に発生させることが最も容易なフォントデータを選択することになる。

フォントファミリーで定義されていない文字コードに対して、 他のフォントファミリーを適用するように指定することが可能である。 この場合、そのフォントファミリーを部分フォントファミリーと呼び、 未定義文字コードを適用するフォントをベースフォントファミリーと呼ぶ。 なお、ベースフォントファミリーの適用は 1 レベルのみに限られ、 多重のベースフォントファミリーの適用は行なわれない。

部分フォントファミリーは、ある特定の文字コード領域のフォントのみを変更するために使用する。 例えば、ひらがな、カタカナだけを定義する「丸文字」のフォントファミリーに対して「丸ゴシック」 のベースフォントが定義されている場合、 「丸文字」フォントファミリーを指定したときには、 ひらがな、カタカナの文字コードに対しては「丸文字」が適用され、 それら以外の文字コードに対しては「丸ゴシック」が適用されることになる。

フォントデータの構造

フォントデータは、メモリ上のデータまたはファイルとして存在し、 基本的に以下の 4 つのデータブロックにより構成される。

フォントデータの全体構造
図 128 : フォントデータの全体構造

フォント定義データは、フォントデータに関する各種の定義データ、 共通データを含むもので以下に示す内容を持つ。

    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 :

フォント属性を示す。

size :

フォントサイズ ( 文字枠の最大高さ ) のドット数 ( 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 つの文字列である。

3.9.1.4 フォントのアクセス

フォントデータの登録

フォントを使用するためには、そのフォントデータをあらかじめ登録しておく必要がある。 登録したフォントデータはフォントID ( ≧ 0 ) により識別される。 フォントID は登録した順に 0 からの連続番号が付けられる。

文字セットごとに、最初に登録したフォントデータの属するフォントファミリーが、 デフォルトフォントファミリーとして登録される。

すでに登録されているフォントとフォントファミリー、 フォント属性が同じで、定義域が重なるフォントを登録した場合、 後から登録したフォントデータの文字が優先される。 既に登録されているフォントデータと同一のフォントデータは登録できない。

システムのスタートアップ直後は、 フォントデータが 1 つも登録されていない状態であり、 システムの初期化処理、およびユーザの切換処理として必要なフォントデータの登録が行なわれる。 登録はシステムで標準的に使用するフォントデータを先に行ない、 特にデフォルトフォントファミリーとして使用するフォントデータは一番最初に登録しなくてはならない。 なお、フォントの登録は初期化以外の任意の時点でも可能である。

フォントデータには、すべてのユーザに共通な共通フォントと、 ユーザ毎に定義される個別フォントの 2 種類がある。 共通フォントは、すべてのユーザの初期化処理で登録され、 個別フォントはユーザに応じて登録される点が異なるだけであり、 一度登録されたフォントは、 実行時のプロセスのユーザ情報に無関係にすべてのプロセスから使用可能となる。

フォントデータの所在

フォントデータは、その所在により以下に示す2つのタイプに分類される。

固定フォント :
ROM 等に固定的に存在しているフォント。
動的フォント :
ファイルとして存在しているフォント。

固定フォントの登録は、そのメモリアドレスを、 動的フォントの登録は、そのファイルを、 それぞれフォントマネージャに通知することにより行なわれる。 即ち、以下に示す 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 で指定したフォントファミリーが存在しない場合に、 代替フォントファミリーを検索するためのフォントクラスを指定する。
ただし、fclassFTC_DEFAULT ( = 0x80000000 ) の場合は、 デフォルトフォントファミリーが代替フォントファミリーとして選択される。

attr :

目的とするフォントのフォント属性を指定する。

size :

目的とするフォントのサイズを指定する。

     
   size.c.v -- 目的とするフォントの基準文字高さのドット数
   size.c.h -- 目的とするフォントの基準文字幅のドット数

name で指定したフォントファミリーが、 実際に存在するかどうかは環境に依存する。

fclass は代替フォントファミリーの検索にのみ使用される。

目的のフォントとしてデフォルトフォントファミリーを指定したい場合は、 name として空文字列を、 fclass として FTC_DEFAULT ( 0x80000000 ) を指定すればよい。

目的のフォントファミリーが存在しない場合に、 任意のフォントファミリーではなくデフォルトフォントファミリーを代替フォントファミリーとして指定したい場合は、 name として目的のフォントファミリー名を、 フォントクラスとして FTC_DEFAULT ( 0x80000000 ) を指定すればよい。

実際の文字イメージへのアクセスは、 フォントセット、文字セット、文字コードを指定して行う。 実際に文字イメージが生成されるまでのロジックを以下に述べる。

  1. システムに登録されたフォントファミリーの中から、 フォントセットで指定されたフォントファミリーを選択する。

  2. 指定されたフォントファミリーが環境に存在しない場合、 もしくはフォントセットで指定されたフォントファミリー名が空文字列の場合は、 フォントセットで指定されたフォントクラスに基づいて最も近似したフォントファミリーを検索し、 代替フォントファミリーとして選択する。

  3. 選択されたフォントファミリーの中から、 指定された文字コードが定義されたフォントデータを選択する。

  4. フォントデータが複数登録されている場合、 フォントセットで指定されたフォント属性/フォントサイズに適合するフォントデータを検索して選択する。

  5. 適合するものがない場合は、 各種の変形処理、拡大/縮小/回転処理により機械的に発生させることが最も容易なフォントデータを選択する。

  6. 選択されたフォントデータから、文字イメージを生成する。

  7. 選択されたフォントファミリーの中に、 指定された文字コードが定義されたフォントデータが存在しない場合、 ベースフォントファミリーが定義されていれば、 第 2 のフォントファミリーとしてベースフォントファミリーを選択する。

  8. ベースフォントファミリー名で指定されたフォントファミリーそのものが存在しない場合でも、 ベースフォントクラスによる代替フォントファミリーの検索を行う。

  9. ベースフォントファミリーとして選択されたフォントファミリーに対し、 3 〜 6 の処理を行う。

  10. ベースフォントファミリーが定義されていない場合、 もしくはベースフォントファミリーにも指定された文字コードが定義されたフォントデータが存在しない場合、 第 3 のフォントファミリーとしてデフォルトフォントファミリーを選択する。

  11. デフォルトフォントファミリーとして選択されたフォントファミリーに対し、 3 〜 6 の処理を行う。

  12. デフォルトフォントファミリーにも指定された文字コードが定義されたフォントデータが存在しない場合、 未定義文字イメージが生成される。未定義文字イメージの詳細はフォントマネージャの実装に依存する。

文字の回転角度の設定

フォントセットには、文字イメージの回転角度を指定することができる。

文字描画位置を中心として、 反時計方向に任意の角度回転させた文字イメージを取得することができる。 回転角度は、0 〜 の度単位の非負の数値で指定し、360 の剰余が有効となる。

文字イメージ形式

フォントマネージャから得られる文字イメージは、フォントデータの文字イメージデータ構造とは無関係に、 常にビットマップデータ形式として、以下に示す形で得られる。

フォントの文字イメージ−1
図 129 : フォントの文字イメージ−1

文字枠は、ある1つの文字を描画する場合に文字が占める仮想的な矩形領域であり、 その幅が文字幅、その高さが文字高さとなる。 フォントデータ内に含まれるすべての文字の文字枠の最大高さ ( size )、 最大幅 ( width ) がフォントデータの定義データに設定される。

また、文字枠は、フォントの属性により以下のようになる。 横書きの場合は、文字描画の起点に文字幅を加えた位置が文字間ギャップ 0 の場合の次の文字描画の起点となり、 縦書きの場合は、文字描画の起点に文字高さを加えた位置が文字間ギャップ 0 の場合の次の文字描画の起点となる。

文字高さと文字幅
図 130 : 文字高さと文字幅

ベース位置は、横書きの場合に文字を揃える位置であり、 文字枠の上端からのドット数で表わされる。 これは、フォントデータに固定の値である。この値は縦書きでは使用しない。

イメージ枠は、実際に得られるビットマップ形式の文字イメージを囲む矩形枠である。 文字枠と同じとは限らず、文字枠をはみだす場合もある。 文字枠をはみだす場合直前/直後の文字に重なることになる。 これは英文字の飾りヒゲ ( kerning ) や斜体などに使用される ( 図 131 : フォントの文字イメージ2参照)。

文字枠より小さい場合は、文字枠の残りの部分は背景部分となる。

イメージオフセットはイメージ枠が文字枠のどの部分に位置するかを示すデータであり、 文字枠左上からの相対座標で示される。 イメージオフセットは回転角度の影響を受ける。 回転した文字イメージを取り出す場合、 文字枠に対して回転操作を行った後の文字枠左上からの相対座標となる。

フォントの文字イメージ2
図 131 : フォントの文字イメージ2

フォントマネージャは、指定されたフォントセット、 属性、サイズ、文字セット、 文字コードに対する文字イメージの情報を提供するだけであり、 ディスプレイプリミティブが、 これらの情報をもとに実際の文字描画領域、文字描画位置を計算して文字描画を行なうことになる。

文字の描画位置(横書き)
図 132 : 文字の描画位置(横書き)
文字の描画位置(縦書き)
図 133 : 文字の描画位置(縦書き)
文字イメージの取り出し

指定したフォントセットに対応するフォントディスクリプタを使用して、 文字セット、文字コードを指定することにより対応する文字イメージを取り出すことができる。

要求したフォント属性、フォントサイズ、 回転角度と完全に一致するイメージが取り出せた場合は文字イメージに対する後処理は不用であるが、 取り出せなかった場合は、取り出した文字イメージに対して拡大 / 縮小 / 変形 / 回転の後処理を行なう必要がある。

ビットマップ形式のフォントデータの場合、 フォントマネージャはイメージに対する処理を行わない。 アウトライン形式フォントの場合は、 フォントマネージャは指定されたサイズの文字イメージとして展開するので拡大 / 縮小の後処理は不要である。 フォントマネージャが変形 / 回転を行うかどうかは実装に依存する。

取り出す文字イメージは以下に示す 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 :

得られた文字イメージの実際のサイズを示す。 文字描画を行なう場合には、 フォントセット設定時に指定した sizeasize の比率に応じた拡大 / 縮小を行なう必要がある。 即ち、以下の倍率で拡大 / 縮小を行なう必要がある。

     size.c.v / asize.c.v   -- 縦の倍率
     size.c.h / asize.c.h   -- 横の倍率
aangle :

得られた文字イメージの実際の回転角度を示す。 文字描画を行なう場合には、 フォントセット設定時に指定した angleaangle の差に応じた回転を行う必要がある。

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を示す。
イメージビットマップ上の文字イメージ
図 134 : イメージビットマップ上の文字イメージ
連続文字イメージ
図 135 : 連続文字イメージ

3.9.2 データ / 定数の定義

□ フォント指定

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;

3.9.3 フォントマネージャの関数

fdef_fnt
 
フォントデータの登録

【形式】

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が不正)。
fdel_fnt
 
フォントデータの削除

【形式】

ERR fdel_fnt(FID fid)

【パラメータ】

FID fid フォントID

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

fid で指定したフォントデータの登録を削除して、以後は使用できない状態とする。

なお、指定したフォントデータが現在選択されている場合にも登録は削除され、 以後使用できなくなってしまうため、注意が必要である。

fid <0 の場合は、 システムフォントを除いて登録してあるフォントデータをすべて削除する。

【エラーコード】

EX_FTID     : フォントID/フォントは存在しない。
fdel_loc
 
フォントデータの所在による削除

【形式】

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が不正)。
fget_def
 
フォント定義データの取り出し

【形式】

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 / フォントは存在しない。
fget_not
 
フォント注釈データの取り出し

【形式】

WERR    fget_not(FID fid, B *buff, UW len)

【パラメータ】

FID fid     フォントID
B   *buff   注釈データ格納領域
UW  len     buff のバイト数

【リターン値】

≧0    正常(関数値は注釈データの文字数)
<0    エラー(エラーコード)

【解説】

fid で指定したフォントデータの注釈データ ( 文字列 ) を取り出し、 buff で指定した領域に格納する。

lenbuff の領域の文字数を示し、 注釈データの文字数が len 以上の場合は len 文字数のみ格納され、 最後の TNULL は格納されない。

関数値として注釈データの文字数が戻る。 関数値 0 は、 注釈データが存在しないことを意味する。

buff = NULL、 または len = 0 の場合は、 注釈文字列は格納されずに、その文字数が関数値として戻る。

【エラーコード】

EX_ADR      : アドレス(buff)のアクセスは許されていない。
EX_FTID     : フォントID/フォントは存在しない。
EX_PAR      : パラメータが不正である(len<0)。
flst_fon
 
フォントの一覧取り出し

【形式】

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が不正)。
fopn_fon
 
フォントセットの生成

【形式】

WERR    fopn_fon()

【パラメータ】

なし

【リターン値】

≧0    正常(関数値はフォントディスクリプタ)
<0    エラー(エラーコード)

【解説】

フォントセットを生成する。関数値としてそのフォントディスクリプタが戻る。

【エラーコード】

EX_NOMEM    : メモリ領域が不足した。
fcls_fon
 
フォントセットの削除

【形式】

ERR fcls_fon(W fdesc)

【パラメータ】

W   fdesc   フォントディスクリプタ

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

fdesc で指定されたフォントセットを削除する。

【エラーコード】

EX_FTD      : フォントディスクリプタは存在しない。
fset_fon
 
フォントセットの設定

【形式】

ERR fset_fon(W fdesc, FSSPEC *spec)

【パラメータ】

W        fdesc   フォントディスクリプタ
FSSPEC   *spec   フォント指定

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

fdesc で指定されたフォントセットに *spec で指定したフォント情報 (フォントファミリー、属性、サイズ)を設定する。

【エラーコード】

EX_ADR      : アドレス(fspec)のアクセスは許されていない。
EX_FTD      : フォントディスクリプタは存在しない。
EX_PAR      : パラメータが不正である(文字サイズが不正)。
fget_fon
 
フォントセットの取り出し

【形式】

ERR fget_fon(W fdesc, FSSPEC *spec)

【パラメータ】

W        fdesc   フォントディスクリプタ
FSSPEC   *spec   フォント指定を格納する領域

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

fdesc で指定されたフォントセットのフォント情報を取り出し、 *spec で指定した領域に戻す。

【エラーコード】

EX_ADR      : アドレス(fspec)のアクセスは許されていない。
EX_FTD      : フォントディスクリプタは存在しない。
fset_ang
 
回転角度の設定

【形式】

ERR fset_ang(W fdesc, W ang);

【パラメータ】

W   fdesc   フォントディスクリプタ
W   ang     回転角度

【リターン値】

=0    正常
<0    エラー(エラーコード)

【解説】

fdesc で指定されたフォントセットに回転角度を設定する。

【エラーコード】

EX_FTD      : フォントディスクリプタは存在しない。
EX_PAR      : パラメータが不正である(angが不正)。
fget_ang
 
回転角度の取り出し

【形式】

WERR    fget_ang(W fdesc);

【パラメータ】

W   fdesc   フォントディスクリプタ

【リターン値】

≧0    正常(回転角度)
<0    エラー(エラーコード)

【解説】

fdesc で指定されたフォントセットの回転角度 ( 0 〜 359 の度単位の非負の数値 ) を取り出す。

【エラーコード】

EX_FTD      : フォントディスクリプタは存在しない。
fget_fam
 
文字フォント情報の取り出し

【形式】

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      : フォントディスクリプタは存在しない。
fget_img
 
文字イメージ情報の取り出し

【形式】

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 のサイズである必要がある。 sizesizeof ( 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    : システムのメモリ領域が不足した。

3.9.4 標準フォントデータ形式

全体の形式

固定フォントの場合

固定フォントの場合は、フォントデータの全体の形式は以下の通りであり、 各データブロックの順序、位置は任意である。

フォントデータの全体構造
図 136 : フォントデータの全体構造

動的フォントの場合

動的フォント、即ちフォントファイルの場合は、 ファイルはフォント定義データおよび文字イメージデータのいずれかあるいは両方を含む一つ以上のレコードにより構成される。

レコードは、先頭がフォント定義データで始まるデータを格納したレコードタイプ 11 ( フォントデータレコード ) のレコード、 および文字イメージのみを格納したレコードタイプ 15 〜 31 ( システムデータ / アプリケーションレコード ) のいずれかである。

一つのフォントデータレコードには一つのフォント定義データを格納することができ、 一つのフォントファイル中には複数のフォントデータレコードを格納することができる。 通常は一つのフォントファイルには一つのフォントデータを格納するが、 複数のフォントデータが一つの文字イメージを共有する場合、 あるいは関連の強いフォントデータである場合は、 一つのフォントファイル中に複数のフォントデータを格納する。

文字イメージデータの分離

動的フォントの場合、文字イメージデータをフォント定義データとは別のレコードに格納することができる。 この場合、文字イメージデータのレコードタイプは レコードサブタイプ フォント定義データの offimage が 0 〜 127 の場合、 レコードタイプ 15 〜 31 ( システムデータ / アプリケーションレコード ) とする。 複数の文字イメージデータレコードを格納する場合は、レコードサブタイプにより区別する。

特定の文字イメージデータの指定

TrueType 形式の文字イメージデータの場合、 複数の文字イメージデータが一つの文字イメージデータレコードに含まれる場合がある。 この場合は、フォント定義データのレコードサブタイプにより区別する。

文字イメージデータ形式

標準ドット形式

標準ドット形式の文字イメージデータは以下の2種類に分類される。

固定イメージサイズ形式
固定されたイメージ幅で文字イメージを格納する
可変イメージサイズ形式
文字毎に異なったイメージ幅で文字イメージを格納する

このうち、以下に示す固定イメージサイズ形式のみが使用できる。

固定イメージサイズ形式の文字イメージデータは以下に示す形式となる。 即ち、ビットマップ上に、固定サイズの枠が規則正しく並んでいることになる。 横に並ぶ文字数は ( rowbytes × 8 - margin ) ÷ width となり、 右端に空きがある場合もある。 offset は文字イメージデータの先頭からのバイトオフセットとなる。

標準ドット形式(固定イメージサイズ)
図 137 : 標準ドット形式(固定イメージサイズ)

TrueType 形式

TrueType 仕様の規定に従う。

TrueType は Apple Computer, Inc の登録商標である。

文字幅等データ形式

3.1 文字幅データ

文字幅データは、 比例ピッチフォントの場合に各文字の文字幅 ( または高さ ) と文字イメージオフセットを示すデータであり、以下に示す形式である。

このデータはフォントの定義域のすべての文字ではなく、 定義域内の 1 つの連続した範囲に対して定義される。 定義されていない文字に対しては、文字幅は最大文字幅、文字オフセットは 0 とみなされる。

標準文字幅データの形式
図 138 : 標準文字幅データの形式

イメージ幅付き文字幅データ

イメージ幅付き文字幅データは、 比例ピッチフォントの場合に各文字の文字幅 ( または高さ ) と文字イメージオフセット、およびイメージ枠の幅 ( または高さ ) を示すデータであり、以下に示す形式である。

このデータはフォントの定義域のすべての文字ではなく、 定義域内の 1 つの連続した範囲に対して定義される。 定義されていない文字に対しては、 文字幅は最大文字幅、文字オフセットは 0 、 イメージ枠は文字幅と等しいとみなされる。

イメージ枠の幅は最大文字幅を超えてはいけない。

イメージ幅指定付き文字幅データの形式
図 139 : イメージ幅指定付き文字幅データの形式

文字幅/インデックスデータ

文字幅/インデックスデータは、 各文字の文字幅を示すデータおよび文字コードと文字イメージデータ内のインデックスの対応を定義するデータである。 インデックスの定義が必要な場合に使用する。

文字幅は、文字幅/インデックスデータの先頭からのバイトオフセットにより、文字幅データ等を指定する。

インデックスデータは、定義域内での文字の順序と、文字イメージデータ内での文字の順序が異なる場合に、 文字コードと文字インデックスの対応を格納したデータを、文字幅/インデックスデータの先頭からのバイトオフセットにより指定する。

文字幅/インデックスデータ
図 140 : 文字幅/インデックスデータ

インデックスデータが存在する場合、 文字コードから計算した文字インデックスによりインデックスデータを参照し、 それにより得られた文字インデックスを使用して文字イメージデータ内の文字イメージにアクセスすることになる。 インデックスデータ形式として、 以下の間接インデックス形式がサポートされている。

間接インデックス形式は、フォント定義データが指定する最初の文字コードから、 定義域内の文字全てについて文字インデックスを格納した配列である。 特別に、文字インデックスが 0xffff の場合は、その文字が未定義であることを表す。

間接インデックス
図 141 : 間接インデックス

この章の目次にもどる
前頁:3.8 実身/仮身マネージャにもどる
次頁:3.10 TCP/IPマネージャにすすむ