1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                                                                             %
6%                 M   M   AAA    GGGG  IIIII   CCCC  K   K                    %
7%                 MM MM  A   A  G        I    C      K  K                     %
8%                 M M M  AAAAA  G GGG    I    C      KKK                      %
9%                 M   M  A   A  G   G    I    C      K  K                     %
10%                 M   M  A   A   GGGG  IIIII   CCCC  K   K                    %
11%                                                                             %
12%                        W   W   AAA   N   N  DDDD                            %
13%                        W   W  A   A  NN  N  D   D                           %
14%                        W W W  AAAAA  N N N  D   D                           %
15%                        WW WW  A   A  N  NN  D   D                           %
16%                        W   W  A   A  N   N  DDDD                            %
17%                                                                             %
18%                                                                             %
19%                           MagickWand Wand Methods                           %
20%                                                                             %
21%                               Software Design                               %
22%                                    Cristy                                   %
23%                                 August 2003                                 %
24%                                                                             %
25%                                                                             %
26%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
27%  dedicated to making software imaging solutions freely available.           %
28%                                                                             %
29%  You may not use this file except in compliance with the License.  You may  %
30%  obtain a copy of the License at                                            %
31%                                                                             %
32%    http://www.imagemagick.org/script/license.php                            %
33%                                                                             %
34%  Unless required by applicable law or agreed to in writing, software        %
35%  distributed under the License is distributed on an "AS IS" BASIS,          %
36%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
37%  See the License for the specific language governing permissions and        %
38%  limitations under the License.                                             %
39%                                                                             %
40%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41%
42%
43%
44*/
45
46/*
47  Include declarations.
48*/
49#include "MagickWand/studio.h"
50#include "MagickWand/MagickWand.h"
51#include "MagickWand/magick-wand-private.h"
52#include "MagickWand/wand.h"
53
54/*
55%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56%                                                                             %
57%                                                                             %
58%                                                                             %
59%   C l e a r M a g i c k W a n d                                             %
60%                                                                             %
61%                                                                             %
62%                                                                             %
63%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64%
65%  ClearMagickWand() clears resources associated with the wand, leaving the
66%  wand blank, and ready to be used for a new set of images.
67%
68%  The format of the ClearMagickWand method is:
69%
70%      void ClearMagickWand(MagickWand *wand)
71%
72%  A description of each parameter follows:
73%
74%    o wand: the magick wand.
75%
76*/
77WandExport void ClearMagickWand(MagickWand *wand)
78{
79  assert(wand != (MagickWand *) NULL);
80  assert(wand->signature == MagickWandSignature);
81  if (wand->debug != MagickFalse)
82    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
83  wand->image_info=DestroyImageInfo(wand->image_info);
84  wand->images=DestroyImageList(wand->images);
85  wand->image_info=AcquireImageInfo();
86  wand->insert_before=MagickFalse;
87  wand->image_pending=MagickFalse;
88  ClearMagickException(wand->exception);
89  wand->debug=IsEventLogging();
90}
91
92/*
93%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94%                                                                             %
95%                                                                             %
96%                                                                             %
97%   C l o n e M a g i c k W a n d                                             %
98%                                                                             %
99%                                                                             %
100%                                                                             %
101%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
102%
103%  CloneMagickWand() makes an exact copy of the specified wand.
104%
105%  The format of the CloneMagickWand method is:
106%
107%      MagickWand *CloneMagickWand(const MagickWand *wand)
108%
109%  A description of each parameter follows:
110%
111%    o wand: the magick wand.
112%
113*/
114WandExport MagickWand *CloneMagickWand(const MagickWand *wand)
115{
116  MagickWand
117    *clone_wand;
118
119  assert(wand != (MagickWand *) NULL);
120  assert(wand->signature == MagickWandSignature);
121  if (wand->debug != MagickFalse)
122    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
123  clone_wand=(MagickWand *) AcquireMagickMemory(sizeof(*clone_wand));
124  if (clone_wand == (MagickWand *) NULL)
125    ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
126      wand->name);
127  (void) ResetMagickMemory(clone_wand,0,sizeof(*clone_wand));
128  clone_wand->id=AcquireWandId();
129  (void) FormatLocaleString(clone_wand->name,MagickPathExtent,"%s-%.20g",
130    MagickWandId,(double) clone_wand->id);
131  clone_wand->exception=AcquireExceptionInfo();
132  InheritException(clone_wand->exception,wand->exception);
133  clone_wand->image_info=CloneImageInfo(wand->image_info);
134  clone_wand->images=CloneImageList(wand->images,clone_wand->exception);
135  clone_wand->insert_before=MagickFalse;
136  clone_wand->image_pending=MagickFalse;
137  clone_wand->debug=IsEventLogging();
138  if (clone_wand->debug != MagickFalse)
139    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_wand->name);
140  clone_wand->signature=MagickWandSignature;
141  return(clone_wand);
142}
143
144/*
145%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
146%                                                                             %
147%                                                                             %
148%                                                                             %
149%   D e s t r o y M a g i c k W a n d                                         %
150%                                                                             %
151%                                                                             %
152%                                                                             %
153%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
154%
155%  DestroyMagickWand() deallocates memory associated with an MagickWand.
156%
157%  The format of the DestroyMagickWand method is:
158%
159%      MagickWand *DestroyMagickWand(MagickWand *wand)
160%
161%  A description of each parameter follows:
162%
163%    o wand: the magick wand.
164%
165*/
166WandExport MagickWand *DestroyMagickWand(MagickWand *wand)
167{
168  assert(wand != (MagickWand *) NULL);
169  assert(wand->signature == MagickWandSignature);
170  if (wand->debug != MagickFalse)
171    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
172  wand->images=DestroyImageList(wand->images);
173  if (wand->image_info != (ImageInfo *) NULL )
174    wand->image_info=DestroyImageInfo(wand->image_info);
175  if (wand->exception != (ExceptionInfo *) NULL )
176    wand->exception=DestroyExceptionInfo(wand->exception);
177  RelinquishWandId(wand->id);
178  wand->signature=(~MagickWandSignature);
179  wand=(MagickWand *) RelinquishMagickMemory(wand);
180  return(wand);
181}
182
183/*
184%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
185%                                                                             %
186%                                                                             %
187%                                                                             %
188%   I s M a g i c k W a n d                                                   %
189%                                                                             %
190%                                                                             %
191%                                                                             %
192%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
193%
194%  IsMagickWand() returns MagickTrue if the wand is verified as a magick wand.
195%
196%  The format of the IsMagickWand method is:
197%
198%      MagickBooleanType IsMagickWand(const MagickWand *wand)
199%
200%  A description of each parameter follows:
201%
202%    o wand: the magick wand.
203%
204*/
205WandExport MagickBooleanType IsMagickWand(const MagickWand *wand)
206{
207  if (wand == (const MagickWand *) NULL)
208    return(MagickFalse);
209  if (wand->signature != MagickWandSignature)
210    return(MagickFalse);
211  if (LocaleNCompare(wand->name,MagickWandId,strlen(MagickWandId)) != 0)
212    return(MagickFalse);
213  return(MagickTrue);
214}
215
216/*
217%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
218%                                                                             %
219%                                                                             %
220%                                                                             %
221%   M a g i c k C l e a r E x c e p t i o n                                   %
222%                                                                             %
223%                                                                             %
224%                                                                             %
225%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
226%
227%  MagickClearException() clears any exceptions associated with the wand.
228%
229%  The format of the MagickClearException method is:
230%
231%      MagickBooleanType MagickClearException(MagickWand *wand)
232%
233%  A description of each parameter follows:
234%
235%    o wand: the magick wand.
236%
237*/
238WandExport MagickBooleanType MagickClearException(MagickWand *wand)
239{
240  assert(wand != (MagickWand *) NULL);
241  assert(wand->signature == MagickWandSignature);
242  if (wand->debug != MagickFalse)
243    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
244  ClearMagickException(wand->exception);
245  return(MagickTrue);
246}
247
248/*
249%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
250%                                                                             %
251%                                                                             %
252%                                                                             %
253%   M a g i c k G e t E x c e p t i o n                                       %
254%                                                                             %
255%                                                                             %
256%                                                                             %
257%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
258%
259%  MagickGetException() returns the severity, reason, and description of any
260%  error that occurs when using other methods in this API.
261%
262%  The format of the MagickGetException method is:
263%
264%      char *MagickGetException(const MagickWand *wand,ExceptionType *severity)
265%
266%  A description of each parameter follows:
267%
268%    o wand: the magick wand.
269%
270%    o severity: the severity of the error is returned here.
271%
272*/
273WandExport char *MagickGetException(const MagickWand *wand,
274  ExceptionType *severity)
275{
276  char
277    *description;
278
279  assert(wand != (const MagickWand *) NULL);
280  assert(wand->signature == MagickWandSignature);
281  if (wand->debug != MagickFalse)
282    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
283  assert(severity != (ExceptionType *) NULL);
284  *severity=wand->exception->severity;
285  description=(char *) AcquireQuantumMemory(2UL*MagickPathExtent,
286    sizeof(*description));
287  if (description == (char *) NULL)
288    {
289      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
290        "MemoryAllocationFailed","`%s'",wand->name);
291      return((char *) NULL);
292    }
293  *description='\0';
294  if (wand->exception->reason != (char *) NULL)
295    (void) CopyMagickString(description,GetLocaleExceptionMessage(
296      wand->exception->severity,wand->exception->reason),MagickPathExtent);
297  if (wand->exception->description != (char *) NULL)
298    {
299      (void) ConcatenateMagickString(description," (",MagickPathExtent);
300      (void) ConcatenateMagickString(description,GetLocaleExceptionMessage(
301        wand->exception->severity,wand->exception->description),MagickPathExtent);
302      (void) ConcatenateMagickString(description,")",MagickPathExtent);
303    }
304  return(description);
305}
306
307/*
308%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
309%                                                                             %
310%                                                                             %
311%                                                                             %
312%   M a g i c k G e t E x c e p t i o n T y p e                               %
313%                                                                             %
314%                                                                             %
315%                                                                             %
316%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
317%
318%  MagickGetExceptionType() returns the exception type associated with the
319%  wand.  If no exception has occurred, UndefinedExceptionType is returned.
320%
321%  The format of the MagickGetExceptionType method is:
322%
323%      ExceptionType MagickGetExceptionType(const MagickWand *wand)
324%
325%  A description of each parameter follows:
326%
327%    o wand: the magick wand.
328%
329*/
330WandExport ExceptionType MagickGetExceptionType(const MagickWand *wand)
331{
332  assert(wand != (MagickWand *) NULL);
333  assert(wand->signature == MagickWandSignature);
334  if (wand->debug != MagickFalse)
335    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
336  return(wand->exception->severity);
337}
338
339/*
340%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
341%                                                                             %
342%                                                                             %
343%                                                                             %
344%   M a g i c k G e t I t e r a t o r I n d e x                               %
345%                                                                             %
346%                                                                             %
347%                                                                             %
348%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
349%
350%  MagickGetIteratorIndex() returns the position of the iterator in the image
351%  list.
352%
353%  The format of the MagickGetIteratorIndex method is:
354%
355%      ssize_t MagickGetIteratorIndex(MagickWand *wand)
356%
357%  A description of each parameter follows:
358%
359%    o wand: the magick wand.
360%
361*/
362WandExport ssize_t MagickGetIteratorIndex(MagickWand *wand)
363{
364  assert(wand != (MagickWand *) NULL);
365  assert(wand->signature == MagickWandSignature);
366  if (wand->debug != MagickFalse)
367    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
368  if (wand->images == (Image *) NULL)
369    {
370      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
371        "ContainsNoIterators","`%s'",wand->name);
372      return(-1);
373    }
374  return(GetImageIndexInList(wand->images));
375}
376
377/*
378%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
379%                                                                             %
380%                                                                             %
381%                                                                             %
382%   M a g i c k Q u e r y C o n f i g u r e O p t i o n                       %
383%                                                                             %
384%                                                                             %
385%                                                                             %
386%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
387%
388%  MagickQueryConfigureOption() returns the value associated with the specified
389%  configure option.
390%
391%  The format of the MagickQueryConfigureOption function is:
392%
393%      char *MagickQueryConfigureOption(const char *option)
394%
395%  A description of each parameter follows:
396%
397%    o option: the option name.
398%
399*/
400WandExport char *MagickQueryConfigureOption(const char *option)
401{
402  char
403    *value;
404
405  const ConfigureInfo
406    **configure_info;
407
408  ExceptionInfo
409    *exception;
410
411  size_t
412    number_options;
413
414  exception=AcquireExceptionInfo();
415  configure_info=GetConfigureInfoList(option,&number_options,exception);
416  exception=DestroyExceptionInfo(exception);
417  if (configure_info == (const ConfigureInfo **) NULL)
418    return((char *) NULL);
419  value=AcquireString(configure_info[0]->value);
420  configure_info=(const ConfigureInfo **)
421    RelinquishMagickMemory((void *) configure_info);
422  return(value);
423}
424
425/*
426%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
427%                                                                             %
428%                                                                             %
429%                                                                             %
430%   M a g i c k Q u e r y C o n f i g u r e O p t i o n s                     %
431%                                                                             %
432%                                                                             %
433%                                                                             %
434%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
435%
436%  MagickQueryConfigureOptions() returns any configure options that match the
437%  specified pattern (e.g.  "*" for all).  Options include NAME, VERSION,
438%  LIB_VERSION, etc.
439%
440%  The format of the MagickQueryConfigureOptions function is:
441%
442%      char **MagickQueryConfigureOptions(const char *pattern,
443%        size_t *number_options)
444%
445%  A description of each parameter follows:
446%
447%    o pattern: Specifies a pointer to a text string containing a pattern.
448%
449%    o number_options:  Returns the number of configure options in the list.
450%
451%
452*/
453WandExport char **MagickQueryConfigureOptions(const char *pattern,
454  size_t *number_options)
455{
456  char
457    **options;
458
459  ExceptionInfo
460    *exception;
461
462  exception=AcquireExceptionInfo();
463  options=GetConfigureList(pattern,number_options,exception);
464  exception=DestroyExceptionInfo(exception);
465  return(options);
466}
467
468/*
469%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
470%                                                                             %
471%                                                                             %
472%                                                                             %
473%   M a g i c k Q u e r y F o n t M e t r i c s                               %
474%                                                                             %
475%                                                                             %
476%                                                                             %
477%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
478%
479%  MagickQueryFontMetrics() returns a 13 element array representing the
480%  following font metrics:
481%
482%    Element Description
483%    -------------------------------------------------
484%          0 character width
485%          1 character height
486%          2 ascender
487%          3 descender
488%          4 text width
489%          5 text height
490%          6 maximum horizontal advance
491%          7 bounding box: x1
492%          8 bounding box: y1
493%          9 bounding box: x2
494%         10 bounding box: y2
495%         11 origin: x
496%         12 origin: y
497%
498%  The format of the MagickQueryFontMetrics method is:
499%
500%      double *MagickQueryFontMetrics(MagickWand *wand,
501%        const DrawingWand *drawing_wand,const char *text)
502%
503%  A description of each parameter follows:
504%
505%    o wand: the Magick wand.
506%
507%    o drawing_wand: the drawing wand.
508%
509%    o text: the text.
510%
511*/
512WandExport double *MagickQueryFontMetrics(MagickWand *wand,
513  const DrawingWand *drawing_wand,const char *text)
514{
515  double
516    *font_metrics;
517
518  DrawInfo
519    *draw_info;
520
521  MagickBooleanType
522    status;
523
524  TypeMetric
525    metrics;
526
527  assert(wand != (MagickWand *) NULL);
528  assert(wand->signature == MagickWandSignature);
529  if (wand->debug != MagickFalse)
530    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
531  assert(drawing_wand != (const DrawingWand *) NULL);
532  if (wand->images == (Image *) NULL)
533    {
534      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
535        "ContainsNoImages","`%s'",wand->name);
536      return((double *) NULL);
537    }
538  font_metrics=(double *) AcquireQuantumMemory(13UL,sizeof(*font_metrics));
539  if (font_metrics == (double *) NULL)
540    return((double *) NULL);
541  draw_info=PeekDrawingWand(drawing_wand);
542  if (draw_info == (DrawInfo *) NULL)
543    {
544      font_metrics=(double *) RelinquishMagickMemory(font_metrics);
545      return((double *) NULL);
546    }
547  (void) CloneString(&draw_info->text,text);
548  (void) ResetMagickMemory(&metrics,0,sizeof(metrics));
549  status=GetTypeMetrics(wand->images,draw_info,&metrics,wand->exception);
550  draw_info=DestroyDrawInfo(draw_info);
551  if (status == MagickFalse)
552    {
553      font_metrics=(double *) RelinquishMagickMemory(font_metrics);
554      return((double *) NULL);
555    }
556  font_metrics[0]=metrics.pixels_per_em.x;
557  font_metrics[1]=metrics.pixels_per_em.y;
558  font_metrics[2]=metrics.ascent;
559  font_metrics[3]=metrics.descent;
560  font_metrics[4]=metrics.width;
561  font_metrics[5]=metrics.height;
562  font_metrics[6]=metrics.max_advance;
563  font_metrics[7]=metrics.bounds.x1;
564  font_metrics[8]=metrics.bounds.y1;
565  font_metrics[9]=metrics.bounds.x2;
566  font_metrics[10]=metrics.bounds.y2;
567  font_metrics[11]=metrics.origin.x;
568  font_metrics[12]=metrics.origin.y;
569  return(font_metrics);
570}
571
572/*
573%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
574%                                                                             %
575%                                                                             %
576%                                                                             %
577%   M a g i c k Q u e r y M u l t i l i n e F o n t M e t r i c s             %
578%                                                                             %
579%                                                                             %
580%                                                                             %
581%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
582%
583%  MagickQueryMultilineFontMetrics() returns a 13 element array representing the
584%  following font metrics:
585%
586%    Element Description
587%    -------------------------------------------------
588%          0 character width
589%          1 character height
590%          2 ascender
591%          3 descender
592%          4 text width
593%          5 text height
594%          6 maximum horizontal advance
595%          7 bounding box: x1
596%          8 bounding box: y1
597%          9 bounding box: x2
598%         10 bounding box: y2
599%         11 origin: x
600%         12 origin: y
601%
602%  This method is like MagickQueryFontMetrics() but it returns the maximum text
603%  width and height for multiple lines of text.
604%
605%  The format of the MagickQueryFontMetrics method is:
606%
607%      double *MagickQueryMultilineFontMetrics(MagickWand *wand,
608%        const DrawingWand *drawing_wand,const char *text)
609%
610%  A description of each parameter follows:
611%
612%    o wand: the Magick wand.
613%
614%    o drawing_wand: the drawing wand.
615%
616%    o text: the text.
617%
618*/
619WandExport double *MagickQueryMultilineFontMetrics(MagickWand *wand,
620  const DrawingWand *drawing_wand,const char *text)
621{
622  double
623    *font_metrics;
624
625  DrawInfo
626    *draw_info;
627
628  MagickBooleanType
629    status;
630
631  TypeMetric
632    metrics;
633
634  assert(wand != (MagickWand *) NULL);
635  assert(wand->signature == MagickWandSignature);
636  if (wand->debug != MagickFalse)
637    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
638  assert(drawing_wand != (const DrawingWand *) NULL);
639  if (wand->images == (Image *) NULL)
640    {
641      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
642        "ContainsNoImages","`%s'",wand->name);
643      return((double *) NULL);
644    }
645  font_metrics=(double *) AcquireQuantumMemory(13UL,sizeof(*font_metrics));
646  if (font_metrics == (double *) NULL)
647    return((double *) NULL);
648  draw_info=PeekDrawingWand(drawing_wand);
649  if (draw_info == (DrawInfo *) NULL)
650    {
651      font_metrics=(double *) RelinquishMagickMemory(font_metrics);
652      return((double *) NULL);
653    }
654  (void) CloneString(&draw_info->text,text);
655  (void) ResetMagickMemory(&metrics,0,sizeof(metrics));
656  status=GetMultilineTypeMetrics(wand->images,draw_info,&metrics,
657    wand->exception);
658  draw_info=DestroyDrawInfo(draw_info);
659  if (status == MagickFalse)
660    {
661      font_metrics=(double *) RelinquishMagickMemory(font_metrics);
662      return((double *) NULL);
663    }
664  font_metrics[0]=metrics.pixels_per_em.x;
665  font_metrics[1]=metrics.pixels_per_em.y;
666  font_metrics[2]=metrics.ascent;
667  font_metrics[3]=metrics.descent;
668  font_metrics[4]=metrics.width;
669  font_metrics[5]=metrics.height;
670  font_metrics[6]=metrics.max_advance;
671  font_metrics[7]=metrics.bounds.x1;
672  font_metrics[8]=metrics.bounds.y1;
673  font_metrics[9]=metrics.bounds.x2;
674  font_metrics[10]=metrics.bounds.y2;
675  font_metrics[11]=metrics.origin.x;
676  font_metrics[12]=metrics.origin.y;
677  return(font_metrics);
678}
679
680/*
681%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
682%                                                                             %
683%                                                                             %
684%                                                                             %
685%   M a g i c k Q u e r y F o n t s                                           %
686%                                                                             %
687%                                                                             %
688%                                                                             %
689%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
690%
691%  MagickQueryFonts() returns any font that match the specified pattern (e.g.
692%  "*" for all).
693%
694%  The format of the MagickQueryFonts function is:
695%
696%      char **MagickQueryFonts(const char *pattern,size_t *number_fonts)
697%
698%  A description of each parameter follows:
699%
700%    o pattern: Specifies a pointer to a text string containing a pattern.
701%
702%    o number_fonts:  Returns the number of fonts in the list.
703%
704%
705*/
706WandExport char **MagickQueryFonts(const char *pattern,
707  size_t *number_fonts)
708{
709  char
710    **fonts;
711
712  ExceptionInfo
713    *exception;
714
715  exception=AcquireExceptionInfo();
716  fonts=GetTypeList(pattern,number_fonts,exception);
717  exception=DestroyExceptionInfo(exception);
718  return(fonts);
719}
720
721/*
722%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
723%                                                                             %
724%                                                                             %
725%                                                                             %
726%   M a g i c k Q u e r y F o r m a t s                                       %
727%                                                                             %
728%                                                                             %
729%                                                                             %
730%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
731%
732%  MagickQueryFormats() returns any image formats that match the specified
733%  pattern (e.g.  "*" for all).
734%
735%  The format of the MagickQueryFormats function is:
736%
737%      char **MagickQueryFormats(const char *pattern,size_t *number_formats)
738%
739%  A description of each parameter follows:
740%
741%    o pattern: Specifies a pointer to a text string containing a pattern.
742%
743%    o number_formats:  This integer returns the number of image formats in the
744%      list.
745%
746*/
747WandExport char **MagickQueryFormats(const char *pattern,
748  size_t *number_formats)
749{
750  char
751    **formats;
752
753  ExceptionInfo
754    *exception;
755
756  exception=AcquireExceptionInfo();
757  formats=GetMagickList(pattern,number_formats,exception);
758  exception=DestroyExceptionInfo(exception);
759  return(formats);
760}
761
762/*
763%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
764%                                                                             %
765%                                                                             %
766%                                                                             %
767%   M a g i c k R e l i n q u i s h M e m o r y                               %
768%                                                                             %
769%                                                                             %
770%                                                                             %
771%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
772%
773%  MagickRelinquishMemory() relinquishes memory resources returned by such
774%  methods as MagickIdentifyImage(), MagickGetException(), etc.
775%
776%  The format of the MagickRelinquishMemory method is:
777%
778%      void *MagickRelinquishMemory(void *resource)
779%
780%  A description of each parameter follows:
781%
782%    o resource: Relinquish the memory associated with this resource.
783%
784*/
785WandExport void *MagickRelinquishMemory(void *memory)
786{
787  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
788  return(RelinquishMagickMemory(memory));
789}
790
791/*
792%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
793%                                                                             %
794%                                                                             %
795%                                                                             %
796%   M a g i c k R e s e t I t e r a t o r                                     %
797%                                                                             %
798%                                                                             %
799%                                                                             %
800%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
801%
802%  MagickResetIterator() resets the wand iterator.
803%
804%  It is typically used either before iterating though images, or before
805%  calling specific functions such as  MagickAppendImages() to append all
806%  images together.
807%
808%  Afterward you can use MagickNextImage() to iterate over all the images
809%  in a wand container, starting with the first image.
810%
811%  Using this before MagickAddImages() or MagickReadImages() will cause
812%  new images to be inserted between the first and second image.
813%
814%  The format of the MagickResetIterator method is:
815%
816%      void MagickResetIterator(MagickWand *wand)
817%
818%  A description of each parameter follows:
819%
820%    o wand: the magick wand.
821%
822*/
823WandExport void MagickResetIterator(MagickWand *wand)
824{
825  assert(wand != (MagickWand *) NULL);
826  assert(wand->signature == MagickWandSignature);
827  if (wand->debug != MagickFalse)
828    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
829  wand->images=GetFirstImageInList(wand->images);
830  wand->insert_before=MagickFalse; /* Insert/add after current (first) image */
831  wand->image_pending=MagickTrue;  /* NextImage will set first image */
832}
833
834/*
835%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
836%                                                                             %
837%                                                                             %
838%                                                                             %
839%   M a g i c k S e t F i r s t I t e r a t o r                               %
840%                                                                             %
841%                                                                             %
842%                                                                             %
843%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
844%
845%  MagickSetFirstIterator() sets the wand iterator to the first image.
846%
847%  After using any images added to the wand using MagickAddImage() or
848%  MagickReadImage() will be prepended before any image in the wand.
849%
850%  Also the current image has been set to the first image (if any) in the
851%  Magick Wand.  Using MagickNextImage() will then set teh current image
852%  to the second image in the list (if present).
853%
854%  This operation is similar to MagickResetIterator() but differs in how
855%  MagickAddImage(), MagickReadImage(), and MagickNextImage() behaves
856%  afterward.
857%
858%  The format of the MagickSetFirstIterator method is:
859%
860%      void MagickSetFirstIterator(MagickWand *wand)
861%
862%  A description of each parameter follows:
863%
864%    o wand: the magick wand.
865%
866*/
867WandExport void MagickSetFirstIterator(MagickWand *wand)
868{
869  assert(wand != (MagickWand *) NULL);
870  assert(wand->signature == MagickWandSignature);
871  if (wand->debug != MagickFalse)
872    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
873  wand->images=GetFirstImageInList(wand->images);
874  wand->insert_before=MagickTrue;   /* Insert/add before the first image */
875  wand->image_pending=MagickFalse;  /* NextImage will set next image */
876}
877
878/*
879%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
880%                                                                             %
881%                                                                             %
882%                                                                             %
883%   M a g i c k S e t I t e r a t o r I n d e x                               %
884%                                                                             %
885%                                                                             %
886%                                                                             %
887%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
888%
889%  MagickSetIteratorIndex() set the iterator to the given position in the
890%  image list specified with the index parameter.  A zero index will set
891%  the first image as current, and so on.  Negative indexes can be used
892%  to specify an image relative to the end of the images in the wand, with
893%  -1 being the last image in the wand.
894%
895%  If the index is invalid (range too large for number of images in wand)
896%  the function will return MagickFalse, but no 'exception' will be raised,
897%  as it is not actually an error.  In that case the current image will not
898%  change.
899%
900%  After using any images added to the wand using MagickAddImage() or
901%  MagickReadImage() will be added after the image indexed, regardless
902%  of if a zero (first image in list) or negative index (from end) is used.
903%
904%  Jumping to index 0 is similar to MagickResetIterator() but differs in how
905%  MagickNextImage() behaves afterward.
906%
907%  The format of the MagickSetIteratorIndex method is:
908%
909%      MagickBooleanType MagickSetIteratorIndex(MagickWand *wand,
910%        const ssize_t index)
911%
912%  A description of each parameter follows:
913%
914%    o wand: the magick wand.
915%
916%    o index: the scene number.
917%
918*/
919WandExport MagickBooleanType MagickSetIteratorIndex(MagickWand *wand,
920  const ssize_t index)
921{
922  Image
923    *image;
924
925  assert(wand != (MagickWand *) NULL);
926  assert(wand->signature == MagickWandSignature);
927  if (wand->debug != MagickFalse)
928    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
929  if (wand->images == (Image *) NULL)
930    return(MagickFalse);
931  image=GetImageFromList(wand->images,index);
932  if (image == (Image *) NULL)
933    return(MagickFalse);    /* this is not an exception! Just range error. */
934  wand->images=image;
935  wand->insert_before=MagickFalse;  /* Insert/Add after (this) image */
936  wand->image_pending=MagickFalse;  /* NextImage will set next image */
937  return(MagickTrue);
938}
939/*
940%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
941%                                                                             %
942%                                                                             %
943%                                                                             %
944%   M a g i c k S e t L a s t I t e r a t o r                                 %
945%                                                                             %
946%                                                                             %
947%                                                                             %
948%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
949%
950%  MagickSetLastIterator() sets the wand iterator to the last image.
951%
952%  The last image is actually the current image, and the next use of
953%  MagickPreviousImage() will not change this allowing this function to be
954%  used to iterate over the images in the reverse direction. In this sense it
955%  is more like  MagickResetIterator() than MagickSetFirstIterator().
956%
957%  Typically this function is used before MagickAddImage(), MagickReadImage()
958%  functions to ensure new images are appended to the very end of wand's image
959%  list.
960%
961%  The format of the MagickSetLastIterator method is:
962%
963%      void MagickSetLastIterator(MagickWand *wand)
964%
965%  A description of each parameter follows:
966%
967%    o wand: the magick wand.
968%
969*/
970WandExport void MagickSetLastIterator(MagickWand *wand)
971{
972  assert(wand != (MagickWand *) NULL);
973  assert(wand->signature == MagickWandSignature);
974  if (wand->debug != MagickFalse)
975    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
976  wand->images=GetLastImageInList(wand->images);
977  wand->insert_before=MagickFalse;  /* Insert/add after current (last) image */
978  wand->image_pending=MagickTrue;   /* PreviousImage will return last image */
979}
980
981/*
982%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
983%                                                                             %
984%                                                                             %
985%                                                                             %
986%   M a g i c k W a n d G e n e s i s                                         %
987%                                                                             %
988%                                                                             %
989%                                                                             %
990%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
991%
992%  MagickWandGenesis() initializes the MagickWand environment.
993%
994%  The format of the MagickWandGenesis method is:
995%
996%      void MagickWandGenesis(void)
997%
998*/
999WandExport void MagickWandGenesis(void)
1000{
1001  if (IsMagickCoreInstantiated() == MagickFalse)
1002    MagickCoreGenesis((char *) NULL,MagickFalse);
1003}
1004
1005/*
1006%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1007%                                                                             %
1008%                                                                             %
1009%                                                                             %
1010%   M a g i c k W a n d T e r m i n u s                                       %
1011%                                                                             %
1012%                                                                             %
1013%                                                                             %
1014%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1015%
1016%  MagickWandTerminus() terminates the MagickWand environment.
1017%
1018%  The format of the MaickWandTerminus method is:
1019%
1020%      void MagickWandTerminus(void)
1021%
1022*/
1023WandExport void MagickWandTerminus(void)
1024{
1025  DestroyWandIds();
1026  MagickCoreTerminus();
1027}
1028
1029/*
1030%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1031%                                                                             %
1032%                                                                             %
1033%                                                                             %
1034%   N e w M a g i c k W a n d                                                 %
1035%                                                                             %
1036%                                                                             %
1037%                                                                             %
1038%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1039%
1040%  NewMagickWand() returns a wand required for all other methods in the API.
1041%  A fatal exception is thrown if there is not enough memory to allocate the
1042%  wand.   Use DestroyMagickWand() to dispose of the wand when it is no longer
1043%  needed.
1044%
1045%  The format of the NewMagickWand method is:
1046%
1047%      MagickWand *NewMagickWand(void)
1048%
1049*/
1050WandExport MagickWand *NewMagickWand(void)
1051{
1052  const char
1053    *quantum;
1054
1055  MagickWand
1056    *wand;
1057
1058  size_t
1059    depth;
1060
1061  depth=MAGICKCORE_QUANTUM_DEPTH;
1062  quantum=GetMagickQuantumDepth(&depth);
1063  if (depth != MAGICKCORE_QUANTUM_DEPTH)
1064    ThrowWandFatalException(WandError,"QuantumDepthMismatch",quantum);
1065  wand=(MagickWand *) AcquireMagickMemory(sizeof(*wand));
1066  if (wand == (MagickWand *) NULL)
1067    ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
1068      GetExceptionMessage(errno));
1069  (void) ResetMagickMemory(wand,0,sizeof(*wand));
1070  wand->id=AcquireWandId();
1071  (void) FormatLocaleString(wand->name,MagickPathExtent,"%s-%.20g",MagickWandId,
1072    (double) wand->id);
1073  wand->images=NewImageList();
1074  wand->image_info=AcquireImageInfo();
1075  wand->exception=AcquireExceptionInfo();
1076  wand->debug=IsEventLogging();
1077  if (wand->debug != MagickFalse)
1078    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1079  wand->signature=MagickWandSignature;
1080  return(wand);
1081}
1082
1083/*
1084%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1085%                                                                             %
1086%                                                                             %
1087%                                                                             %
1088%   N e w M a g i c k W a n d F r o m I m a g e                               %
1089%                                                                             %
1090%                                                                             %
1091%                                                                             %
1092%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1093%
1094%  NewMagickWandFromImage() returns a wand with an image.
1095%
1096%  The format of the NewMagickWandFromImage method is:
1097%
1098%      MagickWand *NewMagickWandFromImage(const Image *image)
1099%
1100%  A description of each parameter follows:
1101%
1102%    o image: the image.
1103%
1104*/
1105WandExport MagickWand *NewMagickWandFromImage(const Image *image)
1106{
1107  MagickWand
1108    *wand;
1109
1110  wand=NewMagickWand();
1111  wand->images=CloneImage(image,0,0,MagickTrue,wand->exception);
1112  return(wand);
1113}
1114
1115/*
1116%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1117%                                                                             %
1118%                                                                             %
1119%                                                                             %
1120%  I s M a g i c k W a n d I n s t a n t i a t e d                            %
1121%                                                                             %
1122%                                                                             %
1123%                                                                             %
1124%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1125%
1126%  IsMagickWandInstantiated() returns MagickTrue if the ImageMagick environment
1127%  is currently instantiated--  that is, MagickWandGenesis() has been called but
1128%  MagickWandTerminus() has not.
1129%
1130%  The format of the IsMagickWandInstantiated method is:
1131%
1132%      MagickBooleanType IsMagickWandInstantiated(void)
1133%
1134*/
1135MagickExport MagickBooleanType IsMagickWandInstantiated(void)
1136{
1137  return(IsMagickCoreInstantiated());
1138}
1139