From d4a8d54b73de893197b489a5f0f55b5651c5f107 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 4 Nov 2007 00:55:28 +0000 Subject: [PATCH] - Removed NtGdiTranslateCharsetInfo, updated w32ksvc.db and ntgdibad.h. - Implemented TranslateCharsetInfo from wine. Works the same just different. svn path=/trunk/; revision=30098 --- reactos/dll/win32/gdi32/misc/stubs.c | 13 --- reactos/dll/win32/gdi32/objects/font.c | 93 +++++++++++++++++++ reactos/include/reactos/win32k/ntgdibad.h | 9 -- .../subsystems/win32/win32k/objects/text.c | 22 ----- reactos/subsystems/win32/win32k/w32ksvc.db | 1 - 5 files changed, 93 insertions(+), 45 deletions(-) diff --git a/reactos/dll/win32/gdi32/misc/stubs.c b/reactos/dll/win32/gdi32/misc/stubs.c index bb1ea82b8cb..c9278146caf 100644 --- a/reactos/dll/win32/gdi32/misc/stubs.c +++ b/reactos/dll/win32/gdi32/misc/stubs.c @@ -21,19 +21,6 @@ #define UNIMPLEMENTED DbgPrint("GDI32: %s is unimplemented, please try again later.\n", __FUNCTION__); -/* - * @unimplemented - */ -BOOL -STDCALL -TranslateCharsetInfo(DWORD * lpSrc, - LPCHARSETINFO lpCs, - DWORD dwFlags) -{ - /* FIXME share memory */ - return NtGdiTranslateCharsetInfo(lpSrc, lpCs, dwFlags ); -} - /* * @unimplemented */ diff --git a/reactos/dll/win32/gdi32/objects/font.c b/reactos/dll/win32/gdi32/objects/font.c index 678183872c0..7a62a4cbe27 100644 --- a/reactos/dll/win32/gdi32/objects/font.c +++ b/reactos/dll/win32/gdi32/objects/font.c @@ -13,6 +13,51 @@ #define NDEBUG #include +/* + * For TranslateCharsetInfo + */ +#define FS(x) {{0,0,0,0},{0x1<<(x),0}} +#define MAXTCIINDEX 32 +static const CHARSETINFO FONT_tci[MAXTCIINDEX] = { + /* ANSI */ + { ANSI_CHARSET, 1252, FS(0)}, + { EASTEUROPE_CHARSET, 1250, FS(1)}, + { RUSSIAN_CHARSET, 1251, FS(2)}, + { GREEK_CHARSET, 1253, FS(3)}, + { TURKISH_CHARSET, 1254, FS(4)}, + { HEBREW_CHARSET, 1255, FS(5)}, + { ARABIC_CHARSET, 1256, FS(6)}, + { BALTIC_CHARSET, 1257, FS(7)}, + { VIETNAMESE_CHARSET, 1258, FS(8)}, + /* reserved by ANSI */ + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + /* ANSI and OEM */ + { THAI_CHARSET, 874, FS(16)}, + { SHIFTJIS_CHARSET, 932, FS(17)}, + { GB2312_CHARSET, 936, FS(18)}, + { HANGEUL_CHARSET, 949, FS(19)}, + { CHINESEBIG5_CHARSET, 950, FS(20)}, + { JOHAB_CHARSET, 1361, FS(21)}, + /* reserved for alternate ANSI and OEM */ + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + { DEFAULT_CHARSET, 0, FS(0)}, + /* reserved for system */ + { DEFAULT_CHARSET, 0, FS(0)}, + { SYMBOL_CHARSET, CP_SYMBOL, FS(31)}, +}; + #define INITIAL_FAMILY_COUNT 64 /*********************************************************************** @@ -1287,6 +1332,54 @@ GdiGetCharDimensions(HDC hdc, LPTEXTMETRICW lptm, LONG *height) return (sz.cx / 26 + 1) / 2; } +/************************************************************************* + * TranslateCharsetInfo [GDI32.@] + * + * Fills a CHARSETINFO structure for a character set, code page, or + * font. This allows making the correspondance between different labelings + * (character set, Windows, ANSI, and OEM codepages, and Unicode ranges) + * of the same encoding. + * + * Only one codepage will be set in lpCs->fs. If TCI_SRCFONTSIG is used, + * only one codepage should be set in *lpSrc. + * + * RETURNS + * TRUE on success, FALSE on failure. + * + */ +/* + * @unimplemented + */ +BOOL +STDCALL +TranslateCharsetInfo( + LPDWORD lpSrc, /* [in] + if flags == TCI_SRCFONTSIG: pointer to fsCsb of a FONTSIGNATURE + if flags == TCI_SRCCHARSET: a character set value + if flags == TCI_SRCCODEPAGE: a code page value + */ + LPCHARSETINFO lpCs, /* [out] structure to receive charset information */ + DWORD flags /* [in] determines interpretation of lpSrc */) +{ + int index = 0; + switch (flags) { + case TCI_SRCFONTSIG: + while (!(*lpSrc>>index & 0x0001) && index= MAXTCIINDEX || FONT_tci[index].ciCharset == DEFAULT_CHARSET) return FALSE; + memcpy(lpCs, &FONT_tci[index], sizeof(CHARSETINFO)); + return TRUE; +} + /* * @unimplemented diff --git a/reactos/include/reactos/win32k/ntgdibad.h b/reactos/include/reactos/win32k/ntgdibad.h index bc31f42f0ea..1ea337ec3b7 100644 --- a/reactos/include/reactos/win32k/ntgdibad.h +++ b/reactos/include/reactos/win32k/ntgdibad.h @@ -59,15 +59,6 @@ NtGdiGetFontFamilyInfo( DWORD Size ); -/* Should be using NtGdiEnumFontChunk */ -BOOL -NTAPI -NtGdiTranslateCharsetInfo( - PDWORD Src, - LPCHARSETINFO CSI, - DWORD Flags -); - /* The gdi32 call does all the work in user-mode, save for NtGdiMakeFontDir */ BOOL NTAPI diff --git a/reactos/subsystems/win32/win32k/objects/text.c b/reactos/subsystems/win32/win32k/objects/text.c index 22e85e86e25..3ef929f734a 100644 --- a/reactos/subsystems/win32/win32k/objects/text.c +++ b/reactos/subsystems/win32/win32k/objects/text.c @@ -646,28 +646,6 @@ IntTranslateCharsetInfo(PDWORD Src, /* [in] return TRUE; } -BOOL STDCALL -NtGdiTranslateCharsetInfo(PDWORD Src, - LPCHARSETINFO UnsafeCs, - DWORD Flags) -{ - CHARSETINFO Cs; - BOOLEAN Ret; - NTSTATUS Status; - - Ret = IntTranslateCharsetInfo(Src, &Cs, Flags); - if (Ret) - { - Status = MmCopyToCaller(UnsafeCs, &Cs, sizeof(CHARSETINFO)); - if (! NT_SUCCESS(Status)) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return FALSE; - } - } - - return (BOOL) Ret; -} static void FASTCALL FillTM(TEXTMETRICW *TM, FT_Face Face, TT_OS2 *pOS2, TT_HoriHeader *pHori) diff --git a/reactos/subsystems/win32/win32k/w32ksvc.db b/reactos/subsystems/win32/win32k/w32ksvc.db index f86bda786ca..a3eb365a367 100644 --- a/reactos/subsystems/win32/win32k/w32ksvc.db +++ b/reactos/subsystems/win32/win32k/w32ksvc.db @@ -696,7 +696,6 @@ NtGdiSetViewportOrgEx 4 NtGdiSetWindowExtEx 4 NtGdiSetWindowOrgEx 4 NtGdiStretchDIBits 13 -NtGdiTranslateCharsetInfo 3 NtGdiUpdateICMRegKey 4 NtUserBuildMenuItemList 4 NtUserCreateCursorIconHandle 2