[前へ] [次へ] [目次]


外字

文字コードに収録されていない、私的に定義した文字のことを、俗に「外字」 と言います。 外字として定義した個々の文字を識別するために、文字コードに収録された 文字とは重複しない位置に、各文字の文字番号に割り振るのが普通です。 (割り当てる文字番号の詳細については、「文字コード」 を参照のこと。)

市販の電子ブック、EPWING でも、ほとんどが外字を使っています。 外字の定義状況は書籍同士でバラバラで、まったく統一感はありません。 つまり、同じ文字番号を使っていても、定義されている外字は書籍によって 違います。 外字は副本毎に定義することが可能ですが、一つの CD-ROM 書籍内でも副本に よって定義が異なることも珍しくありません。 副本によっては、数百から数千の外字を定義していることもあります。

CD-ROM 書籍では、定義した外字の字形データ (つまりフォント) を用意して います。 フォントはビットマップデータであり、書籍によっては大きさの異なる数種類 のフォントを用意しています。

逆に言えば、外字に対して提供されるデータは、フォントだけです。 ある文字番号を割り当てられた外字が、漢字なのか、発音記号なのか、 そういった補助的な情報は用意されていません。 アプリケーションプログラムが外字をサポートするためには、外字のフォント をそのまま表示する以外に方法はないでしょう。

半角外字と全角外字

CD-ROM 書籍における外字には、「全角外字」「半角外字」の二種類があります。 全角外字は用意されているフォントの横と縦の長さがおよそ 1:1 になっており、 半角外字では 1:2 になっています。

      全角外字          半角外字  
    (16×16)        (8×16)
□□□□□□□□□□□□□□□□  □□□□□□□□
□□□□□□□□□□□□□□□□  □□■■□■□□
□□□■■■■■■□□□■□□□  □□□□■□□□
□□□□□□□□■□■□■□□□  □□□■■□□□
□□□□■□□■□□■□■□□□  □□■□□■□□
□□□□■□□■■■■■■□□□  □■□□□■□□
□□■■■■■□□□■□■□□□  □□□■□■□□
□□□□□□□□□□■□■□□□  □□■□■■□□
□□□■□□□□□□□□■□□□  □■□□□■□□
□□□■□□□□□□□□■□□□  □■□□□■□□
□□□■■■■■■■■■■□□□  □■□□□■□□
□□□■□□□□□□□□■□□□  □■□□□■□□
□□□■□□□□□□□□■□□□  □■□□□■□□
□□□■■■■■■■■■■□□□  □■□□□■□□
□□□□□□□□□□□□□□□□  □□■■■□□□
□□□□□□□□□□□□□□□□  □□□□□□□□

テキストデータには、半角表示の開始と終了を表すエスケープシーケンスが あり (「テキストデータの内部形式」 を参照のこと)、 開始と終了の間に置かれたものは半角外字、それ以外のところなら全角外字に なります。

文字番号は同じでも、字形が全角と半角ではまったく異なることもあります ので、外字の文字番号だけから、全角と半角のどちらかを判断することは できません。 かならず、前方に半角開始のエスケープシーケンスが出現していたかどうか という情報に基づいて判断しないといけません。

ただし、全角か半角かの判定は EB ライブラリ側で行いますので、 アプリケーションプログラムが文脈の解析を行う必要はありません。

CD-ROM 書籍の副本には、半角外字あるいは全角外字のどちらか一方だけを 定義しているものもありますし、両方とも定義しているものもあります。

外字の大きさと外字コード

各副本には、定義している外字のフォントがビットマップ形式で収録されて います。 フォントの大きさは、縦のピクセル数を基準にすると 16, 24, 30, 48 の 4 種類があり、全角外字、半角外字それぞれのフォントの大きさ (横のピクセル数×縦のピクセル数) は次の通りになります。

縦のピクセル数 全角全角 半角外字
16 16x16 8x16
24 24x24 16x24
30 32x30 16x30
48 48x48 24x48

ただし、すべての副本でこれら 4 種類のフォントを用意しているわけでは ありません。 縦が 16 ピクセルのものは必ず用意されていますが、それ以外はないことも 珍しくありません。 (外字がまったく定義されていなければ、16 ピクセルのフォントも用意され ません。)

EB ライブラリでは、このように縦方向のピクセル数、つまり フォントの高さ (font height) を基準に、外字フォントの大きさを 区別しています。 そして、それぞれのフォントの高さ (16, 24, 30, 48) に対して、 外字コード (font code) というものを割り当てています。 フォントの高さを指定する際は、必ずこの外字コードを使います。

縦のピクセル数 外字コード
16 EB_FONT_16
24 EB_FONT_24
30 EB_FONT_30
48 EB_FONT_48

選択中の外字フォントの高さ

EB_Book オブジェクトで選択中の副本が用意している外字フォント の高さの中から一つ選んで、 選択中の外字フォントの高さ (current font height) として指定する ことができます。 EB ライブラリで外字のフォントデータ (ビットマップデータ) を取り出すには、 外字フォントの高さをあらかじめ選択しておく必要があります。

選択するには、関数 eb_set_font() を使います。 以下のプログラムは、高さ 24 ピクセルのフォントを選択する場合の例です。

/* bookEB_Book のオブジェクトで、すでに
 * 書籍に結び付けられ、副本を選択中だと仮定しています。*/
if (eb_set_font(&book, EB_FONT_24) != EB_SUCCESS) {
    printf("eb_set_font_() failed\n");
    return;
}

このプログラムでは、高さ 24 ピクセルのフォントを選択中の副本が用意して いるものと仮定していますが、実際には用意していない副本も珍しくありません。 もし、副本が高さ 24 ピクセルのフォントを用意していなければ、 eb_set_font()EB_ERR_NO_SUCH_FONT を返します。

しかし、外字を選択する前に、前もってその副本が用意しているフォントを 知りたいときもあります。 これには、2 通りの方法があります。

まず 1 つ目は、選択中の副本が用意しているフォントの高さの一覧を eb_font_list() で取得する方法です。 これは、副本コードの一覧を取得する eb_subbook_list() と 使い方が良く似ています。

EB_Font_Code font_list[EB_MAX_FONTS];
int font_count;
int i;

if (eb_font_list(&book, font_list, &font_count) != EB_SUCCESS) {
    printf("eb_font_list() failed\n");
    return;
}

for (i = 0; i < font_count; i++) {
    if (font_list[i] == EB_FONT_24)
        printf("this subbook has EB_FONT_24\n");
}

2 つ目は、eb_have_font() を使うやり方です。 この関数は、特定の高さのフォントを、選択中の副本が用意しているかどうか 調べることができます。

if (eb_have_font(&book, EB_FONT_24)) {
    printf("this subbook has EB_FONT_24\n");
}

また、選択中の副本が半角外字、全角外字を定義しているかどうかは、それぞれ eb_have_narrow_font(), eb_have_wide_font() を使って調べることができます。

if (eb_have_narrow_font(&book))
    printf("this subbook has narrow font\n");
if (eb_have_wide_font(&book))
    printf("this subbook has wide font\n");

なお、あらかじめ副本を選択しておかないと、外字の高さは選択できないので 注意して下さい。 eb_set_subbook() で選択中の副本を切り替えると、外字フォント の高さは常に未選択の状態に戻ります。

外字フォントの取り出し

外字の高さを選択した状態であれば、外字のフォントデータ (ビットマップデータ) を取り出すことができます。

フォントデータを取り出す関数は、 全角外字なら eb_wide_font_character_bitmap()、 半角外字なら eb_narrow_font_character_bitmap() です。

全角外字 0xa121 のフォントデータを取り出すプログラムは、 次のようになります。 半角外字の場合は、呼び出す関数名が変わるだけです。

/* bookEB_Book のオブジェクトで、すでに
 * 書籍に結び付けられ、副本と外字の高さを選択中だと仮定しています。*/
char bitmap[EB_SIZE_WIDE_FONT_48];

if (eb_wide_font_character_bitmap(book, 0xa121, bitmap)
    != EB_SUCCESS) {
    return;
}

ここでは、bitmap にフォントデータを格納しています。 bitmap の領域として EB_SIZE_WIDE_FONT_48 バイトを確保していますが、これは高さ 48 ピクセルの外字データを格納する ために必要なサイズを表します。

フォントデータのサイズは、外字の高さに応じて一定です。 高さ 48 ピクセルは外字の中でも最大のサイズなので、このサイズの領域を 用意すれば、どの高さの外字でも格納できます。

外字データは、ビットマップ形式のデータになっています。 背景色をビット値 0, 前景色をビット値 1 として、各ピクセルの値を並べて あります。 並び方ですが、左上からまずは右に向かってピクセルを拾っていき、左端まで 来たら一つ下の段に降りて、また右方向にピクセルを拾います。 以下、一番下の段までこれを繰り返します。

ただし、バイト内では、128, 64, 32, ...1 の桁の順にビット値を格納して います。 つまり、128 の桁は一番左のピクセル、1 の桁は一番右のピクセルに対応 します。

以下に、16x16 の全角外字のビットマップの例と、そのバイト列を記します。 背景色が□、前景色が■です。

□□□□□□□□□□□□□□□□  0x00, 0x00,
□□□□□□□□□□□□□□□□  0x00, 0x00,
□□□■■■■■■□□□■□□□  0x1f, 0x88,
□□□□□□□□■□■□■□□□  0x00, 0xc8,
□□□□■□□■□□■□■□□□  0x09, 0x28,
□□□□■□□■■■■■■□□□  0x09, 0xf8,
□□■■■■■□□□■□■□□□  0x3e, 0x28,
□□□□□□□□□□■□■□□□  0x00, 0x28,
□□□■□□□□□□□□■□□□  0x10, 0x08,
□□□■□□□□□□□□■□□□  0x10, 0x08,
□□□■■■■■■■■■■□□□  0x1f, 0xf8,
□□□■□□□□□□□□■□□□  0x18, 0x08,
□□□■□□□□□□□□■□□□  0x18, 0x08,
□□□■■■■■■■■■■□□□  0x1f, 0xf8,
□□□□□□□□□□□□□□□□  0x00, 0x00,
□□□□□□□□□□□□□□□□  0x00, 0x00,

外字フォントの変換

EB ライブラリには、外字のビットマップデータを XBM, XPM, GIF, BMP, PNG の各画像形式に変換する関数が用意されています。 変換を行う関数は、次の 5 つです。

eb_bitmap_to_xbm() XBM への変換
eb_bitmap_to_xpm() XPM への変換
eb_bitmap_to_gif() GIF への変換
eb_bitmap_to_bmp() BMP への変換
eb_bitmap_to_png() PNG への変換

どの関数も呼び出し方は同じですが、ここでは XBM への変換のプログラム例 を示します。

/* bitmap に高さ 16 の全角外字のビットマップデータが格納
 * されていると仮定しています。*/
char bitmap[EB_SIZE_WIDE_FONT_16];
char xbm[EB_SIZE_WIDE_FONT_16_XBM];
size_t xbmsize;

if (eb_wide_font_character_bitmap(bitmap, EB_WIDTH_WIDE_FONT_16,
    EB_HEIGHT_FONT_16, xbm, &xbmsize) != EB_SUCCESS) {
    return;
}

XPM, GIF, PNG への変換では、前景色は黒、背景色は透明になります。 BMP への変換では、前景色は黒、背景色は白になります。 XBM はモノクロ図版用のデータ形式なので、色の設定はありません。

テキスト中の外字

外字はテキストデータ (本文、メニューなど) の中で使われています。

アプリケーションプログラムが、テキストデータ中に出現する外字を識別して 処理を行うには、外字に対するフックを設定して、フック関数の中で処理する ことになります。

外字に対するフックは、全角外字に対する EB_HOOK_WIDE_FONT と 半角外字に対する EB_HOOK_NARROW_FONT の二種類があります。 いずれも、外字が一字出現する度に、設定したフック関数を呼び出します。

フックの扱い方については、「フックコードの一覧」 を参照のこと。

データ型の詳細

この節で説明しているデータ型を使うには、次のようにヘッダファイルを 読み込んで下さい。

#include <eb/eb.h>

EB_Font_Code

外字コードは、外字の高さ (ピクセル数) を表します。 現在のところ、定義されている高さは次の通りです。

外字コードの実体は整数値ですが、EB_FONT_16 の値は 16 では ありません。 他も同様ですので、注意して下さい。

EB_FONT_INVALID は特別な外字コードで、不正な外字コード値を 表すために用います。

定数の詳細

この節で説明している定数を使うには、次のようにヘッダファイルを 読み込んで下さい。

#include <eb/font.h>

定数 EB_WIDTH_NARROW_FONT_16

定数 EB_WIDTH_NARROW_FONT_24

定数 EB_WIDTH_NARROW_FONT_30

定数 EB_WIDTH_NARROW_FONT_48

定数 EB_WIDTH_WIDE_FONT_16

定数 EB_WIDTH_WIDE_FONT_24

定数 EB_WIDTH_WIDE_FONT_30

定数 EB_WIDTH_WIDE_FONT_48

これらの定数は、半角、全角およびそれぞれの高さ (外字コード) の外字一個 分の幅 (横方向のピクセル数) を int 型で表しています。

定数 EB_HEIGHT_NARROW_FONT_16

定数 EB_HEIGHT_NARROW_FONT_24

定数 EB_HEIGHT_NARROW_FONT_30

定数 EB_HEIGHT_NARROW_FONT_48

定数 EB_HEIGHT_WIDE_FONT_16

定数 EB_HEIGHT_WIDE_FONT_24

定数 EB_HEIGHT_WIDE_FONT_30

定数 EB_HEIGHT_WIDE_FONT_48

これらの定数は、半角、全角およびそれぞれの高さ (外字コード) の外字一個分 の縦方向のピクセル数を int 型で表しています。

EB_HEIGHT_NARROW_FONT_16 および EB_HEIGHT_WIDE_FONT_16 の実際の値は 16 です。 (外字コード EB_FONT_16 の実際の値は 16 ではありませんので、 注意して下さい。)

定数 EB_SIZE_NARROW_FONT_16

定数 EB_SIZE_NARROW_FONT_24

定数 EB_SIZE_NARROW_FONT_30

定数 EB_SIZE_NARROW_FONT_48

定数 EB_SIZE_WIDE_FONT_16

定数 EB_SIZE_WIDE_FONT_24

定数 EB_SIZE_WIDE_FONT_30

定数 EB_SIZE_WIDE_FONT_48

これらの定数は、半角、全角およびそれぞれの高さ (外字コード) の外字一個分 のビットマップデータを格納するのに必要な領域の大きさを表しています。 値は int 型で、単位はバイトです。

定数 EB_SIZE_NARROW_FONT_16_XBM

定数 EB_SIZE_NARROW_FONT_24_XBM

定数 EB_SIZE_NARROW_FONT_30_XBM

定数 EB_SIZE_NARROW_FONT_48_XBM

定数 EB_SIZE_WIDE_FONT_16_XBM

定数 EB_SIZE_WIDE_FONT_24_XBM

定数 EB_SIZE_WIDE_FONT_30_XBM

定数 EB_SIZE_WIDE_FONT_48_XBM

これらの定数は、半角、全角およびそれぞれの高さ (外字コード) の外字一個分 のビットマップデータを eb_bitmap_to_xbm() を用いて XBM 形式 に変換する際に、変換後の XBM 形式のデータの大きさを表しています。 値は int 型で、単位はバイトです。

定数 EB_SIZE_NARROW_FONT_16_XPM

定数 EB_SIZE_NARROW_FONT_24_XPM

定数 EB_SIZE_NARROW_FONT_30_XPM

定数 EB_SIZE_NARROW_FONT_48_XPM

定数 EB_SIZE_WIDE_FONT_16_XPM

定数 EB_SIZE_WIDE_FONT_24_XPM

定数 EB_SIZE_WIDE_FONT_30_XPM

定数 EB_SIZE_WIDE_FONT_48_XPM

これらの定数は、半角、全角およびそれぞれの高さ (外字コード) の外字一個分 のビットマップデータを eb_bitmap_to_xpm() を用いて XPM 形式 に変換する際に、変換後の XPM 形式のデータの大きさを表しています。 値は int 型で、単位はバイトです。

定数 EB_SIZE_NARROW_FONT_16_GIF

定数 EB_SIZE_NARROW_FONT_24_GIF

定数 EB_SIZE_NARROW_FONT_30_GIF

定数 EB_SIZE_NARROW_FONT_48_GIF

定数 EB_SIZE_WIDE_FONT_16_GIF

定数 EB_SIZE_WIDE_FONT_24_GIF

定数 EB_SIZE_WIDE_FONT_30_GIF

定数 EB_SIZE_WIDE_FONT_48_GIF

これらの定数は、半角、全角およびそれぞれの高さ (外字コード) の外字一個分 のビットマップデータを eb_bitmap_to_gif() を用いて GIF 形式 に変換する際に、変換後の GIF 形式のデータの大きさを表しています。 値は int 型で、単位はバイトです。

定数 EB_SIZE_NARROW_FONT_16_BMP

定数 EB_SIZE_NARROW_FONT_24_BMP

定数 EB_SIZE_NARROW_FONT_30_BMP

定数 EB_SIZE_NARROW_FONT_48_BMP

定数 EB_SIZE_WIDE_FONT_16_BMP

定数 EB_SIZE_WIDE_FONT_24_BMP

定数 EB_SIZE_WIDE_FONT_30_BMP

定数 EB_SIZE_WIDE_FONT_48_BMP

これらの定数は、半角、全角およびそれぞれの高さ (外字コード) の外字一個分 のビットマップデータを eb_bitmap_to_bmp() を用いて BMP 形式 に変換する際に、変換後の BMP 形式のデータの大きさを表しています。 値は int 型で、単位はバイトです。

定数 EB_SIZE_NARROW_FONT_16_PNG

定数 EB_SIZE_NARROW_FONT_24_PNG

定数 EB_SIZE_NARROW_FONT_30_PNG

定数 EB_SIZE_NARROW_FONT_48_PNG

定数 EB_SIZE_WIDE_FONT_16_PNG

定数 EB_SIZE_WIDE_FONT_24_PNG

定数 EB_SIZE_WIDE_FONT_30_PNG

定数 EB_SIZE_WIDE_FONT_48_PNG

これらの定数は、半角、全角およびそれぞれの高さ (外字コード) の外字一個分 のビットマップデータを eb_bitmap_to_png() を用いて PNG 形式 に変換する際に、変換後の PNG 形式のデータの大きさを表しています。 値は int 型で、単位はバイトです。

関数の詳細

この節で説明している関数を使うには、次のようにヘッダファイルを読み込んで 下さい。

#include <eb/font.h>

EB_Error_Code eb_font (EB_Book *book, EB_Font_Code *font_code)

関数 eb_font() は、選択している副本において、選択中の 外字フォントの高さを表す外字コードを font_code の指す領域に 書き込みます。

成功すると関数は EB_SUCCESS を返します。 失敗すると font_code の指す領域に EB_FONT_INVALID を書き込み、原因を示すエラーコードを返します。

あらかじめ、外字フォントの高さが選択されていなければなりません。 外字が選択されていなければ、EB_ERR_NO_CUR_FONT を返します。 副本そのものを選択していない場合も、同様です。

EB_Error_Code eb_set_font (EB_Book *book, EB_Font_Code font_code)

関数 eb_set_font() は、選択中の副本における外字フォントの 高さをセットします。 セットする外字フォントの「高さ」は、対応する外字コードを引数 font_code で指定します。

この関数は、成功すると EB_SUCCESS を返し、指定した「高さ」が 「選択中の外字フォントの高さ」となります。 すでに外字フォントの高さを選択していた場合は、いったん未選択の状態に してからあらためて font_code を選択します。

失敗すると原因を示すエラーコードを返し、外字フォントの高さは未選択の 状態になります。

あらかじめ、book 内のいずれかの副本が選択されていなくては なりません。 book が副本を選択していなければ、EB_ERR_NO_CUR_SUB を返します。 また、その副本が持っていない外字フォントの高さが指定されると、 EB_ERR_NO_SUCH_FONT を返します。

void eb_unset_font (EB_Book *book)

関数 eb_unset_font() は、選択中の外字フォントの高さを未選択 の状態に戻します。 book が書籍に結び付いていない場合や副本が選択されていない場合、 もしくは外字フォントの高さが選択されていない場合は何もしません。

EB_Error_Code eb_font_list (EB_Book *book, EB_Font_Code *font_list, int *font_count)

関数 eb_font_list() は、選択中の副本が定義している外字の 高さの一覧を EB_Font_Code 型の配列にして、font_list の指す領域に書き込みます。

配列は、最大で EB_MAX_FONTS 個の要素を持ちます。 加えて、書籍が収録している副本の個数を font_count の指す領域に 書き込みます。 (現在のバージョンでは 、EB_MAX_FONTS の値は 4 になっています。 高さ 16, 24, 30, 48 ピクセルの 4 種類です。)

成功すると、関数は EB_SUCCESS を返します。 失敗すると、font_count の指す領域に 0 を書き込み、原因を示す エラーコードを返します。

あらかじめ、book 内のいずれかの副本が選択されていなくては なりません。 book が副本を選択していなければ、EB_ERR_NO_CUR_SUB を返します。

int eb_have_font (EB_Book *book, EB_Font_Code font_code)

関数 eb_font() は、font_code で指定した高さの 外字フォントを、選択中の副本が持っているかどうかを調べます。

持っていれば 1 を返し、持っていなければ 0 を返します。 book が副本を選択していない場合も 0 を返します。

EB_Error_Code eb_font_height (EB_Book *book, int *height)

関数 eb_font_height() は、book が選択中の 外字フォントの高さ (縦方向のピクセル数) を height の指す領域に 書き込みます。

成功すると、関数は EB_SUCCESS を返します。 失敗すると、height の指す領域に 0 を書き込み、原因を示す エラーコードを返します。

あらかじめ、book は外字フォントの高さを選択していなくては なりません。 選択していない場合は、EB_ERR_NO_CUR_FONT を返します。

EB_Error_Code eb_font_height2 (EB_Font_Code font_code, int *height)

eb_font_height() と似ていますが、選択中の副本ではなく、引数 font_height で指定された外字コードの高さ (縦方向のピクセル数) を書き込む点が異なります。

int eb_have_narrow_font (EB_Book *book)

int eb_have_wide_font (EB_Book *book)

関数 eb_have_narrow_font() は、選択中の副本が半角外字を定義 しているかどうかを調べます。 同様に、関数 eb_have_wide_font() は、全角外字を定義しているか どうかを調べます。

定義していれば 1 を、定義していなければ 0 を返します。 book が副本を選択していない場合も 0 を返します。

EB_Error_Code eb_narrow_font_width (EB_Book *book, int *width)

EB_Error_Code eb_wide_font_width (EB_Book *book, int *width)

関数 eb_narrow_font_width() は、book が選択中の 外字フォントの高さにおける半角外字の幅 (横方向のピクセル数) を、 height の指す領域に書き込みます。 同様に、eb_wide_font_width() は全角外字の幅を書き込みます。

成功すると、関数は EB_SUCCESS を返します。 失敗すると、width の指す領域に 0 を書き込み、原因を示す エラーコードを返します。

あらかじめ、book は外字の高さを選択していなくてはなりません。 選択していない場合は、EB_ERR_NO_CUR_FONT を返します。

EB_Error_Code eb_narrow_font_width2 (EB_Font_Code font_code, int *width)

EB_Error_Code eb_wide_font_width2 (EB_Font_Code font_code, int *width)

eb_narrow_font_width(), eb_wide_font_width() と 似ていますが、選択中の副本ではなく、引数font_height で指定された 外字コードの幅 (横方向のピクセル数) を書き込む点が異なります。

EB_Error_Code eb_narrow_font_size (EB_Book *book, size_t *size)

EB_Error_Code eb_wide_font_size (EB_Book *book, size_t *size)

関数 eb_narrow_font_size() は、book が選択中の 外字フォントの高さにおける半角外字一個分のデータサイズ (バイト数) を、 size の指す領域に書き込みます。 同様に、eb_wide_font_size() は全角外字のサイズを書き込みます。

成功すると、関数は EB_SUCCESS を返します。 失敗すると、size の指す領域に 0 を書き込み、原因を示す エラーコードを返します。

あらかじめ、book は外字フォントの高さを選択していなくては なりません。 選択していない場合は、EB_ERR_NO_CUR_FONT を返します。

EB_Error_Code eb_narrow_font_size2 (EB_Font_Code font_code, size_t *size)

EB_Error_Code eb_wide_font_size2 (EB_Font_Code font_code, size_t *size)

eb_narrow_font_size(), eb_wide_font_size() と 似ていますが、選択中の副本ではなく、引数 font_height で指定 された外字コードの外字一個分のデータサイズを書き込む点が異なります。

EB_Error_Code eb_narrow_font_start (EB_Book *book, int *start)

EB_Error_Code eb_wide_font_start (EB_Book *book, int *start)

関数 eb_narrow_font_start() は、book が選択中の 副本における半角外字の先頭の文字番号 (半角外字の文字番号の中で最小のもの) を、start の指す領域に書き込みます。

成功すると、関数は EB_SUCCESS を返します。 失敗すると、原因を示すエラーコードを返します。

あらかじめ、book は副本を選択していなくてはなりません。 選択していない場合は、EB_ERR_NO_CUR_SUB を返します。 副本が半角外字を定義していない場合は、EB_ERR_NO_CUR_FONT を 返します。

関数 eb_wide_font_start() は、半角外字ではなく全角外字に ついて調べるという点を除いて、eb_narrow_font_start() と同じ です。

EB_Error_Code eb_narrow_font_end (EB_Book *book, int *end)

EB_Error_Code eb_wide_font_end (EB_Book *book, int *end)

関数 eb_narrow_font_end() は、book が選択中の副本 における半角外字の最後の文字番号 (半角外字の文字番号の中で最大のもの) を、 start の指す領域に書き込みます。

成功すると、関数は EB_SUCCESS を返します。 失敗すると、原因を示すエラーコードを返します。

あらかじめ、book は副本を選択していなくてはなりません。 選択していない場合は、EB_ERR_NO_CUR_SUB を返します。 副本が半角外字を定義していない場合は、EB_ERR_NO_CUR_FONT を 返します。

関数 eb_wide_font_end() は、半角外字ではなく全角外字について 調べるという点を除いて、eb_narrow_font_end() と同じです。

EB_Error_Code eb_narrow_font_character_bitmap (EB_Book *book, int character_number, char *bitmap)

EB_Error_Code eb_wide_font_character_bitmap (EB_Book *book, int character_number, char *bitmap)

関数 eb_narrow_font_character_bitmap() は、book が選択中の副本で定義している、半角外字のビットマップデータを取り出します。 取り出す外字の文字番号を、character_number で指定します。

成功すると、関数はビットマップデータを bitmap の指す領域に 書き込み、EB_SUCCESS を返します。 失敗すると、bitmap の指す領域に空文字列を書き込み、原因を示す エラーコードを返します。

あらかじめ、book は外字フォントの高さを選択していなくては なりません。 選択していない場合は、EB_ERR_NO_CUR_FONT を返します。 副本が半角外字を定義していない場合も、やはり EB_ERR_NO_CUR_FONT を返します。 文字番号 character_number が外字の定義範囲外にある場合は、 EB_ERR_NO_SUCH_CHAR_BMP を返します。

関数 eb_wide_font_character_bitmap() は、半角外字ではなく 全角外字のビットマップデータを取り出すという点を除いて、 eb_narrow_font_character_bitmap() と同じです。

ビットマップデータの形式については、 「外字フォントの取り出し」 を参照のこと。

EB_Error_Code eb_forward_narrow_font_character (EB_Book *book, int n, int *character_number)

EB_Error_Code eb_forward_wide_font_character (EB_Book *book, int n, int *character_number)

関数 eb_forward_narrow_font_character() は、book が選択中の副本で定義されている半角外字の文字番号 character_numbern 個後ろに位置する外字の文字番号を取得します。

まず、関数を呼び出す際に、character_number の指す領域に 文字番号を書き込んでおきます。 関数の処理が成功すると、戻ったときに n 個分だけ後方の文字番号 に書き換わっています。

成功すると、関数は EB_SUCCESS を返します。 失敗すると、原因を示すエラーコードを返します。

あらかじめ、book は副本を選択していなくてはなりません。 選択していない場合は、EB_ERR_NO_CUR_SUB を返します。 副本が半角外字を持っていない場合は、EB_ERR_NO_CUR_FONT を 返します。

n 個後ろにもう外字がない場合や、呼び出した際に character_number の指す領域に書き込んであった文字番号が外字の 定義範囲外にある場合は EB_ERR_NO_SUCH_CHAR_BMP を返します。

n には負の数を指定することもできます。 この場合、次の呼び出しと等価になります。

/* n < 0 とする */
eb_backward_narrow_font_character (book, -n, character_number);

関数 eb_forward_wide_font_character() は、半角外字ではなく 全角外字について操作するという点を除いて、 eb_forward_narrow_font_character() と同じです。

EB_Error_Code eb_backward_narrow_font_character (EB_Book *book, int n, int *character_number)

EB_Error_Code eb_backward_wide_font_character (EB_Book *book, int n, int *character_number)

関数 eb_backward_narrow_font_character()eb_forward_narrow_font_character() とはちょうど逆の関数です。 book が選択中の副本で定義されている半角外字の文字番号 character_numbern 個前方に位置する外字の 文字番号を取得します。

同様に、eb_backward_wide_font_character() は、全角外字に ついて n 個前方の外字の文字番号を取得する関数で、 eb_forward_wide_font_character() と反対の関数です。

n には負の数を指定することも可能で、それぞれ次の呼び出しと 等価になります。

/* 半角外字の場合 (n < 0) */
eb_forward_narrow_font_character (book, -n, character_number);

/* 全角外字の場合 (n < 0) */
eb_forward_wide_font_character (book, -n, character_number);

EB_Error_Code eb_narrow_font_xbm_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_narrow_font_xpm_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_narrow_font_gif_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_narrow_font_bmp_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_narrow_font_png_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_wide_font_xbm_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_wide_font_xpm_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_wide_font_gif_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_wide_font_bmp_size (EB_Font_Code height, size_t *size)

EB_Error_Code eb_wide_font_png_size (EB_Font_Code height, size_t *size)

最初の 5 つの関数 (eb_narrow_font_xbm_size()eb_narrow_font_png_size()) は、外字コード height の半角外字一個のビットマップを XBM, XPM, GIF, BMP, PNG 形式にそれぞれ変換 したときのデータサイズを size の指す領域に書き込みます。

同様に、後ろの 5 つの関数 (eb_wide_font_xbm_size()eb_wide_font_png_size()) は、全角外字を変換したときの データサイズを書き込みます。

いずれの関数も、成功すると EB_SUCCESS を返します。 失敗すると、size の指す領域に 0 を書き込み、原因を示す エラーコードを返します。

EB_Error_Code eb_bitmap_to_xbm (const char *bitmap, int width, int height, char *image, size_t *image_length)

EB_Error_Code eb_bitmap_to_xpm (const char *bitmap, int width, int height, char *image, size_t *image_length)

EB_Error_Code eb_bitmap_to_gif (const char *bitmap, int width, int height, char *image, size_t *image_length)

EB_Error_Code eb_bitmap_to_bmp (const char *bitmap, int width, int height, char *image, size_t *image_length)

EB_Error_Code eb_bitmap_to_png (const char *bitmap, int width, int height, char *image, size_t *image_length)

これら 5 つの関数は、eb_narrow_font_character() または eb_wide_font_character() で取り出した外字のビットマップを XBM, XPM, GIF, BMP, PNG 形式にそれぞれ変換します。

ビットマップデータの指す領域を bitmap で指定し、ビットマップの 高さと幅を width, height で渡します。

関数の呼び出しから戻ると、image の指す領域に変換後のデータが 書き込まれ、image_length の指す領域に変換後のデータの大きさが 書き込まれます。

XPM, GIF, PNG への変換では、前景色は黒、背景色は透明になります。 BMP への変換では、前景色は黒、背景色は白になります。 XBM はモノクロ図版用のデータ形式なので、色の設定はありません。

サンプルプログラム

/*                                                            -*- C -*-
 * Copyright (c) 2002-2006  Motoyuki Kasahara
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the project nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*
 * 使用方法:
 *     font <book-path> <subbook-index>
 * 例:
 *     font /cdrom 0
 * 説明:
 *     <book-path> で指定した CD-ROM 書籍から特定の副本を選び、その
 *     副本が定義している半角外字 (高さ 16 ピクセル) をすべてアスキー
 *     アートで表示します。
 *
 *     その副本が、高さ 16 ピクセルの半角外字を定義していないと、エ
 *     ラーになります。
 *
 *     <subbook-index> には、検索対象の副本のインデックスを指定しま
 *     す。インデックスは、書籍の最初の副本から順に 0、1、2 ... に
 *     なります。
 */
#include <stdio.h>
#include <stdlib.h>

#include <eb/eb.h>
#include <eb/error.h>
#include <eb/font.h>

int
main(int argc, char *argv[])
{
    EB_Error_Code error_code;
    EB_Book book;
    EB_Subbook_Code subbook_list[EB_MAX_SUBBOOKS];
    int subbook_count;
    int subbook_index;
    int font_start;
    unsigned char bitmap[EB_SIZE_NARROW_FONT_16];
    int i, j;

    /* コマンド行引数をチェック。*/
    if (argc != 3) {
        fprintf(stderr, "Usage: %s book-path subbook-index\n",
            argv[0]);
        exit(1);
    }

    /* EB ライブラリと `book' を初期化。*/
    eb_initialize_library();
    eb_initialize_book(&book);

    /* 書籍を `book' に結び付ける。*/
    error_code = eb_bind(&book, argv[1]);
    if (error_code != EB_SUCCESS) {
        fprintf(stderr, "%s: failed to bind the book, %s: %s\n",
            argv[0], eb_error_message(error_code), argv[1]);
        goto die;
    }

    /* 副本の一覧を取得。*/
    error_code = eb_subbook_list(&book, subbook_list, &subbook_count);
    if (error_code != EB_SUCCESS) {
        fprintf(stderr, "%s: failed to get the subbbook list, %s\n",
            argv[0], eb_error_message(error_code));
        goto die;
    }

    /* 副本のインデックスを取得。*/
    subbook_index = atoi(argv[2]);

    /*「現在の副本 (current subbook)」を設定。*/
    error_code = eb_set_subbook(&book, subbook_list[subbook_index]);
    if (error_code != EB_SUCCESS) {
        fprintf(stderr, "%s: failed to set the current subbook, %s\n",
            argv[0], eb_error_message(error_code));
        goto die;
    }

    /*「現在の外字の大きさ」を設定。*/
    if (eb_set_font(&book, EB_FONT_16) < 0) {
        fprintf(stderr, "%s: failed to set the font size, %s\n",
            argv[0], eb_error_message(error_code));
        goto die;
    }

    /* 外字の開始位置を取得。*/
    error_code = eb_narrow_font_start(&book, &font_start);
    if (error_code != EB_SUCCESS) {
        fprintf(stderr, "%s: failed to get font information, %s\n",
            argv[0], eb_error_message(error_code));
        goto die;
    }

    i = font_start;
    for (;;) {
        /* 外字のビットマップデータを取得。*/
        error_code = eb_narrow_font_character_bitmap(&book, i,
            (char *)bitmap);
        if (error_code != EB_SUCCESS) {
            fprintf(stderr, "%s: failed to get font data, %s\n",
                argv[0], eb_error_message(error_code));
            goto die;
        }

        /* ビットマップをアスキーアートにして出力。*/
        printf("code point=%04x\n", i);
        for (j = 0; j < 16; j++) {
            fputc((bitmap[j] & 0x80) ? '*' : ' ', stdout);
            fputc((bitmap[j] & 0x40) ? '*' : ' ', stdout);
            fputc((bitmap[j] & 0x20) ? '*' : ' ', stdout);
            fputc((bitmap[j] & 0x10) ? '*' : ' ', stdout);
            fputc((bitmap[j] & 0x08) ? '*' : ' ', stdout);
            fputc((bitmap[j] & 0x04) ? '*' : ' ', stdout);
            fputc((bitmap[j] & 0x02) ? '*' : ' ', stdout);
            fputc((bitmap[j] & 0x01) ? '*' : ' ', stdout);
            fputc('\n', stdout);
        }
        fputs("--------\n", stdout);

        /* 外字の文字番号を一つ進める。*/
        error_code = eb_forward_narrow_font_character(&book, 1, &i);
        if (error_code != EB_SUCCESS)
            break;
    }
        
    /* 書籍と EB ライブラリの利用を終了。*/
    eb_finalize_book(&book);
    eb_finalize_library();
    exit(0);

    /* エラー発生で終了するときの処理。*/
  die:
    eb_finalize_book(&book);
    eb_finalize_library();
    exit(1);
}

[前へ] [次へ] [目次]