似非エンジニアのメモ

研究者にもエンジニアにもまだ到達できていないそのへんの会社員がつづる日々のメモ

gdipp で一部の文字が欠けるときの対処についてのメモ

概要

gdipp はWindows 上でより良いフォントレンダリングの結果を得るために, Windows の描画を担当しているGDI (Graphics Device Interface)の一部をフックして,gdippが提供するより良いフォントレンダリングルーチンに置き換えるアプリケーションです.しかし,一部のアプリケーションでは文字に欠落が生じることがあります.ここでは,その欠落を回避できる可能性がある設定を紹介します.

gdippとは

gdipp はWindows 上でより良いフォントレンダリングの結果を得るために, Windows の描画を担当しているGDI (Graphics Device Interface)の一部をフックして,gdippが提供するより良いフォントレンダリングルーチンに置き換えるアプリケーションです.具体的には,TextOut関数をフックして,freetype によるレンダリング等に置き換えるようです.以前は gdi++ というソフトウェアが有名でしたが,色々あって gdi++ およびその修正ルーチン等などを有志でとりこんで gdipp ができたようです(このへんの歴史はかなりいい加減).

gdippは以下のURLからダウンロードでき,x64アーキテクチャもサポートされています.また,Windows サービスとして実行できるほか,特定の実行ファイルのみに対してフックを行うためのwrapper が提供されています.

gdippの問題

私が現在考えているgdippの問題は2つあります

  1. WPF(Windows Presentation Foundation) を利用して描画を行なっているアプリケーションに対しては無効
  2. 一部のアプリケーションで文字が欠落する

WPFは比較的新しいUIを作成するためのインターフェースで,例えば Visual Studio 2010 では WPF が利用されています.実は仕事で VS2010 を使っているの(Emacs/Vimと併用)ですが,gdippが効かなくて大変残念な思いをしています.

そして,2番目の問題は例えば,論文をデータベース化して閲覧するソフトウェア Mendeley や,キーストローク型(コマンドライン型)ランチャー Launchy の設定画面などで l (エル)の文字が欠落する,あるいは Google 日本語入力の設定画面でも幾つかの文字が欠落することがあるようです.実は筆者はこれらのソフトウェアの愛用者でして困っています.この文章では2番目の問題について回避できる可能性のある設定について述べます.

文字の欠落を回避できる可能性がある設定

gdippの設定はgdippをインストールしたディレクトリ(フォルダ)にある,gdipp_setting.xml を編集することで行いますが,この中に rendererという項目があります.

この renderer はフォントレンダリングのモードを変更するための設定ですが,デフォルトでは 10 という値が設定されているようです.この値は libfreetype という Linux では有名なフォントレンダリングライブラリを利用をしてレンダリングを行うモードのようです.

しかし,オリジナルの Windows のフォントレンダリングに比べて字間に影響があるようで,レンダリングの際の文字列の長さの計算がうまくいかず文字が欠落することがあるようです.

これを解決するには renderer の値を 20 にすると良いようです.このモードは字間をオリジナルに保つモードのようです.実際に筆者の環境では文字の欠落が解決されました.