diff --git a/reactos/dll/win32/t2embed/main.c b/reactos/dll/win32/t2embed/main.c index 6726c4edafe..2df22551ba5 100644 --- a/reactos/dll/win32/t2embed/main.c +++ b/reactos/dll/win32/t2embed/main.c @@ -19,9 +19,13 @@ #define WIN32_NO_STATUS #include + #include #include +#include +#include #include + #include WINE_DEFAULT_DEBUG_CHANNEL(t2embed); @@ -70,16 +74,100 @@ LONG WINAPI TTEmbedFont(HDC hDC, ULONG ulFlags, ULONG ulCharSet, ULONG *pulPrivS LONG WINAPI TTGetEmbeddingType(HDC hDC, ULONG *status) { - FIXME("(%p %p) stub\n", hDC, status); - if (status) *status = EMBED_NOEMBEDDING; - return E_API_NOTIMPL; + OUTLINETEXTMETRICW otm; + + TRACE("(%p %p)\n", hDC, status); + + if (!hDC) + return E_HDCINVALID; + + otm.otmSize = sizeof(otm); + if (!GetOutlineTextMetricsW(hDC, otm.otmSize, &otm)) + return E_NOTATRUETYPEFONT; + + if (!status) + return E_PERMISSIONSINVALID; + + if (otm.otmfsType == LICENSE_INSTALLABLE) + *status = EMBED_INSTALLABLE; + else if (otm.otmfsType & LICENSE_NOEMBEDDING) + *status = EMBED_NOEMBEDDING; + else if (otm.otmfsType & LICENSE_PREVIEWPRINT) + *status = EMBED_PREVIEWPRINT; + else if (otm.otmfsType & LICENSE_EDITABLE) + *status = EMBED_EDITABLE; + + return E_NONE; +} + +LONG WINAPI TTIsEmbeddingEnabledForFacename(LPCSTR facename, BOOL *enabled) +{ + static const WCHAR exclusionlistW[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'S','h','a','r','e','d',' ','T','o','o','l','s','\\','t','2','e','m','b','e','d',0}; + DWORD index; + HKEY hkey; + LONG ret; + + TRACE("(%s %p)\n", debugstr_a(facename), enabled); + + if (!facename) + return E_FACENAMEINVALID; + + if (!enabled) + return E_PBENABLEDINVALID; + + *enabled = TRUE; + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, exclusionlistW, 0, GENERIC_READ, &hkey)) + return E_NONE; + + *enabled = TRUE; + ret = ERROR_SUCCESS; + index = 0; + while (ret != ERROR_NO_MORE_ITEMS) + { + DWORD name_len, value_len, value, type; + CHAR name[LF_FACESIZE]; + + name_len = sizeof(name)/sizeof(*name); + value_len = sizeof(value); + ret = RegEnumValueA(hkey, index++, name, &name_len, NULL, &type, (BYTE*)&value, &value_len); + if (ret || type != REG_DWORD) + continue; + + if (!lstrcmpiA(name, facename)) + { + *enabled = !!value; + break; + } + } + RegCloseKey(hkey); + + return E_NONE; } LONG WINAPI TTIsEmbeddingEnabled(HDC hDC, BOOL *enabled) { - FIXME("(%p %p) stub\n", hDC, enabled); - if (enabled) *enabled = FALSE; - return E_API_NOTIMPL; + OUTLINETEXTMETRICA *otm; + LONG ret; + UINT len; + + TRACE("(%p %p)\n", hDC, enabled); + + if (!hDC) + return E_HDCINVALID; + + len = GetOutlineTextMetricsA(hDC, 0, NULL); + if (!len) + return E_ERRORACCESSINGFACENAME; + + otm = HeapAlloc(GetProcessHeap(), 0, len); + if (!otm) + return E_NOFREEMEMORY; + + GetOutlineTextMetricsA(hDC, len, otm); + ret = TTIsEmbeddingEnabledForFacename(otm->otmpFaceName, enabled); + HeapFree(GetProcessHeap(), 0, otm); + return ret; } LONG WINAPI TTDeleteEmbeddedFont(HANDLE hFontReference, ULONG flags, ULONG *status) diff --git a/reactos/dll/win32/t2embed/stubs.c b/reactos/dll/win32/t2embed/stubs.c index 8a9f9582d31..bee9c42e2cc 100644 --- a/reactos/dll/win32/t2embed/stubs.c +++ b/reactos/dll/win32/t2embed/stubs.c @@ -66,15 +66,6 @@ TTGetEmbeddedFontInfo(ULONG ulFlags, return E_NONE; } -LONG -WINAPI -TTIsEmbeddingEnabledForFacename(LPSTR lpszFacename, - BOOL* pbEnabled) -{ - UNIMPLEMENTED; - return E_NONE; -} - LONG WINAPI TTRunValidationTests(HDC hDC, diff --git a/reactos/dll/win32/t2embed/t2embed.spec b/reactos/dll/win32/t2embed/t2embed.spec index 4c3ef6fd769..9b74715f081 100644 --- a/reactos/dll/win32/t2embed/t2embed.spec +++ b/reactos/dll/win32/t2embed/t2embed.spec @@ -1,11 +1,11 @@ @ stdcall TTCharToUnicode(ptr ptr long ptr long long) -@ stdcall TTDeleteEmbeddedFont(ptr long ptr) -@ stdcall TTEmbedFont(ptr long long ptr ptr ptr ptr ptr long long ptr) +@ stdcall TTDeleteEmbeddedFont(long long ptr) +@ stdcall TTEmbedFont(long long long ptr ptr ptr ptr ptr long long ptr) @ stdcall TTEmbedFontFromFileA(ptr str long long long ptr ptr ptr ptr ptr long long ptr) @ stdcall TTEnableEmbeddingForFacename(str long) @ stdcall TTGetEmbeddedFontInfo(long ptr long ptr ptr ptr ptr) -@ stdcall TTGetEmbeddingType(ptr ptr) -@ stdcall TTIsEmbeddingEnabled(ptr ptr) +@ stdcall TTGetEmbeddingType(long ptr) +@ stdcall TTIsEmbeddingEnabled(long ptr) @ stdcall TTIsEmbeddingEnabledForFacename(str ptr) @ stdcall TTLoadEmbeddedFont(ptr long ptr long ptr ptr ptr wstr str ptr) @ stdcall TTRunValidationTests(ptr ptr) @@ -17,7 +17,7 @@ @ stub _TTGetEmbeddedFontInfo@28 @ stdcall _TTGetEmbeddingType@8(long ptr) TTGetEmbeddingType @ stdcall _TTIsEmbeddingEnabled@8(long ptr) TTIsEmbeddingEnabled -@ stub _TTIsEmbeddingEnabledForFacename@8 +@ stdcall _TTIsEmbeddingEnabledForFacename@8(str ptr) TTIsEmbeddingEnabledForFacename @ stdcall _TTLoadEmbeddedFont@40(ptr long ptr long ptr ptr ptr wstr str ptr) TTLoadEmbeddedFont @ stub _TTRunValidationTests@8 @ stdcall TTEmbedFontEx(ptr long long ptr ptr ptr ptr ptr long long ptr) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f50f07131d4..de3d374366f 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -186,7 +186,7 @@ reactos/dll/win32/stdole2.tlb # Synced to WineStaging-1.9.4 reactos/dll/win32/stdole32.tlb # Synced to WineStaging-1.9.4 reactos/dll/win32/sti # Synced to WineStaging-1.9.4 reactos/dll/win32/sxs # Synced to WineStaging-1.9.4 -reactos/dll/win32/t2embed # Synced to WineStaging-1.9.4 +reactos/dll/win32/t2embed # Synced to WineStaging-1.9.11 reactos/dll/win32/tapi32 # Synced to WineStaging-1.9.4 reactos/dll/win32/traffic # Synced to WineStaging-1.9.4 reactos/dll/win32/twain_32 # Synced to WineStaging-1.9.4 diff --git a/reactos/sdk/include/psdk/t2embapi.h b/reactos/sdk/include/psdk/t2embapi.h index 12a010db14c..7d6512667e5 100644 --- a/reactos/sdk/include/psdk/t2embapi.h +++ b/reactos/sdk/include/psdk/t2embapi.h @@ -233,7 +233,7 @@ TTIsEmbeddingEnabled(HDC hDC, LONG WINAPI -TTIsEmbeddingEnabledForFacename(LPSTR lpszFacename, +TTIsEmbeddingEnabledForFacename(LPCSTR lpszFacename, BOOL* pbEnabled); LONG