mlang
Aric Stewart
aric at codeweavers.com
Fri Sep 23 13:38:39 CDT 2005
Implement a basic beginning for
fnIMLangFontLink_CodePageToCodePages,
fnIMLangFontLink_CodePagesToCodePage and fnIMLangFontLink_GetFontCodePages.
Also some tests for the new functions.
-------------- next part --------------
Index: dlls/mlang/mlang.c
===================================================================
RCS file: /home/wine/wine/dlls/mlang/mlang.c,v
retrieving revision 1.23
diff -u -r1.23 mlang.c
--- dlls/mlang/mlang.c 7 Sep 2005 11:31:18 -0000 1.23
+++ dlls/mlang/mlang.c 23 Sep 2005 18:36:58 -0000
@@ -449,6 +449,63 @@
"Courier","Arial" } /* FIXME */
};
+/*
+ * from gdi/fonts.c
+ *
+ * This is for the DWORD CodePages collections. This DWORD represents a set of
+ * codepages where each bit in the dword corresponds to a CodePage.
+ *
+ * There is not documentation that states of these values are constant across
+ * computers or even applications. All the examples seem to imply they are NOT.
+ *
+ * For Simplicity in translating to and from fonts (another feature) I elected
+ * to use the same setup as a CHARSETINFO. If this proves to be too limited or
+ * incorrect it will need to be changed, possibly to an enumeration of all
+ * locales on the system or all defined above.
+ *
+ */
+#define FS(x) {{0,0,0,0},{0x1<<(x),0}}
+#define MAXTCIINDEX 32
+static const CHARSETINFO FONT_tci[MAXTCIINDEX] = {
+ /* ANSI */
+ { ANSI_CHARSET, 1252, FS(0)},
+ { EASTEUROPE_CHARSET, 1250, FS(1)},
+ { RUSSIAN_CHARSET, 1251, FS(2)},
+ { GREEK_CHARSET, 1253, FS(3)},
+ { TURKISH_CHARSET, 1254, FS(4)},
+ { HEBREW_CHARSET, 1255, FS(5)},
+ { ARABIC_CHARSET, 1256, FS(6)},
+ { BALTIC_CHARSET, 1257, FS(7)},
+ { VIETNAMESE_CHARSET, 1258, FS(8)},
+ /* reserved by ANSI */
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ /* ANSI and OEM */
+ { THAI_CHARSET, 874, FS(16)},
+ { SHIFTJIS_CHARSET, 932, FS(17)},
+ { GB2312_CHARSET, 936, FS(18)},
+ { HANGEUL_CHARSET, 949, FS(19)},
+ { CHINESEBIG5_CHARSET, 950, FS(20)},
+ { JOHAB_CHARSET, 1361, FS(21)},
+ /* reserved for alternate ANSI and OEM */
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { DEFAULT_CHARSET, 0, FS(0)},
+ /* reserved for system */
+ { DEFAULT_CHARSET, 0, FS(0)},
+ { SYMBOL_CHARSET, CP_SYMBOL, FS(31)},
+};
+
static void fill_cp_info(const struct mlang_data *ml_data, UINT index, MIMECPINFO *mime_cp_info);
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
@@ -1254,8 +1311,25 @@
UINT uCodePage,
DWORD* pdwCodePages)
{
- FIXME("\n");
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
+ UINT i;
+
+ TRACE("(%p) Seeking %u\n",This, uCodePage);
+
+ *pdwCodePages = 0x00000000;
+ for (i = 0; i < MAXTCIINDEX; i++)
+ {
+ if (uCodePage == FONT_tci[i].ciACP)
+ {
+ TRACE("Found at index %i\n",i);
+ *pdwCodePages = 1<<i;
+ TRACE("resulting CodePages 0x%lx\n",*pdwCodePages);
+ return S_OK;
+ }
+ }
+
+ TRACE("CodePage Not Found\n");
+ return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink_CodePagesToCodePage(
@@ -1264,8 +1338,36 @@
UINT uDefaultCodePage,
UINT* puCodePage)
{
- FIXME("\n");
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
+ DWORD mask = 0x00000000;
+ UINT i;
+ DWORD least_sig_cp = 0x00000000;;
+
+ TRACE("(%p) scanning 0x%lx default page %u\n",This, dwCodePages,
+ uDefaultCodePage);
+
+ for (i = 0; i < 32; i++)
+ {
+ mask = 1 << i;
+ if (dwCodePages & mask)
+ {
+ if (uDefaultCodePage == FONT_tci[i].ciACP)
+ {
+ *puCodePage = uDefaultCodePage;
+ TRACE("Found requested match %u on index %i", uDefaultCodePage,
+ i);
+ return S_OK;
+ }
+ else if (!least_sig_cp)
+ least_sig_cp = FONT_tci[i].ciACP;
+ }
+ }
+
+ TRACE("Falling back to least significant found CodePage %li\n",
+ least_sig_cp);
+ *puCodePage = least_sig_cp;
+
+ return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink_GetFontCodePages(
@@ -1274,8 +1376,20 @@
HFONT hFont,
DWORD* pdwCodePages)
{
- FIXME("\n");
- return E_NOTIMPL;
+ HFONT old_font;
+ FONTSIGNATURE fontsig;
+ ICOM_THIS_MULTI(MLang_impl, vtbl_IMLangFontLink, iface);
+
+ TRACE("(%p)\n",This);
+
+ old_font = SelectObject(hDC,hFont);
+ GetTextCharsetInfo(hDC,&fontsig, 0);
+ SelectObject(hDC,old_font);
+
+ *pdwCodePages = fontsig.fsCsb[0];
+ TRACE("CodePages is 0x%lx\n",fontsig.fsCsb[0]);
+
+ return S_OK;
}
static HRESULT WINAPI fnIMLangFontLink_MapFont(
Index: dlls/mlang/tests/mlang.c
===================================================================
RCS file: /home/wine/wine/dlls/mlang/tests/mlang.c,v
retrieving revision 1.9
diff -u -r1.9 mlang.c
--- dlls/mlang/tests/mlang.c 7 Sep 2005 11:31:18 -0000 1.9
+++ dlls/mlang/tests/mlang.c 23 Sep 2005 18:36:58 -0000
@@ -606,9 +606,45 @@
IEnumScript_Release(iEnumScript);
}
+void IMLangFontLink_Test(IMLangFontLink* iMLFL)
+{
+ DWORD dwCodePages = 0;
+ DWORD dwManyCodePages = 0;
+ UINT CodePage = 0;
+
+ ok(IMLangFontLink_CodePageToCodePages(iMLFL, 932, &dwCodePages)==S_OK,
+ "IMLangFontLink_CodePageToCodePages failed\n");
+ ok (dwCodePages != 0, "No CodePages returned\n");
+ ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwCodePages, 1035,
+ &CodePage)==S_OK,
+ "IMLangFontLink_CodePagesToCodePage failed\n");
+ ok(CodePage == 932, "Incorrect CodePage Returned (%i)\n",CodePage);
+
+ ok(IMLangFontLink_CodePageToCodePages(iMLFL, 1252, &dwCodePages)==S_OK,
+ "IMLangFontLink_CodePageToCodePages failed\n");
+ dwManyCodePages = dwManyCodePages | dwCodePages;
+ ok(IMLangFontLink_CodePageToCodePages(iMLFL, 1256, &dwCodePages)==S_OK,
+ "IMLangFontLink_CodePageToCodePages failed\n");
+ dwManyCodePages = dwManyCodePages | dwCodePages;
+ ok(IMLangFontLink_CodePageToCodePages(iMLFL, 874, &dwCodePages)==S_OK,
+ "IMLangFontLink_CodePageToCodePages failed\n");
+ dwManyCodePages = dwManyCodePages | dwCodePages;
+
+ ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwManyCodePages, 1256,
+ &CodePage)==S_OK,
+ "IMLangFontLink_CodePagesToCodePage failed\n");
+ ok(CodePage == 1256, "Incorrect CodePage Returned (%i)\n",CodePage);
+
+ ok(IMLangFontLink_CodePagesToCodePage(iMLFL, dwManyCodePages, 936,
+ &CodePage)==S_OK,
+ "IMLangFontLink_CodePagesToCodePage failed\n");
+ ok(CodePage == 1252, "Incorrect CodePage Returned (%i)\n",CodePage);
+}
+
START_TEST(mlang)
{
IMultiLanguage2 *iML2 = NULL;
+ IMLangFontLink *iMLFL = NULL;
HRESULT ret;
pGetCPInfoExA = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetCPInfoExA");
@@ -644,5 +680,13 @@
IMultiLanguage2_Release(iML2);
+ ret = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IMLangFontLink, (void **)&iMLFL);
+
+ trace("ret = %08lx, IMLangFontLink iMLFL = %p\n", ret, iMLFL);
+ if (ret != S_OK || !iML2) return;
+
+ IMLangFontLink_Test(iMLFL);
+
CoUninitialize();
}
More information about the wine-patches
mailing list