Akihiro Sagawa : user32: Implement EC_USEFONTINFO margins in the CJK case.
Alexandre Julliard
julliard at winehq.org
Thu Apr 11 13:10:31 CDT 2019
Module: wine
Branch: master
Commit: c5823e9cac8311cd1dfd622331f2502df0b9f12a
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c5823e9cac8311cd1dfd622331f2502df0b9f12a
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Thu Apr 11 00:04:41 2019 +0900
user32: Implement EC_USEFONTINFO margins in the CJK case.
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/edit.c | 41 ++++++++++++++++++++++++++++++++++++++---
dlls/user32/tests/edit.c | 4 ++--
2 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c
index d1659b4..7eb2214 100644
--- a/dlls/user32/edit.c
+++ b/dlls/user32/edit.c
@@ -2841,6 +2841,32 @@ static void EDIT_EM_SetLimitText(EDITSTATE *es, UINT limit)
es->buffer_limit = limit;
}
+static BOOL is_cjk_charset(HDC dc)
+{
+ switch (GdiGetCodePage(dc)) {
+ case 932: case 936: case 949: case 950: case 1361:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+static int get_cjk_fontinfo_margin(int width, int side_bearing)
+{
+ int margin;
+ if (side_bearing < 0)
+ margin = min(-side_bearing, width/2);
+ else
+ margin = 0;
+ return margin;
+}
+
+struct char_width_info {
+ INT min_lsb, min_rsb, unknown;
+};
+
+/* Undocumented gdi32 export */
+extern BOOL WINAPI GetCharWidthInfo(HDC, struct char_width_info *);
/*********************************************************************
*
@@ -2870,9 +2896,18 @@ static void EDIT_EM_SetMargins(EDITSTATE *es, INT action,
/* The default margins are only non zero for TrueType or Vector fonts */
if (tm.tmPitchAndFamily & ( TMPF_VECTOR | TMPF_TRUETYPE )) {
- /* FIXME: figure out the CJK values. */
- default_left_margin = width / 2;
- default_right_margin = width / 2;
+ struct char_width_info width_info;
+
+ if (is_cjk_charset(dc) && GetCharWidthInfo(dc, &width_info))
+ {
+ default_left_margin = get_cjk_fontinfo_margin(width, width_info.min_lsb);
+ default_right_margin = get_cjk_fontinfo_margin(width, width_info.min_rsb);
+ }
+ else
+ {
+ default_left_margin = width / 2;
+ default_right_margin = width / 2;
+ }
GetClientRect(es->hwndSelf, &rc);
rc_width = !IsRectEmpty(&rc) ? rc.right - rc.left : 80;
diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c
index 2930c33..e8ea774 100644
--- a/dlls/user32/tests/edit.c
+++ b/dlls/user32/tests/edit.c
@@ -1632,7 +1632,7 @@ static void test_margins_default(const char* facename, UINT charset)
SendMessageA(hwnd, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, small_margins);
SendMessageA(hwnd, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(EC_USEFONTINFO, EC_USEFONTINFO));
margins = SendMessageA(hwnd, EM_GETMARGINS, 0, 0);
- todo_wine_if(cjk_charset && expect != MAKELONG(size.cx / 2, size.cx / 2))
+
ok(margins == expect, "%s:%d: expected %d, %d, got %d, %d\n", facename, charset, HIWORD(expect), LOWORD(expect), HIWORD(margins), LOWORD(margins));
DestroyWindow(hwnd);
@@ -1652,7 +1652,7 @@ static void test_margins_default(const char* facename, UINT charset)
SendMessageA(hwnd, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, small_margins);
SendMessageA(hwnd, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(EC_USEFONTINFO, EC_USEFONTINFO));
margins = SendMessageA(hwnd, EM_GETMARGINS, 0, 0);
- todo_wine_if(cjk_charset && expect != MAKELONG(size.cx / 2, size.cx / 2))
+
ok(margins == expect, "%s:%d: expected %d, %d, got %d, %d\n", facename, charset, HIWORD(expect), LOWORD(expect), HIWORD(margins), LOWORD(margins));
DestroyWindow(hwnd);
More information about the wine-cvs
mailing list