gdi32: Implement GdiGetCodePage

Dmitry Timoshkov dmitry at codeweavers.com
Mon Mar 26 03:03:51 CDT 2007


Hello,

according to an API call stack this is what native user32.DrawTextExA uses to
perform a correct translation to unicode, and should help to fix the bug 7861.

Changelog:
    gdi32: Implement GdiGetCodePage.

---
 dlls/gdi32/font.c     |   37 ++++++++++++++++++++++++-------------
 dlls/gdi32/gdi32.spec |    4 ++--
 include/wingdi.h      |    1 +
 3 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index e8b96c4..ea2e66c 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -347,22 +347,11 @@ static void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, NEWTEXTMETRIC
 
 
 /***********************************************************************
- *           FONT_mbtowc
- *
- * Returns a Unicode translation of str using the charset of the
- * currently selected font in hdc.  If count is -1 then str is assumed
- * to be '\0' terminated, otherwise it contains the number of bytes to
- * convert.  If plenW is non-NULL, on return it will point to the
- * number of WCHARs that have been written.  If pCP is non-NULL, on
- * return it will point to the codepage used in the conversion.  The
- * caller should free the returned LPWSTR from the process heap
- * itself.
+ *           GdiGetCodePage   (GDI32.@)
  */
-static LPWSTR FONT_mbtowc(HDC hdc, LPCSTR str, INT count, INT *plenW, UINT *pCP)
+DWORD WINAPI GdiGetCodePage( HDC hdc )
 {
     UINT cp = CP_ACP;
-    INT lenW;
-    LPWSTR strW;
     CHARSETINFO csi;
     int charset = GetTextCharset(hdc);
 
@@ -402,6 +391,28 @@ static LPWSTR FONT_mbtowc(HDC hdc, LPCSTR str, INT count, INT *plenW, UINT *pCP)
     }
 
     TRACE("charset %d => cp %d\n", charset, cp);
+    return cp;
+}
+
+/***********************************************************************
+ *           FONT_mbtowc
+ *
+ * Returns a Unicode translation of str using the charset of the
+ * currently selected font in hdc.  If count is -1 then str is assumed
+ * to be '\0' terminated, otherwise it contains the number of bytes to
+ * convert.  If plenW is non-NULL, on return it will point to the
+ * number of WCHARs that have been written.  If pCP is non-NULL, on
+ * return it will point to the codepage used in the conversion.  The
+ * caller should free the returned LPWSTR from the process heap
+ * itself.
+ */
+static LPWSTR FONT_mbtowc(HDC hdc, LPCSTR str, INT count, INT *plenW, UINT *pCP)
+{
+    UINT cp;
+    INT lenW;
+    LPWSTR strW;
+
+    cp = GdiGetCodePage( hdc );
 
     if(count == -1) count = strlen(str);
     lenW = MultiByteToWideChar(cp, 0, str, count, NULL, 0);
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 10ec996..6f1c71b 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -178,8 +178,8 @@
 @ stdcall GdiFlush()
 # @ stub GdiFullscreenControl
 @ stdcall GdiGetBatchLimit()
-@ stdcall GdiGetCharDimensions(ptr ptr ptr)
-# @ stub GdiGetCodePage
+@ stdcall GdiGetCharDimensions(long ptr ptr)
+@ stdcall GdiGetCodePage(long)
 # @ stub GdiGetDC
 # @ stub GdiGetDevmodeForPage
 @ stub GdiGetLocalBitmap
diff --git a/include/wingdi.h b/include/wingdi.h
index a357c77..ca72f33 100644
--- a/include/wingdi.h
+++ b/include/wingdi.h
@@ -3396,6 +3396,7 @@ BOOL      WINAPI GdiComment(HDC,UINT,const BYTE *);
 DEVMODEW * WINAPI GdiConvertToDevmodeW(const DEVMODEA *);
 BOOL      WINAPI GdiFlush(void);
 LONG      WINAPI GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *);
+DWORD     WINAPI GdiGetCodePage(HDC);
 BOOL      WINAPI GdiGradientFill(HDC,PTRIVERTEX,ULONG,PVOID,ULONG,ULONG);
 BOOL      WINAPI GdiIsMetaFileDC(HDC);
 BOOL      WINAPI GdiIsMetaPrintDC(HDC);
-- 
1.5.0.5






More information about the wine-patches mailing list