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