From 4bb8d9c1c2f16c107c869131744cf879d3c83f43 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Mon, 6 Apr 2009 17:16:40 +0900 Subject: [PATCH] gdi32: Cache current font code page in the DC structure. --- dlls/gdi32/dc.c | 1 + dlls/gdi32/font.c | 89 +++++++++++++++++++++++----------------- dlls/gdi32/gdi_private.h | 1 + 3 files changed, 54 insertions(+), 37 deletions(-) diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index aa8fbc52ca7..fd28663a5a7 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -110,6 +110,7 @@ DC *alloc_dc_ptr( const DC_FUNCTIONS *funcs, WORD magic ) dc->hDevice = 0; dc->hPalette = GetStockObject( DEFAULT_PALETTE ); dc->gdiFont = 0; + dc->font_code_page = CP_ACP; dc->ROPmode = R2_COPYPEN; dc->polyFillMode = ALTERNATE; dc->stretchBltMode = BLACKONWHITE; diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 107536ea5bc..14de32710e5 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -247,45 +247,13 @@ static void FONT_NewTextMetricExWToA(const NEWTEXTMETRICEXW *ptmW, NEWTEXTMETRIC DWORD WINAPI GdiGetCodePage( HDC hdc ) { UINT cp = CP_ACP; - CHARSETINFO csi; - int charset = GetTextCharset(hdc); + DC *dc = get_dc_ptr( hdc ); - /* Hmm, nicely designed api this one! */ - if(TranslateCharsetInfo(ULongToPtr(charset), &csi, TCI_SRCCHARSET)) - cp = csi.ciACP; - else { - switch(charset) { - case OEM_CHARSET: - cp = GetOEMCP(); - break; - case DEFAULT_CHARSET: - cp = GetACP(); - break; - - case VISCII_CHARSET: - case TCVN_CHARSET: - case KOI8_CHARSET: - case ISO3_CHARSET: - case ISO4_CHARSET: - case ISO10_CHARSET: - case CELTIC_CHARSET: - /* FIXME: These have no place here, but because x11drv - enumerates fonts with these (made up) charsets some apps - might use them and then the FIXME below would become - annoying. Now we could pick the intended codepage for - each of these, but since it's broken anyway we'll just - use CP_ACP and hope it'll go away... - */ - cp = CP_ACP; - break; - - default: - FIXME("Can't find codepage for charset %d\n", charset); - break; - } + if (dc) + { + cp = dc->font_code_page; + release_dc_ptr( dc ); } - - TRACE("charset %d => cp %d\n", charset, cp); return cp; } @@ -465,6 +433,52 @@ HFONT WINAPI CreateFontW( INT height, INT width, INT esc, return CreateFontIndirectW( &logfont ); } +static void update_font_code_page( DC *dc ) +{ + CHARSETINFO csi; + int charset = DEFAULT_CHARSET; + + if (dc->gdiFont) + charset = WineEngGetTextCharsetInfo( dc->gdiFont, NULL, 0 ); + + /* Hmm, nicely designed api this one! */ + if (TranslateCharsetInfo( ULongToPtr(charset), &csi, TCI_SRCCHARSET) ) + dc->font_code_page = csi.ciACP; + else { + switch(charset) { + case OEM_CHARSET: + dc->font_code_page = GetOEMCP(); + break; + case DEFAULT_CHARSET: + dc->font_code_page = GetACP(); + break; + + case VISCII_CHARSET: + case TCVN_CHARSET: + case KOI8_CHARSET: + case ISO3_CHARSET: + case ISO4_CHARSET: + case ISO10_CHARSET: + case CELTIC_CHARSET: + /* FIXME: These have no place here, but because x11drv + enumerates fonts with these (made up) charsets some apps + might use them and then the FIXME below would become + annoying. Now we could pick the intended codepage for + each of these, but since it's broken anyway we'll just + use CP_ACP and hope it'll go away... + */ + dc->font_code_page = CP_ACP; + break; + + default: + FIXME("Can't find codepage for charset %d\n", charset); + dc->font_code_page = CP_ACP; + break; + } + } + + TRACE("charset %d => cp %d\n", charset, dc->font_code_page); +} /*********************************************************************** * FONT_SelectObject @@ -506,6 +520,7 @@ static HGDIOBJ FONT_SelectObject( HGDIOBJ handle, HDC hdc ) { ret = dc->hFont; dc->hFont = handle; + update_font_code_page( dc ); GDI_dec_ref_count( ret ); } release_dc_ptr( dc ); diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index bc22741ad58..a21fc766bfa 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -281,6 +281,7 @@ typedef struct tagDC GdiFont *gdiFont; GdiPath path; + UINT font_code_page; WORD ROPmode; WORD polyFillMode; WORD stretchBltMode;