トップ «前の日記 最新 次の日記»

2021-01-23 (Sa) [長年日記]

_ Emacs の logical と physical の狭間で

現状、私の Emacs は、全て logical で処理している。

モニタには scale 設定があるので、logical と physical は異なるものを指す。 physical はモニタの pixel そのものでカウントした位置やサイズを指す。 一方 logical は scale した pixel でカウントした位置やサイズを指す。 基本的に、Gtk/Gdk は logical で計算して指定すればうまく動くように できているので、logical で処理すれば万事うまく行く。

…はずだったんだけど。

なんでか世の中には physical を好む人がたくさんいる。

例として、物理的な画面サイズが 1920x1080 で scale=2 の場合、 logical な画面サイズは 960x540 となる。 ただし、ではピクセル数が 1/4 になるのか、というとそうでもない。 アプリが scale 情報を得て、アプリがライブラリを使って描画するので、 綺麗に描画できる。

physical で (0,0) - (1920,1080) に直線を書くのと logical で (0,0) - (960,540) に直線を書くのは、同じこと。 これを発展させて、文字描画するのに、physical で「ここからこう曲線を書いてこう直線でつないで」とlogical で「ここからこう曲線を書いてこう直線でつないで」は文字の大きさ以外全く同じ結果になる。どちらも綺麗に描画される。

では画像を描画する場合だとどうか。

100x100 の画像を読み込み logical で描画すると、 最終的に physical になる時に、200x200 に拡大され、ピンぼけが起きる。 この、物理 200x200 に表示したいがために logical に合わせて 100x100 に 縮小したのだとすると、画像サイズは 200x200 → 100x100 → 200x200 と 変わっていき、かなり劣化する。

もちろん、文句を言われる。修正することになる…

じゃぁ全部 physical で計算したらどうか、というと、まぁ一つの手ではあるんだけど、 モニタの scale が変わった時にフォントサイズを変えないといけなくて、 その方法がよくわからず挫折した。

全部 logical で、モニタの scale に応じて自動で resize するのも考えたけど、 既存の正しく表示されている画像が軒並み小さくなってしまった。 まぁそもそも、1つの emacs frame に表示した画像を、2つのモニタで表示したら どうなるんだ? という問題はあるので、これはあんまり正しい方法じゃないんだろう。

どうにもならんな。

画像が劣化してしまって困る用途はそんなにはないと思うので、 その用途でだけ大きな画像を生成して小さい領域に描画してくれ、という結論。


編集 パスワード変更