/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % V V EEEEE RRRR SSSSS IIIII OOO N N % % V V E R R SS I O O NN N % % V V EEE RRRR SSS I O O N N N % % V V E R R SS I O O N NN % % V EEEEE R R SSSSS IIIII OOO N N % % % % % % MagickCore Version and Copyright Methods % % % % Software Design % % Cristy % % September 2002 % % % % % % Copyright 1999-2021 ImageMagick Studio LLC, a non-profit organization % % dedicated to making software imaging solutions freely available. % % % % You may not use this file except in compliance with the License. You may % % obtain a copy of the License at % % % % https://imagemagick.org/script/license.php % % % % Unless required by applicable law or agreed to in writing, software % % distributed under the License is distributed on an "AS IS" BASIS, % % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % % See the License for the specific language governing permissions and % % limitations under the License. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % */ #include "MagickCore/studio.h" #include "MagickCore/configure.h" #include "MagickCore/exception.h" #include "MagickCore/exception-private.h" #include "MagickCore/linked-list.h" #include "MagickCore/locale_.h" #include "MagickCore/option.h" #include "MagickCore/string_.h" #include "MagickCore/utility.h" #include "MagickCore/utility-private.h" #include "MagickCore/version.h" #include "MagickCore/version-private.h" /* Define declarations. */ #define MagickURLFilename "index.html" /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k C o p y r i g h t % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickCopyright() returns the ImageMagick API copyright as a string. % % The format of the GetMagickCopyright method is: % % const char *GetMagickCopyright(void) % */ MagickExport const char *GetMagickCopyright(void) { return(MagickCopyright); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k D e l e g a t e s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickDelegates() returns the ImageMagick delegate libraries. % % The format of the GetMagickDelegates method is: % % const char *GetMagickDelegates(void) % % No parameters are required. % */ MagickExport const char *GetMagickDelegates(void) { return "" #if defined(MAGICKCORE_AUTOTRACE_DELEGATE) "autotrace " #endif #if defined(MAGICKCORE_BZLIB_DELEGATE) "bzlib " #endif #if defined(MAGICKCORE_CAIRO_DELEGATE) "cairo " #endif #if defined(MAGICKCORE_DJVU_DELEGATE) "djvu " #endif #if defined(MAGICKCORE_DPS_DELEGATE) "dps " #endif #if defined(MAGICKCORE_EMF_DELEGATE) "emf " #endif #if defined(MAGICKCORE_FFTW_DELEGATE) "fftw " #endif #if defined(MAGICKCORE_FLIF_DELEGATE) "flif " #endif #if defined(MAGICKCORE_FONTCONFIG_DELEGATE) "fontconfig " #endif #if defined(MAGICKCORE_FPX_DELEGATE) "fpx " #endif #if defined(MAGICKCORE_FREETYPE_DELEGATE) "freetype " #endif #if defined(MAGICKCORE_GS_DELEGATE) || defined(MAGICKCORE_WINDOWS_SUPPORT) "gslib " #endif #if defined(MAGICKCORE_GVC_DELEGATE) "gvc " #endif #if defined(MAGICKCORE_HEIC_DELEGATE) "heic " #endif #if defined(MAGICKCORE_JBIG_DELEGATE) "jbig " #endif #if defined(MAGICKCORE_JPEG_DELEGATE) && defined(MAGICKCORE_PNG_DELEGATE) "jng " #endif #if defined(MAGICKCORE_LIBOPENJP2_DELEGATE) "jp2 " #endif #if defined(MAGICKCORE_JPEG_DELEGATE) "jpeg " #endif #if defined(MAGICKCORE_JXL_DELEGATE) "jxl " #endif #if defined(MAGICKCORE_LCMS_DELEGATE) "lcms " #endif #if defined(MAGICKCORE_LQR_DELEGATE) "lqr " #endif #if defined(MAGICKCORE_LTDL_DELEGATE) "ltdl " #endif #if defined(MAGICKCORE_LZMA_DELEGATE) "lzma " #endif #if defined(MAGICKCORE_OPENEXR_DELEGATE) "openexr " #endif #if defined(MAGICKCORE_PANGOCAIRO_DELEGATE) "pangocairo " #endif #if defined(MAGICKCORE_PNG_DELEGATE) "png " #endif #if defined(MAGICKCORE_DPS_DELEGATE) || defined(MAGICKCORE_GS_DELEGATE) || \ defined(MAGICKCORE_WINDOWS_SUPPORT) "ps " #endif #if defined(MAGICKCORE_RAQM_DELEGATE) "raqm " #endif #if defined(MAGICKCORE_RAW_R_DELEGATE) "raw " #endif #if defined(MAGICKCORE_RSVG_DELEGATE) "rsvg " #endif #if defined(MAGICKCORE_TIFF_DELEGATE) "tiff " #endif #if defined(MAGICKCORE_WEBP_DELEGATE) "webp " #endif #if defined(MAGICKCORE_WMF_DELEGATE) || defined (MAGICKCORE_WMFLITE_DELEGATE) "wmf " #endif #if defined(MAGICKCORE_X11_DELEGATE) "x " #endif #if defined(MAGICKCORE_XML_DELEGATE) "xml " #endif #if defined(MAGICKCORE_ZIP_DELEGATE) "zip " #endif #if defined(MAGICKCORE_ZLIB_DELEGATE) "zlib" #endif ; } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k F e a t u r e s % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickFeatures() returns the ImageMagick features. % % The format of the GetMagickFeatures method is: % % const char *GetMagickFeatures(void) % % No parameters are required. % */ MagickExport const char *GetMagickFeatures(void) { return "" #if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_DEBUG) "Debug " #endif #if defined(MAGICKCORE_CIPHER_SUPPORT) "Cipher " #endif #if defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(MAGICKCORE_HAVE_SOCKET) && defined(MAGICKCORE_THREAD_SUPPORT) "DPC " #endif #if defined(MAGICKCORE_HDRI_SUPPORT) "HDRI " #endif #if defined(MAGICKCORE_BUILD_MODULES) || defined(_DLL) "Modules " #endif #if defined(MAGICKCORE_OPENCL_SUPPORT) "OpenCL " #endif #if defined(MAGICKCORE_OPENMP_SUPPORT) "OpenMP" #if _OPENMP == 199810 "(1.0) " #elif _OPENMP == 200203 "(2.0) " #elif _OPENMP == 200505 "(2.5) " #elif _OPENMP == 200805 "(3.0) " #elif _OPENMP == 201107 "(3.1) " #elif _OPENMP == 201307 "(4.0) " #elif _OPENMP == 201511 "(4.5) " #elif _OPENMP == 201811 "(5.0) " #else " " #endif #endif #if defined(MAGICKCORE_HAVE_TCMALLOC) "TCMalloc " #endif #if defined(ZERO_CONFIGURATION_SUPPORT) "Zero-configuration " #endif #if (MAGICKCORE_QUANTUM_DEPTH == 64) "Q64 (experimental, not for production) " #endif ; } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k H o m e U R L % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickHomeURL() returns the ImageMagick home URL. % % The format of the GetMagickHomeURL method is: % % char *GetMagickHomeURL(void) % */ MagickExport char *GetMagickHomeURL(void) { char path[MagickPathExtent]; const char *element; ExceptionInfo *exception; LinkedListInfo *paths; exception=AcquireExceptionInfo(); paths=GetConfigurePaths(MagickURLFilename,exception); exception=DestroyExceptionInfo(exception); if (paths == (LinkedListInfo *) NULL) return(ConstantString(MagickHomeURL)); element=(const char *) GetNextValueInLinkedList(paths); while (element != (const char *) NULL) { (void) FormatLocaleString(path,MagickPathExtent,"%s%s%s",element, DirectorySeparator,MagickURLFilename); if (IsPathAccessible(path) != MagickFalse) { paths=DestroyLinkedList(paths,RelinquishMagickMemory); return(ConstantString(path)); } element=(const char *) GetNextValueInLinkedList(paths); } paths=DestroyLinkedList(paths,RelinquishMagickMemory); return(ConstantString(MagickHomeURL)); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k L i c e n s e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickLicense() returns the ImageMagick API license as a string. % % The format of the GetMagickLicense method is: % % const char *GetMagickLicense(void) % */ MagickExport const char *GetMagickLicense(void) { return(MagickAuthoritativeLicense); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k P a c k a g e N a m e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickPackageName() returns the ImageMagick package name. % % The format of the GetMagickName method is: % % const char *GetMagickName(void) % % No parameters are required. % */ MagickExport const char *GetMagickPackageName(void) { return(MagickPackageName); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k Q u a n t u m D e p t h % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickQuantumDepth() returns the ImageMagick quantum depth. % % The format of the GetMagickQuantumDepth method is: % % const char *GetMagickQuantumDepth(size_t *depth) % % A description of each parameter follows: % % o depth: the quantum depth is returned as a number. % */ MagickExport const char *GetMagickQuantumDepth(size_t *depth) { if (depth != (size_t *) NULL) *depth=(size_t) MAGICKCORE_QUANTUM_DEPTH; return(MagickQuantumDepth); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k Q u a n t u m R a n g e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickQuantumRange() returns the ImageMagick quantum range. % % The format of the GetMagickQuantumRange method is: % % const char *GetMagickQuantumRange(size_t *range) % % A description of each parameter follows: % % o range: the quantum range is returned as a number. % */ MagickExport const char *GetMagickQuantumRange(size_t *range) { if (range != (size_t *) NULL) *range=(size_t) QuantumRange; return(MagickQuantumRange); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k R e l e a s e D a t e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickReleaseDate() returns the ImageMagick release date. % % The format of the GetMagickReleaseDate method is: % % const char *GetMagickReleaseDate(void) % % No parameters are required. % */ MagickExport const char *GetMagickReleaseDate(void) { return(MagickReleaseDate); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k S i g n a t u r e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickSignature() returns a signature that uniquely encodes the % MagickCore libary version, quantum depth, HDRI status, OS word size, and % endianness. % % The format of the GetMagickSignature method is: % % unsigned int GetMagickSignature(const StringInfo *nonce) % % A description of each parameter follows: % % o nonce: arbitrary data. % */ static unsigned int CRC32(const unsigned char *message,const size_t length) { ssize_t i; static MagickBooleanType crc_initial = MagickFalse; static unsigned int crc_xor[256]; unsigned int crc; /* Generate a 32-bit cyclic redundancy check for the message. */ if (crc_initial == MagickFalse) { unsigned int j; unsigned int alpha; for (j=0; j < 256; j++) { ssize_t k; alpha=j; for (k=0; k < 8; k++) alpha=(alpha & 0x01) ? (0xEDB88320 ^ (alpha >> 1)) : (alpha >> 1); crc_xor[j]=alpha; } crc_initial=MagickTrue; } crc=0xFFFFFFFF; for (i=0; i < (ssize_t) length; i++) crc=crc_xor[(crc ^ message[i]) & 0xff] ^ (crc >> 8); return(crc ^ 0xFFFFFFFF); } MagickExport unsigned int GetMagickSignature(const StringInfo *nonce) { unsigned char *p; StringInfo *version; unsigned int signature; version=AcquireStringInfo(MagickPathExtent); p=GetStringInfoDatum(version); signature=MAGICKCORE_QUANTUM_DEPTH; (void) memcpy(p,&signature,sizeof(signature)); p+=sizeof(signature); signature=MAGICKCORE_HDRI_ENABLE; (void) memcpy(p,&signature,sizeof(signature)); p+=sizeof(signature); signature=MagickLibInterface; (void) memcpy(p,&signature,sizeof(signature)); p+=sizeof(signature); signature=1; /* endianness */ (void) memcpy(p,&signature,sizeof(signature)); p+=sizeof(signature); SetStringInfoLength(version,p-GetStringInfoDatum(version)); if (nonce != (const StringInfo *) NULL) ConcatenateStringInfo(version,nonce); signature=CRC32(GetStringInfoDatum(version),GetStringInfoLength(version)); version=DestroyStringInfo(version); return(signature); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % G e t M a g i c k V e r s i o n % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % GetMagickVersion() returns the ImageMagick API version as a string and % as a number. % % The format of the GetMagickVersion method is: % % const char *GetMagickVersion(size_t *version) % % A description of each parameter follows: % % o version: the ImageMagick version is returned as a number. % */ MagickExport const char *GetMagickVersion(size_t *version) { if (version != (size_t *) NULL) *version=MagickLibVersion; return(MagickVersion); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % L i s t M a g i c k V e r s i o n % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ListMagickVersion() identifies the ImageMagick version by printing its % attributes to the file. Attributes include the copyright, features, and % delegates. % % The format of the ListMagickVersion method is: % % void ListMagickVersion(FILE *file) % % A description of each parameter follows: % % o file: the file, typically stdout. % */ MagickExport void ListMagickVersion(FILE *file) { (void) FormatLocaleFile(file,"Version: %s\n", GetMagickVersion((size_t *) NULL));; (void) FormatLocaleFile(file,"Copyright: %s\n",GetMagickCopyright()); (void) FormatLocaleFile(file,"License: %s\n",GetMagickLicense()); #if defined(MAGICKCORE_WINDOWS_SUPPORT) && defined(_MSC_FULL_VER) (void) FormatLocaleFile(file,"Visual C++: %d\n",_MSC_FULL_VER); #endif (void) FormatLocaleFile(file,"Features: %s\n",GetMagickFeatures()); (void) FormatLocaleFile(file,"Delegates (built-in): %s\n", GetMagickDelegates()); if (IsEventLogging() != MagickFalse) { (void) FormatLocaleFile(file,"Wizard attributes: "); (void) FormatLocaleFile(file,"QuantumRange=%g; ",(double) QuantumRange); (void) FormatLocaleFile(file,"QuantumScale=%.*g; ",GetMagickPrecision(), (double) QuantumScale); (void) FormatLocaleFile(file,"MagickEpsilon=%.*g; ",GetMagickPrecision(), (double) MagickEpsilon); (void) FormatLocaleFile(file,"MaxMap=%g; ",(double) MaxMap); (void) FormatLocaleFile(file,"MagickPathExtent=%g; ", (double) MagickPathExtent); (void) FormatLocaleFile(file,"sizeof(Quantum)=%g; ",(double) sizeof(Quantum)); (void) FormatLocaleFile(file,"sizeof(MagickSizeType)=%g; ",(double) sizeof(MagickSizeType)); (void) FormatLocaleFile(file,"sizeof(MagickOffsetType)=%g",(double) sizeof(MagickOffsetType)); } }