43#include "MagickCore/studio.h"
44#include "MagickCore/artifact.h"
45#include "MagickCore/cache.h"
46#include "MagickCore/color.h"
47#include "MagickCore/compare.h"
48#include "MagickCore/constitute.h"
49#include "MagickCore/draw.h"
50#include "MagickCore/effect.h"
51#include "MagickCore/exception.h"
52#include "MagickCore/exception-private.h"
53#include "MagickCore/fx.h"
54#include "MagickCore/fx-private.h"
55#include "MagickCore/gem.h"
56#include "MagickCore/geometry.h"
57#include "MagickCore/image.h"
58#include "MagickCore/layer.h"
59#include "MagickCore/list.h"
60#include "MagickCore/memory_.h"
61#include "MagickCore/monitor.h"
62#include "MagickCore/montage.h"
63#include "MagickCore/option.h"
64#include "MagickCore/profile.h"
65#include "MagickCore/quantum.h"
66#include "MagickCore/resource_.h"
67#include "MagickCore/splay-tree.h"
68#include "MagickCore/signature-private.h"
69#include "MagickCore/statistic.h"
70#include "MagickCore/string_.h"
71#include "MagickCore/token.h"
72#include "MagickCore/utility.h"
73#include "MagickCore/xml-tree.h"
104 *(*CloneKeyFunc)(
const char *),
105 *(*CloneValueFunc)(
const char *);
107static inline void *CloneArtifactKey(
void *key)
109 return((
void *) ((CloneKeyFunc) ConstantString)((
const char *) key));
112static inline void *CloneArtifactValue(
void *value)
114 return((
void *) ((CloneValueFunc) ConstantString)((
const char *) value));
117MagickExport MagickBooleanType CloneImageArtifacts(Image *image,
118 const Image *clone_image)
120 assert(image != (Image *) NULL);
121 assert(image->signature == MagickCoreSignature);
122 assert(clone_image != (
const Image *) NULL);
123 assert(clone_image->signature == MagickCoreSignature);
124 if (IsEventLogging() != MagickFalse)
126 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
127 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
128 clone_image->filename);
130 if (clone_image->artifacts != (
void *) NULL)
132 if (image->artifacts != (
void *) NULL)
133 DestroyImageArtifacts(image);
134 image->artifacts=CloneSplayTree((SplayTreeInfo *) clone_image->artifacts,
135 CloneArtifactKey,CloneArtifactValue);
167MagickExport MagickBooleanType DefineImageArtifact(Image *image,
168 const char *artifact)
171 key[MagickPathExtent],
172 value[MagickPathExtent];
177 assert(image != (Image *) NULL);
178 assert(artifact != (
const char *) NULL);
179 (void) CopyMagickString(key,artifact,MagickPathExtent-1);
180 for (p=key; *p !=
'\0'; p++)
185 (void) CopyMagickString(value,p+1,MagickPathExtent);
187 return(SetImageArtifact(image,key,value));
214MagickExport MagickBooleanType DeleteImageArtifact(Image *image,
215 const char *artifact)
217 assert(image != (Image *) NULL);
218 assert(image->signature == MagickCoreSignature);
219 if (IsEventLogging() != MagickFalse)
220 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
221 if (image->artifacts == (
void *) NULL)
223 return(DeleteNodeFromSplayTree((SplayTreeInfo *) image->artifacts,artifact));
249MagickExport
void DestroyImageArtifacts(Image *image)
251 assert(image != (Image *) NULL);
252 assert(image->signature == MagickCoreSignature);
253 if (IsEventLogging() != MagickFalse)
254 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
255 if (image->artifacts != (
void *) NULL)
256 image->artifacts=(
void *) DestroySplayTree((SplayTreeInfo *)
289MagickExport
const char *GetImageArtifact(
const Image *image,
290 const char *artifact)
295 assert(image != (Image *) NULL);
296 assert(image->signature == MagickCoreSignature);
297 if (IsEventLogging() != MagickFalse)
298 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
299 p=(
const char *) NULL;
300 if (image->artifacts != (
void *) NULL)
302 if (artifact == (
const char *) NULL)
303 return((
const char *) GetRootValueFromSplayTree((SplayTreeInfo *)
305 p=(
const char *) GetValueFromSplayTree((SplayTreeInfo *) image->artifacts,
307 if (p != (
const char *) NULL)
310 if ((image->image_info != (ImageInfo *) NULL) &&
311 (image->image_info->options != (
void *) NULL))
312 p=(
const char *) GetValueFromSplayTree((SplayTreeInfo *)
313 image->image_info->options,artifact);
339MagickExport
const char *GetNextImageArtifact(
const Image *image)
341 assert(image != (Image *) NULL);
342 assert(image->signature == MagickCoreSignature);
343 if (IsEventLogging() != MagickFalse)
344 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
345 if (image->artifacts == (
void *) NULL)
346 return((
const char *) NULL);
347 return((
const char *) GetNextKeyInSplayTree(
348 (SplayTreeInfo *) image->artifacts));
379MagickExport
char *RemoveImageArtifact(Image *image,
const char *artifact)
384 assert(image != (Image *) NULL);
385 assert(image->signature == MagickCoreSignature);
386 if (IsEventLogging() != MagickFalse)
387 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
388 if (image->artifacts == (
void *) NULL)
389 return((
char *) NULL);
390 value=(
char *) RemoveNodeFromSplayTree((SplayTreeInfo *) image->artifacts,
422MagickExport
void ResetImageArtifactIterator(
const Image *image)
424 assert(image != (Image *) NULL);
425 assert(image->signature == MagickCoreSignature);
426 if (IsEventLogging() != MagickFalse)
427 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
428 if (image->artifacts == (
void *) NULL)
430 ResetSplayTreeIterator((SplayTreeInfo *) image->artifacts);
464MagickExport MagickBooleanType SetImageArtifact(Image *image,
465 const char *artifact,
const char *value)
470 assert(image != (Image *) NULL);
471 assert(image->signature == MagickCoreSignature);
472 if (IsEventLogging() != MagickFalse)
473 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
477 if (image->artifacts == (
void *) NULL)
478 image->artifacts=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory,
479 RelinquishMagickMemory);
483 if (value == (
const char *) NULL)
484 return(DeleteImageArtifact(image,artifact));
488 status=AddValueToSplayTree((SplayTreeInfo *) image->artifacts,
489 ConstantString(artifact),ConstantString(value));