Module: wine Branch: refs/heads/master Commit: 1440eb5a35dc95dea1836d9035b51e2b15d83703 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=1440eb5a35dc95dea1836d90...
Author: qingdoa daoo qingdao33122@yahoo.com Date: Sat May 6 17:30:25 2006 +0800
gdi: A-to-W conversion should be font-independent.
---
dlls/gdi/font.c | 79 ++++++++++++------------------------------------------- 1 files changed, 17 insertions(+), 62 deletions(-)
diff --git a/dlls/gdi/font.c b/dlls/gdi/font.c index 817f706..b0d8a98 100644 --- a/dlls/gdi/font.c +++ b/dlls/gdi/font.c @@ -344,59 +344,17 @@ static void FONT_NewTextMetricExWToA(con /*********************************************************************** * 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. + * Returns a Unicode translation of str. 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. 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) +static LPWSTR FONT_mbtowc(LPCSTR str, INT count, INT *plenW) { UINT cp = CP_ACP; INT lenW; LPWSTR strW; - CHARSETINFO csi; - int charset = GetTextCharset(hdc); - - /* Hmm, nicely designed api this one! */ - if(TranslateCharsetInfo((DWORD*)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; - } - } - - TRACE("charset %d => cp %d\n", charset, cp);
if(count == -1) count = strlen(str); lenW = MultiByteToWideChar(cp, 0, str, count, NULL, 0); @@ -404,7 +362,6 @@ static LPWSTR FONT_mbtowc(HDC hdc, LPCST MultiByteToWideChar(cp, 0, str, count, strW, lenW); TRACE("mapped %s -> %s\n", debugstr_an(str, count), debugstr_wn(strW, lenW)); if(plenW) *plenW = lenW; - if(pCP) *pCP = cp; return strW; }
@@ -1066,7 +1023,7 @@ BOOL WINAPI GetTextExtentPoint32A( HDC h { BOOL ret = FALSE; INT wlen; - LPWSTR p = FONT_mbtowc(hdc, str, count, &wlen, NULL); + LPWSTR p = FONT_mbtowc(str, count, &wlen);
if (p) { ret = GetTextExtentPoint32W( hdc, p, wlen, size ); @@ -1187,7 +1144,7 @@ BOOL WINAPI GetTextExtentExPointA( HDC h { BOOL ret; INT wlen; - LPWSTR p = FONT_mbtowc( hdc, str, count, &wlen, NULL); + LPWSTR p = FONT_mbtowc(str, count, &wlen); ret = GetTextExtentExPointW( hdc, p, wlen, maxExt, lpnFit, alpDx, size); if (lpnFit) *lpnFit = WideCharToMultiByte(CP_ACP,0,p,*lpnFit,NULL,0,NULL,NULL); HeapFree( GetProcessHeap(), 0, p ); @@ -1646,7 +1603,7 @@ BOOL WINAPI GetCharWidth32A( HDC hdc, UI for(i = 0; i < count; i++) str[i] = (BYTE)(firstChar + i);
- wstr = FONT_mbtowc(hdc, str, count, &wlen, NULL); + wstr = FONT_mbtowc(str, count, &wlen);
for(i = 0; i < wlen; i++) { @@ -1674,7 +1631,6 @@ BOOL WINAPI ExtTextOutA( HDC hdc, INT x, const RECT *lprect, LPCSTR str, UINT count, const INT *lpDx ) { INT wlen; - UINT codepage; LPWSTR p; BOOL ret; LPINT lpDxW = NULL; @@ -1682,14 +1638,14 @@ BOOL WINAPI ExtTextOutA( HDC hdc, INT x, if (flags & ETO_GLYPH_INDEX) return ExtTextOutW( hdc, x, y, flags, lprect, (LPCWSTR)str, count, lpDx );
- p = FONT_mbtowc(hdc, str, count, &wlen, &codepage); + p = FONT_mbtowc(str, count, &wlen);
if (lpDx) { unsigned int i = 0, j = 0;
lpDxW = HeapAlloc( GetProcessHeap(), 0, wlen*sizeof(INT)); while(i < count) { - if(IsDBCSLeadByteEx(codepage, str[i])) { + if(IsDBCSLeadByte(str[i])) { lpDxW[j++] = lpDx[i] + lpDx[i+1]; i = i + 2; } else { @@ -2290,7 +2246,7 @@ BOOL WINAPI GetCharABCWidthsA(HDC hdc, U for(i = 0; i < count; i++) str[i] = (BYTE)(firstChar + i);
- wstr = FONT_mbtowc(hdc, str, count, &wlen, NULL); + wstr = FONT_mbtowc(str, count, &wlen);
for(i = 0; i < wlen; i++) { @@ -2428,7 +2384,7 @@ DWORD WINAPI GetGlyphOutlineA( HDC hdc, len = 1; mbchs[0] = (uChar & 0xff); } - p = FONT_mbtowc(hdc, mbchs, len, NULL, NULL); + p = FONT_mbtowc(mbchs, len, NULL); c = p[0]; } else c = uChar; @@ -2667,7 +2623,7 @@ DWORD WINAPI GetGlyphIndicesA(HDC hdc, L TRACE("(%p, %s, %d, %p, 0x%lx)\n", hdc, debugstr_an(lpstr, count), count, pgi, flags);
- lpstrW = FONT_mbtowc(hdc, lpstr, count, &countW, NULL); + lpstrW = FONT_mbtowc(lpstr, count, &countW); ret = GetGlyphIndicesW(hdc, lpstrW, countW, pgi, flags); HeapFree(GetProcessHeap(), 0, lpstrW);
@@ -2712,7 +2668,6 @@ GetCharacterPlacementA(HDC hdc, LPCSTR l INT uCountW; GCP_RESULTSW resultsW; DWORD ret; - UINT font_cp;
TRACE("%s, %d, %d, 0x%08lx\n", debugstr_an(lpString, uCount), uCount, nMaxExtent, dwFlags); @@ -2720,7 +2675,7 @@ GetCharacterPlacementA(HDC hdc, LPCSTR l /* both structs are equal in size */ memcpy(&resultsW, lpResults, sizeof(resultsW));
- lpStringW = FONT_mbtowc(hdc, lpString, uCount, &uCountW, &font_cp); + lpStringW = FONT_mbtowc(lpString, uCount, &uCountW); if(lpResults->lpOutString) resultsW.lpOutString = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*uCountW);
@@ -2730,7 +2685,7 @@ GetCharacterPlacementA(HDC hdc, LPCSTR l lpResults->nMaxFit = resultsW.nMaxFit;
if(lpResults->lpOutString) { - WideCharToMultiByte(font_cp, 0, resultsW.lpOutString, uCountW, + WideCharToMultiByte(CP_ACP, 0, resultsW.lpOutString, uCountW, lpResults->lpOutString, uCount, NULL, NULL ); }
@@ -2860,7 +2815,7 @@ BOOL WINAPI GetCharABCWidthsFloatA( HDC for(i = 0; i < count; i++) str[i] = (BYTE)(first + i);
- wstr = FONT_mbtowc( hdc, str, count, &wlen, NULL ); + wstr = FONT_mbtowc(str, count, &wlen);
for (i = 0; i < wlen; i++) {