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