[ttssh2-commit] [10806] 文字を拡大縮小して描画できるようにした

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 7月 23日 (日) 16:07:41 JST


Revision: 10806
          https://osdn.net/projects/ttssh2/scm/svn/commits/10806
Author:   zmatsuo
Date:     2023-07-23 16:07:41 +0900 (Sun, 23 Jul 2023)
Log Message:
-----------
文字を拡大縮小して描画できるようにした

- 拡大縮小して描画できるようにした
  - 2cell幅の文字を1cell幅に縮小して描画
  - 1cell幅の文字を2cell幅に拡大して描画,等
- フォントプロパティーページに設定を追加
  - "Drawing resized font to fit cell width" checkbox
- compat_win.cpp に TransparentBlt() (msimg32.dll) を追加
- ヘルプ追加(enはjaのコピー)

Modified Paths:
--------------
    trunk/doc/en/html/menu/setup-additional-font.html
    trunk/doc/ja/html/menu/setup-additional-font.html
    trunk/teraterm/common/compat_win.cpp
    trunk/teraterm/common/compat_win.h
    trunk/teraterm/teraterm/buffer.c
    trunk/teraterm/teraterm/font_pp.cpp
    trunk/teraterm/teraterm/font_pp.rc
    trunk/teraterm/teraterm/font_pp_res.h
    trunk/teraterm/teraterm/teraprn.cpp
    trunk/teraterm/teraterm/vtdisp.c
    trunk/teraterm/teraterm/vtdisp.h
    trunk/tests/unicodebuf-combining-spacing_mark.pl

-------------- next part --------------
Modified: trunk/doc/en/html/menu/setup-additional-font.html
===================================================================
--- trunk/doc/en/html/menu/setup-additional-font.html	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/doc/en/html/menu/setup-additional-font.html	2023-07-23 07:07:41 UTC (rev 10806)
@@ -41,6 +41,18 @@
 </pre>
           </dd>
 
+          <dt>\x95`\x89敝\x82ɍ\x87\x82킹\x82ă\x8A\x83T\x83C\x83Y\x82\xB5\x82\xBD\x83t\x83H\x83\x93\x83g\x82\xF0\x95`\x89\xE6(Drawing resized font to fit cell width)</dt>
+          <dd>
+            ON\x82̂Ƃ\xAB\x95\\x8E\xA6\x82\xB5\x82\xBD\x82\xA2\x95\x9D\x82ƕ`\x89悷\x82\xE9\x83t\x83H\x83\x93\x83g\x82̕\x9D\x82\xAA\x88قȂ\xC1\x82Ă\xA2\x82鎞\x81A
+            \x83t\x83H\x83\x93\x83g\x82\xF0\x8Fk\x8F\xAC\x8Ag\x91債\x82Ă\xA9\x82\xE7\x95`\x89悵\x82܂\xB7\x81B<br>
+            "©"\x82ȂǁA\x95\\x8E\xA6\x82\xB5\x82悤\x82Ƃ\xB7\x82镝\x82\xCD1cell,2cell\x82̂ǂ\xBF\x82\xE7\x82̏ꍇ\x82\xE0\x82\xA0\x82\xE8\x81A
+            \x83t\x83H\x83\x93\x83g\x83t\x83@\x83C\x83\x8B\x82ɂ\xE6\x82\xC1\x82ăt\x83H\x83\x93\x83g\x82̕\x9D\x82\xE01cell,2cell\x82̂ǂ\xBF\x82\xE7\x82̏ꍇ\x82\xE0\x82\xA0\x82\xE8\x82܂\xB7\x81B<br>
+            \x8C\xBE\x8C\xEA\x82\xE2\x83t\x83H\x83\x93\x83g\x82ɂ\xE6\x82\xC1\x82ăt\x83H\x83\x93\x83g\x95\x9D\x82͕\\x8E\xA6\x82\xB5\x82悤\x82Ƃ\xB7\x82镝\x82ɍ\x87\x82\xED\x82Ȃ\xA2\x8Fꍇ\x82\xE0\x82\xA0\x82\xE8\x82܂\xB7\x81B<br>
+            \x82\xB1\x82̃`\x83F\x83b\x83N\x82\xF0ON\x82ɂ\xB7\x82\xE9\x82ƁAcell\x95\x9D\x82ɍ\x87\x82킹\x82ĕ\xB6\x8E\x9A\x82\xF0\x95`\x89悵\x82܂\xB7\x81B<br>
+            cell\x95\x9D\x82ɂ\xA0\x82킹\x82ĕ\xB6\x8E\x9A\x82\xAA\x95`\x89悳\x82\xEA\x82邽\x82ߕ\xB6\x8E\x9A\x82͔\xBB\x95ʂ\xB5\x82₷\x82\xAD\x82Ȃ\xE9\x82Ƃ\xA2\x82\xA4\x97\x98\x93_\x82\xAA\x82\xA0\x82\xE9\x88\xEA\x95\xFB\x82ŁA
+            \x95`\x89摬\x93x\x82\xAA\x92x\x82\xAD\x82Ȃ\xC1\x82\xBD\x82\xE8\x81A\x83f\x83U\x83C\x83\x93\x82\xAA\x83t\x83H\x83\x93\x83g\x8AJ\x94\xAD\x8E҂̈Ӑ}\x82ƈقȂ\xC1\x82Ă\xB5\x82܂\xA4\x82Ƃ\xA2\x82\xA4\x8C\x87\x93_\x82\xAA\x82\xA0\x82\xE8\x82܂\xB7\x81B
+          </dd>
+
           <dt>Character space</dt>
           <dd>
             Under construction.<br>

Modified: trunk/doc/ja/html/menu/setup-additional-font.html
===================================================================
--- trunk/doc/ja/html/menu/setup-additional-font.html	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/doc/ja/html/menu/setup-additional-font.html	2023-07-23 07:07:41 UTC (rev 10806)
@@ -41,6 +41,18 @@
 </pre>
           </dd>
 
+          <dt>\x95`\x89敝\x82ɍ\x87\x82킹\x82ă\x8A\x83T\x83C\x83Y\x82\xB5\x82\xBD\x83t\x83H\x83\x93\x83g\x82\xF0\x95`\x89\xE6(Drawing resized font to fit cell width)</dt>
+          <dd>
+            ON\x82̂Ƃ\xAB\x95\\x8E\xA6\x82\xB5\x82\xBD\x82\xA2\x95\x9D\x82ƕ`\x89悷\x82\xE9\x83t\x83H\x83\x93\x83g\x82̕\x9D\x82\xAA\x88قȂ\xC1\x82Ă\xA2\x82鎞\x81A
+            \x83t\x83H\x83\x93\x83g\x82\xF0\x8Fk\x8F\xAC\x8Ag\x91債\x82Ă\xA9\x82\xE7\x95`\x89悵\x82܂\xB7\x81B<br>
+            "©"\x82ȂǁA\x95\\x8E\xA6\x82\xB5\x82悤\x82Ƃ\xB7\x82镝\x82\xCD1cell,2cell\x82̂ǂ\xBF\x82\xE7\x82̏ꍇ\x82\xE0\x82\xA0\x82\xE8\x81A
+            \x83t\x83H\x83\x93\x83g\x83t\x83@\x83C\x83\x8B\x82ɂ\xE6\x82\xC1\x82ăt\x83H\x83\x93\x83g\x82̕\x9D\x82\xE01cell,2cell\x82̂ǂ\xBF\x82\xE7\x82̏ꍇ\x82\xE0\x82\xA0\x82\xE8\x82܂\xB7\x81B<br>
+            \x8C\xBE\x8C\xEA\x82\xE2\x83t\x83H\x83\x93\x83g\x82ɂ\xE6\x82\xC1\x82ăt\x83H\x83\x93\x83g\x95\x9D\x82͕\\x8E\xA6\x82\xB5\x82悤\x82Ƃ\xB7\x82镝\x82ɍ\x87\x82\xED\x82Ȃ\xA2\x8Fꍇ\x82\xE0\x82\xA0\x82\xE8\x82܂\xB7\x81B<br>
+            \x82\xB1\x82̃`\x83F\x83b\x83N\x82\xF0ON\x82ɂ\xB7\x82\xE9\x82ƁAcell\x95\x9D\x82ɍ\x87\x82킹\x82ĕ\xB6\x8E\x9A\x82\xF0\x95`\x89悵\x82܂\xB7\x81B<br>
+            cell\x95\x9D\x82ɂ\xA0\x82킹\x82ĕ\xB6\x8E\x9A\x82\xAA\x95`\x89悳\x82\xEA\x82邽\x82ߕ\xB6\x8E\x9A\x82͔\xBB\x95ʂ\xB5\x82₷\x82\xAD\x82Ȃ\xE9\x82Ƃ\xA2\x82\xA4\x97\x98\x93_\x82\xAA\x82\xA0\x82\xE9\x88\xEA\x95\xFB\x82ŁA
+            \x95`\x89摬\x93x\x82\xAA\x92x\x82\xAD\x82Ȃ\xC1\x82\xBD\x82\xE8\x81A\x83f\x83U\x83C\x83\x93\x82\xAA\x83t\x83H\x83\x93\x83g\x8AJ\x94\xAD\x8E҂̈Ӑ}\x82ƈقȂ\xC1\x82Ă\xB5\x82܂\xA4\x82Ƃ\xA2\x82\xA4\x8C\x87\x93_\x82\xAA\x82\xA0\x82\xE8\x82܂\xB7\x81B
+          </dd>
+
           <dt>\x95\xB6\x8E\x9A\x8AԃX\x83y\x81[\x83X</dt>
           <dd>
             \x8DH\x8E\x96\x92\x86\x82ł\xB7\x81B<br>

Modified: trunk/teraterm/common/compat_win.cpp
===================================================================
--- trunk/teraterm/common/compat_win.cpp	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/common/compat_win.cpp	2023-07-23 07:07:41 UTC (rev 10806)
@@ -109,6 +109,10 @@
 HRESULT (WINAPI *pDwmSetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
 HRESULT (WINAPI *pDwmGetWindowAttribute)(HWND hwnd, DWORD dwAttribute, PVOID pvAttribute, DWORD cbAttribute);
 
+// msimg32.dll
+BOOL (WINAPI *pTransparentBlt)(HDC hdcDest, int xoriginDest, int yoriginDest, int wDest, int hDest, HDC hdcSrc,
+							   int xoriginSrc, int yoriginSrc, int wSrc, int hSrc, UINT crTransparent);
+
 class Initializer {
 public:
 	Initializer() {

Modified: trunk/teraterm/common/compat_win.h
===================================================================
--- trunk/teraterm/common/compat_win.h	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/common/compat_win.h	2023-07-23 07:07:41 UTC (rev 10806)
@@ -219,6 +219,10 @@
 extern HRESULT (WINAPI *pDwmSetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute);
 extern HRESULT (WINAPI *pDwmGetWindowAttribute)(HWND hwnd, DWORD dwAttribute, PVOID pvAttribute, DWORD cbAttribute);
 
+// msimg32.dll
+extern BOOL(WINAPI *pTransparentBlt)(HDC hdcDest, int xoriginDest, int yoriginDest, int wDest, int hDest, HDC hdcSrc,
+									 int xoriginSrc, int yoriginSrc, int wSrc, int hSrc, UINT crTransparent);
+
 void WinCompatInit();
 
 #ifdef __cplusplus

Modified: trunk/teraterm/teraterm/buffer.c
===================================================================
--- trunk/teraterm/teraterm/buffer.c	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/teraterm/buffer.c	2023-07-23 07:07:41 UTC (rev 10806)
@@ -3356,22 +3356,24 @@
 			} else {
 				// UTF-16\x82ŃT\x83\x8D\x83Q\x81[\x83g\x83y\x83A
 				bufW[lenW] = b->wc2[0];
-				bufWW[lenW] = b->cell;
+				bufWW[lenW] = 0;
 				lenW++;
 				bufW[lenW] = b->wc2[1];
-				bufWW[lenW] = 0;
+				bufWW[lenW] = b->cell;
 				lenW++;
 			}
-			if (b->CombinationCharCount16 != 0)
-			{
+			if (b->CombinationCharCount16 != 0) {
 				// \x83R\x83\x93\x83r\x83l\x81[\x83V\x83\x87\x83\x93
 				int i;
-				for (i = 0 ; i < (int)b->CombinationCharCount16; i++) {
-					bufW[lenW+i] = b->pCombinationChars16[i];
+				const char cell_tmp = bufWW[lenW - 1];
+				bufWW[lenW - 1] = 0;
+				for (i = 0; i < (int)b->CombinationCharCount16; i++) {
+					bufW[lenW + i] = b->pCombinationChars16[i];
 					bufWW[lenW + i] = 0;
 				}
+				bufWW[lenW + b->CombinationCharCount16 - 1] = cell_tmp;
 				lenW += b->CombinationCharCount16;
-				DrawFlag = TRUE;	// \x83R\x83\x93\x83r\x83l\x81[\x83V\x83\x87\x83\x93\x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x82͂\xB7\x82\xAE\x95`\x89\xE6
+				DrawFlag = TRUE;  // \x83R\x83\x93\x83r\x83l\x81[\x83V\x83\x87\x83\x93\x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x82͂\xB7\x82\xAE\x95`\x89\xE6
 			}
 
 			// ANSI\x94\xC5
@@ -3451,12 +3453,12 @@
 	int draw_y;
 } disp_data_t;
 
-static void l_disp_strW(const wchar_t *bufW, const char *width_info, int count, void *data_)
+static void l_disp_strW(const wchar_t *bufW, const char *cells, int len, void *data_)
 {
 	disp_data_t *data = (disp_data_t *)data_;
 	int x = data->draw_x;
 	int y = data->draw_y;
-	DispStrW(bufW, width_info, count, y, &x);
+	DispStrW(bufW, cells, len, y, &x);
 	data->draw_x = x;
 }
 

Modified: trunk/teraterm/teraterm/font_pp.cpp
===================================================================
--- trunk/teraterm/teraterm/font_pp.cpp	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/teraterm/font_pp.cpp	2023-07-23 07:07:41 UTC (rev 10806)
@@ -210,6 +210,8 @@
 
 			SetFontString(hWnd, IDC_DLGFONT_EDIT, &dlg_data->DlgFont);
 
+			CheckDlgButton(hWnd, IDC_RESIZED_FONT, DispIsResizedFont());
+
 			break;
 		}
 		case WM_NOTIFY: {
@@ -234,6 +236,8 @@
 						cur == 2 ? ANTIALIASED_QUALITY :
 						CLEARTYPE_QUALITY;
 
+					DispEnableResizedFont(IsDlgButtonChecked(hWnd, IDC_RESIZED_FONT) == BST_CHECKED);
+
 					break;
 				}
 				case PSN_HELP: {

Modified: trunk/teraterm/teraterm/font_pp.rc
===================================================================
--- trunk/teraterm/teraterm/font_pp.rc	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/teraterm/font_pp.rc	2023-07-23 07:07:41 UTC (rev 10806)
@@ -65,19 +65,21 @@
     EDITTEXT        IDC_VTFONT_CODEPAGE_EDIT,44,108,40,12,ES_AUTOHSCROLL
     LTEXT           "&Font Quality",IDC_FONT_QUALITY_LABEL,19,129,91,8
     COMBOBOX        IDC_FONT_QUALITY,30,141,87,69,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    LTEXT           "&Dialog font",IDC_DLGFONT,7,162,115,8
-    EDITTEXT        IDC_DLGFONT_EDIT,19,177,148,12,ES_AUTOHSCROLL | ES_READONLY
-    PUSHBUTTON      "Select...",IDC_DLGFONT_CHOOSE,177,176,50,14
-    PUSHBUTTON      "&default",IDC_DLGFONT_DEFAULT,231,176,50,14
+    LTEXT           "&Dialog font",IDC_DLGFONT,7,175,115,8
+    EDITTEXT        IDC_DLGFONT_EDIT,19,192,148,12,ES_AUTOHSCROLL | ES_READONLY
+    PUSHBUTTON      "Select...",IDC_DLGFONT_CHOOSE,177,191,50,14
+    PUSHBUTTON      "&default",IDC_DLGFONT_DEFAULT,231,191,50,14
     CONTROL         "List &hidden fonts in font dialog",IDC_LIST_HIDDEN_FONTS,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,194,234,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,211,234,10
     CONTROL         "List &proportional fonts in font dialog",IDC_LIST_PRO_FONTS,
-                    "Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,209,240,10
+                    "Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,226,240,10
     LTEXT           "character space",IDC_CHARACTER_SPACE_TITLE,187,51,115,8,WS_DISABLED
     EDITTEXT        IDC_SPACE_TOP,224,68,40,14,ES_AUTOHSCROLL | WS_DISABLED
     EDITTEXT        IDC_SPACE_BOTTOM,224,87,40,14,ES_AUTOHSCROLL | WS_DISABLED
     EDITTEXT        IDC_SPACE_LEFT,224,105,40,14,ES_AUTOHSCROLL | WS_DISABLED
     EDITTEXT        IDC_SPACE_RIGHT,224,123,40,14,ES_AUTOHSCROLL | WS_DISABLED
+    CONTROL         "Drawing resized font to fit cell width",IDC_RESIZED_FONT,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,159,140,10
 END
 
 
@@ -93,10 +95,11 @@
     BEGIN
         LEFTMARGIN, 7
         RIGHTMARGIN, 302
+        VERTGUIDE, 19
         TOPMARGIN, 7
         BOTTOMMARGIN, 260
         HORZGUIDE, 33
-        HORZGUIDE, 183
+        HORZGUIDE, 198
     END
 END
 #endif    // APSTUDIO_INVOKED

Modified: trunk/teraterm/teraterm/font_pp_res.h
===================================================================
--- trunk/teraterm/teraterm/font_pp_res.h	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/teraterm/font_pp_res.h	2023-07-23 07:07:41 UTC (rev 10806)
@@ -24,14 +24,16 @@
 #define IDC_DLGFONT_DEFAULT             1018
 #define IDC_LIST_HIDDEN_FONTS           1019
 #define IDC_LIST_PRO_FONTS              1020
+#define IDC_SCALED_FONT                 1021
+#define IDC_RESIZED_FONT                1021
 
 // Next default values for new objects
-//
+// 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        102
 #define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1021
+#define _APS_NEXT_CONTROL_VALUE         1022
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

Modified: trunk/teraterm/teraterm/teraprn.cpp
===================================================================
--- trunk/teraterm/teraterm/teraprn.cpp	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/teraterm/teraprn.cpp	2023-07-23 07:07:41 UTC (rev 10806)
@@ -384,7 +384,7 @@
 	DrawStrA(PrintDC, NULL, StrA, WidthInfo, Count, PrnFW, PrnFH, PrnY, &PrnX);
 }
 
-void PrnOutTextW(const wchar_t *StrW, const char *WidthInfo, int Count, void *data)
+void PrnOutTextW(const wchar_t *StrW, const char *cells, int len, void *data)
 {
 	if (PrnX+PrnFW > Margin.right) {
 		/* new line */
@@ -399,7 +399,7 @@
 		PrnY = Margin.top;
 	}
 
-	DrawStrW(PrintDC, NULL, StrW, WidthInfo, Count, PrnFW, PrnFH, PrnY, &PrnX);
+	DrawStrW(PrintDC, NULL, StrW, cells, len, PrnFW, PrnFH, PrnY, &PrnX);
 }
 
 void PrnNewLine()

Modified: trunk/teraterm/teraterm/vtdisp.c
===================================================================
--- trunk/teraterm/teraterm/vtdisp.c	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/teraterm/vtdisp.c	2023-07-23 07:07:41 UTC (rev 10806)
@@ -176,6 +176,8 @@
 	//
 	BYTE DCBackAlpha;
 	COLORREF DCBackColor;
+
+	BOOL font_resize_enable;
 } vtdisp_work_t;
 static vtdisp_work_t vtdisp_work;
 
@@ -1702,6 +1704,7 @@
   w->alpha_vtback = 255;
   w->debug_drawbox_text = FALSE;
   w->debug_drawbox_fillrect = FALSE;
+  w->font_resize_enable = TRUE;
   BGReverseTextAlpha = 255;
 }
 
@@ -2730,30 +2733,61 @@
 	}
 }
 
-/**
- *	1\x8Ds\x95`\x89\xE6 Unicode
- *		Windows 95 \x82ɂ\xE0 ExtTextOutW() \x82͑\xB6\x8D݂\xB7\x82邪
- *		\x93\xAE\x8D삪\x88قȂ\xE9\x82悤\x82\xBE
- *		TODO \x95\xB6\x8E\x9A\x8AԂɑΉ\x9E\x82\xB5\x82Ă\xA2\x82Ȃ\xA2?
- *
- *
- *	@param  DC				\x95`\x89\xE6\x90\xE6DC
- *	@param  BGDC			\x95`\x89\xE6\x90惏\x81[\x83NDC
- *							NULL\x82̎\x9E\x83\x8F\x81[\x83N\x82Ȃ\xB5(=\x94w\x8Ci\x95`\x89\xE6\x82Ȃ\xB5)
- *							\x83v\x83\x8A\x83\x93\x83^\x82ւ̏o\x97͂̎\x9E\x82͏\xED\x82\xC9NULL
- *	@param	StrW			\x8Fo\x97͕\xB6\x8E\x9A (wchar_t)
- *	@param	WidthInfo[]		\x8Fo\x97͕\xB6\x8E\x9A\x82\xCCcell\x90\x94
- *							1		\x94\xBC\x8Ap\x95\xB6\x8E\x9A
- *							0		\x8C\x8B\x8D\x87\x95\xB6\x8E\x9A, Nonspacing Mark
- *							2+		\x91S\x8Ap\x95\xB6\x8E\x9A, \x94\xBC\x8Ap + Spacing Mark
- *	@param	Count			\x95\xB6\x8E\x9A\x90\x94
- */
-void DrawStrW(HDC DC, HDC BGDC, const wchar_t *StrW, const char *WidthInfo, int Count, int font_width, int font_height,
-			  int Y, int *X)
+static void DrawChar(HDC hDC, HDC BGDC, int x, int y, const wchar_t *str, size_t len, int cell)
 {
-	int Dx[TermWidthMax];
-	int HalfCharCount = 0;
-	int i;
+	SIZE char_size;
+	HDC char_dc;
+	HBITMAP bitmap;
+	HBITMAP prev_bitmap;
+	RECT rc;
+	vtdisp_work_t *w = &vtdisp_work;
+
+	GetTextExtentPoint32W(hDC, str, (int)len, &char_size);
+
+	char_dc = CreateCompatibleDC(hDC);
+	SetTextColor(char_dc, GetTextColor(hDC));
+	SetBkColor(char_dc, GetBkColor(hDC));
+	SelectObject(char_dc, GetCurrentObject(hDC, OBJ_FONT));
+	bitmap = CreateCompatibleBitmap(hDC, char_size.cx, char_size.cy);
+	prev_bitmap = SelectObject(char_dc, bitmap);
+
+	rc.top = 0;
+	rc.left = 0;
+	rc.right = char_size.cx;
+	rc.bottom = char_size.cy;
+	ExtTextOutW(char_dc, 0, 0, ETO_OPAQUE, &rc, str, (UINT)len, 0);
+
+	// \x89\xA1\x82\xF0cell\x95\x9D(cell*FontWidth pixel)\x82Ɋg\x91\xE5/\x8Fk\x8F\xAC\x82\xB5\x82ĕ`\x89\xE6
+	int width = cell * FontWidth;
+	int height = char_size.cy;
+	if (pTransparentBlt == NULL || BGDC == NULL || w->DCBackAlpha == 255) {
+		// \x92\xBC\x90ڕ`\x89\xE6
+		SetStretchBltMode(hDC, COLORONCOLOR);
+		StretchBlt(hDC, x, y, width, height, char_dc, 0, 0, char_size.cx, char_size.cy, SRCCOPY);
+	}
+	else {
+		// BGDC\x82ɔw\x8Ci\x89摜\x82\xF0\x95`\x89\xE6
+		const COLORREF BackColor = GetBkColor(hDC);
+		DrawTextBGImage(BGDC, x, y, width, height, BackColor, w->DCBackAlpha);
+
+		// BGDC\x82ɕ\xB6\x8E\x9A\x82\xF0\x95`\x89\xE6
+		SetStretchBltMode(hDC, COLORONCOLOR);
+		pTransparentBlt(BGDC, 0, 0, width, height, char_dc, 0, 0, char_size.cx, char_size.cy, GetBkColor(hDC));
+
+		// BGDC\x82ɕ`\x89悵\x82\xBD\x95\xB6\x8E\x9A\x82\xF0Window\x82ɓ\\x82\xE8\x95t\x82\xAF
+		BitBlt(hDC, x, y, width, height, BGDC, 0, 0, SRCCOPY);
+	}
+
+	SelectObject(char_dc, prev_bitmap);
+	DeleteObject(bitmap);
+	DeleteDC(char_dc);
+}
+
+static void DrawStrWSub(HDC DC, HDC BGDC, const wchar_t *StrW, const int *Dx,
+						int Count, int cells, int font_width, int font_height,
+						int Y, int *X)
+{
+	int HalfCharCount = cells;	// \x83Z\x83\x8B\x90\x94
 	int width;
 	int height;
 	BOOL direct_draw;
@@ -2760,27 +2794,6 @@
 	BYTE alpha = 0;
 	vtdisp_work_t *w = &vtdisp_work;
 
-	for (i = 0; i < Count; i++) {
-		if (WidthInfo[i] == 1) {
-			HalfCharCount++;
-			Dx[i] = font_width;
-		}
-		else if (WidthInfo[i] == 0) {
-			if (i == 0) {
-				assert(FALSE);  // \x95\\x8E\xA6\x82̍ŏ\x89\x82Ɍ\x8B\x8D\x87\x95\xB6\x8E\x9A?
-				Dx[i] = 0;
-			}
-			else {
-				Dx[i] = Dx[i - 1];
-				Dx[i - 1] = 0;
-			}
-		}
-		else {
-			HalfCharCount += WidthInfo[i];
-			Dx[i] = font_width * WidthInfo[i];
-		}
-	}
-
 	direct_draw = FALSE;
 	if (BGDC == NULL) {
 		// \x83\x8F\x81[\x83N\x82̎w\x92肪\x82Ȃ\xA2\x82ƒ\xBC\x90ڕ`\x89\xE6
@@ -2798,7 +2811,6 @@
 	if (direct_draw) {
 		RECT RText;
 		SetRect(&RText, *X, Y, *X + width, Y + height);
-
 		ExtTextOutW(DC, *X + ts.FontDX, Y + ts.FontDY, ETO_CLIPPED | ETO_OPAQUE, &RText, StrW, Count, &Dx[0]);
 	}
 	else {
@@ -2821,11 +2833,121 @@
 		BitBlt(DC, *X, Y, width, height, BGDC, 0, 0, SRCCOPY);
 	}
 
+	*X += width;
+}
+
+
+/**
+ *	1\x8Ds\x95`\x89\xE6 Unicode
+ *		Windows 95 \x82ɂ\xE0 ExtTextOutW() \x82͑\xB6\x8D݂\xB7\x82邪
+ *		\x93\xAE\x8D삪\x88قȂ\xE9\x82悤\x82\xBE
+ *		TODO \x95\xB6\x8E\x9A\x8AԂɑΉ\x9E\x82\xB5\x82Ă\xA2\x82Ȃ\xA2?
+ *
+ *	@param  DC				\x95`\x89\xE6\x90\xE6DC
+ *	@param  BGDC			\x95`\x89\xE6\x90惏\x81[\x83NDC
+ *							NULL\x82̎\x9E\x83\x8F\x81[\x83N\x82Ȃ\xB5(=\x94w\x8Ci\x95`\x89\xE6\x82Ȃ\xB5)
+ *							\x83v\x83\x8A\x83\x93\x83^\x82ւ̏o\x97͂̎\x9E\x82͏\xED\x82\xC9NULL
+ *	@param	StrW			\x8Fo\x97͕\xB6\x8E\x9A (wchar_t)
+ *	@param	cells[]			\x8Fo\x97͕\xB6\x8E\x9A\x82\xCCcell\x90\x94
+ *							1		\x94\xBC\x8Ap\x95\xB6\x8E\x9A
+ *							0		\x8C\x8B\x8D\x87\x95\xB6\x8E\x9A, Nonspacing Mark
+ *							2+		\x91S\x8Ap\x95\xB6\x8E\x9A, \x94\xBC\x8Ap + Spacing Mark
+ *	@param	len				\x95\xB6\x8E\x9A\x90\x94
+ *
+ *	\x97\xE1
+ *		len=2, L"AB"
+ *					0		1		2
+ *			StrW	'A'		'B'
+ *			cells	1		1
+ *
+ *		len=2, U+307B U+309A (L'\x82\xD9' + L'\x81K')
+ *					0		1		2
+ *			StrW	U+307B	U+309A
+ *			cells	0		2
+ *
+ */
+void DrawStrW(HDC DC, HDC BGDC, const wchar_t *StrW, const char *cells, int len, int font_width, int font_height,
+			  int Y, int *X)
+{
+	int Dx[TermWidthMax];
+	int cell = 0;
+	int i;
+	vtdisp_work_t *w = &vtdisp_work;
+	int sx = *X;
+
+	if (len <= 0) {
+		return;
+	}
+
+	for (i = 0; i < len; i++) {
+		cell += cells[i];
+		Dx[i] = cells[i] * font_width;
+	}
+
+	if (w->font_resize_enable) {
+		int start_idx = 0;
+		int cell_count = 0;
+		int wchar_count = 0;
+		int zero_count = 0;
+		for (i = 0; i < len; i++) {
+			if (cells[i] == 0) {
+				if (cell_count != 0) {
+					DrawStrWSub(DC, BGDC, &StrW[start_idx], &Dx[start_idx], wchar_count, cell_count, font_width, font_height, Y, X);
+					start_idx = i;
+					cell_count = 0;
+					wchar_count = 0;
+				}
+				wchar_count++;
+				zero_count++;
+			}
+#if 0
+			else if (zero_count > 2) {
+				wchar_count++;
+				cell_count += cells[i];
+				DrawStrWSub(DC, BGDC, &StrW[start_idx], &Dx[start_idx], wchar_count, cell_count, font_width,
+							font_height, Y, X);
+				start_idx = i;
+				zero_count = 0;
+				cell_count = 0;
+				wchar_count = 1;
+			}
+#endif
+			else {
+				SIZE size;
+				GetTextExtentPoint32W(DC, &StrW[i - zero_count], 1 + zero_count, &size);
+				if ((size.cx == Dx[i])) {
+					wchar_count++;
+					cell_count += cells[i];
+				}
+				else {
+					if (cell_count > 0) {
+						DrawStrWSub(DC, BGDC, &StrW[start_idx], &Dx[start_idx], wchar_count, cell_count,
+									font_width, font_height, Y, X);
+						start_idx += wchar_count;
+					}
+					DrawChar(DC, BGDC, *X, Y, &StrW[i - zero_count], 1 + zero_count, cells[i]);
+					*X += cells[i] * FontWidth;
+					zero_count = 0;
+					cell_count = 0;
+					wchar_count = 0;
+					start_idx++;
+				}
+			}
+		}
+		if (cell_count != 0) {
+			DrawStrWSub(DC, BGDC, &StrW[start_idx], &Dx[start_idx], wchar_count, cell_count, font_width, font_height, Y,
+						X);
+		}
+	}
+	else {
+		DrawStrWSub(DC, BGDC, StrW, Dx, len, cell, font_width, font_height, Y, X);
+	}
+
 	if (w->debug_drawbox_text) {
-		DrawBox(DC, *X, Y, width, height, RGB(0,255,0));
+		int width = cell * font_width;
+		int height = font_height;
+		DrawBox(DC, sx, Y, width, height, RGB(0, 255, 0));
 	}
-
-	*X += width;
 }
 
 /**
@@ -3936,3 +4058,15 @@
 	vtdisp_work_t *w = &vtdisp_work;
 	return w->bg_enable;
 }
+
+void DispEnableResizedFont(BOOL enable)
+{
+	vtdisp_work_t *w = &vtdisp_work;
+	w->font_resize_enable = enable;
+}
+
+BOOL DispIsResizedFont()
+{
+	vtdisp_work_t *w = &vtdisp_work;
+	return w->font_resize_enable;
+}

Modified: trunk/teraterm/teraterm/vtdisp.h
===================================================================
--- trunk/teraterm/teraterm/vtdisp.h	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/teraterm/teraterm/vtdisp.h	2023-07-23 07:07:41 UTC (rev 10806)
@@ -133,6 +133,8 @@
 			  int Y, int *X);
 void DrawStrA(HDC DC, HDC BGDC, const char *StrA, const char *WidthInfo, int Count, int font_width, int font_height,
 			  int Y, int *X);
+void DispEnableResizedFont(BOOL enable);
+BOOL DispIsResizedFont();
 
 extern int WinWidth, WinHeight;
 extern HFONT VTFont[AttrFontMask+1];

Modified: trunk/tests/unicodebuf-combining-spacing_mark.pl
===================================================================
--- trunk/tests/unicodebuf-combining-spacing_mark.pl	2023-07-23 07:07:29 UTC (rev 10805)
+++ trunk/tests/unicodebuf-combining-spacing_mark.pl	2023-07-23 07:07:41 UTC (rev 10806)
@@ -8,25 +8,17 @@
 #
 print "Malayalam\n";
 print "\N{U+0d2e}\N{U+0d32}\N{U+0d2f}\N{U+0d3e}\N{U+0d33}\N{U+0d02}\n";
+print "\N{U+0d28}\N{U+0d2e}\N{U+0d38}\N{U+0d4d}\N{U+0d15}\N{U+0d3e}\N{U+0d30}\N{U+0d02}\n";
 
+print "\N{U+0d28}| U+0d28 1cell\n";
 print "\N{U+0d2e}| U+0d2e 1cell\n";
 print "\N{U+0d32}| U+0d32 1cell\n";
 print "\N{U+0d2f}\N{U+0d3e}| U+0d2f U+0d3e(Spacing Mark) 2cell\n";
 print "\N{U+0d33}\N{U+0d02}| U+0d33 U+0d02(Spacing Mark) 2cell\n";
-print "\n";
-
-print "Hello (in Malayalam)\n";
-print "\N{U+0d28}\N{U+0d2e}\N{U+0d38}\N{U+0d4d}\N{U+0d15}\N{U+0d3e}\N{U+0d30}\N{U+0d02}\n";
-
-print "\N{U+0d28}| U+0d28 1cell\n";
-print "\N{U+0d2e}| U+0d2e 1cell\n";
 print "\N{U+0d38}\N{U+0d4d}\N{U+0d15}\N{U+0d3e}| U+0d38 U+0d4d(Nonspacing Mark) U+0d15 U+0d3e(Spacing Mark) 3cell\n";
 print "\N{U+0d30}\N{U+0d02}| U+0d30 U+0d02(Spacing Mark) 2cell\n";
 print "\n";
 
-print "\N{U+307B}\N{U+309A}| U+307B U+309A (ほ + ゜ = ぽ)\n";
-print "\n";
-
 # repeat spacing mark
 print "repeat spacing mark\n";
 for ($i = 0 ; $i < 10 + 2; $i++) {
@@ -40,8 +32,13 @@
 print "| U+0d33 + U+0d02 * 10 11cell\n";
 print "\n";
 
+# Japanese
+print "Japanese\n";
+print "\N{U+307B}\N{U+309A}| U+307B U+309A (ほ + ゜ = ぽ)\n";
+print "\n";
+
 # virama
-print "Virama test\n";
+print "Virama\n";
 
 # Devanagari
 #  wget https://raw.githubusercontent.com/emacs-mirror/emacs/master/etc/HELLO -O - --quiet | grep Devanagari


ttssh2-commit メーリングリストの案内
Back to archive index