Java Runtime へのフォントの追加

このドキュメントでは Java Runtime JDK 1.2 に、アジア言語および他の言語のフォントを追加する方法を説明します。特にこのドキュメントでは、これらのフォントを Java Runtime に追加するための JDK 1.2 の特別な機能について扱います。この機能は、JDK の将来のリリースでは変更になる可能性があります。

今回このドキュメントでは、日本語、韓国語、中国語および繁体字中国語フォントのインストールの方法を説明します。

Win32 プラットフォーム用の JDK 1.2 リリースは、TrueType フォントと Postscript Type1 フォントをサポートします。Solaris 用の JDK 1.2 は、F3、Type1 および TrueType などの X11 サーバが扱える拡大縮小可能なアウトラインフォントをサポートします。

font.properties ファイルの名前

いくつかの font.properties ファイルは、 JDK 1.2 に含まれて出荷されています。これらのファイルは、Java がインストールされているディレクトリの下の ../lib ディレクトリにあります。これらのファイルには、標準フォント環境に関する情報が入っています。これからの説明では、このドキュメントの読者が英語環境で作業しているものと仮定します。英語環境では、次のようにデフォルトの font.properties ファイルのファイル名には接尾辞を使用しません。
font.properties
ただし、オペレーティングシステムによってインストールされているフォントが違うので、名前に埋め込まれているオペレーティングシステム版数を使ってフォントプロパティファイルを読み取る機能があります。たとえば、Solaris 2.5.1 では TrueType フォントがサポートされないので、プロパティファイル font.properties.5.5.1 には、F3 フォントだけが含まれます。このため、次の名前のファイルを最初に検索します。
font.properties.<osVersion>
<osVersion> は、ほとんどのシステムに対して、System.getProperty("os.version") によって返されるバージョンです。Windows NT では NT と 95 を区別するために、このメソッドはオーバーライドされて 4.0 ではなく NT 4.0 が返されます。

しかし、使用環境が日本語、韓国語、中国語または繁体字中国語の場合、その特定の環境に対応する font.properties ファイルを使用する必要があります。これらのファイルは、次のようにファイル名に国またはロケール接尾辞を追加して識別します。

font.properties.<locale>
ただし、locale は次のうちの 1 つです。
ja

ko

zh

zh_TW

...
ある特定のフォントの接尾辞付きファイルを選択します。このように、繁体字中国語については font.properties.zh_TW ファイルにアクセスします。

注: <locale> は、<language>_<region>_<encoding> のように構成されます。それぞれの意味は以下のとおりです。

<language> は、System.getProperty("user.language") から返される文字列
<region> は、System.getProperty("user.region") から返される文字列
<encoding> は、System.getProperty("file.encoding") から返される文字列

この font.properties.<locale> の名前には、オペレーティングシステムのバージョンも付け加えられる場合があります。要約すると、フォントプロパティファイルは、次の順番で検索されます。


font.properties.<language>_<region>_<encoding>.<osVersion>
font.properties.<language>_<region>_<encoding>
font.properties.<language>_<region>.<osVersion>
font.properties.<language>_<region>
font.properties.<language>_<encoding>.<osVersion>
font.properties.<language>_<encoding>
font.properties.<language>_<osVersion>
font.properties.<language>
font.properties.<encoding>.<osVersion>
font.properties.<encoding>
font.properties.<osVersion>
font.properties

font.properties ファイルの使用

Java Runtime にフォントを追加するには、font.properties ファイルを操作する必要があります。font.properties ファイルは、プラットフォーム固有のファイルです。このファイルは、特定のプラットフォームで Java 仮想フォントとして使用されるフォントを示します。フォントは、タイプまたはクラスによってグループ化されます。現在、Java Runtime は次のクラスのフォントをサポートしています。

また、次のフォントスタイルをサポートしています。

font.properties ファイルは、プラットフォームのフォントに関する特定の情報を定義します。この中には次のような別名があります。

alias.timesroman=serif

alias.helvetica=sansserif
注: timesroman および helvetica は実在のフォント名ですが、JDK 1.2 では仮想フォントにこれらの別名をつけることはないので、これは良い例とはいえません。

これにはフォントの記述も入っています。この記述は、Win32 および Solaris プラットフォームの間では異なります。例ではセリフフォントを使用して、必要に応じたフォントの指定と変換の方法を説明しています。しかし、同じエントリが他の型のフォントにも適用されます。一般的に、フォントプロパティファイルにはユーザが使用したいフォントを指定するエントリがあります。これらのエントリは次のようなフォーマットを持っています。

   <virtual font name>.<style>.<index number> = <platform font name>, attributes
virtual font name は、Java Runtime が認識するフォントの名前です。platform font name は、プラットフォームの実際のフォント名です。たとえば、Dialog および Serif は Java フォント名であり、Times および Helvetica は Win32 または Solaris プラットフォームのネイティブフォント名です。index number はゼロを最高の優先順位として、フォントグリフを照合するための検索順序を指定します。

JDK 1.2 では、virtual font name と style のマトリックスが完全でなければなりません。たとえば、serifserif.boldserif.italicserif.bolditalic のようにする必要があります。serifserif.plain に相当します。このファイル内の名前は、すべて大文字と小文字を区別しません。

たとえば、JDK 1.1 の Solaris の font.properties ファイルでは、serif エントリは次のとおりです。

 serif.plain.0=-linotype-times-medium-r-normal--*-%d-*-*-p-*-iso8859-1
 serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
 serif.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific

 serif.italic.0=-linotype-times-medium-i-normal--*-%d-*-*-p-*-iso8859-1
 
 serif.bold.0=-linotype-times-bold-r-normal--*-%d-*-*-p-*-iso8859-1

 serif.bolditalic.0=-linotype-times-bold-i-normal--*-%d-*-*-p-*-iso8859-1
上記のように、「serif.plain」、「serif.italic」、「serif.bold」および「serif.bolditalic」の最初のエントリだけが指定されています。フォントの 2 つ目および 3 つ目のエントリは、デフォルトの「serif.1」および「serif.2」になります (各「serif」フォントスタイルに同じ 2 つのフォントが使われたため)。しかし、JDK 1.2 font.properties には、マトリックス全体を指定しなければなりません。
 serif.0=-linotype-times-medium-r-normal--*-%d-*-*-p-*-iso8859-1
 serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
 serif.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific

 serif.italic.0=-linotype-times-medium-i-normal--*-%d-*-*-p-*-iso8859-1
 serif.italic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
 serif.italic.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
	
 serif.bold.0=-linotype-times-bold-r-normal--*-%d-*-*-p-*-iso8859-1
 serif.bold.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
 serif.bold.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
	 
 serif.bolditalic.0=-linotype-times-bold-i-normal--*-%d-*-*-p-*-iso8859-1
 serif.bolditalic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
 serif.bolditalic.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
 
前述のとおり、plain スタイルの基本値である plain は指定する必要がありません (serif.0 はデフォルトで plain スタイルになる)。ただし、italicbold、および bolditalic は明示的に指定する必要があります。

Java Runtime へのアジア語フォントの追加

英語環境プラットフォーム上で日本語フォントなどのアジア語フォントを使用するためには、 2 つのステップを実行する必要があります。

ステップ 1: フォントのインストール

最初に、日本語、韓国語、中国語または繁体字中国語フォントを使用しているシステムにインストールする必要があります。 Windows プラットフォームユーザについては、Microsoft はこれらのアジアフォントを、NT4.0 インストレーション CD に添付して配布しています。あるいは、これらのフォントを Microsoft World Wide Web ホームページからダウンロードできます。 Solaris ユーザは Sun に連絡を取り、Solaris 環境のアジアアウトラインフォントをお求めください。

ステップ 2: フォントのコピー

システムにフォントをインストールしたあと、目的のフォントの記述を font.properties にコピーします。アジア語フォントを 1 つ追加するもっとも簡単な方法は、font.properties.<locale> ファイルを新しい font.properties ファイルに名前を変更することです。ロケールシンボルはユーザの目的のフォント名を表します。 font.properties を font.properties.<locale> で置換するとき、編集は必要ありません。それは、font.properties.<locale> が font.properties のスーパーセットだからです。 異なるフォントプロパティファイルを指定するのは、次に示すロケールシンボルです。

フォントのロケールシンボル
フォント名 font.properties シンボル
日本語 ja
韓国語 ko
中国語 zh
中国語 (繁体字) zh_TW

たとえば、韓国語フォントを使用するためには、font.properties.kofont.properties にコピーまたは名前を変更します。

Runtime での複数フォントの使用

Runtime で複数のアジア語フォントを使用することができます。このためには、font.properties ファイルを編集する必要があります。この節では、複数のアジア語フォントを使用するために必要なファイルの編集について説明します。

Win32 プラットフォームでのフォントの指定

英語版 Win32 プラットフォームには、使用可能な既定のセリフフォントが 3 つあります。そのフォントは次のとおりです。

さらに、font.properties ファイル内のセリフフォントの説明は、次のとおりです。


serif.0=Arial,ANSI_CHARSET

serif.1=WingDings,SYMBOL_CHARSET,NEED_CONVERTED

serif.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

上記の 3 行はこのプラットフォーム上で使用可能な 3 つのセリフフォントの添字を示します。各行は 1 つのセリフフォントを示し、後ろにそのフォントの 3 つの引数が付きます。

serif.0 などの serif という語のあとに表示されている数字 (0、1、2) は、Unicode、または Java 文字列エンコーディング、codepoint で対応するフォントグリフを検索する順序を示します。したがって、serif.0 および serif.1 の両方が同じ Unicode codepoint に対応するグリフを持っている場合、serif.0 のグリフが使用されます。

最初の引数は、Win32 ネイティブフォントの書体名です。各行は特定のフォントを指定します。たとえば、serif.0 の行はフォント Times New Roman を、serif.2 の行はフォント Symbol を指定しています。

2 番目の引数は *_CHARSET という形式を取ります。この例では、ANSI_CHARSET または SYMBOL_CHARSET のどちらかです。この引数は Win32 での対応するフォントの文字セットエントリを示します。詳細については、Win32 API ドキュメントを参照してください。

3 番目の引数は、もしあれば、NEED_CONVERTED です。この引数は、対応するプラットフォームフォントを Unicode でアクセスできないことを示します。この引数が存在するとき、Java Runtime は、フォントのグリフの使用を試みる前に、 Unicode 文字列をこのフォントの添字に変換する必要があります。この NEED_CONVERTED 引数を持つフォントは、対応するフォント文字セットエントリを持つ必要があります。このエントリは、Unicode 文字列を変換するために使用する文字セットコンバータを示します。

この例では、serif.1 および serif.2 はともに NEED_CONVERTED 引数を持っています。両方とも次のように font.properties ファイルにフォント文字セットエントリを持っています。


fontcharset.serif.1=sun.awt.windows.CharToByteWingDings

fontcharset.serif.2=sun.awt.CharToByteSymbol

serif.1 のフォント文字セットエントリは、WingDings グリフを描画するためには Unicode 文字列を sun.awt.windows.CharToByteWingDings コンバータを使用して変換するよう指示しています。なお、font.properties ファイルでは、すでに serif.1 のフォントが WingDings として設定されています。

文字セットコンバータの仕様については、後述の節「文字セットコンバータ」を参照してください。

注: JDK 1.2 の現在の実装では、NEED_CONVERTED は使われていません。

JDK 1.2 でのフォントファイル名

初期化にかかる時間を減らすために、現在では論理フォント名から物理フォント名へのマッピングを指定する方法があります。
filename.Arial=ARIAL.TTF
filename.Arial_Bold=ARIALBD.TTF
filename.Arial_Italic=ARIALI.TTF
filename.Arial_Bold_Italic=ARIALBI.TTF
最初のエントリは、フォント名 Arial と物理フォント名 ARIAL.TTF との間のマッピングを示しています。以降のエントリは、ほかのスタイルが適用された Arial のマッピングを示しています。これにより、各フォントファイルを開いて特定の名前のフォントを探す必要がなくなるので、初期化時間が短くなります。

Win32 フォントファイル

現在の Win32 JDK は、次のフォントプロパティファイルを提供します。


./lib/font.properties

./lib/font.properties.ar

./lib/font.properties.iw

./lib/font.properties.ja

./lib/font.properties.ko

./lib/font.properties.ru

./lib/font.properties.th

./lib/font.properties.zh

./lib/font.properties.zh.NT4.0

./lib/font.properties.zh_TW

提供されるフォントと異なるフォントが必要な場合、ユーザ独自のフォントプロパティファイルを生成する必要があります。

Solaris プラットフォームでのフォントの指定

JDK 1.2 では、font.properties ファイル内に指定されたフォントは、拡大縮小可能なフォントを参照する必要があります。しかし、これは特定のフォントのポイントサイズが要求されたときに、拡大縮小可能なフォントが必ず使われるという意味ではありません。

	-adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1

上のように xlfd 文字列が与えられた場合に X11 は、Xserver が、最初に xlfd 文字列内で見つかったエントリ (フォントファンドリ、フォントファミリ、スタイル、スラント、エンコーディングなど) に一致する拡大縮小可能なフォントを検索するように動作します。ただし、次に xlfd 文字列の特定のピクセルやポイントサイズ (この場合は 10 pt) に正確に一致するビットマップフォントを検索します。該当するビットマップフォントが見つかった場合は、X11 は、拡大縮小可能なフォントファイル内で見つかったデータから生成されたビットマップではなく、使用されるビットマップフォントファイルから直接読み取ったビットマップを返します。

たとえば、英語版 Solaris (2.6+) プラットフォーム上で serif フォントは、次のフォントで構成されます。

serif.0=-monotype-times new roman-regular-r---*-%d-*-*-p-*-iso8859-1
serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol

serif.italic.0=-monotype-times new roman-regular-i---*-%d-*-*-p-*-iso8859-1
serif.italic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol

serif.bold.0=-monotype-times new roman-bold-r---*-%d-*-*-p-*-iso8859-1
serif.bold.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bold.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol

serif.bolditalic.0=-monotype-times new roman-bold-i---*-%d-*-*-p-*-iso8859-1
serif.bolditalic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bolditalic.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol

Solaris での font.properties ファイルのこれらの行は、異なる型を持つセリフフォントの添字を示します。たとえば、書体名がセリフでスタイルがプレーンのフォントは、serif.0serif.1、および serif.2 から構成されます。さらに、これらの行は斜体のセリフフォントが serif.italic.0serif.italic.1 および serif.italic.2 から構成されることを示します。

現在、Solaris (X11) フォントの添字は Unicode の添字ではありません。これが Unicode でないため、このフォントは常に変換する必要があります。各エントリは、次のように変換の方法を示す、対応するフォント文字セットエントリを持つ必要があります。


fontcharset.serif.0=sun.io.CharToByte8859_1 

fontcharset.serif.1=sun.awt.motif.CharToByteX11Dingbats

fontcharset.serif.2=sun.awt.CharToByteSymbol

例:

fontcharset.serif.0=sun.io.CharToByte8859_1 

この行はすべての serif.0 フォントを、タイプがプレーン (serif.plain.0)、太字 (serif.bold.0)、斜体 (serif.italic.0) または太字斜体 (serif.bolditalic.0) であるかどうかにかかわらず、sun.io.CharToByte8859_1 コンバータを使用して変換することを示します。

font.properties ファイル内の xlfd 文字列が適正かどうかのテスト

拡大縮小可能なフォントを指定しなければならないのは、Java2D がアウトラインの生成などの特定の操作を、拡大縮小可能なファイルに対してしか実行できないためです。現在、Java2D コードは、TrueType、Type1、F3などの拡大縮小可能なフォントを認識できます。このため、font.properties ファイルに xlfd 文字列を入力する場合は、これらのタイプのフォントがシステムにインストールされているのを探し、これらを指定します。TrueType フォントの拡張子は、通常は「ttf」です。Type 1 フォントの拡張子は、「pfa」か「pfb」です。F3 フォントの拡張子は「f3b」です。Solaris 2.6 の「C」ロケールですべてのパッケージがインストールされている環境では、これらの形式のフォントは次の場所にあります。

 
	Type1:    /usr/openwin/lib/X11/fonts/Type1
  	TrueType: /usr/openwin/lib/X11/fonts/TrueType
  	F3:       /usr/openwin/lib/X11/fonts/F3

そのほかのロケールでは、フォントは /usr/openwin/lib/locale/ などのディレクトリにインストールされます。たとえば、/usr/openwin/lib/locale/ja の下の JA ロケールでは、次の場所にフォントがインストールされます。

	TrueType: /usr/openwin/lib/locale/ja/X11/fonts/TT
	F3:       /usr/openwin/lib/locale/ja/X11/fonts/F3 

フォントファイルの位置はロケールによって異なり、必ずしも常に /usr/openwin/lib/locale/<locale>/X11/fonts にあるとは限りませんが、一般的に /usr/openwin/lib/locale/<locale> ディレクトリの下のどこかに置かれます。

拡大縮小可能なフォントが検索されたら、拡大縮小可能なフォントファイルと同じディレクトリ内にある fonts.dir ファイルを探します。このファイルには、そのディレクトリ内に格納されるフォントのすべての有効な xlfd 文字列を一覧にしてあります。たとえば、/usr/openwin/lib/locale/ja/X11/fonts/TT ディレクトリ内にある fonts.dir ファイルには、次のようなエントリがあります。

	HG-MinchoL.ttf -ricoh-hg mincho l-medium-r-normal--0-0-0-0-m-0-jisx0208.1983-0

xlfd 文字列内に、ゼロ (0) が 4 つ連続した値があります。これらは、ピクセルサイズ、ポイントサイズ、解像度 x および解像度 y の値を示しています。この xlfd 文字列を font.properties エントリにコピーする場合は、必ず、ポイントサイズ (2 番目の 0) を「%d」に置き換えるようにします。「%d」は、あとでフォントが使用されるときに特定のポイントサイズに置換されます。また、その他の 0 の値を * (アスタリスク) に置き換えると、任意の値がこのフィールドに一致することを示します。たとえば、上のフォントが font.properties ファイル内で指定された serif フォントのエントリとして使われる場合は、次のようになります。

	serif.1=-ricoh-hg mincho l-medium-r-normal--*-%d-*-*-m-*-jisx0208.1983-0

実際にフォントが使われるときは、Java Font オブジェクトが作成されたときに指定されたポイントサイズが使われ (「%d」がこの値に置換される)、フォントは初期化されてそのポイントサイズで使用されます。

font.properties ファイル内に入力した xlfd 文字列が正しいかどうかを検証するには、「xfd」を使ってそのフォントを表示してみる方法があります。「xfd」は /usr/openwin/bin 内の X11 アプリケーションで、フォント内に見つかったすべての文字を表示します。このアプリケーションを実行するには、xlfd 文字列としてフォントを指定します。font.properties ファイル内の xlfd エントリを検証するには、「%d」を 120 (12 pt)、140 (14 pt)、160 (16 pt) などの有効なポイントサイズに置き換えます (xlfd ポイントサイズは、通常フォントポイントサイズとして知られている「ピクセルサイズ」の 10 倍ににあたる)。日本語の font.properties ファイルへの「serif.1」のエントリである上の例では、この xlfd 文字列が正しいことを検証するには、以下を実行します。

	% xfd -fn "-ricoh-hg mincho l-medium-r-normal--*-140-*-*-m-*-jisx0208.1983-0"

xlfd 文字列が正しくない場合は、xfd はウィンドウを表示せず、即座に終了してから次のようなエラーメッセージを出力します。

	Warning: Cannot convert string "<xlfd string>" to type FontStruct
	xfd:  no font to display

xlfd 文字列が正しい場合は、そのフォントに指定されたすべての文字を示すウィンドウが表示されます。文字が 256 文字より多い場合は、最初の 256 文字だけが表示されますが、アプリケーションに表示された [NextPage] ボタンをクリックして、すべてのエントリを見ることができます。

拡大縮小可能なフォントについての注

font.properties ファイルに指定されるフォントの形式は、上記に示した形式 (TrueType、Type1、または F3) のうちの 1 つでなければなりません。これらの形式のフォントがシステムにインストールされていない場合、Java2D は有効なフォントを見つけられないため、drawString ("some Text") などの操作ができません。

現在、JDK 1.2 にはバグがあり、F3 フォントの回転 (拡大縮小、または変形) ができません。このため、TrueType フォントが存在すれば、TrueType フォントを選ぶことをお勧めします。Type1 フォント対応の X サーバーにもバグがある (2.6 よりも 2.5.1 に問題が多い) ため、Type1 フォントの使用も避けることをお勧めします。

Solaris フォントファイル

現時点では、Solaris JDK は、次のフォントプロパティファイルを提供します。


./lib/font.properties

./lib/font.properties.5.6

./lib/font.properties.5.7

./lib/font.properties.cs

./lib/font.properties.el

./lib/font.properties.hu

./lib/font.properties.ja

./lib/font.properties.ja.5.6

./lib/font.properties.ko

./lib/font.properties.ko.5.6

./lib/font.properties.ko.5.7

./lib/font.properties.lt

./lib/font.properties.lv

./lib/font.properties.pl

./lib/font.properties.ru

./lib/font.properties.tr

./lib/font.properties.zh_EUC_CN

./lib/font.properties.zh_EUC_CN.5.6

./lib/font.properties.zh_EUC_CN.5.7

./lib/font.properties.zh_TW_Big5

./lib/font.properties.zh_EUC_TW

./lib/psfont.properties.ja

提供されるフォントと異なるフォントが必要な場合、ユーザ独自のフォントプロパティファイルを生成する必要があります。

除外範囲

前の項で述べたように、仮想フォント名のうしろにある数は、要求されたグリフを見つけるために実際のフォントを検索する順序を示します。仮想フォントを構成する各物理フォントでは、グリフの範囲が重複することがあります。除外範囲を追加して、物理フォント内でグリフを検索する範囲を制限できます。

たとえば、Solaris font.properties.ja ファイルでは、以下はモノスペースフォントを表しています。

monospaced.plain.0=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0201.1976-0
monospaced.plain.1=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0208.1983-0
monospaced.plain.2=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0201.1976-0
monospaced.plain.3=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
monospaced.plain.4=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
対応する除外範囲は次のとおりです。
exclusion.monospaced.0=0080-ffff

したがって、Unicode 0x0080 から Unicode 0xffff までの範囲のグリフが仮想フォントの最初のフォントから除外されるので、以降のフォント (monospaced.plain.1、monospaced.plain.2、monospaced.plain.3、monospaced.plain.4) でこれらのグリフの検索が行われます。

文字セットコンバータ

charset コンバータは、Unicode または Java 文字列エンコーディングをフォントの添字に変換します。フォントの描画については、Runtime は sun.io.CharToByteConverter のサブクラスである charset コンバータを使用します。

Runtime に独自のフォントを追加するためには、charset コンバータを生成し、font.properties file 内でそれを指定する必要があります。

ユーザ独自のプラットフォームフォントを Java セリフフォントに追加する方法を、次の例に示します。この例では、ユーザのフォントとして 0 - 0xff の添字の付いた 256 グリフがあります。このフォントグリフは Unicode 0xe000 - 0xe0ff に対応します。この例は 2 つのステップに分かれます。最初に、ユーザの fontcharset コンバータクラスを生成します。次に、フォント名およびコンバータクラス名を font.properties file 内で指定します。

ステップ 1. フォント文字セットコンバータの生成

fontcharset コンバータを生成する Java コードを次に示します。

package mypkg.converter;

import sun.io.CharToByte8859_1;
import sun.io.CharToByteConverter;
import sun.io.ConversionBufferFullException;

public class CharToByteMyFont extends sun.io.CharToByte8859_1 { 

   /*
    * This method indicates the range this font covers.
    */
   public boolean canConvert(char ch) {
      if (ch >= 0xe000 && ch <= 0xe0ff) {
         return true;
      }
      return false;
   }

   /*
    * This method converts the unicode to this font index.
    */
   public int convert(char[] input, int inStart, int inEnd, 
                      byte[] output, int outStart, int outEnd) 
                      throws ConversionBufferFullException {
      int outIndex = outStart; 
      for (int i = inStart; i < inEnd; i++) {
         char ch = input[i];
         if (ch >= 0xe000 && ch <= 0xe0ff) {
            if (outIndex >= outEnd) 
            throw new ConversionBufferFullException();
            output[outIndex++] = (byte)(ch - 0xe000);
         }
      }
      return outIndex - outStart;
   }

   /*
    * This method indicates the charset name for this font.
    */
   public String toString() {
      return "MyFont";
   }
}

ステップ 2. プロパティファイルへのフォントおよびコンバータの追加

最初に、フォント名を font.properties ファイルに設定する必要があります。そのためには、フォントの添字エントリを追加します。たとえば、セリフフォントについては、セリフフォントのあとにファイル内の次の添字順番を付けたセリフフォントを指定する行を追加します。Java Runtime は、すべてのフォントの添字番号が連続していることを要求します。

次に、前述の例の font.properties ファイルにセリフフォントを追加するために、次の行を挿入します。

serif.3=<your own font name>
添字番号は、プロパティファイルの中で 2 番目に高い添字番号である必要があります。この例では、すでに serif.0serif.1 および serif.2 を使用しています。そのため、新しいセリフフォントは serif.3 でなければなりません。serif.5 などの連続していない番号を使用した場合、「Java Runtime はそのエントリを使用しません。

次に、このフォントのコンバータを定義する必要があります。このためには、新しいフォントの fontcharset エントリが必要です。この場合、serif.3 です。次の行は、Java コード例で生成したコンバータを使用する fontcharset エントリです。

fontcharset.serif.3=mypkg.converter.CharToByteMyfont
ユーザはまた、新しく生成したコンバータが Java Runtime から可視であることを保証する必要があります。ユーザのコンバータが Java Runtime から可視であることを保証するためには、java アプリケーションの classpath が、そのコンバータへのクラスパスを含んでいる必要があります。この例では、クラス mypkg.converter.CharToByteMyfont が Java Runtime に対して可視であることを確認する必要があります。この一番簡単な方法は、このクラスを $JDK_HOME/classes/myown/package ディレクトリの下に置くことです。

font.properties ファイルのデバッグ

カスタム font.properties ファイルをデバッグするもっともよい方法は、既存のファイルと比較することです。まず、osversion、region、encoding、language に基づいて、正しい font.properties ファイルを探す必要があります。カスタムファイルとこの標準ファイルとの違いを確認する場合、代わりに使用するフォント (および除外範囲など、そのフォントに関連するその他のフィールド) 以外は同じでなければなりません。

次に demo/applets/SymbolTest 内の SymbolTest などのテストを実行して、標準の論理フォントが表示されるかどうかを調べます。