43#include "MagickCore/studio.h"
44#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__)
45#include "MagickCore/cache.h"
46#include "MagickCore/colorspace.h"
47#include "MagickCore/colorspace-private.h"
48#include "MagickCore/draw.h"
49#include "MagickCore/exception.h"
50#include "MagickCore/exception-private.h"
51#include "MagickCore/image-private.h"
52#include "MagickCore/locale-private.h"
53#include "MagickCore/memory_.h"
54#include "MagickCore/memory-private.h"
55#include "MagickCore/monitor.h"
56#include "MagickCore/monitor-private.h"
57#include "MagickCore/nt-base.h"
58#include "MagickCore/nt-base-private.h"
59#include "MagickCore/nt-feature.h"
60#include "MagickCore/pixel-accessor.h"
61#include "MagickCore/quantum.h"
62#include "MagickCore/string_.h"
63#include "MagickCore/token.h"
64#include "MagickCore/splay-tree.h"
65#include "MagickCore/utility.h"
66#if defined(__CYGWIN__)
67#define WIN32_LEAN_AND_MEAN
95MagickExport MagickBooleanType NTIsMagickConflict(
const char *magick)
100 assert(magick != (
char *) NULL);
101 if (strlen(magick) > 1)
103 status=(GetLogicalDrives() & (1 << ((LocaleToUppercase((
int)
104 (*magick)))-
'A'))) != 0 ? MagickTrue : MagickFalse;
130MagickExport MagickBooleanType NTAcquireTypeCache(SplayTreeInfo *type_cache,
131 ExceptionInfo *exception)
140 buffer[MagickPathExtent],
141 font_root[MagickPathExtent];
154 reg_key=(HKEY) INVALID_HANDLE_VALUE;
155 res=RegOpenKeyExA(HKEY_LOCAL_MACHINE,
156 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",0,KEY_READ,®_key);
157 length=
sizeof(font_root)-1;
158 if (res == ERROR_SUCCESS)
159 res=RegQueryValueExA(reg_key,
"SystemRoot",NULL,&type,(BYTE*) font_root,
161 if (res != ERROR_SUCCESS)
163 res=RegOpenKeyExA(HKEY_LOCAL_MACHINE,
164 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion",0,KEY_READ,®_key);
165 if (res == ERROR_SUCCESS)
166 res=RegQueryValueExA(reg_key,
"SystemRoot",NULL,&type,(BYTE*) font_root,
169 if (res == ERROR_SUCCESS)
170 res=RegOpenKeyExA(reg_key,
"Fonts",0,KEY_READ,®_key);
171 if (res != ERROR_SUCCESS)
173 (void) ConcatenateMagickString(font_root,
"\\fonts\\arial.ttf",
175 if (IsPathAccessible(font_root) != MagickFalse)
177 font_root[length-1]=0;
178 (void) ConcatenateMagickString(font_root,
"\\fonts\\",MagickPathExtent);
182 font_root[length-1]=0;
183 (void) ConcatenateMagickString(font_root,
"\\",MagickPathExtent);
194 utf8[MagickPathExtent];
197 wide_name[MagickPathExtent],
198 wide_value[MagickPathExtent];
202 while (res != ERROR_NO_MORE_ITEMS)
213 name_length=MagickPathExtent-1;
214 value_length=MagickPathExtent-1;
215 res=RegEnumValueW(reg_key,registry_index,(
wchar_t *) wide_name,
216 &name_length,0,&type,(BYTE *) wide_value,&value_length);
218 if (res != ERROR_SUCCESS)
220 WideCharToMultiByte(CP_UTF8,0,wide_name,-1,utf8,
sizeof(utf8),NULL,
222 if ((pos=strstr(utf8,
" (TrueType)")) == (
char*) NULL)
225 type_info=(TypeInfo *) AcquireCriticalMemory(
sizeof(*type_info));
226 (void) memset(type_info,0,
sizeof(TypeInfo));
227 type_info->path=ConstantString(
"Windows Fonts");
228 type_info->signature=MagickCoreSignature;
229 (void) CopyMagickString(buffer,utf8,MagickPathExtent);
230 for (pos=buffer; *pos != 0; pos++)
233 type_info->name=ConstantString(buffer);
234 type_info->description=ConstantString(utf8);
235 type_info->format=ConstantString(
"truetype");
236 type_info->stretch=NormalStretch;
237 type_info->style=NormalStyle;
238 type_info->weight=400;
240 if ((LocaleCompare(type_info->name,
"Symbol") == 0) ||
241 (LocaleCompare(type_info->name,
"Wingdings") == 0) ||
242 (LocaleCompare(type_info->name,
"Wingdings-2") == 0) ||
243 (LocaleCompare(type_info->name,
"Wingdings-3") == 0))
244 type_info->encoding=ConstantString(
"AppleRoman");
246 for (q=utf8; *q !=
'\0'; )
249 token[MagickPathExtent];
251 (void) GetNextToken(q,(
const char **) &q,MagickPathExtent,token);
254 if (LocaleCompare(token,
"Italic") == 0)
255 type_info->style=ItalicStyle;
256 else if (LocaleCompare(token,
"Oblique") == 0)
257 type_info->style=ObliqueStyle;
258 else if (LocaleCompare(token,
"Bold") == 0)
259 type_info->weight=700;
260 else if (LocaleCompare(token,
"Thin") == 0)
261 type_info->weight=100;
262 else if ((LocaleCompare(token,
"ExtraLight") == 0) ||
263 (LocaleCompare(token,
"UltraLight") == 0))
264 type_info->weight=200;
265 else if (LocaleCompare(token,
"Light") == 0)
266 type_info->weight=300;
267 else if ((LocaleCompare(token,
"Normal") == 0) ||
268 (LocaleCompare(token,
"Regular") == 0))
269 type_info->weight=400;
270 else if (LocaleCompare(token,
"Medium") == 0)
271 type_info->weight=500;
272 else if ((LocaleCompare(token,
"SemiBold") == 0) ||
273 (LocaleCompare(token,
"DemiBold") == 0))
274 type_info->weight=600;
275 else if ((LocaleCompare(token,
"ExtraBold") == 0) ||
276 (LocaleCompare(token,
"UltraBold") == 0))
277 type_info->weight=800;
278 else if ((LocaleCompare(token,
"Heavy") == 0) ||
279 (LocaleCompare(token,
"Black") == 0))
280 type_info->weight=900;
281 else if (LocaleCompare(token,
"Condensed") == 0)
282 type_info->stretch = CondensedStretch;
283 else if (LocaleCompare(token,
"Expanded") == 0)
284 type_info->stretch = ExpandedStretch;
285 else if (LocaleCompare(token,
"ExtraCondensed") == 0)
286 type_info->stretch = ExtraCondensedStretch;
287 else if (LocaleCompare(token,
"ExtraExpanded") == 0)
288 type_info->stretch = ExtraExpandedStretch;
289 else if (LocaleCompare(token,
"SemiCondensed") == 0)
290 type_info->stretch = SemiCondensedStretch;
291 else if (LocaleCompare(token,
"SemiExpanded") == 0)
292 type_info->stretch = SemiExpandedStretch;
293 else if (LocaleCompare(token,
"UltraCondensed") == 0)
294 type_info->stretch = UltraCondensedStretch;
295 else if (LocaleCompare(token,
"UltraExpanded") == 0)
296 type_info->stretch = UltraExpandedStretch;
300 (void) CopyMagickString(buffer,utf8,family_extent-utf8+1);
301 (void) StripMagickString(buffer);
302 type_info->family=ConstantString(buffer);
303 WideCharToMultiByte(CP_UTF8,0,wide_value,-1,utf8,
sizeof(utf8),NULL,
305 if (strchr(utf8,
'\\') != (
char *) NULL)
306 (void) CopyMagickString(buffer,utf8,MagickPathExtent);
309 (void) CopyMagickString(buffer,font_root,MagickPathExtent);
310 (void) ConcatenateMagickString(buffer,utf8,MagickPathExtent);
313 type_info->glyphs=ConstantString(buffer);
314 status=AddValueToSplayTree(type_cache,type_info->name,type_info);
315 if (status == MagickFalse)
316 (void) ThrowMagickException(exception,GetMagickModule(),
317 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",type_info->name);
320 RegCloseKey(reg_key);