• R/O
  • SSH
  • HTTPS

ttssh2: 提交


Commit MetaInfo

修订版10385 (tree)
时间2022-11-27 22:08:21
作者zmatsuo

Log Message

透過画像を背景画像を使用できるようにした

- 背景画像にalpha情報がある時、alpha情報を利用して描画するようにした
- 透過画像ファイル

- 透過png(32bit png), 透過gif, 32bit bmp
- その他 GDI+, Susie pluginで読み込めるもの

- テーマが有効な時、色を設定するか問い合わせるようにした

- [setup]-[Windows...]でokを押したとき

- bgテーマiniファイルのフォーマットを変更した
- GDI+を使った画像ファイル読み込みを修正

- alpha情報付きでHBITMAP生成可能だった

ticket #34990

更改概述

差异

--- trunk/doc/en/html/menu/setup-additional-visual-theme.html (revision 10384)
+++ trunk/doc/en/html/menu/setup-additional-visual-theme.html (revision 10385)
@@ -19,9 +19,9 @@
1919 <dl>
2020 <dt><a href="#preview">preview/file tab</a></dt>
2121 <dd>テーマの一時的な設定(preview),テーマファイルの読み込みと書き出し</dd>
22- <dt><a href="#bg">Backgroud tab</a></dt>
22+ <dt><a href="#bg">Background tab</a></dt>
2323 <dd>BG(背景画像)に関する設定を行う</dd>
24- <dt><a href="#bg_alpha">Backgroud alpha tab</a></dt>
24+ <dt><a href="#bg_alpha">Background alpha tab</a></dt>
2525 <dd>BG(背景画像)と文字背景色の透過設定を行う</dd>
2626 <dt><a href="#color">color tab</a></dt>
2727 <dd>文字の色に関する設定を行う</dd>
@@ -64,23 +64,38 @@
6464
6565 <hr>
6666
67- <h2 id="bg">Backgroud tab(背景テーマ)</h2>
67+ <h2 id="bg">Background tab(背景テーマ)</h2>
6868
6969 <h3>背景</h3>
7070
71- 上から順に背景画像が合成されていく。
71+ 下から順に背景画像が合成されていく。
7272
7373 <dl>
74- <dt>Base Color</dt>
74+ <dt>Mixing simple color plane</dt>
7575 <dd>
76- 背景画像を使用しない場合はこの色で塗りつぶされる。背景画像が描画されない部分がある場合もこの色で塗りつぶされる。
76+ 単色をアルファブレンドする。<br>
77+ 例:背景画像,壁紙をブレンドした状態で少し暗くする場合は、000000を128の割合でアルファブレンドする。
78+ <dl>
79+ <dt>Color (RRGGBB)</dt>
80+ <dd>合成するプレーンの色</dd>
81+
82+ <dt>alpha</dt>
83+ <dd>合成するアルファブレンド値(0...255)</dd>
84+ </dl>
7785 </dd>
7886
79- <dt>Backgroud Image</dt>
87+ <dt>Background Image</dt>
8088 <dd>
8189 背景画像を指定する。<br>
8290 描画方法は次の中から選択する
8391 <dl>
92+ <dt>画像ファイル名</dt>
93+ <dd>
94+ bmp, png, gif, jpg等<br>
95+ 32bit bmp, 透過pngの場合は8bitのアルファチャンネルが付加される<br>
96+ 透過gifの場合は1色を透明として扱う
97+ </dd>
98+
8499 <dt>stretch</dt>
85100 <dt>tile</dt>
86101 <dt>center</dt>
@@ -91,17 +106,18 @@
91106 <dd>
92107 TODO 詳細を調べて書く
93108 </dd>
94- </dl></dd>
95109
96- <dt>desktop wallpaper image</dt>
97- <dd>
98- Windowsの壁紙画像をアルファブレンドする。
110+ <dt>alpha</dt>
111+ <dd>合成するアルファブレンド値(0...255)</dd>
112+
113+ <dt>Color (RRGGBB)</dt>
114+ <dd>景画像が描画されない部分がある場合この色で塗りつぶされる。</dd>
115+ </dl>
99116 </dd>
100117
101- <dt>simple color plane</dt>
118+ <dt>desktop wallpaper image</dt>
102119 <dd>
103- 単色をアルファブレンドする。<br>
104- 例:背景画像,壁紙をブレンドした状態で少し暗くする場合は、000000を128の割合でアルファブレンドする。
120+ Windowsの壁紙画像
105121 </dd>
106122
107123 </dl>
--- trunk/doc/ja/html/menu/setup-additional-visual-theme.html (revision 10384)
+++ trunk/doc/ja/html/menu/setup-additional-visual-theme.html (revision 10385)
@@ -19,9 +19,9 @@
1919 <dl>
2020 <dt><a href="#preview">preview/file tab</a></dt>
2121 <dd>テーマの一時的な設定(preview),テーマファイルの読み込みと書き出し</dd>
22- <dt><a href="#bg">Backgroud tab</a></dt>
22+ <dt><a href="#bg">Background tab</a></dt>
2323 <dd>BG(背景画像)に関する設定を行う</dd>
24- <dt><a href="#bg_alpha">Backgroud alpha tab</a></dt>
24+ <dt><a href="#bg_alpha">Background alpha tab</a></dt>
2525 <dd>BG(背景画像)と文字背景色の透過設定を行う</dd>
2626 <dt><a href="#color">color tab</a></dt>
2727 <dd>文字の色に関する設定を行う</dd>
@@ -64,23 +64,38 @@
6464
6565 <hr>
6666
67- <h2 id="bg">Backgroud tab(背景テーマ)</h2>
67+ <h2 id="bg">Background tab(背景テーマ)</h2>
6868
6969 <h3>背景</h3>
7070
71- 上から順に背景画像が合成されていく。
71+ 下から順に背景画像が合成されていく。
7272
7373 <dl>
74- <dt>Base Color</dt>
74+ <dt>Mixing simple color plane</dt>
7575 <dd>
76- 背景画像を使用しない場合はこの色で塗りつぶされる。背景画像が描画されない部分がある場合もこの色で塗りつぶされる。
76+ 単色をアルファブレンドする。<br>
77+ 例:背景画像,壁紙をブレンドした状態で少し暗くする場合は、000000を128の割合でアルファブレンドする。
78+ <dl>
79+ <dt>Color (RRGGBB)</dt>
80+ <dd>合成するプレーンの色</dd>
81+
82+ <dt>alpha</dt>
83+ <dd>合成するアルファブレンド値(0...255)</dd>
84+ </dl>
7785 </dd>
7886
79- <dt>Backgroud Image</dt>
87+ <dt>Background Image</dt>
8088 <dd>
8189 背景画像を指定する。<br>
8290 描画方法は次の中から選択する
8391 <dl>
92+ <dt>画像ファイル名</dt>
93+ <dd>
94+ bmp, png, gif, jpg等<br>
95+ 32bit bmp, 透過pngの場合は8bitのアルファチャンネルが付加される<br>
96+ 透過gifの場合は1色を透明として扱う
97+ </dd>
98+
8499 <dt>stretch</dt>
85100 <dt>tile</dt>
86101 <dt>center</dt>
@@ -91,17 +106,18 @@
91106 <dd>
92107 TODO 詳細を調べて書く
93108 </dd>
94- </dl></dd>
95109
96- <dt>desktop wallpaper image</dt>
97- <dd>
98- Windowsの壁紙画像をアルファブレンドする。
110+ <dt>alpha</dt>
111+ <dd>合成するアルファブレンド値(0...255)</dd>
112+
113+ <dt>Color (RRGGBB)</dt>
114+ <dd>景画像が描画されない部分がある場合この色で塗りつぶされる。</dd>
115+ </dl>
99116 </dd>
100117
101- <dt>simple color plane</dt>
118+ <dt>desktop wallpaper image</dt>
102119 <dd>
103- 単色をアルファブレンドする。<br>
104- 例:背景画像,壁紙をブレンドした状態で少し暗くする場合は、000000を128の割合でアルファブレンドする。
120+ Windowsの壁紙画像
105121 </dd>
106122
107123 </dl>
--- trunk/teraterm/common/ttgdiplus.cpp (revision 10384)
+++ trunk/teraterm/common/ttgdiplus.cpp (revision 10385)
@@ -106,45 +106,14 @@
106106 }
107107 #endif
108108
109-static HBITMAP bitmap_GetHBITMAP(Gdiplus::Bitmap *bitmap)
110-{
111- const int width = bitmap->GetWidth();
112- const int height = bitmap->GetHeight();
113-
114- Gdiplus::Rect rect(0, 0, width, height);
115- Gdiplus::BitmapData src_info;
116- Gdiplus::Status r;
117- r = bitmap->LockBits(&rect, Gdiplus::ImageLockModeWrite, PixelFormat32bppARGB, &src_info);
118- if(r != Gdiplus::Ok) {
119- return NULL;
120- }
121-
122- BITMAPINFO bmi = {};
123- bmi.bmiHeader.biSize = sizeof(bmi);
124- bmi.bmiHeader.biWidth = width;
125- bmi.bmiHeader.biHeight = -height;
126- bmi.bmiHeader.biPlanes = 1;
127- bmi.bmiHeader.biBitCount = 32; // = 8*4
128- bmi.bmiHeader.biCompression = BI_RGB;
129- bmi.bmiHeader.biSizeImage = width * height * 4;
130-
131- // usage == DIB_PAL_COLORS のとき hdcのパレットが使用される
132- // DIB_RGB_COLORS のときは hdc は参照されない?
133- // MSDNにはNULLでもokとは書かれていない
134- void* pvBits;
135- HBITMAP hBmp = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0x0);
136- if (hBmp == NULL) {
137- return NULL;
138- }
139-
140- memcpy(pvBits, src_info.Scan0, width * height * 4);
141-
142- return hBmp;
143-}
144-
145109 /**
146110 * 画像ファイルを読み込んで HBITMAP を返す
147111 *
112+ * GDI+で読み込んだ画像は32bit bitmapとなる
113+ * (32以外になることもあるかもしれない)
114+ * alphaプレーンを含んでいない画像ファイルを読み込むと、
115+ * 32bit bitmap画像データのalpha値は不透明になっている
116+ *
148117 * @param filename ファイル名
149118 * @retval HBITMAP
150119 * 不要になったら DeleteObject() すること
@@ -163,18 +132,11 @@
163132
164133 Gdiplus::PixelFormat format = bitmap.GetPixelFormat();
165134
166- if (format != PixelFormat32bppARGB) {
167- HBITMAP hBmp;
168- Gdiplus::Status r;
169- Gdiplus::Color bgColor = Gdiplus::Color(0, 0, 0);
170- r = bitmap.GetHBITMAP(bgColor, &hBmp);
171- if (r != Gdiplus::Ok) {
172- return NULL;
173- }
174- return hBmp;
135+ HBITMAP hBmp;
136+ Gdiplus::Color bgColor = Gdiplus::Color(0, 0, 0);
137+ Gdiplus::Status r = bitmap.GetHBITMAP(bgColor, &hBmp);
138+ if (r != Gdiplus::Ok) {
139+ return NULL;
175140 }
176- else {
177- // GetHBITMAP() returns no alpha info
178- return bitmap_GetHBITMAP(&bitmap);
179- }
141+ return hBmp;
180142 }
--- trunk/teraterm/teraterm/theme.h (revision 10384)
+++ trunk/teraterm/teraterm/theme.h (revision 10385)
@@ -49,16 +49,17 @@
4949 typedef struct {
5050 BG_TYPE type;
5151 BG_PATTERN pattern;
52+ BOOL enable;
5253 BOOL antiAlias;
53- COLORREF color;
54+ COLORREF color; // type=BG_PICTURE, BG_WALLPAPER時、画像のない部分塗りつぶし色
5455 int alpha;
5556 wchar_t file[MAX_PATH];
5657 } TBGSrc;
5758
5859 typedef struct _BGTheme {
59- TBGSrc BGDest;
60- TBGSrc BGSrc1;
61- TBGSrc BGSrc2;
60+ TBGSrc BGDest; // 背景画像
61+ TBGSrc BGSrc1; // 壁紙(Windowsのデスクトップ背景)
62+ TBGSrc BGSrc2; // fill color
6263 BYTE TextBackAlpha; // 通常属性(SGR0),back部分のAlpha
6364 BYTE BGReverseTextAlpha; // 反転属性(SGR7),back部分のAlpha
6465 BYTE BackAlpha; // その他のback部分のAlpha
--- trunk/teraterm/teraterm/themedlg.cpp (revision 10384)
+++ trunk/teraterm/teraterm/themedlg.cpp (revision 10385)
@@ -133,8 +133,8 @@
133133
134134 static void ResetControls(HWND hWnd, const BGTheme *bg_theme)
135135 {
136- BOOL bg_enable = (bg_theme->BGDest.type == BG_PICTURE && (bg_theme->BGDest.file != NULL && bg_theme->BGDest.file[0] != 0)) ? TRUE : FALSE;
137- SendDlgItemMessageA(hWnd, IDC_BGIMG_CHECK, BM_SETCHECK, bg_enable, 0);
136+ // bg image
137+ SendDlgItemMessageA(hWnd, IDC_BGIMG_CHECK, BM_SETCHECK, bg_theme->BGDest.enable, 0);
138138 SetDlgItemTextW(hWnd, IDC_BGIMG_EDIT, bg_theme->BGDest.file);
139139 SetDlgItemTextColor(hWnd, IDC_BGIMG_COLOR_EDIT, bg_theme->BGDest.color);
140140 {
@@ -150,11 +150,13 @@
150150 }
151151 SendDlgItemMessageA(hWnd, IDC_BGIMG_COMBO, CB_SETCURSEL, sel, 0);
152152 }
153+ SetDlgItemInt(hWnd, IDC_BGIMG_ALPHA_EDIT, bg_theme->BGDest.alpha, FALSE);
153154
154- SendDlgItemMessageA(hWnd, IDC_WALLPAPER_CHECK, BM_SETCHECK, bg_theme->BGSrc1.alpha != 0, 0);
155- SetDlgItemInt(hWnd, IDC_WALLPAPER_ALPHA_EDIT, bg_theme->BGSrc1.alpha, FALSE);
155+ // wall paper
156+ SendDlgItemMessageA(hWnd, IDC_WALLPAPER_CHECK, BM_SETCHECK, bg_theme->BGSrc1.enable, 0);
156157
157- SendDlgItemMessageA(hWnd, IDC_SIMPLE_COLOR_PLANE_CHECK, BM_SETCHECK, bg_theme->BGSrc2.alpha != 0, 0);
158+ // simple color plane
159+ SendDlgItemMessageA(hWnd, IDC_SIMPLE_COLOR_PLANE_CHECK, BM_SETCHECK, bg_theme->BGSrc2.enable, 0);
158160 SetDlgItemInt(hWnd, IDC_SIMPLE_COLOR_PLANE_ALPHA, bg_theme->BGSrc2.alpha, FALSE);
159161 SetDlgItemTextColor(hWnd, IDC_SIMPLE_COLOR_PLANE_COLOR, bg_theme->BGSrc2.color);
160162 }
@@ -163,30 +165,24 @@
163165 {
164166 LRESULT checked;
165167 LRESULT index;
168+
169+ // bg_image
166170 checked = SendDlgItemMessageA(hWnd, IDC_BGIMG_CHECK, BM_GETCHECK, 0, 0);
167- bg_theme->BGDest.type = checked & BST_CHECKED ? BG_PICTURE : BG_NONE;
171+ bg_theme->BGDest.enable = checked & BST_CHECKED;
168172 GetDlgItemTextW(hWnd, IDC_BGIMG_EDIT, bg_theme->BGDest.file, _countof(bg_theme->BGDest.file));
169173 bg_theme->BGDest.color = GetDlgItemTextColor(hWnd, IDC_BGIMG_COLOR_EDIT);
170174 index = SendDlgItemMessageA(hWnd, IDC_BGIMG_COMBO, CB_GETCURSEL, 0, 0);
171175 bg_theme->BGDest.pattern = (BG_PATTERN)SendDlgItemMessageA(hWnd, IDC_BGIMG_COMBO, CB_GETITEMDATA, index, 0);
176+ bg_theme->BGDest.alpha = GetDlgItemInt(hWnd, IDC_BGIMG_ALPHA_EDIT, NULL, FALSE);
172177
178+ // wall paper
173179 checked = SendDlgItemMessageA(hWnd, IDC_WALLPAPER_CHECK, BM_GETCHECK, 0, 0);
174- if (checked & BST_CHECKED) {
175- bg_theme->BGSrc1.type = BG_WALLPAPER;
176- bg_theme->BGSrc1.alpha = GetDlgItemInt(hWnd, IDC_WALLPAPER_ALPHA_EDIT, NULL, FALSE);
177- } else {
178- bg_theme->BGSrc1.type = BG_NONE;
179- bg_theme->BGSrc1.alpha = 0;
180- }
180+ bg_theme->BGSrc1.enable = checked & BST_CHECKED;
181181
182+ // simple color plane
182183 checked = SendDlgItemMessageA(hWnd, IDC_SIMPLE_COLOR_PLANE_CHECK, BM_GETCHECK, 0, 0);
183- if (checked & BST_CHECKED) {
184- bg_theme->BGSrc2.type = BG_COLOR;
185- bg_theme->BGSrc2.alpha = GetDlgItemInt(hWnd, IDC_SIMPLE_COLOR_PLANE_ALPHA, NULL, FALSE);
186- } else {
187- bg_theme->BGSrc2.type = BG_NONE;
188- bg_theme->BGSrc2.alpha = 0;
189- }
184+ bg_theme->BGSrc2.enable = checked & BST_CHECKED;
185+ bg_theme->BGSrc2.alpha = GetDlgItemInt(hWnd, IDC_SIMPLE_COLOR_PLANE_ALPHA, NULL, FALSE);
190186 bg_theme->BGSrc2.color = GetDlgItemTextColor(hWnd, IDC_SIMPLE_COLOR_PLANE_COLOR);
191187 }
192188
@@ -206,13 +202,11 @@
206202
207203 SetDlgItemTextW(hWnd, IDC_BG_THEME_HELP,
208204 L"Mix order:\n"
209- L" base\n"
210- L" v\n"
205+ L" simple color plane\n"
206+ L" ^\n"
211207 L" Background Image\n"
212- L" v\n"
208+ L" ^\n"
213209 L" wallpaper\n"
214- L" v\n"
215- L" simple color plane"
216210 );
217211
218212 for (int i = 0;; i++) {
--- trunk/teraterm/teraterm/themedlg_res.h (revision 10384)
+++ trunk/teraterm/teraterm/themedlg_res.h (revision 10385)
@@ -31,8 +31,8 @@
3131 #define IDC_BGIMG_COLOR_EDIT 3005
3232 #define IDC_BGIMG_COMBO 3006
3333 #define IDC_WALLPAPER_CHECK 3100
34-#define IDC_WALLPAPER_ALPHA_TITLE 3101
35-#define IDC_WALLPAPER_ALPHA_EDIT 3102
34+#define IDC_BGIMG_ALPHA_TITLE 3101
35+#define IDC_BGIMG_ALPHA_EDIT 3102
3636 #define IDC_SIMPLE_COLOR_PLANE_CHECK 3200
3737 #define IDC_SIMPLE_COLOR_PLANE_COLOR_TITLE 3201
3838 #define IDC_SIMPLE_COLOR_PLANE_COLOR 3202
@@ -42,7 +42,7 @@
4242 #define IDC_COLOR_DEFAULT_BUTTON 4001
4343
4444 // Next default values for new objects
45-//
45+//
4646 #ifdef APSTUDIO_INVOKED
4747 #ifndef APSTUDIO_READONLY_SYMBOLS
4848 #define _APS_NO_MFC 1
--- trunk/teraterm/teraterm/themefile.cpp (revision 10384)
+++ trunk/teraterm/teraterm/themefile.cpp (revision 10385)
@@ -359,6 +359,7 @@
359359 {
360360 const wchar_t *section = BG_SECTION_NEW;
361361
362+ WritePrivateProfileIntW(section, L"BGDestEnable", bg_theme->BGDest.enable, file);
362363 WritePrivateProfileStringW(section, L"BGDestFile", bg_theme->BGDest.file, file);
363364 #if 0
364365 WritePrivateProfileStringW(section, L"BGDestType",
@@ -366,9 +367,12 @@
366367 #endif
367368 WriteCOLORREF(section, L"BGDestColor", file, bg_theme->BGDest.color);
368369 WritePrivateProfileStringW(section, L"BGDestPattern", GetBGPatternStr(bg_theme->BGDest.pattern), file);
370+ WritePrivateProfileIntW(section, L"BGDestAlpha", bg_theme->BGDest.alpha, file);
369371
372+ WritePrivateProfileIntW(section, L"BGSrc1Enable", bg_theme->BGSrc1.enable, file);
370373 WritePrivateProfileIntW(section, L"BGSrc1Alpha", bg_theme->BGSrc1.alpha, file);
371374
375+ WritePrivateProfileIntW(section, L"BGSrc2Enable", bg_theme->BGSrc2.enable, file);
372376 WritePrivateProfileIntW(section, L"BGSrc2Alpha", bg_theme->BGSrc2.alpha, file);
373377 WriteCOLORREF(section, L"BGSrc2Color", file, bg_theme->BGSrc2.color);
374378
@@ -432,10 +436,12 @@
432436 wchar_t *p;
433437
434438 // Dest の読み出し
439+ bg_theme->BGDest.enable = GetPrivateProfileIntW(section, L"BGDestEnable", 0, file);
435440 bg_theme->BGDest.type = BGGetType(section, L"BGDestType", bg_theme->BGDest.type, file);
436441 bg_theme->BGDest.pattern = BGGetPattern(section, L"BGPicturePattern", bg_theme->BGDest.pattern, file);
437442 bg_theme->BGDest.pattern = BGGetPattern(section, L"BGDestPattern", bg_theme->BGDest.pattern, file);
438443 bg_theme->BGDest.antiAlias = BGGetOnOff(section, L"BGDestAntiAlias", bg_theme->BGDest.antiAlias, file);
444+ bg_theme->BGDest.alpha = GetPrivateProfileIntW(section, L"BGDestAlpha", bg_theme->BGDest.alpha, file);
439445 bg_theme->BGDest.color = BGGetColor(section, L"BGPictureBaseColor", bg_theme->BGDest.color, file);
440446 bg_theme->BGDest.color = BGGetColor(section, L"BGDestColor", bg_theme->BGDest.color, file);
441447 GetPrivateProfileStringW(section, L"BGPictureFile", bg_theme->BGDest.file, pathW, _countof(pathW), file);
@@ -450,6 +456,7 @@
450456 }
451457
452458 // Src1 の読み出し
459+ bg_theme->BGSrc1.enable = GetPrivateProfileIntW(section, L"BGSrc1Enable", 0, file);
453460 bg_theme->BGSrc1.type = BGGetType(section, L"BGSrc1Type", bg_theme->BGSrc1.type, file);
454461 bg_theme->BGSrc1.pattern = BGGetPattern(section, L"BGSrc1Pattern", bg_theme->BGSrc1.pattern, file);
455462 bg_theme->BGSrc1.antiAlias = BGGetOnOff(section, L"BGSrc1AntiAlias", bg_theme->BGSrc1.antiAlias, file);
@@ -467,6 +474,7 @@
467474 }
468475
469476 // Src2 の読み出し
477+ bg_theme->BGSrc2.enable = GetPrivateProfileIntW(section, L"BGSrc2Enable", 0, file);
470478 bg_theme->BGSrc2.type = BGGetType(section, L"BGSrc2Type", bg_theme->BGSrc2.type, file);
471479 bg_theme->BGSrc2.pattern = BGGetPattern(section, L"BGSrc2Pattern", bg_theme->BGSrc2.pattern, file);
472480 bg_theme->BGSrc2.antiAlias = BGGetOnOff(section, L"BGSrc2AntiAlias", bg_theme->BGSrc2.antiAlias, file);
--- trunk/teraterm/teraterm/vtdisp.c (revision 10384)
+++ trunk/teraterm/teraterm/vtdisp.c (revision 10385)
@@ -125,6 +125,7 @@
125125 typedef struct _BGSrc
126126 {
127127 HDC hdc;
128+ BOOL enable;
128129 BG_TYPE type;
129130 BG_PATTERN pattern;
130131 BOOL antiAlias;
@@ -135,9 +136,9 @@
135136 wchar_t *fileW;
136137 } BGSrc;
137138
138-static BGSrc BGDest;
139-static BGSrc BGSrc1;
140-static BGSrc BGSrc2;
139+static BGSrc BGDest; // 背景画像用
140+static BGSrc BGSrc1; // 壁紙(Windowsのデスクトップ背景)用
141+static BGSrc BGSrc2; // fill color用
141142
142143 static int BGEnable;
143144 static BYTE BGReverseTextAlpha;
@@ -503,7 +504,7 @@
503504 return;
504505
505506 //壁紙ファイル名ゲット
506- hRegQueryValueExW(hKey, L"Wallpaper", NULL, NULL, &wi->filename, NULL);
507+ hRegQueryValueExW(hKey, L"Wallpaper", NULL, NULL, (void **)&wi->filename, NULL);
507508
508509 //壁紙スタイルゲット
509510 length = sizeof(str);
@@ -1052,6 +1053,152 @@
10521053 }
10531054 }
10541055
1056+/**
1057+ * 32bit bitmap でも alphaが使用されていないときは
1058+ * 不透明なbitmapと同様に扱う
1059+ */
1060+static BOOL IsAlphaValidBitmap(HBITMAP hBmp)
1061+{
1062+ BITMAP bm;
1063+ BOOL alpha = FALSE;
1064+
1065+ assert(hBmp != NULL);
1066+
1067+ // 1pixelあたりのbit数をチェックする
1068+ GetObject(hBmp, sizeof(bm), &bm);
1069+ if (bm.bmBitsPixel != 32) {
1070+ // 32bit/pixel 以外の時は alpha 情報はない
1071+ return FALSE;
1072+ }
1073+
1074+ // alpha情報が使用されているかチェックする
1075+ // すべてのピクセルで不透明となっているか調べる
1076+ {
1077+ // DIBを作成する hBmp のコピー先
1078+ // hBmp が DDB のとき pixel情報をチェックできないので DIB へコピー(BitBlt)する
1079+ LONG width;
1080+ LONG height;
1081+ BITMAPINFO bmi;
1082+ void* pvBits;
1083+ HBITMAP hBmpDIB;
1084+ HBITMAP hBmpCopy;
1085+ HDC HDCDest;
1086+ HDC HDCSrc;
1087+ HBITMAP prev1;
1088+ HBITMAP prev2;
1089+ DWORD *p;
1090+ LONG i;
1091+
1092+ width = bm.bmWidth;
1093+ height = bm.bmHeight;
1094+ memset(&bmi, 0, sizeof(bmi));
1095+ bmi.bmiHeader.biSize = sizeof(bmi);
1096+ bmi.bmiHeader.biWidth = width;
1097+ bmi.bmiHeader.biHeight = height;
1098+ bmi.bmiHeader.biPlanes = 1;
1099+ bmi.bmiHeader.biBitCount = 32; // = 8*4
1100+ bmi.bmiHeader.biCompression = BI_RGB;
1101+ bmi.bmiHeader.biSizeImage = width * height * 4;
1102+ hBmpDIB = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0x0);
1103+
1104+ // hBmp が SelectObject() されいたとき
1105+ // 別HDCにSelectObject()できないのでコピーしておく
1106+ hBmpCopy = (HBITMAP)CopyImage(hBmp, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE);
1107+
1108+ // hBmp(hBmpCopy)をDIBにコピー(BitBlt)する
1109+ HDCDest = CreateCompatibleDC(NULL);
1110+ HDCSrc = CreateCompatibleDC(NULL);
1111+ prev1 = SelectObject(HDCDest, hBmpDIB);
1112+ prev2 = SelectObject(HDCSrc, hBmpCopy);
1113+ BitBlt(HDCDest, 0, 0, width, height, HDCSrc, 0, 0, SRCCOPY);
1114+
1115+ // alpha値をチェックする
1116+ p = pvBits;
1117+ for (i = 0; i < width * height; i++) {
1118+ DWORD pix = *p++;
1119+ if ((pix & 0xff000000) != 0xff000000) {
1120+ alpha = TRUE;
1121+ break;
1122+ }
1123+ }
1124+
1125+ // 破棄
1126+ SelectObject(HDCDest, prev1);
1127+ SelectObject(HDCSrc, prev2);
1128+ DeleteObject(hBmpDIB);
1129+ DeleteObject(hBmpCopy);
1130+ DeleteDC(HDCDest);
1131+ DeleteDC(HDCSrc);
1132+ }
1133+ return alpha;
1134+}
1135+
1136+static BOOL IsAlphaValidBitmapHDC(HDC hDC)
1137+{
1138+ HBITMAP hBmp;
1139+
1140+ assert(hDC != NULL);
1141+ hBmp = GetCurrentObject(hDC, OBJ_BITMAP);
1142+ return IsAlphaValidBitmap(hBmp);
1143+}
1144+
1145+/**
1146+ * 背景画像生成
1147+ */
1148+static HDC CreateBGImage(int width, int height)
1149+{
1150+ BLENDFUNCTION bf;
1151+ HDC hdc_work;
1152+ HDC hdc_bg;
1153+
1154+ hdc_bg = CreateBitmapDC(CreateScreenCompatibleBitmap(width, height));
1155+ hdc_work = CreateBitmapDC(CreateScreenCompatibleBitmap(width, height));
1156+
1157+ // 壁紙(Windowsのデスクトップ背景)
1158+ if (BGSrc1.enable) {
1159+ BGLoadSrc(hdc_bg, &BGSrc1);
1160+ }
1161+ DebugSaveFile(L"bg_1.bmp", hdc_bg, width, height);
1162+
1163+ // 指定画像
1164+ if (BGDest.enable && BGDest.hdc != NULL) {
1165+ memset(&bf, 0, sizeof(bf));
1166+ bf.BlendOp = AC_SRC_OVER;
1167+ bf.SourceConstantAlpha = BGDest.alpha;
1168+ bf.AlphaFormat = 0;
1169+ if (IsAlphaValidBitmapHDC(BGDest.hdc)) {
1170+ // 32bitビットマップ(alpha値が存在している)場合はalpha値を参照する
1171+ bf.AlphaFormat = AC_SRC_ALPHA;
1172+ }
1173+ BGLoadSrc(hdc_work, &BGDest);
1174+ BGAlphaBlend(hdc_bg, 0, 0, width, height, hdc_work, 0, 0, width, height, bf);
1175+ }
1176+ DebugSaveFile(L"bg_2.bmp", hdc_bg, width, height);
1177+
1178+ // 単色プレーン
1179+ if (BGSrc2.enable) {
1180+ memset(&bf, 0, sizeof(bf));
1181+ bf.BlendOp = AC_SRC_OVER;
1182+ bf.SourceConstantAlpha = BGSrc2.alpha;
1183+ bf.AlphaFormat = 0;
1184+ BGLoadSrc(hdc_work, &BGSrc2);
1185+ BGAlphaBlend(hdc_bg, 0, 0, width, height, hdc_work, 0, 0, width, height, bf);
1186+ }
1187+ DebugSaveFile(L"bg_3.bmp", hdc_bg, width, height);
1188+
1189+ DeleteBitmapDC(&hdc_work);
1190+
1191+ return hdc_bg;
1192+}
1193+
1194+/**
1195+ *
1196+ * ThemeSetBG(), ThemeSetColor() のあとにコールする
1197+ *
1198+ * @param forceSetup FALSE WM_PAINT時
1199+ * TRUE 以外
1200+ *
1201+ */
10551202 void BGSetupPrimary(BOOL forceSetup)
10561203 {
10571204 POINT point;
@@ -1094,40 +1241,12 @@
10941241
10951242 if(!BGInSizeMove)
10961243 {
1097- BLENDFUNCTION bf;
1098- HDC hdcSrc = NULL;
1244+ //背景 HDC
1245+ if(hdcBG) {
1246+ DeleteBitmapDC(&hdcBG);
1247+ }
10991248
1100- //背景 HDC
1101- if(hdcBG) DeleteBitmapDC(&hdcBG);
1102- hdcBG = CreateBitmapDC(CreateScreenCompatibleBitmap(ScreenWidth,ScreenHeight));
1103-
1104- //作業用DC
1105- hdcSrc = CreateBitmapDC(CreateScreenCompatibleBitmap(ScreenWidth,ScreenHeight));
1106-
1107- //背景生成
1108- BGLoadSrc(hdcBG,&BGDest);
1109- DebugSaveFile(L"bg_1.bmp", hdcBG, ScreenWidth, ScreenHeight);
1110-
1111- ZeroMemory(&bf,sizeof(bf));
1112- bf.BlendOp = AC_SRC_OVER;
1113-
1114- bf.SourceConstantAlpha = BGSrc1.alpha;
1115- if(bf.SourceConstantAlpha)
1116- {
1117- BGLoadSrc(hdcSrc,&BGSrc1);
1118- (BGAlphaBlend)(hdcBG,0,0,ScreenWidth,ScreenHeight,hdcSrc,0,0,ScreenWidth,ScreenHeight,bf);
1119- }
1120- DebugSaveFile(L"bg_2.bmp", hdcBG, ScreenWidth, ScreenHeight);
1121-
1122- bf.SourceConstantAlpha = BGSrc2.alpha;
1123- if(bf.SourceConstantAlpha)
1124- {
1125- BGLoadSrc(hdcSrc,&BGSrc2);
1126- (BGAlphaBlend)(hdcBG,0,0,ScreenWidth,ScreenHeight,hdcSrc,0,0,ScreenWidth,ScreenHeight,bf);
1127- }
1128- DebugSaveFile(L"bg_3.bmp", hdcBG, ScreenWidth, ScreenHeight);
1129-
1130- DeleteBitmapDC(&hdcSrc);
1249+ hdcBG = CreateBGImage(ScreenWidth, ScreenHeight);
11311250 }
11321251 }
11331252
@@ -1207,22 +1326,10 @@
12071326 // 背景画像チェック
12081327 if (BGDest.fileW == NULL || BGDest.fileW[0] == 0) {
12091328 // 背景画像は使用しない
1210- BGDest.type = BG_NONE;
1329+ BGDest.enable = FALSE;
12111330 }
12121331
1213- // デスクトップ壁紙チェック
1214- if (BGSrc1.alpha == 0) {
1215- // 使用しない
1216- BGSrc1.type = BG_NONE;
1217- }
1218-
1219- // simple plane
1220- if (BGSrc2.alpha == 0) {
1221- // 使用しない
1222- BGSrc2.type = BG_NONE;
1223- }
1224-
1225- if (BGDest.type == BG_NONE && BGSrc1.type == BG_NONE && BGSrc2.type == BG_NONE) {
1332+ if (BGDest.enable == FALSE && BGSrc1.enable == FALSE && BGSrc2.enable == FALSE) {
12261333 // BGは使用しない
12271334 BGEnable = FALSE;
12281335 w->bg_enable = FALSE;
@@ -1238,7 +1345,7 @@
12381345 * テーマ無しならデフォルト設定する
12391346 * テーマありならテーマファイルを読み出して設定する
12401347 */
1241-void BGLoadThemeFile(TTTSet *pts)
1348+void BGLoadThemeFile(const TTTSet *pts)
12421349 {
12431350 // コンフィグファイル(テーマファイル)の決定
12441351 switch(pts->EtermLookfeel.BGEnable) {
@@ -1427,27 +1534,6 @@
14271534 return;
14281535
14291536 BGInSizeMove = TRUE;
1430-
1431-#if 0
1432- {
1433- int r,g,b;
1434-
1435- //背景色生成
1436- r = GetRValue(BGDest.color);
1437- g = GetGValue(BGDest.color);
1438- b = GetBValue(BGDest.color);
1439-
1440- r = (r * (255 - BGSrc1.alpha) + GetRValue(BGSrc1.color) * BGSrc1.alpha) >> 8;
1441- g = (g * (255 - BGSrc1.alpha) + GetGValue(BGSrc1.color) * BGSrc1.alpha) >> 8;
1442- b = (b * (255 - BGSrc1.alpha) + GetBValue(BGSrc1.color) * BGSrc1.alpha) >> 8;
1443-
1444- r = (r * (255 - BGSrc2.alpha) + GetRValue(BGSrc2.color) * BGSrc2.alpha) >> 8;
1445- g = (g * (255 - BGSrc2.alpha) + GetGValue(BGSrc2.color) * BGSrc2.alpha) >> 8;
1446- b = (b * (255 - BGSrc2.alpha) + GetBValue(BGSrc2.color) * BGSrc2.alpha) >> 8;
1447-
1448- BGBrushInSizeMove = CreateSolidBrush(RGB(r,g,b));
1449- }
1450-#endif
14511537 }
14521538
14531539 void BGOnExitSizeMove(void)
@@ -1470,22 +1556,20 @@
14701556 #endif
14711557 }
14721558
1559+/**
1560+ * WM_SETTINGCHANGE 時に呼び出す
1561+ */
14731562 void BGOnSettingChange(void)
14741563 {
1475- if(!BGEnable)
1476- return;
1564+ if(!BGEnable)
1565+ return;
14771566
1478- // TODO モニタ(ディスプレイ)をまたぐとサイズが変化するのでは?
1479- CRTWidth = GetSystemMetrics(SM_CXSCREEN);
1480- CRTHeight = GetSystemMetrics(SM_CYSCREEN);
1567+ // TODO モニタ(ディスプレイ)をまたぐとサイズが変化するのでは?
1568+ CRTWidth = GetSystemMetrics(SM_CXSCREEN);
1569+ CRTHeight = GetSystemMetrics(SM_CYSCREEN);
14811570
1482- //壁紙 or 背景をプリロード
1483- BGPreloadSrc(&BGDest);
1484- BGPreloadSrc(&BGSrc1);
1485- BGPreloadSrc(&BGSrc2);
1486-
1487- BGSetupPrimary(TRUE);
1488- InvalidateRect(HVTWin, NULL, FALSE);
1571+ BGSetupPrimary(TRUE);
1572+ InvalidateRect(HVTWin, NULL, FALSE);
14891573 }
14901574
14911575 /**
@@ -3728,12 +3812,15 @@
37283812 */
37293813 void ThemeGetBGDefault(BGTheme *bg_theme)
37303814 {
3815+ bg_theme->BGDest.enable = FALSE;
37313816 bg_theme->BGDest.type = BG_PICTURE;
37323817 bg_theme->BGDest.pattern = BG_STRETCH;
37333818 bg_theme->BGDest.color = RGB(0, 0, 0);
3819+ bg_theme->BGDest.alpha = 255;
37343820 bg_theme->BGDest.antiAlias = TRUE;
37353821 bg_theme->BGDest.file[0] = 0;
37363822
3823+ bg_theme->BGSrc1.enable = FALSE;
37373824 bg_theme->BGSrc1.type = BG_WALLPAPER;
37383825 bg_theme->BGSrc1.pattern = BG_STRETCH;
37393826 bg_theme->BGSrc1.color = RGB(255, 255, 255);
@@ -3741,6 +3828,7 @@
37413828 bg_theme->BGSrc1.alpha = 0;
37423829 bg_theme->BGSrc1.file[0] = 0;
37433830
3831+ bg_theme->BGSrc2.enable = FALSE;
37443832 bg_theme->BGSrc2.type = BG_COLOR;
37453833 bg_theme->BGSrc2.pattern = BG_STRETCH;
37463834 bg_theme->BGSrc2.color = RGB(0, 0, 0);
@@ -3823,13 +3911,17 @@
38233911 BGDest.type = bg_theme->BGDest.type;
38243912 BGDest.color = bg_theme->BGDest.color;
38253913 BGDest.pattern = bg_theme->BGDest.pattern;
3914+ BGDest.enable = bg_theme->BGDest.enable;
3915+ BGDest.alpha = bg_theme->BGDest.alpha;
38263916
38273917 BGSrc1.type = bg_theme->BGSrc1.type;
38283918 BGSrc1.alpha = bg_theme->BGSrc1.alpha;
3919+ BGSrc1.enable = bg_theme->BGSrc1.enable;
38293920
38303921 BGSrc2.type = bg_theme->BGSrc2.type;
38313922 BGSrc2.alpha = bg_theme->BGSrc2.alpha;
38323923 BGSrc2.color = bg_theme->BGSrc2.color;
3924+ BGSrc2.enable = bg_theme->BGSrc2.enable;
38333925
38343926 BGReverseTextAlpha = bg_theme->BGReverseTextAlpha;
38353927 {
@@ -3852,13 +3944,17 @@
38523944 bg_theme->BGDest.type = BG_PICTURE;
38533945 bg_theme->BGDest.color = BGDest.color;
38543946 bg_theme->BGDest.pattern = BGDest.pattern;
3947+ bg_theme->BGDest.enable = BGDest.enable;
3948+ bg_theme->BGDest.alpha = BGDest.alpha;
38553949
38563950 bg_theme->BGSrc1.type = BG_WALLPAPER;
38573951 bg_theme->BGSrc1.alpha = BGSrc1.alpha;
3952+ bg_theme->BGSrc1.enable = BGSrc1.enable;
38583953
38593954 bg_theme->BGSrc2.type = BG_COLOR;
38603955 bg_theme->BGSrc2.alpha = BGSrc2.alpha;
38613956 bg_theme->BGSrc2.color = BGSrc2.color;
3957+ bg_theme->BGSrc2.enable = BGSrc2.enable;
38623958
38633959 bg_theme->BGReverseTextAlpha = BGReverseTextAlpha;
38643960 {
--- trunk/teraterm/teraterm/vtdisp.h (revision 10384)
+++ trunk/teraterm/teraterm/vtdisp.h (revision 10385)
@@ -61,7 +61,7 @@
6161
6262 /* prototypes */
6363 void BGInitialize(BOOL initialize_once);
64-void BGLoadThemeFile(TTTSet *pts);
64+void BGLoadThemeFile(const TTTSet *pts);
6565 void BGSetupPrimary(BOOL forceSetup);
6666
6767 void BGOnSettingChange(void);
--- trunk/teraterm/teraterm/vtwin.cpp (revision 10384)
+++ trunk/teraterm/teraterm/vtwin.cpp (revision 10385)
@@ -67,6 +67,7 @@
6767 #include "teraterml.h"
6868 #include "buffer.h"
6969 #include "cyglib.h"
70+#include "theme.h"
7071
7172 #include <stdio.h>
7273 #define _CRTDBG_MAP_ALLOC
@@ -4296,11 +4297,24 @@
42964297 Ok = (*SetupWin)(HVTWin, &ts);
42974298
42984299 if (Ok) {
4299- // Eterm lookfeelの画面情報も更新することで、リアルタイムでの背景色変更が
4300- // 可能となる。(2006.2.24 yutaka)
4301- BGInitialize(FALSE);
4302- BGSetupPrimary(TRUE);
4300+ BOOL set_color = TRUE;
4301+ if (ThemeGetEnable()) {
4302+ static const TTMessageBoxInfoW info = {
4303+ "Tera Term",
4304+ "MSG_TT_NOTICE", L"Tera Term: Notice",
4305+ NULL, L"Theme is used\nDo you want to set color?",
4306+ MB_ICONQUESTION | MB_YESNO };
4307+ int r = TTMessageBoxW(m_hWnd, &info, ts.UILanguageFileW);
4308+ if (r == IDNO) {
4309+ set_color = FALSE;
4310+ }
4311+ }
43034312
4313+ // 色を設定する
4314+ if (set_color) {
4315+ DispResetColor(CS_ALL);
4316+ }
4317+
43044318 // タイトルが変更されていたら、リモートタイトルをクリアする
43054319 if ((ts.AcceptTitleChangeRequest == IdTitleChangeRequestOverwrite) &&
43064320 (strcmp(orgTitle, ts.Title) != 0)) {
Show on old repository browser