先頭
概要
動作環境
INI 設定
履歴
不具合・仕様
制限
FAQ
予定
リンク

このバージョンは実験版です。
一応 0789 (0577) ベースですが、もはやソースレベルでは別物です。
以下のどれかに納得できない人は、今すぐ削除して 0787 でも使いましょう。

- マニュアル (これ) なんて読んでられるかYO!
  →実験版なのでマニュアル読まない人は使わないで下さい。
- うちの CPU、SSE2 に対応してないんですけど・・・
  →頻繁に呼ばれる部分を随時 SIMD 化しているので、もう対応できません。
  ごめんなさい。
- FreeType は必ず付属の物を使用して下さい。
- 重大な欠陥が見つかった場合は予告無しに削除します。
  再配布・転載は控えてください。

## 概要

コアエンジン (Helium と呼ぶ事にする) をフルスクラッチした gdi++ です。

具体的には……

- SourceMonitor で Max Complexity が 30 以下になりました。
- FreeType 内蔵キャッシュの使用を廃止し、独自のキャッシュシステムを使用することでメモリ消費量を削減しました。
- ＭＳ Ｐゴシックなどの太字やイタリック体をエミュレートしているフォントで FontStream を多重に確保しないようにしました。
- 文字の描画に必要な API のみをフックし、その他は GDI の結果をそのまま使うようにしました。
- マルチスレッドからの非同期アクセスに対する安定性が大幅に向上しました。

## 動作環境

- Windows XP SP3
  - 上記の OS、サービスパック以外での動作は保証しません。
  - 64 ビット版 OS での動作は保証しません。
- SSE2 対応 CPU
  Pentium 4、Pentium M、Athlon64 以降の CPU で動作します。
  SSE2 非対応 CPU では使用できません。
- それなりのメモリ
  前のバージョンよりはメモリに易しくなってるはずです。
  ただし gdippManager や GdiTray で全適用する場合は 512MB 以上を推奨。
- マニュアル(これ)は Firefox か Opera で見てください。
  IE 系で見ると色々出なかったりずれたり正常に表示されない部分があります。

## INI のオプション

INI は付属しないので、自分で調整しましょう。

    [General]
    ; 子プロセスにも自動適用
    ; [0:Disable]  1:Enable
    HookChildProcesses=1

    [Rasterize]
    ; ヒンティング方式
    ; 0:NoHinting  [1:Normal]  2:AutoHinting  3:Light
    HintingMode=0
    ; アンチエイリアス方式
    ; 0:Disable  [1:Grayscale]  2:SubPixel(RGB)  3:SubPixel(BGR)
    AntiAliasMode=1
    ; 標準のウエイト
    ; -32:+32
    NormalWeight=0
    ; 太字のウエイト
    ; -16:+16
    BoldWeight=0
    ; 斜体の傾き具合
    ; -16:+16
    ItalicSlant=0
    ; 濃さの調整
    ; -32:+32
    Saturation=0

    [Misc]
    ; gdi++ に処理させる最大サイズ (ピクセル単位)
    ; 0-2147483647
    MaxHeight=72
    ; ガンマ補正を使う
    ; [0:Disable]  1:Enable
    GammaCorrection=0
    ; α値を補間する
    ; 0-16
    Interpolation=0
    ; 縦書きを使用する
    ; [0:Disable]  1:Enable
    VerticalText=0
    ; モジュールリストの優先順位
    ; [0:Deny]  1:Allow  2:Allow->Deny
    ModuleListOrder=0

    [FreeType]
    ; FT_Library_SetLcdFilter に渡すパラメータ
    ; [0:None]  1:Default  2:Light  16:Legacy
    LcdFilter=0
    ; FreeType のバージョンチェックをスキップ
    ; [0:Check]  1:Skip
    SkipVersionCheck=0

    [Cache]
    ; キャッシュ
    MaxFamilies=8
    MaxStyles=12
    MaxBytes=8388608

    [Individual]
    ; フォント別設定
    ; Format: FontName=Hinting,AAMode,NormalWeight,BoldWeight,ItalicSlant,Saturation
    Tahoma=0

    [FontLink]
    ; フォントリンクのような物
    ; Format: FontName=Name1,Name2,Name3, ... ,Name16
    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 相当のガンマ補正が有効になります。
- 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 の時は無視されます。(ガンマ補正を優先)

### 縦書き

- 現時点では対応していません。

### バージョンチェックをしない

- デバッグ用なのでこの設定は触らないでください。

### キャッシュ

- MaxFamilies
  指定した数だけフォントファミリをキャッシュします。
  太字や斜体も同じフォントとして数えます。
- MaxStyles
  1 書体につき、指定した数だけフォントスタイル別データをキャッシュします。
  ここでいうスタイルとは、太字・斜体・サイズが該当します。
- MaxBytes
  キャッシュするビットマップデータの合計サイズです。
  上の 2 つの設定よりも優先されます。
  当然ながら AntiAliasMode を LCD にすると 3 倍メモリを消費します。

### フォントリンク

- レジストリの設定とは違い、ファイル名は書きません。
- レジストリと gdi++.ini の設定をある程度一致させておかないと、 表示が乱れる可能性があります。

### モジュールリスト

- プロセス名ではありません。
  ModuleListOrder にて以下の 3 パターンが選択可能です。
  - 0: Deny のみ使用
  - 1: Allow のみ使用
  - 2: Allow を使いつつ Deny も使用

### ロードさせたくないプロセス

- デバッグ用なので通常は DenyModule を使用します。

## 履歴

### 20081225 での更新内容

- HookChildProcesses=1 のときに一部のソフトが起動できないバグを修正。

### 20081224 での更新内容

- フォントの幅がおかしかったのを修正。
- キャッシュ設定によってはハングアップする可能性があったのを修正。

### 20080927 での更新内容

- Google Chrome で表示領域に適用されるようにした。
  (gdi++.exe 経由、または HookChildProcesses=1 の場合のみ)
- DLL の初期化・終了ルーチンの仕様変更に伴う修正。
- 不完全ながら IE で説明書を閲覧できるようにした。(IE6 〜 IE8beta で確認)
- 細かいバグを修正。

### 20080808 での更新内容

- DLL のロードとアンロードを繰り返すとメモリリークする可能性があったのを修正。

### 20080727 での更新内容

- FreeType ver2.3.7 に対応した。
- 付属の freetype.dll を ver2.3.7 の物にした。
- SkipVersionCheck オプションを認識するようにした。

### 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 での更新内容

- セル高さの渡し方を変えてみた。(>>913)

### 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 などの下線が出なかったので描画領域を広げてみた。
- Firefox 3.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 と高さが違う ( [ ] が L ｣ に見える、など)
  FreeType の問題。(特に AutoHinting)
  気になるなら FreeType ML に投げましょう。

## 制限

- 安全性のため SSE2 非対応 CPU、ver2.3.7 以外の 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. 以下の対策をすれば使用可能です。
  - freetype.dll と detoured.dll を PATH の通ったフォルダにコピー。
  - または gdi++ のファイル群を置いているフォルダを PATH に追加。
  gdi++.exe、GdiTray、gdippManager は問題無し。

## 今後の予定

- 縦書きの完成
- ソース公開
- ソースの配布ライセンスをどうするか
  今のところ GPL や FTL に該当するソースを含んでないので GPL でも FTL でもない。
  多分 gdi0300 ぐらいの頃と同じ ◆0x0D/0x20I氏の配布条件 に従うと思う。

## リンク

- gdi++.dll 本家サイト
  FreeType を使用していないオリジナル版。
- The FreeType Project
  フリーでハイクオリティでポータブルなフォントエンジン。(公式サイトより)
- higambana氏
  FreeType 版 gdi++ の原点。
- GDI++ Uploader
  GDI++ 専用アップローダ。
- gdi++.dll @ wiki
  公式 wiki。
- gdi++.dll - windows
  まとめ wiki。