Module: wine Branch: master Commit: 4bb8d9c1c2f16c107c869131744cf879d3c83f43 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4bb8d9c1c2f16c107c86913174...
Author: Dmitry Timoshkov dmitry@codeweavers.com Date: Mon Apr 6 17:16:40 2009 +0900
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 aa8fbc5..fd28663 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 107536e..14de327 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); - - /* 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; + DC *dc = get_dc_ptr( hdc );
- 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 bc22741..a21fc76 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;