You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

663 lines
23 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% 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));
}
}