48#include "MagickCore/studio.h"
49#include "MagickCore/artifact.h"
50#include "MagickCore/attribute.h"
51#include "MagickCore/blob.h"
52#include "MagickCore/client.h"
53#include "MagickCore/configure.h"
54#include "MagickCore/constitute.h"
55#include "MagickCore/delegate.h"
56#include "MagickCore/delegate-private.h"
57#include "MagickCore/exception.h"
58#include "MagickCore/exception-private.h"
59#include "MagickCore/fx-private.h"
60#include "MagickCore/image-private.h"
61#include "MagickCore/linked-list.h"
62#include "MagickCore/linked-list-private.h"
63#include "MagickCore/list.h"
64#include "MagickCore/memory_.h"
65#include "MagickCore/memory-private.h"
66#include "MagickCore/nt-base-private.h"
67#include "MagickCore/option.h"
68#include "MagickCore/policy.h"
69#include "MagickCore/property.h"
70#include "MagickCore/resource_.h"
71#include "MagickCore/semaphore.h"
72#include "MagickCore/signature.h"
73#include "MagickCore/string_.h"
74#include "MagickCore/token.h"
75#include "MagickCore/token-private.h"
76#include "MagickCore/utility.h"
77#include "MagickCore/utility-private.h"
78#include "MagickCore/xml-tree.h"
79#include "MagickCore/xml-tree-private.h"
85 #include "TargetConditionals.h"
86 #if TARGET_OS_IOS || TARGET_OS_WATCH || TARGET_OS_TV
87 #define system(s) ((s)==NULL ? 0 : -1)
89#elif defined(__ANDROID__)
90 #define system(s) ((s)==NULL ? 0 : -1)
92#define DelegateFilename "delegates.xml"
98 *DelegateMap = (
const char *)
99 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
101 " <delegate decode=\"bpg\" command=\""bpgdec" -b 16 -o "%o.png" "%i"; mv "%o.png" "%o"\"/>"
102 " <delegate decode=\"png\" encode=\"bpg\" command=\""bpgenc" -b 12 -q %~ -o "%o" "%i"\"/>"
103 " <delegate decode=\"browse\" stealth=\"True\" spawn=\"True\" command=\""xdg-open" https://imagemagick.org/; rm "%i"\"/>"
104 " <delegate decode=\"cdr\" command=\""uniconvertor" "%i" "%o.svg"; mv "%o.svg" "%o"\"/>"
105 " <delegate decode=\"cgm\" command=\""uniconvertor" "%i" "%o.svg"; mv "%o.svg" "%o"\"/>"
106 " <delegate decode=\"https\" command=\""curl" -s -k -L -o "%o" "https:%M"\"/>"
107 " <delegate decode=\"doc\" command=\""soffice" --convert-to pdf -outdir `dirname "%i"` "%i" 2> "%u"; mv "%i.pdf" "%o"\"/>"
108 " <delegate decode=\"docx\" command=\""soffice" --convert-to pdf -outdir `dirname "%i"` "%i" 2> "%u"; mv "%i.pdf" "%o"\"/>"
109 " <delegate decode=\"dng:decode\" command=\""ufraw-batch" --silent --create-id=also --out-type=png --out-depth=16 "--output=%u.png" "%i"\"/>"
110 " <delegate decode=\"dot\" command=\""dot" -Tsvg "%i" -o "%o"\"/>"
111 " <delegate decode=\"dvi\" command=\""dvips" -sstdout=%%stderr -o "%o" "%i"\"/>"
112 " <delegate decode=\"dxf\" command=\""uniconvertor" "%i" "%o.svg"; mv "%o.svg" "%o"\"/>"
113 " <delegate decode=\"edit\" stealth=\"True\" command=\""xterm" -title "Edit Image Comment" -e vi "%o"\"/>"
114 " <delegate decode=\"eps\" encode=\"pdf\" mode=\"bi\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 "-sDEVICE=pdfwrite" "-sOutputFile=%o" "-f%i"\"/>"
115 " <delegate decode=\"eps\" encode=\"ps\" mode=\"bi\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=ps2write" "-sOutputFile=%o" "-f%i"\"/>"
116 " <delegate decode=\"fig\" command=\""uniconvertor" "%i" "%o.svg"; mv "%o.svg" "%o"\"/>"
117 " <delegate decode=\"hpg\" command=\""hp2xx" -sstdout=%%stderr -m eps -f `basename "%o"` "%i"; mv -f `basename "%o"` "%o"\"/>"
118 " <delegate decode=\"hpgl\" command=\""hp2xx" -sstdout=%%stderr -m eps -f `basename "%o"` "%i"; mv -f `basename "%o"` "%o"\"/>"
119 " <delegate decode=\"htm\" command=\""html2ps" -U -o "%o" "%i"\"/>"
120 " <delegate decode=\"html\" command=\""html2ps" -U -o "%o" "%i"\"/>"
121 " <delegate decode=\"ilbm\" command=\""ilbmtoppm" "%i" > "%o"\"/>"
122 " <delegate decode=\"jpg\" encode=\"lep\" mode=\"encode\" command=\""lepton" "%i" "%o"\"/>"
123 " <delegate decode=\"jxr\" command=\"mv "%i" "%i.jxr"; "JxrDecApp" -i "%i.jxr" -o "%o.tiff"; mv "%i.jxr" "%i"; mv "%o.tiff" "%o"\"/>"
124 " <delegate decode=\"lep\" mode=\"decode\" command=\""lepton" "%i" "%o"\"/>"
125 " <delegate decode=\"odt\" command=\""soffice" --convert-to pdf -outdir `dirname "%i"` "%i" 2> "%u"; mv "%i.pdf" "%o"\"/>"
126 " <delegate decode=\"pcl:cmyk\" stealth=\"True\" command=\""pcl6" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pamcmyk32" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s"\"/>"
127 " <delegate decode=\"pcl:color\" stealth=\"True\" command=\""pcl6" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=ppmraw" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s"\"/>"
128 " <delegate decode=\"pcl:mono\" stealth=\"True\" command=\""pcl6" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pbmraw" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s"\"/>"
129 " <delegate decode=\"pdf\" encode=\"eps\" mode=\"bi\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 -sPDFPassword="%a" "-sDEVICE=eps2write" "-sOutputFile=%o" "-f%i"\"/>"
130 " <delegate decode=\"pdf\" encode=\"ps\" mode=\"bi\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=ps2write" -sPDFPassword="%a" "-sOutputFile=%o" "-f%i"\"/>"
131 " <delegate decode=\"png\" encode=\"webp\" command=\""cwebp" -quiet -q %Q "%i" -o "%o"\"/>"
132 " <delegate decode=\"pnm\" encode=\"ilbm\" mode=\"encode\" command=\""ppmtoilbm" -24if "%i" > "%o"\"/>"
133 " <delegate decode=\"tiff\" encode=\"jxr\" command=\"mv "%i" "%i.tiff"; "JxrEncApp" -i "%i.tiff" -o "%o.jxr"; mv "%i.tiff" "%i"; mv "%o.jxr" "%o"\"/>"
134 " <delegate decode=\"tiff\" encode=\"wdp\" command=\"mv "%i" "%i.tiff"; "JxrEncApp" -i "%i.tiff" -o "%o.jxr"; mv "%i.tiff" "%i"; mv "%o.jxr" "%o"\"/>"
135 " <delegate decode=\"ppt\" command=\""soffice" --convert-to pdf -outdir `dirname "%i"` "%i" 2> "%u"; mv "%i.pdf" "%o"\"/>"
136 " <delegate decode=\"pptx\" command=\""soffice" --convert-to pdf -outdir `dirname "%i"` "%i" 2> "%u"; mv "%i.pdf" "%o"\"/>"
137 " <delegate decode=\"ps\" encode=\"prt\" command=\""lpr" "%i"\"/>"
138 " <delegate decode=\"ps:alpha\" stealth=\"True\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "-f%s" "-f%s"\"/>"
139 " <delegate decode=\"ps:cmyk\" stealth=\"True\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pamcmyk32" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "-f%s" "-f%s"\"/>"
140 " <delegate decode=\"ps:color\" stealth=\"True\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pnmraw" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "-f%s" "-f%s"\"/>"
141 " <delegate decode=\"ps\" encode=\"eps\" mode=\"bi\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=eps2write" "-sOutputFile=%o" "-f%i"\"/>"
142 " <delegate decode=\"ps\" encode=\"pdf\" mode=\"bi\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pdfwrite" "-sOutputFile=%o" "-f%i"\"/>"
143 " <delegate decode=\"ps\" encode=\"print\" mode=\"encode\" command=\"lpr "%i"\"/>"
144 " <delegate decode=\"ps:mono\" stealth=\"True\" command=\""gs" -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pbmraw" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "-f%s" "-f%s"\"/>"
145 " <delegate decode=\"shtml\" command=\""html2ps" -U -o "%o" "%i"\"/>"
146 " <delegate decode=\"sid\" command=\""mrsidgeodecode" -if sid -i "%i" -of tif -o "%o" > "%u"\"/>"
147 " <delegate decode=\"svg\" command=\""rsvg-convert" --dpi-x %x --dpi-y %y -o "%o" "%i"\"/>"
148#ifndef MAGICKCORE_RSVG_DELEGATE
149 " <delegate decode=\"svg:decode\" stealth=\"True\" command=\""inkscape" "%s" --export-png="%s" --export-dpi="%s" --export-background="%s" --export-background-opacity="%s"\"/>"
151 " <delegate decode=\"tiff\" encode=\"launch\" mode=\"encode\" command=\""gimp" "%i"\"/>"
152 " <delegate decode=\"wdp\" command=\"mv "%i" "%i.jxr"; "JxrDecApp" -i "%i.jxr" -o "%o.tiff"; mv "%i.jxr" "%i"; mv "%o.tiff" "%o"\"/>"
153 " <delegate decode=\"webp\" command=\""dwebp" -pam "%i" -o "%o"\"/>"
154 " <delegate decode=\"xls\" command=\""soffice" --convert-to pdf -outdir `dirname "%i"` "%i" 2> "%u"; mv "%i.pdf" "%o"\"/>"
155 " <delegate decode=\"xlsx\" command=\""soffice" --convert-to pdf -outdir `dirname "%i"` "%i" 2> "%u"; mv "%i.pdf" "%o"\"/>"
156 " <delegate decode=\"xps:cmyk\" stealth=\"True\" command=\""gxps" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=bmpsep8" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s"\"/>"
157 " <delegate decode=\"xps:color\" stealth=\"True\" command=\""gxps" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=ppmraw" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s"\"/>"
158 " <delegate decode=\"xps:mono\" stealth=\"True\" command=\""gxps" -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pbmraw" -dTextAlphaBits=%u -dGraphicsAlphaBits=%u "-r%s" %s "-sOutputFile=%s" "%s"\"/>"
159 " <delegate decode=\"video:decode\" command=\""ffmpeg" -nostdin -loglevel error -i "%s" -an -f rawvideo -y %s "%s"\"/>"
160 " <delegate encode=\"video:encode\" stealth=\"True\" command=\""ffmpeg" -nostdin -loglevel error -i "%s%%d.%s" %s "%s.%s"\"/>"
175static MagickBooleanType
177 LoadDelegateCache(
LinkedListInfo *,
const char *,
const char *,
const size_t,
212 cache=NewLinkedList(0);
213#if !MAGICKCORE_ZERO_CONFIGURATION_SUPPORT
221 options=GetConfigureOptions(filename,exception);
222 option=(
const StringInfo *) GetNextValueInLinkedList(options);
225 (void) LoadDelegateCache(cache,(
const char *)
226 GetStringInfoDatum(option),GetStringInfoPath(option),0,exception);
227 option=(
const StringInfo *) GetNextValueInLinkedList(options);
229 options=DestroyConfigureOptions(options);
232 magick_unreferenced(filename);
234 if (IsLinkedListEmpty(cache) != MagickFalse)
235 (void) LoadDelegateCache(cache,DelegateMap,
"built-in",0,exception);
257MagickPrivate MagickBooleanType DelegateComponentGenesis(
void)
260 delegate_semaphore=AcquireSemaphoreInfo();
283static void *DestroyDelegate(
void *delegate_info)
289 if (p->path != (
char *) NULL)
290 p->path=DestroyString(p->path);
291 if (p->decode != (
char *) NULL)
292 p->decode=DestroyString(p->decode);
293 if (p->encode != (
char *) NULL)
294 p->encode=DestroyString(p->encode);
295 if (p->commands != (
char *) NULL)
296 p->commands=DestroyString(p->commands);
298 RelinquishSemaphoreInfo(&p->semaphore);
300 return((
void *) NULL);
303MagickPrivate
void DelegateComponentTerminus(
void)
306 ActivateSemaphoreInfo(&delegate_semaphore);
307 LockSemaphoreInfo(delegate_semaphore);
309 delegate_cache=DestroyLinkedList(delegate_cache,DestroyDelegate);
310 UnlockSemaphoreInfo(delegate_semaphore);
311 RelinquishSemaphoreInfo(&delegate_semaphore);
350MagickExport
int ExternalDelegateCommand(
const MagickBooleanType asynchronous,
351 const MagickBooleanType verbose,
const char *command,
char *message,
372 arguments=StringToArgv(command,&number_arguments);
373 if (arguments == (
char **) NULL)
375 if (*arguments[1] ==
'\0')
377 for (i=0; i < (ssize_t) number_arguments; i++)
378 arguments[i]=DestroyString(arguments[i]);
379 arguments=(
char **) RelinquishMagickMemory(arguments);
382 rights=ExecutePolicyRights;
383 domain=DelegatePolicyDomain;
384 if (IsRightsAuthorized(domain,rights,arguments[1]) == MagickFalse)
387 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
388 "NotAuthorized",
"`%s'",arguments[1]);
389 for (i=0; i < (ssize_t) number_arguments; i++)
390 arguments[i]=DestroyString(arguments[i]);
391 arguments=(
char **) RelinquishMagickMemory(arguments);
394 if (verbose != MagickFalse)
396 (void) FormatLocaleFile(stderr,
"%s\n",command);
397 (void) fflush(stderr);
399 sanitize_command=SanitizeString(command);
400 if (asynchronous != MagickFalse)
401 (void) ConcatenateMagickString(sanitize_command,
"&",MagickPathExtent);
402 if (message != (
char *) NULL)
404#if defined(MAGICKCORE_POSIX_SUPPORT)
405#if defined(MAGICKCORE_HAVE_POPEN)
406 if ((asynchronous == MagickFalse) && (message != (
char *) NULL))
409 buffer[MagickPathExtent];
418 file=popen_utf8(sanitize_command,
"r");
419 if (file == (FILE *) NULL)
420 status=system(sanitize_command);
423 while (fgets(buffer,(
int)
sizeof(buffer),file) != NULL)
428 length=MagickMin(MagickPathExtent-offset,strlen(buffer)+1);
431 (void) CopyMagickString(message+offset,buffer,length);
441#if !defined(MAGICKCORE_HAVE_EXECVP)
442 status=system(sanitize_command);
444 if ((asynchronous != MagickFalse) ||
445 (strpbrk(sanitize_command,
"&;<>|") != (
char *) NULL))
446 status=system(sanitize_command);
455 child_pid=(pid_t) fork();
456 if (child_pid == (pid_t) -1)
457 status=system(sanitize_command);
461 status=execvp(arguments[1],arguments+1);
473 pid=(pid_t) waitpid(child_pid,&child_status,0);
478 if (WIFEXITED(child_status) != 0)
479 status=WEXITSTATUS(child_status);
481 if (WIFSIGNALED(child_status))
488#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
501 p=strstr(sanitize_command,
"cmd.exe /c");
502 if (p != (
char*) NULL)
505 for ( ; *p !=
'\0'; p++)
507 *p=(*DirectorySeparator);
510 status=NTSystemCommand(sanitize_command,message);
512 status=system(sanitize_command);
514# error No suitable system() method.
518 if ((message != (
char *) NULL) && (*message !=
'\0'))
519 (void) ThrowMagickException(exception,GetMagickModule(),DelegateError,
520 "FailedToExecuteCommand",
"`%s' (%s)",sanitize_command,message);
522 (
void) ThrowMagickException(exception,GetMagickModule(),DelegateError,
523 "FailedToExecuteCommand",
"`%s' (%d)",sanitize_command,status);
525 sanitize_command=DestroyString(sanitize_command);
526 for (i=0; i < (ssize_t) number_arguments; i++)
527 arguments[i]=DestroyString(arguments[i]);
528 arguments=(
char **) RelinquishMagickMemory(arguments);
570static char *GetMagickPropertyLetter(
ImageInfo *image_info,
Image *image,
573#define WarnNoImageReturn(format,letter) \
574 if (image == (Image *) NULL) \
576 (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning, \
577 "NoImageForProperty",format,letter); \
580#define WarnNoImageInfoReturn(format,letter) \
581 if (image_info == (ImageInfo *) NULL) \
583 (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning, \
584 "NoImageInfoForProperty",format,letter); \
589 value[MagickPathExtent];
594 if ((image != (
Image *) NULL) && (IsEventLogging() != MagickFalse))
595 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
597 if ((image_info != (
ImageInfo *) NULL) && (IsEventLogging() != MagickFalse))
598 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
"no-images");
603 string=(
const char *) value;
608 WarnNoImageInfoReturn(
"\"%%%c\"",letter);
609 string=GetImageOption(image_info,
"authenticate");
614 WarnNoImageReturn(
"\"%%%c\"",letter);
615 (void) FormatMagickSize(image->extent,MagickFalse,
"B",MagickPathExtent,
617 if (image->extent == 0)
618 (void) FormatMagickSize(GetBlobSize(image),MagickFalse,
"B",
619 MagickPathExtent,value);
624 WarnNoImageReturn(
"\"%%%c\"",letter);
625 GetPathComponent(image->magick_filename,HeadPath,value);
630 WarnNoImageReturn(
"\"%%%c\"",letter);
631 GetPathComponent(image->magick_filename,ExtensionPath,value);
636 WarnNoImageReturn(
"\"%%%c\"",letter);
637 GetPathComponent(image->magick_filename,TailPath,value);
642 WarnNoImageReturn(
"\"%%%c\"",letter);
643 (void) FormatLocaleString(value,MagickPathExtent,
644 "%.20gx%.20g%+.20g%+.20g",(
double) image->page.width,(double)
645 image->page.height,(
double) image->page.x,(double) image->page.y);
650 WarnNoImageReturn(
"\"%%%c\"",letter);
651 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
652 (image->rows != 0 ? image->rows : image->magick_rows));
657 WarnNoImageReturn(
"\"%%%c\"",letter);
658 string=image->filename;
663 WarnNoImageReturn(
"\"%%%c\"",letter);
664 string=image->magick;
669 if (image != (
Image *) NULL)
670 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
671 GetImageListLength(image));
676 WarnNoImageInfoReturn(
"\"%%%c\"",letter);
677 string=image_info->filename;
682 WarnNoImageReturn(
"\"%%%c\"",letter);
683 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
684 GetImageIndexInList(image));
689 WarnNoImageReturn(
"\"%%%c\"",letter);
690 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
691 MAGICKCORE_QUANTUM_DEPTH);
699 WarnNoImageReturn(
"\"%%%c\"",letter);
700 colorspace=image->colorspace;
701 (void) FormatLocaleString(value,MagickPathExtent,
"%s %s %s",
702 CommandOptionToMnemonic(MagickClassOptions,(ssize_t)
703 image->storage_class),CommandOptionToMnemonic(MagickColorspaceOptions,
704 (ssize_t) colorspace),image->alpha_trait != UndefinedPixelTrait ?
710 WarnNoImageReturn(
"\"%%%c\"",letter);
711 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
717 WarnNoImageReturn(
"\"%%%c\"",letter);
718 GetPathComponent(image->magick_filename,BasePath,value);
723 WarnNoImageInfoReturn(
"\"%%%c\"",letter);
724 string=image_info->unique;
729 WarnNoImageReturn(
"\"%%%c\"",letter);
730 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
731 (image->columns != 0 ? image->columns : image->magick_columns));
736 WarnNoImageReturn(
"\"%%%c\"",letter);
737 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",
738 fabs(image->resolution.x) > MagickEpsilon ? image->resolution.x :
739 image->units == PixelsPerCentimeterResolution ? DefaultResolution/2.54 :
745 WarnNoImageReturn(
"\"%%%c\"",letter);
746 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",
747 fabs(image->resolution.y) > MagickEpsilon ? image->resolution.y :
748 image->units == PixelsPerCentimeterResolution ? DefaultResolution/2.54 :
754 WarnNoImageReturn(
"\"%%%c\"",letter);
755 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",
756 (
double) image->depth);
761 WarnNoImageReturn(
"\"%%%c\"",letter);
762 string=CommandOptionToMnemonic(MagickPixelTraitOptions,(ssize_t)
768 WarnNoImageReturn(
"\"%%%c\"",letter);
769 string=CommandOptionToMnemonic(MagickCompressOptions,
770 (ssize_t) image->compression);
775 WarnNoImageReturn(
"\"%%%c\"",letter);
776 string=CommandOptionToMnemonic(MagickDisposeOptions,
777 (ssize_t) image->dispose);
785 WarnNoImageReturn(
"\"%%%c\"",letter);
786 (void) CopyMagickString(value,image->magick_filename,MagickPathExtent);
791 WarnNoImageReturn(
"\"%%%c\"",letter);
792 (void) FormatLocaleString(value,MagickPathExtent,
"%.20gx%.20g",
793 (
double) image->magick_columns,(double) image->magick_rows);
798 WarnNoImageReturn(
"\"%%%c\"",letter);
799 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",
800 (
double) image->page.height);
805 WarnNoImageReturn(
"\"%%%c\"",letter);
806 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
812 WarnNoImageReturn(
"\"%%%c\"",letter);
813 string=image->magick_filename;
818 WarnNoImageReturn(
"\"%%%c\"",letter);
819 (void) FormatLocaleString(value,MagickPathExtent,
"%+ld%+ld",(
long)
820 image->page.x,(long) image->page.y);
825 WarnNoImageReturn(
"\"%%%c\"",letter);
826 (void) FormatLocaleString(value,MagickPathExtent,
"%.20gx%.20g",
827 (
double) image->page.width,(double) image->page.height);
832 WarnNoImageReturn(
"\"%%%c\"",letter);
833 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
834 (100-(image->quality == 0 ? 42 : image->quality))/2);
839 WarnNoImageReturn(
"\"%%%c\"",letter);
840 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
841 (image->quality == 0 ? 92 : image->quality));
846 WarnNoImageInfoReturn(
"\"%%%c\"",letter);
847 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
848 (image_info->number_scenes == 0 ? 2147483647 :
849 image_info->number_scenes));
854 WarnNoImageReturn(
"\"%%%c\"",letter);
855 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
861 WarnNoImageReturn(
"\"%%%c\"",letter);
862 string=CommandOptionToMnemonic(MagickResolutionOptions,
863 (ssize_t) image->units);
868 WarnNoImageReturn(
"\"%%%c\"",letter);
869 (void) FormatLocaleString(value,MagickPathExtent,
"%.20g",(
double)
875 WarnNoImageReturn(
"\"%%%c\"",letter);
876 (void) FormatLocaleString(value,MagickPathExtent,
"%+.20g",(
double)
882 WarnNoImageReturn(
"\"%%%c\"",letter);
883 (void) FormatLocaleString(value,MagickPathExtent,
"%+.20g",(
double)
897 WarnNoImageReturn(
"\"%%%c\"",letter);
898 page=GetImageBoundingBox(image,exception);
899 (void) FormatLocaleString(value,MagickPathExtent,
900 "%.20gx%.20g%+.20g%+.20g",(
double) page.width,(double) page.height,
901 (
double) page.x,(double) page.y);
909 WarnNoImageReturn(
"\"%%%c\"",letter);
910 (void) SignatureImage(image,exception);
911 string=GetImageProperty(image,
"signature",exception);
915 return(SanitizeDelegateString(
string));
918static char *InterpretDelegateProperties(
ImageInfo *image_info,
921#define ExtendInterpretText(string_length) \
923 size_t length=(string_length); \
924 if ((size_t) (q-interpret_text+(ssize_t) length+1) >= extent) \
927 interpret_text=(char *) ResizeQuantumMemory(interpret_text,extent+ \
928 MagickPathExtent,sizeof(*interpret_text)); \
929 if (interpret_text == (char *) NULL) \
930 return((char *) NULL); \
931 q=interpret_text+strlen(interpret_text); \
935#define AppendKeyValue2Text(key,value)\
937 size_t length=strlen(key)+strlen(value)+2; \
938 if ((size_t) (q-interpret_text+length+1) >= extent) \
941 interpret_text=(char *) ResizeQuantumMemory(interpret_text,extent+ \
942 MagickPathExtent,sizeof(*interpret_text)); \
943 if (interpret_text == (char *) NULL) \
944 return((char *) NULL); \
945 q=interpret_text+strlen(interpret_text); \
947 q+=FormatLocaleString(q,extent,"%s=%s\n",(key),(value)); \
950#define AppendString2Text(string) \
952 size_t length=strlen((string)); \
953 if ((size_t) (q-interpret_text+(ssize_t) length+1) >= extent) \
956 interpret_text=(char *) ResizeQuantumMemory(interpret_text,extent+ \
957 MagickPathExtent,sizeof(*interpret_text)); \
958 if (interpret_text == (char *) NULL) \
959 return((char *) NULL); \
960 q=interpret_text+strlen(interpret_text); \
962 (void) CopyMagickString(q,(string),extent); \
982 assert(image == NULL || image->signature == MagickCoreSignature);
983 assert(image_info == NULL || image_info->signature == MagickCoreSignature);
984 if ((image != (
Image *) NULL) && (IsEventLogging() != MagickFalse))
985 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
987 if ((image_info != (
ImageInfo *) NULL) && (IsEventLogging() != MagickFalse))
988 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
"no-image");
989 if (embed_text == (
const char *) NULL)
990 return(ConstantString(
""));
992 while ((isspace((
int) ((
unsigned char) *p)) != 0) && (*p !=
'\0'))
995 return(ConstantString(
""));
999 interpret_text=AcquireString(embed_text);
1000 extent=MagickPathExtent;
1002 for (q=interpret_text; *p!=
'\0';
1003 number=isdigit((
int) ((
unsigned char) *p)) ? MagickTrue : MagickFalse,p++)
1009 ExtendInterpretText(MagickPathExtent);
1052 if (LocaleNCompare(
"<",p,4) == 0)
1058 if (LocaleNCompare(
">",p,4) == 0)
1064 if (LocaleNCompare(
"&",p,5) == 0)
1085 if ((*p ==
'\0') || (*p ==
'\'') || (*p ==
'"'))
1095 if (number != MagickFalse)
1104 string=GetMagickPropertyLetter(image_info,image,*p,exception);
1105 if (
string != (
char *) NULL)
1107 AppendString2Text(
string);
1108 string=DestroyString(
string);
1111 (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning,
1112 "UnknownImageProperty",
"\"%%%c\"",*p);
1115 return(interpret_text);
1118MagickExport
char *GetDelegateCommand(
const ImageInfo *image_info,
Image *image,
1119 const char *decode,
const char *encode,
ExceptionInfo *exception)
1131 assert(image_info != (
ImageInfo *) NULL);
1132 assert(image_info->signature == MagickCoreSignature);
1133 assert(image != (
Image *) NULL);
1134 assert(image->signature == MagickCoreSignature);
1135 if (IsEventLogging() != MagickFalse)
1136 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1137 delegate_info=GetDelegateInfo(decode,encode,exception);
1140 (void) ThrowMagickException(exception,GetMagickModule(),DelegateError,
1141 "NoTagFound",
"`%s'",decode ? decode : encode);
1142 return((
char *) NULL);
1144 commands=StringToList(delegate_info->commands);
1145 if (commands == (
char **) NULL)
1147 (void) ThrowMagickException(exception,GetMagickModule(),
1148 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",decode ? decode :
1150 return((
char *) NULL);
1152 command=InterpretDelegateProperties((
ImageInfo *) image_info,image,
1153 commands[0],exception);
1154 if (command == (
char *) NULL)
1155 (void) ThrowMagickException(exception,GetMagickModule(),ResourceLimitError,
1156 "MemoryAllocationFailed",
"`%s'",commands[0]);
1160 for (i=0; commands[i] != (
char *) NULL; i++)
1161 commands[i]=DestroyString(commands[i]);
1162 commands=(
char **) RelinquishMagickMemory(commands);
1188MagickExport
const char *GetDelegateCommands(
const DelegateInfo *delegate_info)
1190 if (IsEventLogging() != MagickFalse)
1191 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1193 assert(delegate_info->signature == MagickCoreSignature);
1194 return(delegate_info->commands);
1226MagickExport
const DelegateInfo *GetDelegateInfo(
const char *decode,
1236 if (IsDelegateCacheInstantiated(exception) == MagickFalse)
1242 LockSemaphoreInfo(delegate_semaphore);
1243 p=GetHeadElementInLinkedList(delegate_cache);
1244 if ((LocaleCompare(decode,
"*") == 0) && (LocaleCompare(encode,
"*") == 0))
1246 UnlockSemaphoreInfo(delegate_semaphore);
1249 return(delegate_info);
1254 if (delegate_info->mode > 0)
1256 if (LocaleCompare(delegate_info->decode,decode) == 0)
1261 if (delegate_info->mode < 0)
1263 if (LocaleCompare(delegate_info->encode,encode) == 0)
1268 if (LocaleCompare(decode,delegate_info->decode) == 0)
1269 if (LocaleCompare(encode,delegate_info->encode) == 0)
1271 if (LocaleCompare(decode,
"*") == 0)
1272 if (LocaleCompare(encode,delegate_info->encode) == 0)
1274 if (LocaleCompare(decode,delegate_info->decode) == 0)
1275 if (LocaleCompare(encode,
"*") == 0)
1282 SetHeadElementInLinkedList(delegate_cache,p);
1283 UnlockSemaphoreInfo(delegate_semaphore);
1284 return(delegate_info);
1316#if defined(__cplusplus) || defined(c_plusplus)
1320static int DelegateInfoCompare(
const void *x,
const void *y)
1331 cmp=LocaleCompare((*p)->path,(*q)->path);
1334 if ((*p)->decode == (
char *) NULL)
1335 if (((*p)->encode != (
char *) NULL) &&
1336 ((*q)->encode != (
char *) NULL))
1337 return(strcmp((*p)->encode,(*q)->encode));
1338 if (((*p)->decode != (
char *) NULL) &&
1339 ((*q)->decode != (
char *) NULL))
1340 return(strcmp((*p)->decode,(*q)->decode));
1345#if defined(__cplusplus) || defined(c_plusplus)
1349MagickExport
const DelegateInfo **GetDelegateInfoList(
const char *pattern,
1361 assert(number_delegates != (
size_t *) NULL);
1362 assert(pattern != (
char *) NULL);
1363 if (IsEventLogging() != MagickFalse)
1364 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
1365 *number_delegates=0;
1366 if (IsDelegateCacheInstantiated(exception) == MagickFalse)
1368 delegates=(
const DelegateInfo **) AcquireQuantumMemory((
size_t)
1369 GetNumberOfElementsInLinkedList(delegate_cache)+1UL,
sizeof(*delegates));
1372 LockSemaphoreInfo(delegate_semaphore);
1373 p=GetHeadElementInLinkedList(delegate_cache);
1380 if( (delegate_info->stealth == MagickFalse) &&
1381 (GlobExpression(delegate_info->decode,pattern,MagickFalse) != MagickFalse ||
1382 GlobExpression(delegate_info->encode,pattern,MagickFalse) != MagickFalse))
1383 delegates[i++]=delegate_info;
1386 UnlockSemaphoreInfo(delegate_semaphore);
1388 delegates=(
const DelegateInfo **) RelinquishMagickMemory((
void*) delegates);
1391 qsort((
void *) delegates,(
size_t) i,
sizeof(*delegates),DelegateInfoCompare);
1394 *number_delegates=(size_t) i;
1428#if defined(__cplusplus) || defined(c_plusplus)
1432static int DelegateCompare(
const void *x,
const void *y)
1438 p=(
const char **) x;
1439 q=(
const char **) y;
1440 return(LocaleCompare(*p,*q));
1443#if defined(__cplusplus) || defined(c_plusplus)
1447MagickExport
char **GetDelegateList(
const char *pattern,
1459 assert(pattern != (
char *) NULL);
1460 if (IsEventLogging() != MagickFalse)
1461 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",pattern);
1462 assert(number_delegates != (
size_t *) NULL);
1463 *number_delegates=0;
1464 if (IsDelegateCacheInstantiated(exception) == MagickFalse)
1465 return((
char **) NULL);
1466 delegates=(
char **) AcquireQuantumMemory((
size_t)
1467 GetNumberOfElementsInLinkedList(delegate_cache)+1UL,
sizeof(*delegates));
1468 if (delegates == (
char **) NULL)
1469 return((
char **) NULL);
1470 LockSemaphoreInfo(delegate_semaphore);
1471 p=GetHeadElementInLinkedList(delegate_cache);
1478 if ((delegate_info->stealth == MagickFalse) &&
1479 (GlobExpression(delegate_info->decode,pattern,MagickFalse) != MagickFalse))
1480 delegates[i++]=ConstantString(delegate_info->decode);
1481 if ((delegate_info->stealth == MagickFalse) &&
1482 (GlobExpression(delegate_info->encode,pattern,MagickFalse) != MagickFalse))
1483 delegates[i++]=ConstantString(delegate_info->encode);
1486 UnlockSemaphoreInfo(delegate_semaphore);
1488 delegates=(
char **) RelinquishMagickMemory(delegates);
1491 qsort((
void *) delegates,(
size_t) i,
sizeof(*delegates),DelegateCompare);
1492 delegates[i]=(
char *) NULL;
1494 *number_delegates=(size_t) i;
1520MagickExport ssize_t GetDelegateMode(
const DelegateInfo *delegate_info)
1522 if (IsEventLogging() != MagickFalse)
1523 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1525 assert(delegate_info->signature == MagickCoreSignature);
1526 return(delegate_info->mode);
1553MagickExport MagickBooleanType GetDelegateThreadSupport(
1557 assert(delegate_info->signature == MagickCoreSignature);
1558 if (IsEventLogging() != MagickFalse)
1559 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"...");
1560 return(delegate_info->thread_support);
1586static MagickBooleanType IsDelegateCacheInstantiated(
ExceptionInfo *exception)
1591 ActivateSemaphoreInfo(&delegate_semaphore);
1592 LockSemaphoreInfo(delegate_semaphore);
1594 delegate_cache=AcquireDelegateCache(DelegateFilename,exception);
1595 UnlockSemaphoreInfo(delegate_semaphore);
1597 return(delegate_cache != (
LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
1630static MagickBooleanType CopyDelegateFile(
const char *source,
1631 const char *destination,
const MagickBooleanType overwrite)
1657 assert(source != (
const char *) NULL);
1658 assert(destination != (
char *) NULL);
1659 if (overwrite == MagickFalse)
1661 status=GetPathAttributes(destination,&attributes);
1662 if (status != MagickFalse)
1665 destination_file=open_utf8(destination,O_WRONLY | O_BINARY | O_CREAT,S_MODE);
1666 if (destination_file == -1)
1667 return(MagickFalse);
1668 source_file=open_utf8(source,O_RDONLY | O_BINARY,0);
1669 if (source_file == -1)
1671 (void) close(destination_file);
1672 return(MagickFalse);
1674 quantum=(size_t) MagickMaxBufferExtent;
1675 if ((fstat(source_file,&attributes) == 0) && (attributes.st_size > 0))
1676 quantum=MagickMin((
size_t) attributes.st_size,MagickMaxBufferExtent);
1677 buffer=(
unsigned char *) AcquireQuantumMemory(quantum,
sizeof(*buffer));
1678 if (buffer == (
unsigned char *) NULL)
1680 (void) close(source_file);
1681 (void) close(destination_file);
1682 return(MagickFalse);
1685 for (i=0; ; i+=(ssize_t) count)
1687 count=(ssize_t) read(source_file,buffer,quantum);
1690 length=(size_t) count;
1691 count=(ssize_t) write(destination_file,buffer,length);
1692 if ((
size_t) count != length)
1695 (void) close(destination_file);
1696 (void) close(source_file);
1697 buffer=(
unsigned char *) RelinquishMagickMemory(buffer);
1698 return(i != 0 ? MagickTrue : MagickFalse);
1701MagickExport MagickBooleanType InvokeDelegate(
ImageInfo *image_info,
1707 input_filename[MagickPathExtent],
1708 output_filename[MagickPathExtent];
1726 assert(image_info != (
ImageInfo *) NULL);
1727 assert(image_info->signature == MagickCoreSignature);
1728 assert(image != (
Image *) NULL);
1729 assert(image->signature == MagickCoreSignature);
1730 if (IsEventLogging() != MagickFalse)
1731 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1732 rights=ExecutePolicyRights;
1733 if ((decode != (
const char *) NULL) &&
1734 (IsRightsAuthorized(DelegatePolicyDomain,rights,decode) == MagickFalse))
1737 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
1738 "NotAuthorized",
"`%s'",decode);
1739 return(MagickFalse);
1741 if ((encode != (
const char *) NULL) &&
1742 (IsRightsAuthorized(DelegatePolicyDomain,rights,encode) == MagickFalse))
1745 (void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
1746 "NotAuthorized",
"`%s'",encode);
1747 return(MagickFalse);
1749 temporary=*image->filename ==
'\0' ? MagickTrue : MagickFalse;
1750 if ((temporary != MagickFalse) && (AcquireUniqueFilename(image->filename) ==
1753 ThrowFileException(exception,FileOpenError,
"UnableToCreateTemporaryFile",
1755 return(MagickFalse);
1757 delegate_info=GetDelegateInfo(decode,encode,exception);
1760 if (temporary != MagickFalse)
1761 (void) RelinquishUniqueFileResource(image->filename);
1762 (void) ThrowMagickException(exception,GetMagickModule(),DelegateError,
1763 "NoTagFound",
"`%s'",decode ? decode : encode);
1764 return(MagickFalse);
1766 if (*image_info->filename ==
'\0')
1768 if (AcquireUniqueFilename(image_info->filename) == MagickFalse)
1770 if (temporary != MagickFalse)
1771 (void) RelinquishUniqueFileResource(image->filename);
1772 ThrowFileException(exception,FileOpenError,
1773 "UnableToCreateTemporaryFile",image_info->filename);
1774 return(MagickFalse);
1776 image_info->temporary=MagickTrue;
1778 if ((delegate_info->mode != 0) && (((decode != (
const char *) NULL) &&
1779 (delegate_info->encode != (
char *) NULL)) ||
1780 ((encode != (
const char *) NULL) &&
1781 (delegate_info->decode != (
char *) NULL))))
1795 if (AcquireUniqueFilename(image_info->unique) == MagickFalse)
1797 ThrowFileException(exception,FileOpenError,
1798 "UnableToCreateTemporaryFile",image_info->unique);
1799 return(MagickFalse);
1801 magick=InterpretImageProperties(image_info,image,decode != (
char *) NULL ?
1802 delegate_info->encode : delegate_info->decode,exception);
1803 if (magick == (
char *) NULL)
1805 (void) RelinquishUniqueFileResource(image_info->unique);
1806 if (temporary != MagickFalse)
1807 (void) RelinquishUniqueFileResource(image->filename);
1808 (void) ThrowMagickException(exception,GetMagickModule(),
1809 DelegateError,
"DelegateFailed",
"`%s'",decode ? decode : encode);
1810 return(MagickFalse);
1812 LocaleUpper(magick);
1813 clone_info=CloneImageInfo(image_info);
1814 (void) CopyMagickString((
char *) clone_info->magick,magick,
1816 if (LocaleCompare(magick,
"NULL") != 0)
1817 (
void) CopyMagickString(image->magick,magick,MagickPathExtent);
1818 magick=DestroyString(magick);
1819 (void) FormatLocaleString(clone_info->filename,MagickPathExtent,
"%s:",
1820 delegate_info->decode);
1821 (void) SetImageInfo(clone_info,(
unsigned int) GetImageListLength(image),
1823 (void) CopyMagickString(clone_info->filename,image_info->filename,
1825 (void) CopyMagickString(image_info->filename,image->filename,
1827 for (p=image; p != (
Image *) NULL; p=GetNextImageInList(p))
1829 (void) FormatLocaleString(p->filename,MagickPathExtent,
"%s:%s",
1830 delegate_info->decode,clone_info->filename);
1831 status=WriteImage(clone_info,p,exception);
1832 if (status == MagickFalse)
1834 (void) RelinquishUniqueFileResource(image_info->unique);
1835 if (temporary != MagickFalse)
1836 (void) RelinquishUniqueFileResource(image->filename);
1837 clone_info=DestroyImageInfo(clone_info);
1838 (void) ThrowMagickException(exception,GetMagickModule(),
1839 DelegateError,
"DelegateFailed",
"`%s'",decode ? decode : encode);
1840 return(MagickFalse);
1842 if (clone_info->adjoin != MagickFalse)
1845 (void) RelinquishUniqueFileResource(image_info->unique);
1846 clone_info=DestroyImageInfo(clone_info);
1851 commands=StringToList(delegate_info->commands);
1852 if (commands == (
char **) NULL)
1854 if (temporary != MagickFalse)
1855 (void) RelinquishUniqueFileResource(image->filename);
1856 (void) ThrowMagickException(exception,GetMagickModule(),
1857 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
1858 decode ? decode : encode);
1859 return(MagickFalse);
1861 command=(
char *) NULL;
1863 (void) CopyMagickString(output_filename,image_info->filename,
1865 (void) CopyMagickString(input_filename,image->filename,MagickPathExtent);
1866 for (i=0; commands[i] != (
char *) NULL; i++)
1868 (void) AcquireUniqueSymbolicLink(output_filename,image_info->filename);
1869 if (AcquireUniqueFilename(image_info->unique) == MagickFalse)
1871 ThrowFileException(exception,FileOpenError,
1872 "UnableToCreateTemporaryFile",image_info->unique);
1875 if (LocaleCompare(decode,
"SCAN") != 0)
1877 status=AcquireUniqueSymbolicLink(input_filename,image->filename);
1878 if (status == MagickFalse)
1880 ThrowFileException(exception,FileOpenError,
1881 "UnableToCreateTemporaryFile",input_filename);
1886 command=InterpretDelegateProperties(image_info,image,commands[i],exception);
1887 if (command != (
char *) NULL)
1892 if (ExternalDelegateCommand(delegate_info->spawn,image_info->verbose,
1893 command,(
char *) NULL,exception) != 0)
1895 if (delegate_info->spawn != MagickFalse)
1904 while ((count-- > 0) && (access_utf8(image->filename,F_OK) == 0))
1905 (void) MagickDelay(100);
1907 command=DestroyString(command);
1909 if (LocaleCompare(decode,
"SCAN") != 0)
1911 if (CopyDelegateFile(image->filename,input_filename,MagickFalse) == MagickFalse)
1912 (void) RelinquishUniqueFileResource(input_filename);
1914 if ((strcmp(input_filename,output_filename) != 0) &&
1915 (CopyDelegateFile(image_info->filename,output_filename,MagickTrue) == MagickFalse))
1916 (void) RelinquishUniqueFileResource(output_filename);
1917 if (image_info->temporary != MagickFalse)
1918 (void) RelinquishUniqueFileResource(image_info->filename);
1919 (void) RelinquishUniqueFileResource(image_info->unique);
1920 (void) RelinquishUniqueFileResource(image_info->filename);
1921 (void) RelinquishUniqueFileResource(image->filename);
1922 if (status == MagickFalse)
1924 (void) ThrowMagickException(exception,GetMagickModule(),DelegateError,
1925 "DelegateFailed",
"`%s'",commands[i]);
1928 commands[i]=DestroyString(commands[i]);
1930 (void) CopyMagickString(image_info->filename,output_filename,
1932 (void) CopyMagickString(image->filename,input_filename,MagickPathExtent);
1936 for ( ; commands[i] != (
char *) NULL; i++)
1937 commands[i]=DestroyString(commands[i]);
1938 commands=(
char **) RelinquishMagickMemory(commands);
1939 if (temporary != MagickFalse)
1940 (void) RelinquishUniqueFileResource(image->filename);
1968MagickExport MagickBooleanType ListDelegateInfo(FILE *file,
1976 delegate[MagickPathExtent];
1990 if (file == (
const FILE *) NULL)
1992 delegate_info=GetDelegateInfoList(
"*",&number_delegates,exception);
1994 return(MagickFalse);
1995 path=(
const char *) NULL;
1996 for (i=0; i < (ssize_t) number_delegates; i++)
1998 if (delegate_info[i]->stealth != MagickFalse)
2000 if ((path == (
const char *) NULL) ||
2001 (LocaleCompare(path,delegate_info[i]->path) != 0))
2003 if (delegate_info[i]->path != (
char *) NULL)
2004 (
void) FormatLocaleFile(file,
"\nPath: %s\n\n",delegate_info[i]->path);
2005 (void) FormatLocaleFile(file,
"Delegate Command\n");
2006 (void) FormatLocaleFile(file,
2007 "-------------------------------------------------"
2008 "------------------------------\n");
2010 path=delegate_info[i]->path;
2012 if (delegate_info[i]->encode != (
char *) NULL)
2013 (
void) CopyMagickString(delegate,delegate_info[i]->encode,
2015 (void) ConcatenateMagickString(delegate,
" ",MagickPathExtent);
2017 commands=StringToList(delegate_info[i]->commands);
2018 if (commands == (
char **) NULL)
2020 (void) FormatLocaleFile(file,
"%11s%c=%c%s ",delegate_info[i]->decode ?
2021 delegate_info[i]->decode :
"",delegate_info[i]->mode <= 0 ?
'<' :
' ',
2022 delegate_info[i]->mode >= 0 ?
'>' :
' ',delegate);
2023 (void) StripMagickString(commands[0]);
2024 (void) FormatLocaleFile(file,
"\"%s\"\n",commands[0]);
2025 for (j=1; commands[j] != (
char *) NULL; j++)
2027 (void) StripMagickString(commands[j]);
2028 (void) FormatLocaleFile(file,
" \"%s\"\n",commands[j]);
2030 for (j=0; commands[j] != (
char *) NULL; j++)
2031 commands[j]=DestroyString(commands[j]);
2032 commands=(
char **) RelinquishMagickMemory(commands);
2034 (void) fflush(file);
2036 RelinquishMagickMemory((
void *) delegate_info);
2072 const char *xml,
const char *filename,
const size_t depth,
2076 keyword[MagickPathExtent],
2094 (void) LogMagickEvent(ConfigureEvent,GetMagickModule(),
2095 "Loading delegate configuration file \"%s\" ...",filename);
2096 if (xml == (
const char *) NULL)
2097 return(MagickFalse);
2100 token=AcquireString(xml);
2101 extent=strlen(token)+MagickPathExtent;
2102 for (q=(
const char *) xml; *q !=
'\0'; )
2107 (void) GetNextToken(q,&q,extent,token);
2110 (void) CopyMagickString(keyword,token,MagickPathExtent);
2111 if (LocaleNCompare(keyword,
"<!DOCTYPE",9) == 0)
2116 while ((LocaleNCompare(q,
"]>",2) != 0) && (*q !=
'\0'))
2117 (
void) GetNextToken(q,&q,extent,token);
2120 if (LocaleNCompare(keyword,
"<!--",4) == 0)
2125 while ((LocaleNCompare(q,
"->",2) != 0) && (*q !=
'\0'))
2126 (void) GetNextToken(q,&q,extent,token);
2129 if (LocaleCompare(keyword,
"<include") == 0)
2134 while (((*token !=
'/') && (*(token+1) !=
'>')) && (*q !=
'\0'))
2136 (void) CopyMagickString(keyword,token,MagickPathExtent);
2137 (void) GetNextToken(q,&q,extent,token);
2140 (void) GetNextToken(q,&q,extent,token);
2141 if (LocaleCompare(keyword,
"file") == 0)
2143 if (depth > MagickMaxRecursionDepth)
2144 (void) ThrowMagickException(exception,GetMagickModule(),
2145 ConfigureError,
"IncludeElementNestedTooDeeply",
"`%s'",token);
2149 path[MagickPathExtent],
2152 GetPathComponent(filename,HeadPath,path);
2154 (void) ConcatenateMagickString(path,DirectorySeparator,
2156 if (*token == *DirectorySeparator)
2157 (void) CopyMagickString(path,token,MagickPathExtent);
2159 (
void) ConcatenateMagickString(path,token,MagickPathExtent);
2160 file_xml=FileToXML(path,~0UL);
2161 if (file_xml != (
char *) NULL)
2163 status&=(MagickStatusType) LoadDelegateCache(cache,
2164 file_xml,path,depth+1,exception);
2165 file_xml=DestroyString(file_xml);
2172 if (LocaleCompare(keyword,
"<delegate") == 0)
2178 sizeof(*delegate_info));
2179 (void) memset(delegate_info,0,
sizeof(*delegate_info));
2180 delegate_info->path=ConstantString(filename);
2181 delegate_info->thread_support=MagickTrue;
2182 delegate_info->signature=MagickCoreSignature;
2187 if ((LocaleCompare(keyword,
"/>") == 0) ||
2188 (LocaleCompare(keyword,
"</policy>") == 0))
2190 status=AppendValueToLinkedList(cache,delegate_info);
2191 if (status == MagickFalse)
2192 (void) ThrowMagickException(exception,GetMagickModule(),
2193 ResourceLimitError,
"MemoryAllocationFailed",
"`%s'",
2194 delegate_info->commands);
2198 (void) GetNextToken(q,(
const char **) NULL,extent,token);
2201 (void) GetNextToken(q,&q,extent,token);
2202 (void) GetNextToken(q,&q,extent,token);
2208 if (LocaleCompare((
char *) keyword,
"command") == 0)
2213 commands=AcquireString(token);
2214#if defined(MAGICKCORE_WINDOWS_SUPPORT)
2215 if (strchr(commands,
'@') != (
char *) NULL)
2218 path[MagickPathExtent];
2220 NTGhostscriptEXE(path,MagickPathExtent);
2221 (void) SubstituteString((
char **) &commands,
"@PSDelegate@",
2223 (void) SubstituteString((
char **) &commands,
"\\",
"/");
2225 (void) SubstituteString((
char **) &commands,
""",
"\"");
2227 (void) SubstituteString((
char **) &commands,
""",
"'");
2229 (void) SubstituteString((
char **) &commands,
"&",
"&");
2230 (void) SubstituteString((
char **) &commands,
">",
">");
2231 (void) SubstituteString((
char **) &commands,
"<",
"<");
2232 if (delegate_info->commands != (
char *) NULL)
2233 delegate_info->commands=DestroyString(delegate_info->commands);
2234 delegate_info->commands=commands;
2242 if (LocaleCompare((
char *) keyword,
"decode") == 0)
2244 delegate_info->decode=ConstantString(token);
2245 delegate_info->mode=1;
2253 if (LocaleCompare((
char *) keyword,
"encode") == 0)
2255 delegate_info->encode=ConstantString(token);
2256 delegate_info->mode=(-1);
2264 if (LocaleCompare((
char *) keyword,
"mode") == 0)
2266 delegate_info->mode=1;
2267 if (LocaleCompare(token,
"bi") == 0)
2268 delegate_info->mode=0;
2270 if (LocaleCompare(token,
"encode") == 0)
2271 delegate_info->mode=(-1);
2279 if (LocaleCompare((
char *) keyword,
"spawn") == 0)
2281 delegate_info->spawn=IsStringTrue(token);
2284 if (LocaleCompare((
char *) keyword,
"stealth") == 0)
2286 delegate_info->stealth=IsStringTrue(token);
2294 if (LocaleCompare((
char *) keyword,
"thread-support") == 0)
2296 delegate_info->thread_support=IsStringTrue(token);
2297 if (delegate_info->thread_support == MagickFalse)
2298 delegate_info->semaphore=AcquireSemaphoreInfo();
2307 token=(
char *) RelinquishMagickMemory(token);
2308 return(status != 0 ? MagickTrue : MagickFalse);