管理人のふたこと Tweet
「マウスのお供」で文字にアンチエイリアスを効かせていないのは
公開日:2019/12/31
12月19日のブログでも書いたのですが、マウスのお供では、表示している文字にアンチエイリアス(=スクリーンフォントの縁を滑らかにする)が効かないような措置を施しています。この件について、今日は少し掘り下げていきたいと思います。また、来年以降、何とか解決できないもんか、策を探っていくための礎づくりをしたいと思っています。
▲アンチエイリアスってこんな感じ
再掲となりますが、アンチエイリアスってこんな感じです。
先日、フィードバックより「フォントのアンチエイリアスが効いていないようですが」というお問い合わせをいただきましたが、これは仕様として、アンチエイリアスを無効化しています。
そもそも、アンチエイリアスとは、文字を滑らかに表示するため、文字の端と背景の端の境界部分に中間色を表示したり、サブピクセル(RGBが横3列に並んでいることに由来)を利用して特定の色を「3分の1ピクセル」として表示したりすることによる実現しています。
普通は、自プログラムの背景に対して文字描画を行うことになります。これならOSが自動的にアンチエイリアス処理をしてくれるので、プログラマーは何も考えなくてよいことになります。もし本プログラムで何も考えずにアンチエイリアスをONにしてしまうと、背景通過用のグリーンバックの緑色を背景としてアンチエイリアスな文字描画が発生するため、中途半端な濃度の緑の部分が現れ、そこが通過しなくなり、文字の周辺にヘンな緑色が漂う微妙な文字が描画されることになります。
まずは、このあたりを掘り下げていきたいと思います。「マウスのお供」では、こんな感じで表示されています。
デフォルトのフォントではなく、あえて、アンチエイリアスを効かせたくなる「メイリオ」を選んで表示しています。なんだかギザギザ感があるかと思います。
▲通常のマウスのお供の表示状態
右側に、一部を拡大した図を示します。
背景が白く通過していますが、実際には、こんな感じで背景の上に通過して表示されます。
▲通常のマウスのお供の表示状態2
これを実現するため、■真緑(R=0, G=255, B=0)の色をグリーンバックと位置づけ、背景通過色としてOSに依頼して通過をさせています。
▲グリーンバック(仮)で表示したもの
さて、普通通りに、何も考えずアンチエイリアスを行いたい場合、自プログラムの背景に対して文字描画を行うことになります。OSが自動的にアンチエイリアス処理をしてくれます。
▲グリーンバック(仮)にアンチエイリアス文字描画
でも実はグリーンバックに対してアンチエイリアスをしても意味がありません。背後に表示されている別アプリケーションとの中間色を表示しないと、実用上は意味を成しません。このままグリーンバックを背景通過させると、こうなってしまいます。
▲グリーンバックとの中間色にアンチエイリアス文字描画
こんな感じで、グリーンバックと文字との中間色が微妙に周りにこびり付いたような表示になってしまいます。背景通過色はあくまで■真緑(R=0, G=255, B=0)だけで、その中間色(緑と黒の配合色)は背景通過してくれるわけではないので。もし、配合色が背景通過するとしたら、白色も、それを構成する赤要素と青要素を残して半通過することになってしまいますからね。
というわけで、背景が別アプリケーションのときのアンチエイリアス処理は、通常のOSが勝手にやってくれるような文字描画とは別の処理を考えないといけません。UpdateLayeredWindow() APIを使った半通過ウィンドウのワザが使えないかと模索していますが、文字表示全体をフェードイン/フェードアウトするために使っている SetLayeredWindowAttributes() APIとは同時利用できないとか、α値を持たせたデバイスコンテキストにDrawText()するときの問題とか色々あって、そう簡単にはいきません。
次回は、背景が別アプリケーションのときのアンチエイリアス処理にどんな困難な壁があるのかを見ていきたいと思います。
【続き】2020/01/01 「マウスのお供」で文字にアンチエイリアスを効かせる方法を模索してみる
本ページへは、自己責任の範囲内であれば自由にリンクしていただいて構いません。
本ページに掲載されている内容は、自由にお使いいただいて構いませんが、必ずしも筆者が内容を保証するものではありませんので、ご利用に際しては自己の責任においてお使いいただきますよう、お願いいたします。
このページのURLやアンカーは、サーバ運営・サイト運営・ページ運営・その他の都合により無告知で一時的あるいは永遠に消滅したり、変更したりする可能性がありますので、あらかじめご了承下さい。
本ページは、公開から1年半経過後の任意のタイミングで削除される予定です。本ページの内容は複製・公開していただいて構いません。