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つのモニタで表示したら どうなるんだ? という問題はあるので、これはあんまり正しい方法じゃないんだろう。
どうにもならんな。
画像が劣化してしまって困る用途はそんなにはないと思うので、 その用途でだけ大きな画像を生成して小さい領域に描画してくれ、という結論。