| /* |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
| % % |
| % % |
| % % |
| % 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-2018 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://www.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_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_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_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 " |
| #endif |
| #if defined(ZERO_CONFIGURATION_SUPPORT) |
| "Zero-configuration " |
| #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) |
| { |
| register 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) |
| { |
| register unsigned int |
| j; |
| |
| unsigned int |
| alpha; |
| |
| for (j=0; j < 256; j++) |
| { |
| register 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) |
| { |
| register 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; /* endianess */ |
| (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)); |
| } |
| } |