Loading...
Searching...
No Matches
version.c
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% 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 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/pixel.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)
{
static const char
*delegates=""
#if defined(MAGICKCORE_AUTOTRACE_DELEGATE)
" autotrace"
#endif
#if defined(MAGICKCORE_BZLIB_DELEGATE)
" bzlib"
#endif
#if defined(MAGICKCORE_CAIRO_DELEGATE)
" cairo"
#endif
#if defined(MAGICKCORE_DMR_DELEGATE)
" dmr"
#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_UHDR_DELEGATE)
" uhdr"
#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
#if defined(MAGICKCORE_ZSTD_DELEGATE)
" zstd"
#endif
;
if (*delegates == '\0')
return(delegates);
return(delegates+1);
}
␌
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% 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_64BIT_CHANNEL_MASK_SUPPORT)
"Channel-masks(64-bit) "
#endif
#if defined(MAGICKCORE_CIPHER_SUPPORT)
"Cipher "
#endif
#if defined(MAGICKCORE_DPC_SUPPORT)
"DPC "
#endif
#if defined(MAGICKCORE_HDRI_SUPPORT)
"HDRI "
#endif
#if defined(MAGICKCORE_BUILD_MODULES)
"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 MAGICKCORE_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 library version, quantum depth, HDRI status, OS word size,
% channel type, 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+=(ptrdiff_t) sizeof(signature);
signature=MAGICKCORE_HDRI_ENABLE;
(void) memcpy(p,&signature,sizeof(signature));
p+=(ptrdiff_t) sizeof(signature);
signature=MagickLibInterface;
(void) memcpy(p,&signature,sizeof(signature));
p+=(ptrdiff_t) sizeof(signature);
signature=1; /* endianness */
(void) memcpy(p,&signature,sizeof(signature));
p+=(ptrdiff_t) sizeof(signature);
#if defined(MAGICKCORE_64BIT_CHANNEL_MASK_SUPPORT)
signature=sizeof(ChannelType);
(void) memcpy(p,&signature,sizeof(signature));
p+=(ptrdiff_t) sizeof(signature);
#endif
SetStringInfoLength(version,(size_t) (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());
(void) FormatLocaleFile(file,"Features: %s\n",GetMagickFeatures());
(void) FormatLocaleFile(file,"Delegates (built-in): %s\n",
GetMagickDelegates());
#if defined(MAGICKCORE_MSC_VER)
(void) FormatLocaleFile(file,"Compiler: Visual Studio %d (%d)\n",
MAGICKCORE_MSC_VER,_MSC_FULL_VER);
#elif defined(__clang__)
(void) FormatLocaleFile(file,"Compiler: clang (%d.%d.%d)\n",__clang_major__,
__clang_minor__,__clang_patchlevel__);
#elif defined(__GNUC__)
(void) FormatLocaleFile(file,"Compiler: gcc (%d.%d)\n",__GNUC__,
__GNUC_MINOR__);
#elif defined(__MINGW32_MAJOR_VERSION)
(void) FormatLocaleFile(file,"Compiler: MinGW (%d.%d)\n",
__MINGW32_MAJOR_VERSION,__MINGW32_MINOR_VERSION);
#elif defined(__MINGW64_VERSION_MAJOR)
(void) FormatLocaleFile(file,"Compiler: MinGW-w64 (%d.%d)\n",
__MINGW64_VERSION_MAJOR ,__MINGW64_VERSION_MINOR);
#endif
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));
}
}
_ExceptionInfo
Definition exception.h:102
_LinkedListInfo
Definition linked-list.c:61
_StringInfo
Definition string_.h:28