| /* |
| * |
| * Copyright 2009 Austin English |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| |
| #include "config.h" |
| |
| #include <stdarg.h> |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "wingdi.h" |
| #include "winreg.h" |
| #include "t2embapi.h" |
| #include "wine/debug.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(t2embed); |
| |
| BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) |
| { |
| switch (fdwReason) |
| { |
| case DLL_WINE_PREATTACH: |
| return FALSE; /* prefer native version */ |
| case DLL_PROCESS_ATTACH: |
| DisableThreadLibraryCalls(hinstDLL); |
| break; |
| } |
| |
| return TRUE; |
| } |
| |
| LONG WINAPI TTLoadEmbeddedFont(HANDLE *phFontReference, ULONG ulFlags, |
| ULONG *pulPrivStatus, ULONG ulPrivs, |
| ULONG *pulStatus, READEMBEDPROC lpfnReadFromStream, |
| LPVOID lpvReadStream, LPWSTR szWinFamilyName, |
| LPSTR szMacFamilyName, TTLOADINFO *pTTLoadInfo) |
| { |
| FIXME("(%p 0x%08x %p 0x%08x %p %p %p %s %s %p) stub\n", phFontReference, |
| ulFlags, pulPrivStatus, ulPrivs, pulStatus, lpfnReadFromStream, |
| lpvReadStream, debugstr_w(szWinFamilyName), szMacFamilyName, |
| pTTLoadInfo); |
| |
| return E_API_NOTIMPL; |
| } |
| |
| LONG WINAPI TTEmbedFont(HDC hDC, ULONG ulFlags, ULONG ulCharSet, ULONG *pulPrivStatus, |
| ULONG *pulStatus, WRITEEMBEDPROC lpfnWriteToStream, LPVOID lpvWriteStream, |
| USHORT *pusCharCodeSet, USHORT usCharCodeCount, USHORT usLanguage, |
| TTEMBEDINFO *pTTEmbedInfo) |
| { |
| FIXME("(%p 0x%08x 0x%08x %p %p %p %p %p %u %u %p) stub\n", hDC, |
| ulFlags, ulCharSet, pulPrivStatus, pulStatus, lpfnWriteToStream, |
| lpvWriteStream, pusCharCodeSet, usCharCodeCount, usLanguage, |
| pTTEmbedInfo); |
| |
| return E_API_NOTIMPL; |
| } |
| |
| LONG WINAPI TTGetEmbeddingType(HDC hDC, ULONG *status) |
| { |
| OUTLINETEXTMETRICW otm; |
| WORD fsType; |
| |
| 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; |
| |
| otm.otmfsType = (fsType = otm.otmfsType) & 0xf; |
| if (otm.otmfsType == LICENSE_INSTALLABLE) |
| *status = EMBED_INSTALLABLE; |
| else if (otm.otmfsType & LICENSE_EDITABLE) |
| *status = EMBED_EDITABLE; |
| else if (otm.otmfsType & LICENSE_PREVIEWPRINT) |
| *status = EMBED_PREVIEWPRINT; |
| else if (otm.otmfsType & LICENSE_NOEMBEDDING) |
| *status = EMBED_NOEMBEDDING; |
| else |
| { |
| WARN("unrecognized flags, %#x\n", otm.otmfsType); |
| *status = EMBED_INSTALLABLE; |
| } |
| |
| TRACE("fsType 0x%04x, status %u\n", fsType, *status); |
| 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)) |
| goto out; |
| |
| *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); |
| |
| out: |
| TRACE("embedding %s for %s\n", *enabled ? "enabled" : "disabled", debugstr_a(facename)); |
| return E_NONE; |
| } |
| |
| LONG WINAPI TTIsEmbeddingEnabled(HDC hDC, BOOL *enabled) |
| { |
| 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((LPCSTR)otm + (ULONG_PTR)otm->otmpFaceName, enabled); |
| HeapFree(GetProcessHeap(), 0, otm); |
| return ret; |
| } |
| |
| LONG WINAPI TTDeleteEmbeddedFont(HANDLE hFontReference, ULONG flags, ULONG *status) |
| { |
| FIXME("(%p 0x%08x %p) stub\n", hFontReference, flags, status); |
| return E_API_NOTIMPL; |
| } |