このバージョンは実験版です。
一応 0789 ベースですが、もはやソースレベルでは別物です。
以下のどれかに納得できない人は、今すぐ削除して 0787 でも使いましょう。
- マニュアル(これ)なんて読んでられるかYO!
→実験版なのでマニュアル読まない人は使わないで下さい。
- うちの CPU、SSE2 に対応してないんですけど・・・
→頻繁に呼ばれる部分を随時 SIMD 化しているので、もう対応できません。
ごめんなさい。
- FreeType は必ずgdi0770 の物を使用して下さい。
この辺からダウンロードできます。
- 重大な欠陥が見つかった場合は予告無しにあぷろだから削除します。
無用なトラブルを避けるためにも再up・転載は控えてください。
概要
gdi++.dll のコアエンジン( Helium と呼ぶ事にする)をフルスクラッチした。
具体的には
- SourceMonitor
で Max Complexity が 30 以下。
- FreeType 内蔵キャッシュの使用を廃止し、メモリ消費量を低減。
- MS Pゴシックなどの太字やイタリック体をエミュレートしているフォントで
FontStream を使いまわす。
- 文字の描画に必要な API のみをフックし、その他は GDI の結果をそのまま使う。
- 安定性の向上。
マルチスレッドからの非同期アクセスに耐え得るよう全オブジェクトに参照カウンタを付けている。
最低動作環境
- Windows 2000 SP4、Windows XP SP2
- 動作確認を行ったのは Windows 2000 SP4 Pro、Windows XP SP3 Pro (いずれも日本語版) のみです。
- それ以外の OS 、サービスパックでは動作確認していませんし保証もできません。
- Windows 2000 では初期状態で不具合が出ます。
- SSE2 対応 CPU
Pentium 4、Pentium M、Athlon64 以降の CPU で動作します。
SSE2 非対応 CPU では
gdi0787
/
gdi0789 (SSE用)、
gdi0577 (P6用)
が個人的おすすめ。
- それなりのメモリ
前のバージョンよりはメモリに易しくなってるはずです。
ただし gdippManager や
gditray
で全適用する場合は 512MB 以上を推奨。
- マニュアル(これ)は Firefox か Opera で見てください。
IE 系で見ると色々出なかったりずれたり正常に表示されない部分があります。
INI のオプション
INI は付属しないので、自分で調整して使うこと。
[General]
HookChildProcesses=1
[Rasterize]
HintingMode=2
AntiAliasMode=2
NormalWeight=4
BoldWeight=2
ItalicSlant=0
Saturation=0
[Misc]
MaxHeight=72
GammaCorrection=0
Interpolation=0
VerticalText=0
ModuleListOrder=2
[FreeType]
LcdFilter=1
SkipVersionCheck=0
[Cache]
MaxFamilies=8
MaxStyles=12
MaxBytes=8388608
[Individual]
Tahoma=0
MS UI Gothic=,,-5
M+2P+IPAG=2
[FontLink]
Tahoma = MS UI Gothic, SimSun, PMingLiU
Lucida Sans Unicode = MS UI Gothic
MS UI Gothic = SimSun, PMingLiU
Microsoft Sans Serif = MS UI Gothic
[Exclude]
Marlett
[AllowModule]
[DenyModule]
[UnloadDLL]
ガンマ補正
- 旧バージョンでの GammaValue=2.0 相当のガンマ補正が有効になる。
2.0 固定だと色々と計算が省けたのと、まあ Mac と Windows の平均値?だからいいかなと。
Saturation と合わせて調整すれば黒地に白文字が読みにくいことは無くなると思う。
1ピクセル単位で処理+浮動小数点型に変換してるので off の場合より描画が遅い。
α値の補間
- 背景色に応じてαチャンネルの値を補間する。暗い背景色ほど強く補間がかかるようになっている。
- R,G,B の順で補間値を指定する。
書式は
- Interpolation=6,5,8 (R=6, G=5, B=8 で補間)
- Interpolation=4 (R=4, G=4, B=4 で補間)
- Interpolation=0 (全て 0 で無効)
など。
- ガンマ補正と違って白地に黒文字でも薄くならず、描画が比較的軽い。
が、AntiAliasMode=LCD で値を大きくするとカラフルになって逆に見辛くなるので注意。
- GammaCorrection=1 の時は無視される。(ガンマ補正が優先される)
縦書き
- この設定を有効にすると GSUB と cmap を別個ロードするので、フォントの読込が遅くなる上にメモリ消費量も増える。
- また、フォント依存・環境依存が激しく「表示できればラッキー」程度の物。
- 基本的にOFFを推奨。ONにした設定を他人に勧めない事。
- 現時点では縦書き用 @ 付きフォントが使用できるだけで、縦書き表示には対応していません。
バージョンチェックをしない
- デバッグ用。
FreeType はバイナリ互換とは限らないようなのでこの設定は触らないこと。
- 現時点では指定しても無視されます。(バージョンチェックをスキップできない)
キャッシュ
- MaxFamilies
指定した数だけフォントファミリをキャッシュする。
太字や斜体も同じフォントとして数える。
- MaxStyles
1書体につき、指定した数だけフォントスタイル別データをキャッシュする。
ここでいうスタイルとは、太字・斜体・サイズのこと。
- MaxBytes
ラスタライズ済みのビットマップデータをキャッシュする容量の閾値。
上の 2 つの設定よりも優先される。
当然 AntiAliasMode を LCD にすると 3 倍メモリを消費する。
フォントリンク
- レジストリの設定とは違い、ファイル名は書かない。
- 当然ながら Individual も有効。
- gdi++ はレジストリ設定を見ていないが
GDI 自体は当然レジストリ設定に基づいているので、レジストリ設定と
gdi++.ini の設定をある程度一致させておくと無難。
モジュールリスト
- プロセス名ではない。
ModuleListOrder にて以下の 3 パターンが選択可能。
- 0: Deny のみ使う
- 1: Allow のみ使う
- 2: Allow を使いつつ Deny も使う
ロードさせたくないプロセス
-
ここに書かれたプロセスが gdi++.dll をロードできなくする。
gdi++.exe 経由でも使用できなくなる。
履歴
20071227での更新内容
- いつの間にか
> 20071127での更新内容
> フォント名の取得にGetTextFaceではなくGetOutlineTextMetricsを使用するようにした。
……のコードが抜け落ちていたのを修正。
20071224での更新内容
- FontLinkを使用するとキャッシュ管理がバグってしまうのを修正。
- シンボルフォント(Wingdingsなど)がgdi++で描画されないのを修正。
- ANSIアプリで欧文フォントの非ASCII文字が正しく描画できなかったのを修正。
- OTFのFallback結果がGDIと一致しない(?)のでUniscribeを使用しないようにした。(>>728)
でもこれはGDI側の問題のような気もする。
- 回避不能な問題点が多いのでFontOverrideを廃止した。(>>831,>>862)
20071205での更新内容
- αブレンドのソースを整理。
- SaturationをIndividualに対応。
20071129での更新内容
20071127での更新内容
- Excludeのフォント名比較がバグっていたのを修正。ハッシュアルゴリズムも変更。(>>454)
- Windows Vistaでタイトルバーの文字が細くなるのを強引に修正。(>>954)
- 文字化けする可能性のあった箇所を修正。
- 初期設定のWindows 2000で正しく描画されなかったのがなぜか直ったようなのでFAQを変えた。
- MS UI GothicにFontOverrideしてもダイアログの文字が大きくならないようにした。
Undocumentedな事をしているので、将来のWindowsでgdi++自体が動作しなくなる可能性あり。
- フォント名の取得にGetTextFaceではなくGetOutlineTextMetricsを使用するようにした。
例えば、日本語版WindowsでMS Shell DlgをMS UI Gothicとして認識するようになった。
- その他色々と変更、修正。
あちこち書き換えたのでgdi0820より不安定&バグが増えた可能性あり。
- 2chスレのバグ報告にリンクをはっておいた。
gdi0820での更新内容
gdi0817での更新内容
- 一部の文字で横長になるのを修正。(>>863)
- FontLinkとIndividualを同時に使うと表示がおかしくなることがあるバグを修正。
gdi0814での更新内容
- ガンマ補正の代わりに使えそうな別の方法を実装してみる。
因みに、描画の重さは ガンマ補正 > α値補間 >
gdi0811
> 両方off の順。
- 説明書のHTMLにgdi0814としてupされていた物をベースにした。
- gditrayを更新。
gditray.htm を読んでから使うこと。
gdi0813での更新内容
- INIオプションをカテゴリ分けしてみた。
Cache以外は従来どおりGeneralに書いても動作するはず。
- INIオプションが増えたり減ったり名前変更されたりした。
- MaxBytesのGC処理を少し変えた。
- SelectObjectの回数を減らしてみたら少し速くなった。
- メモリ確保に
Doug Lea malloc (dlmalloc)
を使うようにした。
- 説明書をHTML化。
読めればいいかぐらいの感覚で書いてるので多分タグの閉じ忘れとかがあると思う。
- gditrayを更新。
gditray.htm を読んでから使うこと。
gdi0811での更新内容
- 32ビットDIBの上位8ビットをクリアするようにした。(>>200)
ここにゴミがあると表示がバグるVGAドライバの対策。
- gdippMonitorのUI周りのバグ修正。
gdi0809での更新内容
- 高さが1pxぐらいの文字を描画すると落ちるのを修正。(>>181)
- gdippMonitorのGUI化。
gdi0800での更新内容
- Saturationオプションを追加。
- 特定の環境で1文字だけの行が正しく描画できない問題の回避策を書いた。
gdi0793での更新内容
- 文字の右端1pxが色化けする事があるのを修正。(>>68)
- αブレンドにSSE2を使った。
- Courier Newなどの下線が出なかったので描画領域を広げてみた。
- Firefox3.0αで文字がまともに出るようにした。
opacityで左に1px欠けるのは直し方分からず。
- HintingModeとAntiAliasModeの動作を変えてみた。
具体的には、LightをHintingModeに移して、それぞれ 0 が無効扱いにした。
因みに、Lightを有効にするとFreeType内部でAutoHintingも有効になるらしい。
gdi0791での更新内容
- αブレンドにMMX2を使った。
- 太字化を少し弄った。
- 斧がよく落ちてるので公式あぷろだに上げることにした。
40335での更新内容
- フォントによっては上下にずれることがあるのを修正。
- フォントによっては右側が欠ける事があるのを修正。
両方ともM+2P+IPAG.otfで発見。gdi++のデバッグに便利なフォントだ・・・。
- Smudger Alts LETというフォント(Office付属品?)の10pt台を使うと
消費メモリ量が爆発的に増えるバグを修正。
- memcpy/memsetをSSE2化。
40202での更新内容
- OTFなどにフォントリンクできないバグを修正。
- メニューなどの文字が出ないことがあるのを修正。
寝ぼけていたのか、ScriptStringAnalyseに渡すパラメータが滅茶苦茶だった。
40173での更新内容
- フォントリンクのバグを修正。
- ビットマップのキャッシュ方法を変更。
- キャッシュ管理ルーチンを半分ぐらい書き直し。
ガベコレのオーバーヘッドが減った。
40078での更新内容
- gdippMonitorの重大なバグを修正。(>>756)
- Bold用のフォントが別にある場合に2重に太くしていたバグを修正。(>>760)
- αブレンド部分に手を加えたので少しだけ軽くなった。
- フォントリンクのような物に対応してみる。
これのせいで結構ソースが書き換わったので前より不安定かも知れない。
- CacheMaxBytesの動作変更。
- Uniscribeを使用して本物のExtTextOutWの内部動作を真似てみる。
39696での更新内容
既知の不具合・仕様
- 文字化けする (らしい)
フォント関係のレジストリを初期状態に戻せば直るという報告もあり。
- アンロード中に落ちる可能性がある (全ての gdi++ に共通)
gdi++ というより CreateRemoteThread で FreeLibrary を飛ばすアプリ全般の問題。
- フォントによっては GDI と高さが違う
FreeType の問題 (特に AutoHinting )。気になるなら FreeType ML に投げましょう。
制限
- 安全性のため SSE2 非対応CPU、ver2.3.5 以外の FreeType では使えない。
FAQ
- Q. HTMLのソース(ry W3C(ry lint(ry
A. どなたかが修正してくれたみたい。感謝。
- Q. ガンマ値が 2.0 以外では使えないの?
A. 使えません。
- Q. Shadow には対応していないの?
A. 対応していません。
- Q. IME 変換候補など一部で適用されない。
A. サンプルの [FontLink] を gdi++.ini にコピペすれば OK 。
- Q. AntiAliasMode を SubPixel に設定しても Opera で一部の文字がグレースケールになる。
A. Opera の問題らしいです。
- Q. 文字間がおかしい。
A. よく分かりません。
- Q. ft2vert.c / ft2vert.h
A. 使用していません。
- Q. メニューやタスクバーなどに gdi++ が適用されない。
A. 付属の w2kfix.reg を読み込ませて OS を再起動。
- Q. gdippin、HookInjection などでエラーになる。
A. manifest を除去してあるので、対応ソフト以外では使えません。
以下の対策をすれば使用可能。
- freetype.dll と detoured.dll を PATH の通ったフォルダにコピー。
- または gdi++ のファイル群を置いているフォルダを
PATH
に追加。
gdi++.exe(付属)、gditray、gdippManager は問題無し。
今後の予定
- 縦書きの完成
- ソース公開
- ソースの配布ライセンスをどうするか
今のところ GPL や FTL に該当するソースを含んでないので GPL でも FTL でもない。
多分 gdi0300 ぐらいの頃と同じ
◆0x0D/0x20I氏の配布条件
に従うと思う。
リンク