On Wed, Mar 27, 2019 at 10:25:48PM +0900, Akihiro Sagawa wrote:
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com
dlls/user32/edit.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++-- dlls/user32/tests/edit.c | 4 +-- 2 files changed, 90 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c index d1659b4..c0cb056 100644 --- a/dlls/user32/edit.c +++ b/dlls/user32/edit.c @@ -2842,6 +2842,70 @@ static void EDIT_EM_SetLimitText(EDITSTATE *es, UINT 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;
- }
+}
+#ifdef WORDS_BIGENDIAN +#define GET_BE_WORD(x) (x) +#else +#define GET_BE_WORD(x) MAKEWORD(HIBYTE(x), LOBYTE(x)) +#endif
+#define MS_MAKE_TAG(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24))
+static BOOL get_side_bearings(HDC hdc, short *min_lsb, short *min_rsb) +{
- const DWORD hhea_tag = MS_MAKE_TAG('h','h','e','a');
+#include "pshpack2.h"
- struct {
unsigned short majorVersion;
unsigned short minorVersion;
short ascender;
short descender;
short lineGap;
unsigned short advanceWidthMax;
short minLeftSideBearing;
short minRightSideBearing;
short xMaxExtent;
short caretSlopeRise;
short caretSlopeRun;
short caretOffset;
short reserved[4];
short metricDataFormat;
short numberOfHMetrics;
- } hhea_table;
+#include "poppack.h"
- LONG size;
- size = GetFontData(hdc, hhea_tag, 0, &hhea_table, sizeof(hhea_table));
- if (size != sizeof(hhea_table))
return FALSE;
- *min_lsb = GET_BE_WORD(hhea_table.minLeftSideBearing);
- *min_rsb = GET_BE_WORD(hhea_table.minRightSideBearing);
- return TRUE;
+}
The undocumented gdi32 export GetCharWidthInfo() could help here. Its prototype seems to be:
struct width_info { INT lsb; INT rsb; INT unknown; };
INT WINAPI GetCharWidthInfo(HDC hdc, struct width_info *info);
You'd first want to implement and write tests for this in gdi32.
Huw.