[NTEmacsjp-users 83] 半透明パッチで半透明にしないときの処理

Back to archive index

Satoshi Nakamura ml****@snak*****
2008年 3月 21日 (金) 00:03:39 JST


中村と申します。

IME patch + 半透明 patch を当てたNTEmacsバイナリを使わせていただいています。
このバイナリに当たっているパッチだと、半透明にする設定をしない場合でも半透
明にするためのコードが走ってしまうため、描画のパフォーマンスに悪影響があり
ます。

具体的には、半透明にしない場合でも、WS_EX_LAYEREDスタイルが適用されてしま
います。このスタイルが適用されると、ウィンドウの背景を描画する前に、その下
にあるウィンドウの再描画順番に行われるため、特にウィンドウのサイズが大きい
と描画のパフォーマンスが悪くなります。

以下のパッチを当てると半透明にしない場合にはこのスタイルを適用しなくなりま
す。よろしければ取り込んでいただけないでしょうか。

diff -ur emacs-22.1.92.orig/src/w32term.c emacs-22.1.92/src/w32term.c
--- emacs-22.1.92.orig/src/w32term.c	2008-03-10 08:54:04.000000000 +0900
+++ emacs-22.1.92/src/w32term.c	2008-03-20 19:24:02.261519600 +0900
@@ -1209,12 +1209,19 @@
   if (alpha < 0.0) alpha = 1.0;
 
   if (set_layered_window_attributes_fn != NULL) {
-    SetWindowLong (window, GWL_EXSTYLE,
-                   GetWindowLong (window, GWL_EXSTYLE)|WS_EX_LAYERED);
-    set_layered_window_attributes_fn (FRAME_W32_WINDOW (f),
-                                      RGB(255, 255, 255),
-                                      (int)(alpha * 255.0),
-                                      LWA_ALPHA);
+    int a = (int)(alpha * 255.0);
+    if (a != 255) {
+      SetWindowLong (window, GWL_EXSTYLE,
+                     GetWindowLong (window, GWL_EXSTYLE)|WS_EX_LAYERED);
+      set_layered_window_attributes_fn (FRAME_W32_WINDOW (f),
+                                        RGB(255, 255, 255),
+                                        a,
+                                        LWA_ALPHA);
+    }
+    else {
+      SetWindowLong (window, GWL_EXSTYLE,
+                     GetWindowLong (window, GWL_EXSTYLE) & ~WS_EX_LAYERED);
+    }
   }
 }
 

-- 
Satoshi Nakamura <snak****@snak*****>




NTEmacsjp-users メーリングリストの案内
Back to archive index