67 #if defined(MAGICKCORE_FONTCONFIG_DELEGATE) 68 # include "fontconfig/fontconfig.h" 69 #if (FC_VERSION < 20209) 70 #undef FC_WEIGHT_LIGHT 71 #define FC_WIDTH "width" 72 #define FC_WIDTH_ULTRACONDENSED 50 73 #define FC_WIDTH_EXTRACONDENSED 63 74 #define FC_WIDTH_CONDENSED 75 75 #define FC_WIDTH_SEMICONDENSED 87 76 #define FC_WIDTH_NORMAL 100 77 #define FC_WIDTH_SEMIEXPANDED 113 78 #define FC_WIDTH_EXPANDED 125 79 #define FC_WIDTH_EXTRAEXPANDED 150 80 #define FC_WIDTH_ULTRAEXPANDED 200 82 #define FC_WEIGHT_THIN 0 83 #define FC_WEIGHT_EXTRALIGHT 40 84 #define FC_WEIGHT_ULTRALIGHT FC_WEIGHT_EXTRALIGHT 85 #define FC_WEIGHT_LIGHT 50 86 #define FC_WEIGHT_BOOK 75 87 #define FC_WEIGHT_REGULAR 80 88 #define FC_WEIGHT_NORMAL FC_WEIGHT_REGULAR 89 #define FC_WEIGHT_MEDIUM 100 90 #define FC_WEIGHT_DEMIBOLD 180 91 #define FC_WEIGHT_SEMIBOLD FC_WEIGHT_DEMIBOLD 92 #define FC_WEIGHT_BOLD 200 93 #define FC_WEIGHT_EXTRABOLD 205 94 #define FC_WEIGHT_ULTRABOLD FC_WEIGHT_EXTRABOLD 95 #define FC_WEIGHT_BLACK 210 96 #define FC_WEIGHT_HEAVY FC_WEIGHT_BLACK 99 #if defined(MAGICKCORE_WINDOWS_SUPPORT) 106 #define MagickTypeFilename "type.xml" 113 "<?xml version=\"1.0\"?>" 115 " <type stealth=\"True\" name=\"fixed\" family=\"helvetica\"/>" 116 " <type stealth=\"True\" name=\"helvetica\" family=\"helvetica\"/>" 169 if (p->
path != (
char *) NULL)
171 if (p->
name != (
char *) NULL)
175 if (p->
family != (
char *) NULL)
179 if (p->
foundry != (
char *) NULL)
181 if (p->
format != (
char *) NULL)
183 if (p->
metrics != (
char *) NULL)
185 if (p->
glyphs != (
char *) NULL)
204 #if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT 228 if (font_path != (
char *) NULL)
239 if (xml != (
void *) NULL)
288 if ((name == (
const char *) NULL) || (
LocaleCompare(name,
"*") == 0))
332 typedef struct _Fontmap
354 {
"fixed",
"courier" },
355 {
"modern",
"courier" },
356 {
"monotype corsiva",
"courier" },
357 {
"news gothic",
"helvetica" },
358 {
"system",
"courier" },
359 {
"terminal",
"courier" },
360 {
"wingdings",
"symbol" }
374 font_weight=(size_t) (weight == 0 ? 400 : weight);
379 while (p != (
const TypeInfo *) NULL)
381 if (p->
family == (
char *) NULL)
386 if (family == (
const char *) NULL)
412 if (p->
weight != font_weight)
421 if (type_info != (
const TypeInfo *) NULL)
430 while (p != (
const TypeInfo *) NULL)
432 if (p->
family == (
char *) NULL)
437 if (family == (
const char *) NULL)
469 if (score > max_score)
477 if (type_info != (
const TypeInfo *) NULL)
482 for (i=0; i < (ssize_t) (
sizeof(fontmap)/
sizeof(fontmap[0])); i++)
484 if (family == (
const char *) NULL)
497 if (type_info != (
const TypeInfo *) NULL)
500 "FontSubstitutionRequired",
"`%s'",type_info->
family);
503 if (family != (
const char *) NULL)
537 #if defined(__cplusplus) || defined(c_plusplus) 554 #if defined(__cplusplus) || defined(c_plusplus) 573 assert(pattern != (
char *) NULL);
574 assert(number_fonts != (
size_t *) NULL);
583 if (fonts == (
const TypeInfo **) NULL)
591 for (i=0; p != (
const TypeInfo *) NULL; )
601 *number_fonts=(size_t) i;
633 #if defined(__cplusplus) || defined(c_plusplus) 648 #if defined(__cplusplus) || defined(c_plusplus) 667 assert(pattern != (
char *) NULL);
668 assert(number_fonts != (
size_t *) NULL);
674 return((
char **) NULL);
677 if (fonts == (
char **) NULL)
678 return((
char **) NULL);
685 for (i=0; p != (
const TypeInfo *) NULL; )
693 qsort((
void *) fonts,(
size_t) i,
sizeof(*fonts),
TypeCompare);
694 fonts[i]=(
char *) NULL;
695 *number_fonts=(size_t) i;
723 #if defined(MAGICKCORE_FONTCONFIG_DELEGATE) 727 #if !defined(FC_FULLNAME) 728 #define FC_FULLNAME "fullname" 777 font_config=FcConfigGetCurrent();
778 if (font_config == (FcConfig *) NULL)
780 FcConfigSetRescanInterval(font_config,0);
781 font_set=(FcFontSet *) NULL;
782 object_set=FcObjectSetBuild(FC_FULLNAME,FC_FAMILY,FC_STYLE,FC_SLANT,
783 FC_WIDTH,FC_WEIGHT,FC_FILE,(
char *) NULL);
784 if (object_set != (FcObjectSet *) NULL)
786 pattern=FcPatternCreate();
787 if (pattern != (FcPattern *) NULL)
789 font_set=FcFontList(font_config,pattern,object_set);
790 FcPatternDestroy(pattern);
792 FcObjectSetDestroy(object_set);
794 if (font_set == (FcFontSet *) NULL)
796 FcConfigDestroy(font_config);
799 for (i=0; i < (ssize_t) font_set->nfont; i++)
801 status=FcPatternGetString(font_set->fonts[i],FC_FAMILY,0,&family);
802 if (status != FcResultMatch)
804 status=FcPatternGetString(font_set->fonts[i],FC_FILE,0,&file);
805 if (status != FcResultMatch)
809 if ((*extension !=
'\0') && (
LocaleCompare(extension,
"gz") == 0))
814 (void) memset(type_info,0,
sizeof(*type_info));
818 status=FcPatternGetString(font_set->fonts[i],FC_FULLNAME,0,&fullname);
819 if ((status == FcResultMatch) && (fullname != (FcChar8 *) NULL))
823 if (family != (FcChar8 *) NULL)
825 status=FcPatternGetString(font_set->fonts[i],FC_STYLE,0,&style);
826 if ((status == FcResultMatch) && (style != (FcChar8 *) NULL) &&
837 status=FcPatternGetInteger(font_set->fonts[i],FC_SLANT,0,&slant);
839 if (slant == FC_SLANT_ITALIC)
841 if (slant == FC_SLANT_OBLIQUE)
843 status=FcPatternGetInteger(font_set->fonts[i],FC_WIDTH,0,&width);
845 if (width >= FC_WIDTH_ULTRACONDENSED)
847 if (width >= FC_WIDTH_EXTRACONDENSED)
849 if (width >= FC_WIDTH_CONDENSED)
851 if (width >= FC_WIDTH_SEMICONDENSED)
853 if (width >= FC_WIDTH_NORMAL)
855 if (width >= FC_WIDTH_SEMIEXPANDED)
857 if (width >= FC_WIDTH_EXPANDED)
859 if (width >= FC_WIDTH_EXTRAEXPANDED)
861 if (width >= FC_WIDTH_ULTRAEXPANDED)
864 status=FcPatternGetInteger(font_set->fonts[i],FC_WEIGHT,0,&weight);
865 if (weight >= FC_WEIGHT_THIN)
867 if (weight >= FC_WEIGHT_EXTRALIGHT)
869 if (weight >= FC_WEIGHT_LIGHT)
871 if (weight >= FC_WEIGHT_NORMAL)
873 if (weight >= FC_WEIGHT_MEDIUM)
875 if (weight >= FC_WEIGHT_DEMIBOLD)
877 if (weight >= FC_WEIGHT_BOLD)
879 if (weight >= FC_WEIGHT_EXTRABOLD)
881 if (weight >= FC_WEIGHT_BLACK)
886 FcFontSetDestroy(font_set);
887 FcConfigDestroy(font_config);
905 #if defined(MAGICKCORE_WINDOWS_SUPPORT) 908 #if defined(MAGICKCORE_FONTCONFIG_DELEGATE) 909 (void) LoadFontConfigFonts(splay_tree,exception);
964 if (file == (FILE *) NULL)
968 if (type_info == (
const TypeInfo **) NULL)
971 path=(
const char *) NULL;
972 for (i=0; i < (ssize_t) number_fonts; i++)
976 if (((path == (
const char *) NULL) ||
978 (type_info[i]->
path != (
char *) NULL))
980 path=type_info[i]->
path;
982 if (type_info[i]->name != (
char *) NULL)
983 name=type_info[i]->
name;
985 if (type_info[i]->family != (
char *) NULL)
986 family=type_info[i]->
family;
990 if (type_info[i]->glyphs != (
char *) NULL)
991 glyphs=type_info[i]->
glyphs;
1001 (void) fflush(file);
1038 char *font_path,
const char *token,
char **target)
1044 #if defined(MAGICKCORE_WINDOWS_SUPPORT) 1045 if (strchr(path,
'@') != (
char *) NULL)
1059 #if defined(MAGICKCORE_WINDOWS_SUPPORT) 1060 if (strchr(path,
'@') != (
char *) NULL)
1075 const char *filename,
const size_t depth,
ExceptionInfo *exception)
1099 "Loading type configure file \"%s\" ...",filename);
1100 if (xml == (
const char *) NULL)
1106 #if defined(MAGICKCORE_WINDOWS_SUPPORT) 1115 for (q=(
char *) xml; *q !=
'\0'; )
1147 while (((*token !=
'/') && (*(token+1) !=
'>')) && (*q !=
'\0'))
1180 if (file_xml != (
char *) NULL)
1197 (void) memset(type_info,0,
sizeof(*type_info));
1202 if (type_info == (
TypeInfo *) NULL)
1214 (void)
GetNextToken(q,(
const char **) NULL,extent,token);
1328 type_info->
weight=(size_t) weight;
static SemaphoreInfo * type_semaphore
#define MagickMaxRecursionDepth
MagickExport MagickBooleanType AddValueToSplayTree(SplayTreeInfo *splay_tree, const void *key, const void *value)
MagickExport size_t ConcatenateMagickString(char *magick_restrict destination, const char *magick_restrict source, const size_t length)
MagickExport void UnlockSemaphoreInfo(SemaphoreInfo *semaphore_info)
static unsigned long StringToUnsignedLong(const char *magick_restrict value)
#define MagickTypeFilename
MagickExport ssize_t ParseCommandOption(const CommandOption option, const MagickBooleanType list, const char *options)
MagickExport const TypeInfo * GetTypeInfo(const char *name, ExceptionInfo *exception)
#define ThrowFatalException(severity, tag)
MagickExport SemaphoreInfo * AcquireSemaphoreInfo(void)
static SplayTreeInfo * type_cache
MagickPrivate MagickBooleanType TypeComponentGenesis(void)
MagickExport MagickBooleanType ListTypeInfo(FILE *file, ExceptionInfo *exception)
static MagickBooleanType IsTypeTreeInstantiated(ExceptionInfo *)
MagickExport ExceptionInfo * AcquireExceptionInfo(void)
MagickExport ssize_t FormatLocaleString(char *magick_restrict string, const size_t length, const char *magick_restrict format,...)
MagickExport size_t CopyMagickString(char *magick_restrict destination, const char *magick_restrict source, const size_t length)
MagickExport char * FileToString(const char *filename, const size_t extent, ExceptionInfo *exception)
MagickExport void * GetNextValueInLinkedList(LinkedListInfo *list_info)
static SplayTreeInfo * AcquireTypeCache(const char *filename, ExceptionInfo *exception)
MagickExport const void * GetNextValueInSplayTree(SplayTreeInfo *splay_tree)
MagickPrivate void TypeComponentTerminus(void)
#define MagickCoreSignature
MagickExport void LockSemaphoreInfo(SemaphoreInfo *semaphore_info)
MagickExport unsigned char * GetStringInfoDatum(const StringInfo *string_info)
MagickExport char ** GetTypeList(const char *pattern, size_t *number_fonts, ExceptionInfo *exception)
MagickExport void GetPathComponent(const char *path, PathType type, char *component)
MagickExport ssize_t FormatLocaleFile(FILE *file, const char *magick_restrict format,...)
#define DirectorySeparator
unsigned int MagickStatusType
MagickExport char * AcquireString(const char *source)
MagickExport MagickBooleanType GlobExpression(const char *magick_restrict expression, const char *magick_restrict pattern, const MagickBooleanType case_insensitive)
MagickExport const char * CommandOptionToMnemonic(const CommandOption option, const ssize_t type)
MagickExport void * AcquireCriticalMemory(const size_t size)
MagickExport void * AcquireQuantumMemory(const size_t count, const size_t quantum)
MagickExport int LocaleNCompare(const char *p, const char *q, const size_t length)
MagickExport magick_hot_spot size_t GetNextToken(const char *magick_restrict start, const char **magick_restrict end, const size_t extent, char *magick_restrict token)
MagickExport MagickBooleanType NTAcquireTypeCache(SplayTreeInfo *, ExceptionInfo *)
MagickExport SplayTreeInfo * DestroySplayTree(SplayTreeInfo *splay_tree)
static void * DestroyTypeNode(void *type_info)
MagickExport MagickBooleanType IsStringTrue(const char *value)
MagickExport MagickBooleanType IsEventLogging(void)
static const char TypeMap[]
MagickExport SplayTreeInfo * NewSplayTree(int(*compare)(const void *, const void *), void *(*relinquish_key)(void *), void *(*relinquish_value)(void *))
static MagickBooleanType SetTypeNodePath(const char *filename, char *font_path, const char *token, char **target)
MagickExport MagickBooleanType ThrowMagickException(ExceptionInfo *exception, const char *module, const char *function, const size_t line, const ExceptionType severity, const char *tag, const char *format,...)
MagickExport MagickBooleanType LogMagickEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
MagickExport MagickBooleanType IsPathAccessible(const char *path)
MagickExport const TypeInfo * GetTypeInfoByFamily(const char *family, const StyleType style, const StretchType stretch, const size_t weight, ExceptionInfo *exception)
MagickExport MagickBooleanType SubstituteString(char **string, const char *search, const char *replace)
MagickExport char * GetEnvironmentValue(const char *name)
MagickBooleanType stealth
MagickExport const void * GetValueFromSplayTree(SplayTreeInfo *splay_tree, const void *key)
MagickExport int LocaleCompare(const char *p, const char *q)
#define GetMagickModule()
MagickExport int CompareSplayTreeString(const void *target, const void *source)
MagickExport const char * GetStringInfoPath(const StringInfo *string_info)
static int TypeInfoCompare(const void *x, const void *y)
static MagickBooleanType LoadTypeCache(SplayTreeInfo *, const char *, const char *, const size_t, ExceptionInfo *)
MagickExport char * DestroyString(char *string)
MagickExport void * AcquireMagickMemory(const size_t size)
MagickExport void ActivateSemaphoreInfo(SemaphoreInfo **semaphore_info)
MagickExport const TypeInfo ** GetTypeInfoList(const char *pattern, size_t *number_fonts, ExceptionInfo *exception)
MagickExport const void * GetRootValueFromSplayTree(SplayTreeInfo *splay_tree)
MagickExport void ResetSplayTreeIterator(SplayTreeInfo *splay_tree)
MagickExport void * RelinquishMagickMemory(void *memory)
#define magick_unreferenced(x)
MagickExport size_t GetNumberOfNodesInSplayTree(const SplayTreeInfo *splay_tree)
static int TypeCompare(const void *x, const void *y)
MagickExport void RelinquishSemaphoreInfo(SemaphoreInfo **semaphore_info)
MagickExport char * ConstantString(const char *source)
MagickExport ExceptionInfo * DestroyExceptionInfo(ExceptionInfo *exception)