« 2008年10月 | トップページ | 2009年1月 »

2008年12月

2008年12月25日 (木)

アイコン。

TrueType/OpenTypeフォント解析ツールのT2FAnalyzerのアイコンを変更しました。

Icon

paradlx様より頂いたものです。ありがとうございますwink

そういえば、もう今年も終わりが近づいてきた。振り返ると英語三昧だったような・・・ODBC(Open DataBase Connectivity)のマニュアルから始まって、TrueType・OpenTypeフォントの仕様書、Unsicribe関連の文書、規格化が進んでいる?10進浮動小数IEEE754rの文書、LL(∞)のパーサージェネレータCocoRのマニュアルとDelphiのソースを出力するようにソースの改変・・更には、Windowsで使われてる実行形式のファイルフォーマットPE/COFFの仕様書・・すべて英語だし・・

ODBCは気合入れたので理解がすごい深まった。今更ODBCなんだけど、これを理解することで、JDBCやADO.NETとのつながりも見えてきた。特に、ODBCとJDBCを比較するとおもしろいように似ている。ODBC絡みで、OLEDB(ADOではなくて)もやってみようとしたが、根本的な概念はODBCと変わらず、ただ、インターフェースがWindowsのCOM(Component Object Model)なだけであり、あんま、面白み味がなかったのでキャンセル。TrueType・OpenTypeフォントもT2FAnalyzerの作成を通して、理解が深まった。といってもODBCに比べると範囲が広いので、まだ色々調べていない部分がたくさん残っているがwobbly。10進浮動小数というよりむしろ、多倍長演算についてもアセンブラで組んでみたり。パーサージェネレータというよりむしろ、コンパイラ全般についても適当なスクリプト言語を作ってみたり(作りかけだがdespair)。作りかけのプログラムたくさんあるな・・・

いや、頑張った。けど、新しい事をやるにつれ、前やってた事を忘れていくような・・

2008年12月19日 (金)

MLang(Multilingual Language)の続き(4)・・・IMLangFontLink

今回はMLangの続きで、IMLangFontLinkインターフェース。フォントリンクとは、選択したフォントで表示できない文字を、その選択したフォント(ベースフォント)にリンクしたフォントで表示できれば、それを使って表示するメカニズムのことであるが、このインターフェースを利用すれば、フォントリンクを利用したり、カスタムフォントを作成できるとのことなので、実際に使ってみる。

IMLangFontLinkインターフェースにいくつかのメソッドがあるが、フォントリンクのサービースを利用するには、主にその内の

  • GetFontCodePagesメソッド
  • GetCharCodePagesメソッド
  • MapFontメソッド
  • ReleaseFontメソッド(とResetFontMappingメソッド)

を使用する。まずは、GetFontCodePagesメソッドである。MSDNの説明によれば、

Gets the set of code pages whose characters can be output by the specified font on the given device context.

である。指定したデバイスコンテキスト上で指定したフォントによって表示できる文字のコードページ集合が返される。最初、指定したフォントだけで表示できる文字のコードページ集合が返されると勘違いしてしまったが、返されるのは指定したフォントとそれにリンクしたフォントで表示できる文字のコードページ集合である。

次に、GetCharCodePagesである。これは指定した文字のコードページ集合を求めるメソッドである。指定した文字が指定したフォント(とそれにリンクされたフォント)で表示できるか判定するには、上記2つのメソッドを使って返されたコードページ集合のビットごとの論理積を取ればよい。

MapFontメソッドは指定したコードページ集合とソースフォントからそれを表示できるリンクしたフォント?を返すメソッドらしい??。

と、MapFontメソッドで返されるフォントの理解に苦しむが、いつも通りU+0000からU+FFFFの各文字に対してMapFontメソッドを呼び出しどのようなフォントが返されるか調べてみる。実行結果は次の通り。

Fontlink1_1_3

ベースフォントはTahomaである。Tahomaフォントを指定してGetFontCharCodePagesメソッドを呼び出して返されるコードページ集合は2032127であるが、そのコードページ集合に含まれる各コードページは、

Fontlink1_2

である(まぁ、ここらへんは実行環境によって変わるはず)。先ほどの、GetFontCodePagesメソッドの説明で、返されるコードページ集合は、指定したフォントとそれにリンクしたフォントによって表示できる文字のコードページ集合と書いたが、Tahomaは日本語の文字に対するグリフを持っていないが、上の画像に日本語のシフトJISに対応するコードページが含まれていることからも、リンクしたフォントも考慮されている事が分かる。また、最初の画像より、コードポイントU+0041の「A」(LATIN CAPITAL LETTER A)に対するMapFontメソッドによって返されるフォントの名前がArialであることが分かる(MapFontメソッドによって返されるのはHFONT型のフォントハンドルなのでそれからWin32APIのGetObject関数を使いLOGFONT構造体を取得してそのlfFaceNameメンバの値をここでは表示した)。

次に、コードポイントU+3042の「あ」(KATAKANA LETTER A)を見てみる。

Fontlink1_3

MS PゴシックフォントがMapFontメソッドによって返されているのが分かる。

ところで、この結果をCharCodePagesが0の結果でフィルタしてみると、

Fontlink1_4_2

MSDNのヘルプに、IMLangFontLinkはMicrosoftのコードページベースでフォントリンクを行うと書いてあるように、CharCodePagesが0の文字に対してMapFontメソッドの呼び出しが失敗していることが分かる(FontNameがFailedになってるが実際にFailedという名前のフォントが返されたのではない事に注意)。

ふむふむ。

最後にいつものように、作ったプログラムはここのMultiLang.zip。メモリ食うし重いので注意を。

2008年12月17日 (水)

GetStringTypeEx

最近ブログ書くのさぼってた。モチベーションを維持するのは大変bearing

ということで久しぶりに書いてみる。お題はWin32のGetStringTypeEx。指定した文字列中の各文字に文字情報を取得するAPIである。取得できる文字情報の種類は

  • CType 1(文字種情報)
  • CType 2(左右文字方向情報)
  • CType 3(テキスト処理情報)

の3種類である。CType 1で返される種類は、

CType 1
定数 種類 意味
C1_UPPER 0x0001 大文字
C1_LOWER 0x0002 小文字
C1_DIGIT 0x0004 10進数字
C1_SPACE 0x0008 スペース文字
C1_PUNC 0x0010 区切り記号
C1_CNTRL 0x0020 制御文字
C1_BLANK 0x0040 ブランク文字
C1_XDIGIT 0x0080 16進数字
C1_ALPHA 0x0100 言語上の文字(表音文字・音節文字・表意文字)
C1_DEFINED 0x0200 他のC1_*の文字でない文字

で、ANSI CとPOSIX(LC_CTYPE)の文字種関数をサポートするそうである。また、1度に1種類の情報しか取得できないので、上記3種類すべての情報を取得するにはGetStringTypeExを3回呼び出す必要がある。この種類のAPIはMSDNのマニュアルを参照した方が手っ取り早いので、詳細はここを参照。

ということで、ここでは、実際にこのAPIを使ってみる。いつも通り?各Unicode文字(コードポイントU+0000からU+FFFFまで)に対してどのような結果が返されるか列挙してみる。実行結果は次の通り。

Getstringtypeex1

当たり前のことを書くが上の画像においてコードポイントU+0041の「A」(LATIN CAPITAL LETTER A)の文字に対して、CType 1の大文字であることを表すC1_UPPERフラグがセットされていることがわかる。

まぁ、この種のAPIは結果を実際に目で見て確認した方が早いということで・・

作ったプログラムはここのGetStringTypeEx.zip。以前は、プログラムをココログにアップロードしてたのだが、アップロードできるファイルの最大サイズが1Mバイトまでになってしまったので、MicrosoftのストレージサービスSkyDriveを利用させていただくことにしましたbearing。この際、ブログも引っ越すかな?はは。

ところで、上の画像でChar Info列に各Unicode文字のUnicodeプロパティという情報が表示されているのだが、この情報を表示させるためには実行ファイルGetStringTypeEx.exeと同じフォルダにUnicodeコンソーシアムのサイトからダウンロードできるUnicode Character Databaseの各ファイルを置いてください。具体的には、ここ

  • UnicodeData.txt
  • Scripts.txt
  • Blocks.txt

の3つです。

そいうえば、このプログラムを作ってる時に、Unicode Character Databaseの情報を表示できるビューアみたいなプログラムを作ってみようかなと思いついたgood。というのも、そのようなツールはインターネットで検索すれば何種類か見つかるのだが、自分好みのがほしい。

« 2008年10月 | トップページ | 2009年1月 »

自作ソフトウェア

無料ブログはココログ

メモ