1 /* 2 * 3 * Copyright 2009 Austin English 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 18 */ 19 20 21 #include "config.h" 22 23 #include <stdarg.h> 24 25 #include "windef.h" 26 #include "winbase.h" 27 #include "wingdi.h" 28 #include "winreg.h" 29 #include "t2embapi.h" 30 #include "wine/debug.h" 31 32 WINE_DEFAULT_DEBUG_CHANNEL(t2embed); 33 34 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 35 { 36 switch (fdwReason) 37 { 38 case DLL_WINE_PREATTACH: 39 return FALSE; /* prefer native version */ 40 case DLL_PROCESS_ATTACH: 41 DisableThreadLibraryCalls(hinstDLL); 42 break; 43 } 44 45 return TRUE; 46 } 47 48 LONG WINAPI TTLoadEmbeddedFont(HANDLE *phFontReference, ULONG ulFlags, 49 ULONG *pulPrivStatus, ULONG ulPrivs, 50 ULONG *pulStatus, READEMBEDPROC lpfnReadFromStream, 51 LPVOID lpvReadStream, LPWSTR szWinFamilyName, 52 LPSTR szMacFamilyName, TTLOADINFO *pTTLoadInfo) 53 { 54 FIXME("(%p 0x%08x %p 0x%08x %p %p %p %s %s %p) stub\n", phFontReference, 55 ulFlags, pulPrivStatus, ulPrivs, pulStatus, lpfnReadFromStream, 56 lpvReadStream, debugstr_w(szWinFamilyName), szMacFamilyName, 57 pTTLoadInfo); 58 59 return E_API_NOTIMPL; 60 } 61 62 LONG WINAPI TTEmbedFont(HDC hDC, ULONG ulFlags, ULONG ulCharSet, ULONG *pulPrivStatus, 63 ULONG *pulStatus, WRITEEMBEDPROC lpfnWriteToStream, LPVOID lpvWriteStream, 64 USHORT *pusCharCodeSet, USHORT usCharCodeCount, USHORT usLanguage, 65 TTEMBEDINFO *pTTEmbedInfo) 66 { 67 FIXME("(%p 0x%08x 0x%08x %p %p %p %p %p %u %u %p) stub\n", hDC, 68 ulFlags, ulCharSet, pulPrivStatus, pulStatus, lpfnWriteToStream, 69 lpvWriteStream, pusCharCodeSet, usCharCodeCount, usLanguage, 70 pTTEmbedInfo); 71 72 return E_API_NOTIMPL; 73 } 74 75 LONG WINAPI TTGetEmbeddingType(HDC hDC, ULONG *status) 76 { 77 OUTLINETEXTMETRICW otm; 78 WORD fsType; 79 80 TRACE("(%p %p)\n", hDC, status); 81 82 if (!hDC) 83 return E_HDCINVALID; 84 85 otm.otmSize = sizeof(otm); 86 if (!GetOutlineTextMetricsW(hDC, otm.otmSize, &otm)) 87 return E_NOTATRUETYPEFONT; 88 89 if (!status) 90 return E_PERMISSIONSINVALID; 91 92 otm.otmfsType = (fsType = otm.otmfsType) & 0xf; 93 if (otm.otmfsType == LICENSE_INSTALLABLE) 94 *status = EMBED_INSTALLABLE; 95 else if (otm.otmfsType & LICENSE_EDITABLE) 96 *status = EMBED_EDITABLE; 97 else if (otm.otmfsType & LICENSE_PREVIEWPRINT) 98 *status = EMBED_PREVIEWPRINT; 99 else if (otm.otmfsType & LICENSE_NOEMBEDDING) 100 *status = EMBED_NOEMBEDDING; 101 else 102 { 103 WARN("unrecognized flags, %#x\n", otm.otmfsType); 104 *status = EMBED_INSTALLABLE; 105 } 106 107 TRACE("fsType 0x%04x, status %u\n", fsType, *status); 108 return E_NONE; 109 } 110 111 LONG WINAPI TTIsEmbeddingEnabledForFacename(LPCSTR facename, BOOL *enabled) 112 { 113 static const WCHAR exclusionlistW[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', 114 'S','h','a','r','e','d',' ','T','o','o','l','s','\\','t','2','e','m','b','e','d',0}; 115 DWORD index; 116 HKEY hkey; 117 LONG ret; 118 119 TRACE("(%s %p)\n", debugstr_a(facename), enabled); 120 121 if (!facename) 122 return E_FACENAMEINVALID; 123 124 if (!enabled) 125 return E_PBENABLEDINVALID; 126 127 *enabled = TRUE; 128 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, exclusionlistW, 0, GENERIC_READ, &hkey)) 129 goto out; 130 131 *enabled = TRUE; 132 ret = ERROR_SUCCESS; 133 index = 0; 134 while (ret != ERROR_NO_MORE_ITEMS) 135 { 136 DWORD name_len, value_len, value, type; 137 CHAR name[LF_FACESIZE]; 138 139 name_len = ARRAY_SIZE(name); 140 value_len = sizeof(value); 141 ret = RegEnumValueA(hkey, index++, name, &name_len, NULL, &type, (BYTE*)&value, &value_len); 142 if (ret || type != REG_DWORD) 143 continue; 144 145 if (!lstrcmpiA(name, facename)) 146 { 147 *enabled = !!value; 148 break; 149 } 150 } 151 RegCloseKey(hkey); 152 153 out: 154 TRACE("embedding %s for %s\n", *enabled ? "enabled" : "disabled", debugstr_a(facename)); 155 return E_NONE; 156 } 157 158 LONG WINAPI TTIsEmbeddingEnabled(HDC hDC, BOOL *enabled) 159 { 160 OUTLINETEXTMETRICA *otm; 161 LONG ret; 162 UINT len; 163 164 TRACE("(%p %p)\n", hDC, enabled); 165 166 if (!hDC) 167 return E_HDCINVALID; 168 169 len = GetOutlineTextMetricsA(hDC, 0, NULL); 170 if (!len) 171 return E_ERRORACCESSINGFACENAME; 172 173 otm = HeapAlloc(GetProcessHeap(), 0, len); 174 if (!otm) 175 return E_NOFREEMEMORY; 176 177 GetOutlineTextMetricsA(hDC, len, otm); 178 ret = TTIsEmbeddingEnabledForFacename((LPCSTR)otm + (ULONG_PTR)otm->otmpFaceName, enabled); 179 HeapFree(GetProcessHeap(), 0, otm); 180 return ret; 181 } 182 183 LONG WINAPI TTDeleteEmbeddedFont(HANDLE hFontReference, ULONG flags, ULONG *status) 184 { 185 FIXME("(%p 0x%08x %p) stub\n", hFontReference, flags, status); 186 return E_API_NOTIMPL; 187 } 188