Jacek Caban : gdi32: Get codepages and OS version directly from PEB.

Alexandre Julliard julliard at winehq.org
Wed Sep 29 15:54:10 CDT 2021


Module: wine
Branch: master
Commit: bdebdbafe95cc495e6afd7282b411cab3c42888e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=bdebdbafe95cc495e6afd7282b411cab3c42888e

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Sep 29 14:07:19 2021 +0200

gdi32: Get codepages and OS version directly from PEB.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/clipping.c      |  2 +-
 dlls/gdi32/font.c          | 30 ++++++++++++++++++++----------
 dlls/gdi32/gdiobj.c        |  2 +-
 dlls/gdi32/ntgdi_private.h |  1 +
 4 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/dlls/gdi32/clipping.c b/dlls/gdi32/clipping.c
index 115de908cf6..9436a91a43f 100644
--- a/dlls/gdi32/clipping.c
+++ b/dlls/gdi32/clipping.c
@@ -435,7 +435,7 @@ INT WINAPI NtGdiGetRandomRgn( HDC hDC, HRGN hRgn, INT iCode )
         {
             NtGdiCombineRgn( hRgn, dc->hVisRgn, 0, RGN_COPY );
             /* On Windows NT/2000, the SYSRGN returned is in screen coordinates */
-            if (!(GetVersion() & 0x80000000))
+            if (NtCurrentTeb()->Peb->OSPlatformId != VER_PLATFORM_WIN32s)
                 NtGdiOffsetRgn( hRgn, dc->attr->vis_rect.left, dc->attr->vis_rect.top );
         }
         else if (!is_rect_empty( &dc->device_rect ))
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index dc0ad84242b..305bc087b18 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -202,6 +202,16 @@ static UINT asciiz_to_unicode( WCHAR *dst, const char *src )
     return (p - dst) * sizeof(WCHAR);
 }
 
+UINT get_acp(void)
+{
+    return ((const WORD *)NtCurrentTeb()->Peb->AnsiCodePageData)[1];
+}
+
+static UINT get_oemcp(void)
+{
+    return ((const WORD *)NtCurrentTeb()->Peb->OemCodePageData)[1];
+}
+
 static inline WCHAR facename_tolower( WCHAR c )
 {
     if (c >= 'A' && c <= 'Z') return c - 'A' + 'a';
@@ -272,7 +282,7 @@ static inline INT INTERNAL_YWSTODS(DC *dc, INT height)
 
 static inline BOOL is_win9x(void)
 {
-    return GetVersion() & 0x80000000;
+    return NtCurrentTeb()->Peb->OSPlatformId == VER_PLATFORM_WIN32s;
 }
 
 static inline WCHAR *strdupW( const WCHAR *p )
@@ -1864,7 +1874,7 @@ static struct gdi_font_face *find_matching_face( const LOGFONTW *lf, CHARSETINFO
        corresponding to the current ansi codepage */
     if (!csi->fs.fsCsb[0])
     {
-        INT acp = GetACP();
+        INT acp = get_acp();
         if (!translate_charset_info( (DWORD *)(INT_PTR)acp, csi, TCI_SRCCODEPAGE ))
         {
             FIXME( "TCI failed on codepage %d\n", acp );
@@ -2464,7 +2474,7 @@ static void create_child_font_list( struct gdi_font *font )
      * if not SYMBOL or OEM then we also get all the fonts for Microsoft
      * Sans Serif.  This is how asian windows get default fallbacks for fonts
      */
-    if (is_dbcs_ansi_cp(GetACP()) && font->charset != SYMBOL_CHARSET && font->charset != OEM_CHARSET &&
+    if (is_dbcs_ansi_cp(get_acp()) && font->charset != SYMBOL_CHARSET && font->charset != OEM_CHARSET &&
         facename_compare( font_name, microsoft_sans_serifW, -1 ) != 0)
     {
         if ((font_link = find_gdi_font_link( microsoft_sans_serifW )))
@@ -2725,8 +2735,8 @@ static void update_codepage( UINT screen_dpi )
     if (size == sizeof(DWORD) && info->Type == REG_DWORD)
         font_dpi = *(DWORD *)info->Data;
 
-    ansi_cp = GetACP();
-    oem_cp = GetOEMCP();
+    ansi_cp = get_acp();
+    oem_cp = get_oemcp();
     sprintf( cpbuf, "%u,%u", ansi_cp, oem_cp );
     asciiz_to_unicode( cpbufW, cpbuf );
 
@@ -2897,7 +2907,7 @@ static DWORD create_enum_charset_list(DWORD charset, struct enum_charset *list)
     }
     else /* charset is DEFAULT_CHARSET or invalid. */
     {
-        int acp = GetACP();
+        int acp = get_acp();
         DWORD mask = 0;
 
         /* Set the current codepage's charset as the first element. */
@@ -3884,7 +3894,7 @@ static void get_nearest_charset( const WCHAR *family_name, struct gdi_font_face
 
     int i;
 
-    if (translate_charset_info( (DWORD*)(INT_PTR)GetACP(), csi, TCI_SRCCODEPAGE ))
+    if (translate_charset_info( (DWORD*)(INT_PTR)get_acp(), csi, TCI_SRCCODEPAGE ))
     {
         const struct gdi_font_link *font_link;
 
@@ -3904,7 +3914,7 @@ static void get_nearest_charset( const WCHAR *family_name, struct gdi_font_face
 
     FIXME("returning DEFAULT_CHARSET face->fs.fsCsb[0] = %08x file = %s\n",
 	  face->fs.fsCsb[0], debugstr_w(face->file));
-    csi->ciACP = GetACP();
+    csi->ciACP = get_acp();
     csi->ciCharset = DEFAULT_CHARSET;
 }
 
@@ -4497,10 +4507,10 @@ static void update_font_code_page( DC *dc, HANDLE font )
     else {
         switch(charset) {
         case OEM_CHARSET:
-            dc->attr->font_code_page = GetOEMCP();
+            dc->attr->font_code_page = get_oemcp();
             break;
         case DEFAULT_CHARSET:
-            dc->attr->font_code_page = GetACP();
+            dc->attr->font_code_page = get_acp();
             break;
 
         case VISCII_CHARSET:
diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 62bd2c4bd59..c0912c3ad2d 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -497,7 +497,7 @@ static UINT get_default_charset( void )
     CHARSETINFO     csi;
     UINT    uACP;
 
-    uACP = GetACP();
+    uACP = get_acp();
     csi.ciCharset = ANSI_CHARSET;
     if ( !translate_charset_info( ULongToPtr(uACP), &csi, TCI_SRCCODEPAGE ) )
     {
diff --git a/dlls/gdi32/ntgdi_private.h b/dlls/gdi32/ntgdi_private.h
index 9f0f1d44240..c342bcf3a7c 100644
--- a/dlls/gdi32/ntgdi_private.h
+++ b/dlls/gdi32/ntgdi_private.h
@@ -339,6 +339,7 @@ struct font_callback_funcs
 };
 
 extern UINT font_init(void) DECLSPEC_HIDDEN;
+extern UINT get_acp(void) DECLSPEC_HIDDEN;
 
 /* opentype.c */
 




More information about the wine-cvs mailing list