フォントの幅計算
真魚というか、TNotePadでは等幅フォントでないとマトモな文字幅にならない。
これは、全ての文字を半角か全角かという2種類の横幅に分類しちゃうことで、
いちいち文字の幅を計算しなくても良くなるので、その分高速な処理をしているのだ。
まぁ、内部は結構な量でTEditorのパクリがあるわけだから仕方がない。
ただ、SJIS外の文字幅は、フォントの種類によって異なるという問題がある。
その実例がコレ。
http://wantech.ikuto.com/software/UnicodeTest.exe
真魚2.xxの前身であるぎょえ(仮)の設計時点で、こういった問題は抱えていた。
仕方がないので、SJIS外の文字は全て全角文字幅で扱うことにしてきた。
だが、ソースコード内には、それぞれのフォント幅を計算する痕跡は残っている。
実際に計算させた場合にどれだけ動作が遅くなるかを試したのだ。
それを試した時点で、あまりにも動作が遅いのでやるのをあきらめた。
しかし、いったん表示した文字はキャッシュしちゃう方法を使ってみたら、
それほど遅さは気にならずに表示できたので、そういう実装にしてみた。
以前試して遅かった時とはパソコンの性能も違うので、
もう少し遅いパソコンでもテストする必要があるかも知れない。
具体的に何が変ったかというと、ユニコードの文字を表示したときに、
実際の文字幅は半角なのに、全角の幅で表示されていた文字が半角になった。
たったそれだけのために遅くなってもいい程度の犠牲かどうかは問題だ。
遅くなるのは、起動してすぐやフォント変更後、フォントサイズ変更後など、
フォントサイズの再計算が必要となってから、まだ表示してない文字を表示する時。
だから、「あ」を初めて表示するのは遅いけど、「あ」の幅はそこで覚える。
「ああああ」とかって同じ字があると、2回目以降の「あ」は遅くならない。
「あ」を削除してもう一回書いても遅くならない。
でもまだ一度も書いていない「い」が出てくると遅くなり、「い」の幅も覚える。
フォントを変更すると、「あ」の大きさを調べてない状態に戻ってしまう。
設定を保存しないので、真魚を再起動しても元に戻ってしまう。
とにかくコレ。
http://mana.ikuto.com/Mana2beta.zip
さて、今回の文字幅計算部分って、せっかくピクセル単位の幅が出てるのに、
全角か半角かに振り分けてしまって、ピクセル幅は使わないことにしちゃってる。
だが、この部分でこの計算さえやっておけば、等幅以外のフォントにも対応できそうだ。
それをやってさらに遅くなるってことも十分あり得るし、
ボックス選択とかタブ幅とか、解決が面倒そうな部分もたくさんある。
「何文字目」で判断してる部分を「何ピクセル目」で処理すべき変更も必要。
やる気さえあれば、プロポーショナルフォント対応で新テキストエディタ作るべきかも。
やる気はないんだよなぁ。