43#include "magick/studio.h"
44#include "magick/artifact.h"
45#include "magick/cache.h"
46#include "magick/color.h"
47#include "magick/compare.h"
48#include "magick/constitute.h"
49#include "magick/draw.h"
50#include "magick/effect.h"
51#include "magick/exception.h"
52#include "magick/exception-private.h"
54#include "magick/fx-private.h"
55#include "magick/gem.h"
56#include "magick/geometry.h"
57#include "magick/image.h"
58#include "magick/layer.h"
59#include "magick/list.h"
60#include "magick/memory_.h"
61#include "magick/monitor.h"
62#include "magick/montage.h"
63#include "magick/option.h"
64#include "magick/profile.h"
65#include "magick/quantum.h"
66#include "magick/resource_.h"
67#include "magick/splay-tree.h"
68#include "magick/signature-private.h"
69#include "magick/statistic.h"
70#include "magick/string_.h"
71#include "magick/token.h"
72#include "magick/utility.h"
73#include "magick/xml-tree.h"
102 *(*CloneKeyFunc)(
const char *),
103 *(*CloneValueFunc)(
const char *);
105static inline void *CloneArtifactKey(
void *key)
107 return((
void *) ((CloneKeyFunc) ConstantString)((
const char *) key));
110static inline void *CloneArtifactValue(
void *value)
112 return((
void *) ((CloneValueFunc) ConstantString)((
const char *) value));
115MagickExport MagickBooleanType CloneImageArtifacts(Image *image,
116 const Image *clone_image)
118 assert(image != (Image *) NULL);
119 assert(image->signature == MagickCoreSignature);
120 assert(clone_image != (
const Image *) NULL);
121 assert(clone_image->signature == MagickCoreSignature);
122 if (IsEventLogging() != MagickFalse)
124 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
125 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
126 clone_image->filename);
128 if (clone_image->artifacts != (
void *) NULL)
130 if (image->artifacts != (
void *) NULL)
131 DestroyImageArtifacts(image);
132 image->artifacts=CloneSplayTree((SplayTreeInfo *) clone_image->artifacts,
133 CloneArtifactKey,CloneArtifactValue);
163MagickExport MagickBooleanType DefineImageArtifact(Image *image,
164 const char *artifact)
168 value[MaxTextExtent];
173 assert(image != (Image *) NULL);
174 assert(artifact != (
const char *) NULL);
175 (void) CopyMagickString(key,artifact,MaxTextExtent-1);
176 for (p=key; *p !=
'\0'; p++)
181 (void) CopyMagickString(value,p+1,MaxTextExtent);
183 return(SetImageArtifact(image,key,value));
210MagickExport MagickBooleanType DeleteImageArtifact(Image *image,
211 const char *artifact)
213 assert(image != (Image *) NULL);
214 assert(image->signature == MagickCoreSignature);
215 if (IsEventLogging() != MagickFalse)
216 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
217 if (image->artifacts == (
void *) NULL)
219 return(DeleteNodeFromSplayTree((SplayTreeInfo *) image->artifacts,artifact));
245MagickExport
void DestroyImageArtifacts(Image *image)
247 assert(image != (Image *) NULL);
248 assert(image->signature == MagickCoreSignature);
249 if (IsEventLogging() != MagickFalse)
250 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
251 if (image->artifacts != (
void *) NULL)
252 image->artifacts=(
void *) DestroySplayTree((SplayTreeInfo *)
282MagickExport
const char *GetImageArtifact(
const Image *image,
283 const char *artifact)
288 assert(image != (Image *) NULL);
289 assert(image->signature == MagickCoreSignature);
290 if (IsEventLogging() != MagickFalse)
291 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
292 p=(
const char *) NULL;
293 if (artifact == (
const char *) NULL)
295 ResetSplayTreeIterator((SplayTreeInfo *) image->artifacts);
296 p=(
const char *) GetNextValueInSplayTree((SplayTreeInfo *)
300 if (image->artifacts != (
void *) NULL)
302 p=(
const char *) GetValueFromSplayTree((SplayTreeInfo *) image->artifacts,
304 if (p != (
const char *) NULL)
332MagickExport
char *GetNextImageArtifact(
const Image *image)
334 assert(image != (Image *) NULL);
335 assert(image->signature == MagickCoreSignature);
336 if (IsEventLogging() != MagickFalse)
337 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
338 if (image->artifacts == (
void *) NULL)
339 return((
char *) NULL);
340 return((
char *) GetNextKeyInSplayTree((SplayTreeInfo *) image->artifacts));
368MagickExport
char *RemoveImageArtifact(Image *image,
const char *artifact)
373 assert(image != (Image *) NULL);
374 assert(image->signature == MagickCoreSignature);
375 if (IsEventLogging() != MagickFalse)
376 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
377 if (image->artifacts == (
void *) NULL)
378 return((
char *) NULL);
379 value=(
char *) RemoveNodeFromSplayTree((SplayTreeInfo *) image->artifacts,
408MagickExport
void ResetImageArtifactIterator(
const Image *image)
410 assert(image != (Image *) NULL);
411 assert(image->signature == MagickCoreSignature);
412 if (IsEventLogging() != MagickFalse)
413 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
414 if (image->artifacts == (
void *) NULL)
416 ResetSplayTreeIterator((SplayTreeInfo *) image->artifacts);
450MagickExport MagickBooleanType SetImageArtifact(Image *image,
451 const char *artifact,
const char *value)
456 assert(image != (Image *) NULL);
457 assert(image->signature == MagickCoreSignature);
458 if (IsEventLogging() != MagickFalse)
459 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
463 if (image->artifacts == (
void *) NULL)
464 image->artifacts=NewSplayTree(CompareSplayTreeString,RelinquishMagickMemory,
465 RelinquishMagickMemory);
469 if (value == (
const char *) NULL)
470 return(DeleteImageArtifact(image,artifact));
474 status=AddValueToSplayTree((SplayTreeInfo *) image->artifacts,
475 ConstantString(artifact),ConstantString(value));