43#include "magick/studio.h"
44#if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__)
45#include "magick/cache.h"
46#include "magick/colorspace.h"
47#include "magick/colorspace-private.h"
48#include "magick/draw.h"
49#include "magick/exception.h"
50#include "magick/exception-private.h"
51#include "magick/image-private.h"
52#include "magick/locale-private.h"
53#include "magick/memory_.h"
54#include "magick/monitor.h"
55#include "magick/monitor-private.h"
56#include "magick/nt-base.h"
57#include "magick/nt-base-private.h"
58#include "magick/nt-feature.h"
59#include "magick/pixel-accessor.h"
60#include "magick/quantum.h"
61#include "magick/string_.h"
62#include "magick/token.h"
63#include "magick/splay-tree.h"
64#include "magick/utility.h"
65#if defined(__CYGWIN__)
66#define WIN32_LEAN_AND_MEAN
94MagickExport MagickBooleanType NTIsMagickConflict(
const char *magick)
99 assert(magick != (
char *) NULL);
100 if (strlen(magick) > 1)
102 status=(GetLogicalDrives() & (1 <<
103 ((LocaleToUppercase((
int) (*magick)))-
'A'))) != 0 ? MagickTrue : MagickFalse;
129MagickExport MagickBooleanType NTAcquireTypeCache(
SplayTreeInfo *type_cache,
133 reg_key = (HKEY) INVALID_HANDLE_VALUE;
142 buffer[MaxTextExtent],
143 system_root[MaxTextExtent],
144 font_root[MaxTextExtent];
157 res = RegOpenKeyExA (HKEY_LOCAL_MACHINE,
158 "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, ®_key);
159 if (res == ERROR_SUCCESS) {
160 system_root_length=
sizeof(system_root)-1;
161 res = RegQueryValueExA(reg_key,
"SystemRoot",NULL, &type,
162 (BYTE*) system_root, &system_root_length);
164 if (res != ERROR_SUCCESS) {
165 res = RegOpenKeyExA (HKEY_LOCAL_MACHINE,
166 "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0, KEY_READ, ®_key);
167 if (res == ERROR_SUCCESS) {
168 system_root_length=
sizeof(system_root)-1;
169 res = RegQueryValueExA(reg_key,
"SystemRoot",NULL, &type,
170 (BYTE*)system_root, &system_root_length);
173 if (res == ERROR_SUCCESS)
174 res = RegOpenKeyExA (reg_key,
"Fonts",0, KEY_READ, ®_key);
175 if (res != ERROR_SUCCESS)
178 (void) CopyMagickString(buffer,system_root,MaxTextExtent);
179 (void) ConcatenateMagickString(buffer,
"\\fonts\\arial.ttf",MaxTextExtent);
180 if (IsPathAccessible(buffer) != MagickFalse)
182 (void) CopyMagickString(font_root,system_root,MaxTextExtent);
183 (void) ConcatenateMagickString(font_root,
"\\fonts\\",MaxTextExtent);
187 (void) CopyMagickString(font_root,system_root,MaxTextExtent);
188 (void) ConcatenateMagickString(font_root,
"\\",MaxTextExtent);
202 value_data[MaxTextExtent],
203 value_name[MaxTextExtent];
207 while (res != ERROR_NO_MORE_ITEMS)
211 token[MaxTextExtent],
215 value_name_length =
sizeof(value_name) - 1;
216 value_data_size =
sizeof(value_data) - 1;
217 res=RegEnumValueA(reg_key,registry_index,value_name,&value_name_length,
218 0,&type,(BYTE *) value_data,&value_data_size);
220 if (res != ERROR_SUCCESS)
222 if ((pos=strstr(value_name,
" (TrueType)")) == (
char*) NULL)
225 type_info=(
TypeInfo *) AcquireMagickMemory(
sizeof(*type_info));
227 ThrowFatalException(ResourceLimitFatalError,
"MemoryAllocationFailed");
228 (void) memset(type_info,0,
sizeof(
TypeInfo));
229 type_info->path=ConstantString(
"Windows Fonts");
230 type_info->signature=MagickCoreSignature;
231 (void) CopyMagickString(buffer,value_name,MaxTextExtent);
232 for (pos=buffer; *pos != 0; pos++)
235 type_info->name=ConstantString(buffer);
236 type_info->description=ConstantString(value_name);
237 type_info->format=ConstantString(
"truetype");
238 if (strchr(value_data,
'\\') != (
char *) NULL)
239 (void) CopyMagickString(buffer,value_data,MaxTextExtent);
242 (void) CopyMagickString(buffer,font_root,MaxTextExtent);
243 (void) ConcatenateMagickString(buffer,value_data,MaxTextExtent);
246 type_info->glyphs=ConstantString(buffer);
247 type_info->stretch=NormalStretch;
248 type_info->style=NormalStyle;
249 type_info->weight=400;
253 if ( (LocaleCompare(type_info->name,
"Symbol") == 0 ) ||
254 (LocaleCompare(type_info->name,
"Wingdings") == 0 ) ||
255 (LocaleCompare(type_info->name,
"Wingdings-2") == 0 ) ||
256 (LocaleCompare(type_info->name,
"Wingdings-3") == 0 ) )
257 type_info->encoding=ConstantString(
"AppleRoman");
258 family_extent=value_name;
259 for (q=value_name; *q !=
'\0'; )
261 (void) GetNextToken(q,(
const char **) &q,MaxTextExtent,token);
265 if (LocaleCompare(token,
"Italic") == 0)
267 type_info->style=ItalicStyle;
270 else if (LocaleCompare(token,
"Oblique") == 0)
272 type_info->style=ObliqueStyle;
275 else if (LocaleCompare(token,
"Bold") == 0)
277 type_info->weight=700;
280 else if (LocaleCompare(token,
"Thin") == 0)
282 type_info->weight=100;
285 else if ( (LocaleCompare(token,
"ExtraLight") == 0) ||
286 (LocaleCompare(token,
"UltraLight") == 0) )
288 type_info->weight=200;
291 else if (LocaleCompare(token,
"Light") == 0)
293 type_info->weight=300;
296 else if ( (LocaleCompare(token,
"Normal") == 0) ||
297 (LocaleCompare(token,
"Regular") == 0) )
299 type_info->weight=400;
302 else if (LocaleCompare(token,
"Medium") == 0)
304 type_info->weight=500;
307 else if ( (LocaleCompare(token,
"SemiBold") == 0) ||
308 (LocaleCompare(token,
"DemiBold") == 0) )
310 type_info->weight=600;
313 else if ( (LocaleCompare(token,
"ExtraBold") == 0) ||
314 (LocaleCompare(token,
"UltraBold") == 0) )
316 type_info->weight=800;
319 else if ( (LocaleCompare(token,
"Heavy") == 0) ||
320 (LocaleCompare(token,
"Black") == 0) )
322 type_info->weight=900;
325 else if (LocaleCompare(token,
"Condensed") == 0)
327 type_info->stretch = CondensedStretch;
330 else if (LocaleCompare(token,
"Expanded") == 0)
332 type_info->stretch = ExpandedStretch;
335 else if (LocaleCompare(token,
"ExtraCondensed") == 0)
337 type_info->stretch = ExtraCondensedStretch;
340 else if (LocaleCompare(token,
"ExtraExpanded") == 0)
342 type_info->stretch = ExtraExpandedStretch;
345 else if (LocaleCompare(token,
"SemiCondensed") == 0)
347 type_info->stretch = SemiCondensedStretch;
350 else if (LocaleCompare(token,
"SemiExpanded") == 0)
352 type_info->stretch = SemiExpandedStretch;
355 else if (LocaleCompare(token,
"UltraCondensed") == 0)
357 type_info->stretch = UltraCondensedStretch;
360 else if (LocaleCompare(token,
"UltraExpanded") == 0)
362 type_info->stretch = UltraExpandedStretch;
371 (void) CopyMagickString(buffer,value_name,family_extent-value_name+1);
373 type_info->family=ConstantString(buffer);
376 status=AddValueToSplayTree(type_cache,type_info->name,type_info);
377 if (status == MagickFalse)
378 (void) ThrowMagickException(exception,GetMagickModule(),
379 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",type_info->name);
382 RegCloseKey(reg_key);