validate.c revision 042ee78fa9004bf1ac6a95f09d9d1faca631dda1
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%           V   V   AAA   L      IIIII  DDDD    AAA   TTTTT  EEEEE            %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%           V   V  A   A  L        I    D   D  A   A    T    E                %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%           V   V  AAAAA  L        I    D   D  AAAAA    T    EEE              %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%            V V   A   A  L        I    D   D  A   A    T    E                %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%             V    A   A  LLLLL  IIIII  DDDD   A   A    T    EEEEE            %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                        ImageMagick Validation Suite                         %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             Software Design                                 %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                               John Cristy                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                               March 2001                                    %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
217e41fe84a841d7b9d7b36b245b65e9dcb3314943cristy%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  see the License for the specific language governing permissions and        %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <stdio.h>
445e8e98117d8549131cd304db78537e04dde513f5cristy#include <stdlib.h>
453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <string.h>
465e8e98117d8549131cd304db78537e04dde513f5cristy#include <ctype.h>
473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <math.h>
483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "wand/MagickWand.h"
49a0b81c3e9f1773555296b3147c9bb3edef8dcddbcristy#include "magick/string-private.h"
503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "validate.h"
513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e C o m p a r e C o m m a n d                               %
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateCompareCommand() validates the ImageMagick compare command line
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateCompareCommand method is:
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
68bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateCompareCommand(ImageInfo *image_info,
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
70bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
85bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateCompareCommand(ImageInfo *image_info,
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
87bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    command[MaxTextExtent];
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
99bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
103bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate compare command line program:\n");
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; compare_options[i] != (char *) NULL; i++)
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
11175a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (void) fprintf(stdout,"  test %.20g: %s",(double) (test++),
1126aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      compare_options[i]);
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) FormatMagickString(command,MaxTextExtent,"%s %s %s %s",
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      compare_options[i],reference_filename,reference_filename,output_filename);
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11866688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=CompareImageCommand(image_info,number_arguments,arguments,
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < number_arguments; j++)
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status != MagickFalse)
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12966688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fprintf(stdout,"... pass.\n");
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
13575a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
13675a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
13775a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e C o m p o s i t e C o m m a n d                           %
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateCompositeCommand() validates the ImageMagick composite command line
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateCompositeCommand method is:
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
157bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateCompositeCommand(ImageInfo *image_info,
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
159bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
174bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateCompositeCommand(ImageInfo *image_info,
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
176bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    command[MaxTextExtent];
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
188bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
192bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate composite command line program:\n");
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; composite_options[i] != (char *) NULL; i++)
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
20075a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (void) fprintf(stdout,"  test %.20g: %s",(double) (test++),
2016aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      composite_options[i]);
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) FormatMagickString(command,MaxTextExtent,"%s %s %s %s",
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_filename,composite_options[i],reference_filename,
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      output_filename);
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
20866688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=CompositeImageCommand(image_info,number_arguments,arguments,
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < number_arguments; j++)
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status != MagickFalse)
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
21966688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fprintf(stdout,"... pass.\n");
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
22575a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
22675a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
22775a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e C o n v e r t C o m m a n d                               %
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateConvertCommand() validates the ImageMagick convert command line
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateConvertCommand method is:
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
247bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateConvertCommand(ImageInfo *image_info,
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
249bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
264bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateConvertCommand(ImageInfo *image_info,
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
266bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    command[MaxTextExtent];
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
278bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
282bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate convert command line program:\n");
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; convert_options[i] != (char *) NULL; i++)
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
29075a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (void) fprintf(stdout,"  test %.20g: %s",(double) test++,
2916aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      convert_options[i]);
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) FormatMagickString(command,MaxTextExtent,"%s %s %s %s",
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_filename,convert_options[i],reference_filename,output_filename);
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
29766688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=ConvertImageCommand(image_info,number_arguments,arguments,
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < number_arguments; j++)
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status != MagickFalse)
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
30866688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fprintf(stdout,"... pass.\n");
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
31475a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
31575a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
31675a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e I d e n t i f y C o m m a n d                             %
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateIdentifyCommand() validates the ImageMagick identify command line
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateIdentifyCommand method is:
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
336bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateIdentifyCommand(ImageInfo *image_info,
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
338bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
353bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateIdentifyCommand(ImageInfo *image_info,
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
355bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    command[MaxTextExtent];
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
367bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
371bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) output_filename;
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate identify command line program:\n");
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; identify_options[i] != (char *) NULL; i++)
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
38075a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (void) fprintf(stdout,"  test %.20g: %s",(double) test++,
3816aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      identify_options[i]);
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) FormatMagickString(command,MaxTextExtent,"%s %s",
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      identify_options[i],reference_filename);
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
38766688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=IdentifyImageCommand(image_info,number_arguments,arguments,
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < number_arguments; j++)
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status != MagickFalse)
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
39866688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fprintf(stdout,"... pass.\n");
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
40475a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
40575a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
40675a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e I m a g e F o r m a t s I n M e m o r y                   %
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateImageFormatsInMemory() validates the ImageMagick image formats in
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  memory and returns the number of validation tests that passed and failed.
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateImageFormatsInMemory method is:
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
426bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateImageFormatsInMemory(ImageInfo *image_info,
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
428bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
443bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImageFormatsInMemory(ImageInfo *image_info,
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
445bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    size[MaxTextExtent];
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickInfo
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magick_info;
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distortion,
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fuzz;
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *difference_image,
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reference_image,
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reconstruct_image;
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
465bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *blob;
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
475bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate image formats in memory:\n");
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; reference_formats[i].magick != (char *) NULL; i++)
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magick_info=GetMagickInfo(reference_formats[i].magick,exception);
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((magick_info == (const MagickInfo *) NULL) ||
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (magick_info->decoder == (DecodeImageHandler *) NULL) ||
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (magick_info->encoder == (EncodeImageHandler *) NULL))
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
4875f1c1fff2a55c4d8756556e78c1f307d352ed1b8cristy    for (j=0; reference_types[j].type != UndefinedType; j++)
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Generate reference image.
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      CatchException(exception);
49375a2623568540f98985ce5bb1d88687eb9c85d2ecristy      (void) fprintf(stdout,"  test %.20g: %s/%s/%s/%.20g-bits",(double)
494042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy        (test++),reference_formats[i].magick,CommandOptionToMnemonic(
4957998e5fecd99cd9838e7a960168f48b92d38bbfccristy        MagickCompressOptions,reference_formats[i].compression),
496042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy        CommandOptionToMnemonic(MagickTypeOptions,reference_types[j].type),
49775a2623568540f98985ce5bb1d88687eb9c85d2ecristy        (double) reference_types[j].depth);
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,reference_filename,
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_image == (Image *) NULL)
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
50366688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Write reference image.
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
51075a2623568540f98985ce5bb1d88687eb9c85d2ecristy      (void) FormatMagickString(size,MaxTextExtent,"%.20gx%.20g",
51175a2623568540f98985ce5bb1d88687eb9c85d2ecristy        (double) reference_image->columns,(double) reference_image->rows);
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CloneString(&image_info->size,size);
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->depth=reference_types[j].depth;
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickString(reference_image->filename,MaxTextExtent,"%s:%s",
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=SetImageType(reference_image,reference_types[j].type);
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
52066688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=SetImageDepth(reference_image,reference_types[j].depth);
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
52966688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5347998e5fecd99cd9838e7a960168f48b92d38bbfccristy      reference_image->compression=reference_formats[i].compression;
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=WriteImage(image_info,reference_image);
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
54066688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reference image.
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickString(image_info->filename,MaxTextExtent,"%s:%s",
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_image == (Image *) NULL)
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
55266688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Write reference image.
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickString(reference_image->filename,MaxTextExtent,"%s:%s",
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->magick,reference_formats[i].magick,
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image->depth=reference_types[j].depth;
5647998e5fecd99cd9838e7a960168f48b92d38bbfccristy      reference_image->compression=reference_formats[i].compression;
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=8192;
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      blob=ImageToBlob(image_info,reference_image,&length,exception);
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (blob == (unsigned char *) NULL)
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
56966688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reconstruct image.
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickString(image_info->filename,MaxTextExtent,"%s:%s",
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=BlobToImage(image_info,blob,length,exception);
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      blob=(unsigned char *) RelinquishMagickMemory(blob);
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reconstruct_image == (Image *) NULL)
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
58366688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Compare reference to reconstruct image.
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fuzz=0.0;
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_formats[i].fuzz != 0.0)
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fuzz=reference_formats[i].fuzz;
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HDRI_SUPPORT)
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fuzz+=0.003;
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_image->colorspace != RGBColorspace)
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fuzz+=0.3;
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fuzz+=MagickEpsilon;
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=CompareImageChannels(reference_image,reconstruct_image,
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        AllChannels,MeanSquaredErrorMetric,&distortion,exception);
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=DestroyImage(reconstruct_image);
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (difference_image == (Image *) NULL)
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
60666688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=DestroyImage(difference_image);
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((distortion/QuantumRange) > fuzz)
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
613e7f5109f30fc7242d04a26174a9138483dda5b6acristy          (void) fprintf(stdout,"... fail (with distortion %g).\n",
6148cd5b3193212b4aebce08c4e7afbb66b09778029cristy            distortion/QuantumRange);
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fprintf(stdout,"... pass.\n");
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
62175a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
62275a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
62375a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e I m a g e F o r m a t s O n D i s k                       %
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateImageFormatsOnDisk() validates the ImageMagick image formats on disk
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and returns the number of validation tests that passed and failed.
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateImageFormatsOnDisk method is:
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
643bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateImageFormatsOnDisk(ImageInfo *image_info,
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
645bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
660bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImageFormatsOnDisk(ImageInfo *image_info,
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
662bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    size[MaxTextExtent];
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickInfo
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magick_info;
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distortion,
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fuzz;
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *difference_image,
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reference_image,
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reconstruct_image;
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
682bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
686bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate image formats on disk:\n");
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; reference_formats[i].magick != (char *) NULL; i++)
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magick_info=GetMagickInfo(reference_formats[i].magick,exception);
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((magick_info == (const MagickInfo *) NULL) ||
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (magick_info->decoder == (DecodeImageHandler *) NULL) ||
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (magick_info->encoder == (EncodeImageHandler *) NULL))
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
6985f1c1fff2a55c4d8756556e78c1f307d352ed1b8cristy    for (j=0; reference_types[j].type != UndefinedType; j++)
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Generate reference image.
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      CatchException(exception);
70475a2623568540f98985ce5bb1d88687eb9c85d2ecristy      (void) fprintf(stdout,"  test %.20g: %s/%s/%s/%.20g-bits",(double)
705042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy        (test++),reference_formats[i].magick,CommandOptionToMnemonic(
7067998e5fecd99cd9838e7a960168f48b92d38bbfccristy        MagickCompressOptions,reference_formats[i].compression),
707042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy        CommandOptionToMnemonic(MagickTypeOptions,reference_types[j].type),
70875a2623568540f98985ce5bb1d88687eb9c85d2ecristy        (double) reference_types[j].depth);
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,reference_filename,
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_image == (Image *) NULL)
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
71466688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Write reference image.
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
72175a2623568540f98985ce5bb1d88687eb9c85d2ecristy      (void) FormatMagickString(size,MaxTextExtent,"%.20gx%.20g",
72275a2623568540f98985ce5bb1d88687eb9c85d2ecristy        (double) reference_image->columns,(double) reference_image->rows);
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CloneString(&image_info->size,size);
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->depth=reference_types[j].depth;
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickString(reference_image->filename,MaxTextExtent,"%s:%s",
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=SetImageType(reference_image,reference_types[j].type);
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
73166688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=SetImageDepth(reference_image,reference_types[j].depth);
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
74066688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7457998e5fecd99cd9838e7a960168f48b92d38bbfccristy      reference_image->compression=reference_formats[i].compression;
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=WriteImage(image_info,reference_image);
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
75166688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reference image.
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickString(image_info->filename,MaxTextExtent,"%s:%s",
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_image == (Image *) NULL)
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
76366688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Write reference image.
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickString(reference_image->filename,MaxTextExtent,"%s:%s",
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image->depth=reference_types[j].depth;
7737998e5fecd99cd9838e7a960168f48b92d38bbfccristy      reference_image->compression=reference_formats[i].compression;
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=WriteImage(image_info,reference_image);
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
77866688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reconstruct image.
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) FormatMagickString(image_info->filename,MaxTextExtent,"%s:%s",
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=ReadImage(image_info,exception);
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reconstruct_image == (Image *) NULL)
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
79166688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Compare reference to reconstruct image.
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fuzz=0.0;
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_formats[i].fuzz != 0.0)
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fuzz=reference_formats[i].fuzz;
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_HDRI_SUPPORT)
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fuzz+=0.003;
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_image->colorspace != RGBColorspace)
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fuzz+=0.3;
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      fuzz+=MagickEpsilon;
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=CompareImageChannels(reference_image,reconstruct_image,
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        AllChannels,MeanSquaredErrorMetric,&distortion,exception);
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=DestroyImage(reconstruct_image);
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (difference_image == (Image *) NULL)
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
81466688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=DestroyImage(difference_image);
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((distortion/QuantumRange) > fuzz)
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
821e7f5109f30fc7242d04a26174a9138483dda5b6acristy          (void) fprintf(stdout,"... fail (with distortion %g).\n",
8228cd5b3193212b4aebce08c4e7afbb66b09778029cristy            distortion/QuantumRange);
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fprintf(stdout,"... pass.\n");
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
82975a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
83075a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
83175a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e I m p o r t E x p o r t P i x e l s                       %
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateImportExportPixels() validates the pixel import and export methods.
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  It returns the number of validation tests that passed and failed.
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateImportExportPixels method is:
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
851bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateImportExportPixels(ImageInfo *image_info,
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
853bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
868bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImportExportPixels(ImageInfo *image_info,
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
870bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distortion;
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *difference_image,
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reference_image,
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reconstruct_image;
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
883bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
893bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) output_filename;
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate the import and export of image pixels:\n");
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; reference_map[i] != (char *) NULL; i++)
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; reference_storage[j].type != UndefinedPixel; j++)
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Generate reference image.
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      CatchException(exception);
90775a2623568540f98985ce5bb1d88687eb9c85d2ecristy      (void) fprintf(stdout,"  test %.20g: %s/%s",(double) (test++),
908042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy        reference_map[i],CommandOptionToMnemonic(MagickStorageOptions,
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_storage[j].type));
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,reference_filename,
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_image == (Image *) NULL)
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
91566688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleNCompare(reference_map[i],"cmy",3) == 0)
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) TransformImageColorspace(reference_image,CMYKColorspace);
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=strlen(reference_map[i])*reference_image->columns*
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_image->rows*reference_storage[j].quantum;
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels));
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (pixels == (unsigned char *) NULL)
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
92666688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ResetMagickMemory(pixels,0,length*sizeof(*pixels));
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=ExportImagePixels(reference_image,0,0,reference_image->columns,
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_image->rows,reference_map[i],reference_storage[j].type,pixels,
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        exception);
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
93766688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixels=(unsigned char *) RelinquishMagickMemory(pixels);
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) SetImageBackgroundColor(reference_image);
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=ImportImagePixels(reference_image,0,0,reference_image->columns,
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_image->rows,reference_map[i],reference_storage[j].type,
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixels);
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
95066688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           pixels=(unsigned char *) RelinquishMagickMemory(pixels);
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reconstruct image.
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=AcquireImage(image_info);
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) SetImageExtent(reconstruct_image,reference_image->columns,
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_image->rows);
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) SetImageColorspace(reconstruct_image,reference_image->colorspace);
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) SetImageBackgroundColor(reconstruct_image);
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=ImportImagePixels(reconstruct_image,0,0,reconstruct_image->columns,
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reconstruct_image->rows,reference_map[i],reference_storage[j].type,
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixels);
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reconstruct_image->exception);
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels=(unsigned char *) RelinquishMagickMemory(pixels);
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
97166688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Compare reference to reconstruct image.
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=CompareImageChannels(reference_image,reconstruct_image,
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        AllChannels,MeanSquaredErrorMetric,&distortion,exception);
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=DestroyImage(reconstruct_image);
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (difference_image == (Image *) NULL)
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
98566688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy          (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=DestroyImage(difference_image);
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((distortion/QuantumRange) > 0.0)
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
992e7f5109f30fc7242d04a26174a9138483dda5b6acristy          (void) fprintf(stdout,"... fail (with distortion %g).\n",
9938cd5b3193212b4aebce08c4e7afbb66b09778029cristy            distortion/QuantumRange);
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) fprintf(stdout,"... pass.\n");
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
100075a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
100175a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
100275a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e M o n t a g e C o m m a n d                               %
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateMontageCommand() validates the ImageMagick montage command line
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateMontageCommand method is:
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1022bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateMontageCommand(ImageInfo *image_info,
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1024bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1039bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateMontageCommand(ImageInfo *image_info,
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
1041bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    command[MaxTextExtent];
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1053bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1057bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate montage command line program:\n");
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; montage_options[i] != (char *) NULL; i++)
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
106575a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (void) fprintf(stdout,"  test %.20g: %s",(double) (test++),
10666aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      montage_options[i]);
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) FormatMagickString(command,MaxTextExtent,"%s %s %s %s",
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_filename,montage_options[i],reference_filename,
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      output_filename);
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
107366688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=MontageImageCommand(image_info,number_arguments,arguments,
10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < number_arguments; j++)
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status != MagickFalse)
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
108466688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fprintf(stdout,"... pass.\n");
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
109075a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
109175a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
109275a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e S t r e a m C o m m a n d                                 %
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateStreamCommand() validates the ImageMagick stream command line
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateStreamCommand method is:
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1112bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateStreamCommand(ImageInfo *image_info,
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1114bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1129bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateStreamCommand(ImageInfo *image_info,
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *reference_filename,const char *output_filename,
1131bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t *fail,ExceptionInfo *exception)
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    command[MaxTextExtent];
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1143bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1147bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) fprintf(stdout,"validate stream command line program:\n");
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; stream_options[i] != (char *) NULL; i++)
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
115575a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (void) fprintf(stdout,"  test %.20g: %s",(double) (test++),
11566aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      stream_options[i]);
11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) FormatMagickString(command,MaxTextExtent,"%s %s %s",
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      stream_options[i],reference_filename,output_filename);
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
116266688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=StreamImageCommand(image_info,number_arguments,arguments,
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < number_arguments; j++)
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status != MagickFalse)
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
117366688e5d7ff2a642cdb1b3bd97b1ddae755f5dc1cristy        (void) fprintf(stdout,"... fail @ %s/%s/%lu.\n",GetMagickModule());
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) fprintf(stdout,"... pass.\n");
11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
117975a2623568540f98985ce5bb1d88687eb9c85d2ecristy  (void) fprintf(stdout,
118075a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
118175a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  M a i n                                                                    %
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType ValidateUsage(void)
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p;
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *miscellaneous[]=
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-debug events        display copious debugging information",
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-help                print program options",
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-log format          format of debugging information",
12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-validate type       validation type",
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-version             print version information",
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *settings[]=
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-regard-warnings     pay attention to warning messages",
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-verbose             print detailed information about the image",
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1221bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) printf("Copyright: %s\n\n",GetMagickCopyright());
1223b28d64742e55a8b565085faf37e9aead51f89a83cristy  (void) printf("Features: %s\n",GetMagickFeatures());
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) printf("Usage: %s [options ...] reference-file\n",GetClientName());
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) printf("\nValidate Settings:\n");
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=settings; *p != (char *) NULL; p++)
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) printf("  %s\n",*p);
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) printf("\nMiscellaneous Options:\n");
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=miscellaneous; *p != (char *) NULL; p++)
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) printf("  %s\n",*p);
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristyint main(int argc,char **argv)
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DestroyValidate() \
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ \
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image_info=DestroyImageInfo(image_info); \
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception); \
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ThrowValidateException(asperity,tag,option) \
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ \
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    option); \
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  CatchException(exception); \
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DestroyValidate(); \
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse); \
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    output_filename[MaxTextExtent],
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    reference_filename[MaxTextExtent],
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *option;
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    elapsed_time,
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    user_time;
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reference_image;
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ImageInfo
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image_info;
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    regard_warnings,
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1272bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  TimerInfo
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *timer;
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1278bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fail,
12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    iterations,
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    tests;
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ValidateType
12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Validate the ImageMagick image processing suite.
12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickCoreGenesis(*argv,MagickFalse);
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  iterations=1;
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickFalse;
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  type=AllValidate;
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  regard_warnings=MagickFalse;
1294d886290b2a32bf23bbdc19b883f32cd4d364b310cristy  (void) regard_warnings;
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image_info=AcquireImageInfo();
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(image_info->filename,ReferenceFilename,MaxTextExtent);
1298bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=1; i < (ssize_t) argc; i++)
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    option=argv[i];
1301042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy    if (IsCommandOption(option) == MagickFalse)
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) CopyMagickString(image_info->filename,option,MaxTextExtent);
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*(option+1))
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'b':
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("bench",option+1) == 0)
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1312e27293e706ca05b6b121e9512a83b16f7ad887f2cristy            iterations=StringToUnsignedLong(argv[++i]);
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'd':
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("debug",option+1) == 0)
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) SetLogEventMask(argv[++i]);
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'h':
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("help",option+1) == 0)
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) ValidateUsage();
13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return(0);
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'l':
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("log",option+1) == 0)
13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (*option != '+')
13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) SetLogFormat(argv[i+1]);
13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'r':
13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("regard-warnings",option+1) == 0)
13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            regard_warnings=MagickTrue;
13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
13513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
13533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'v':
13553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("validate",option+1) == 0)
13573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1358bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            ssize_t
13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              validate;
13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (*option == '+')
13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            i++;
1364bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            if (i == (ssize_t) argc)
13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ThrowValidateException(OptionError,"MissingArgument",option);
1366042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy            validate=ParseCommandOption(MagickValidateOptions,MagickFalse,
13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              argv[i]);
13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (validate < 0)
13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ThrowValidateException(OptionError,"UnrecognizedValidateType",
13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                argv[i]);
13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            type=(ValidateType) validate;
13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((LocaleCompare("version",option+1) == 0) ||
13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (LocaleCompare("-version",option+1) == 0))
13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) fprintf(stdout,"Version: %s\n",
1378bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              GetMagickVersion((size_t *) NULL));
13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) fprintf(stdout,"Copyright: %s\n\n",GetMagickCopyright());
1380104cea817534e8601291610f22e496c10f8f9ddbcristy            (void) fprintf(stdout,"Features: %s\n\n",GetMagickFeatures());
13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return(0);
13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
1389205e21f9b7ffdf5b0e48642ba0981b239959f8a9cristy  timer=(TimerInfo *) NULL;
13908b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy  if (iterations > 1)
13918b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy    timer=AcquireTimerInfo();
13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  reference_image=ReadImage(image_info,exception);
13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  tests=0;
13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fail=0;
13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (reference_image == (Image *) NULL)
13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fail++;
13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
13993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleCompare(image_info->filename,ReferenceFilename) == 0)
14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) CopyMagickString(reference_image->magick,ReferenceImageFormat,
14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          MaxTextExtent);
14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) AcquireUniqueFilename(reference_filename);
14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) AcquireUniqueFilename(output_filename);
14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(reference_image->filename,reference_filename,
14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MaxTextExtent);
14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=WriteImage(image_info,reference_image);
14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InheritException(exception,&reference_image->exception);
14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fail++;
14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) fprintf(stdout,"Version: %s\n",
1414bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            GetMagickVersion((size_t *) NULL));
14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) fprintf(stdout,"Copyright: %s\n\n",
14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            GetMagickCopyright());
14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) fprintf(stdout,"ImageMagick Validation Suite (%s)\n\n",
1418042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy            CommandOptionToMnemonic(MagickValidateOptions,(ssize_t) type));
14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & CompareValidate) != 0)
14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateCompareCommand(image_info,reference_filename,
14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & CompositeValidate) != 0)
14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateCompositeCommand(image_info,reference_filename,
14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & ConvertValidate) != 0)
14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateConvertCommand(image_info,reference_filename,
14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & FormatsInMemoryValidate) != 0)
14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateImageFormatsInMemory(image_info,reference_filename,
14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & FormatsOnDiskValidate) != 0)
14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateImageFormatsOnDisk(image_info,reference_filename,
14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & IdentifyValidate) != 0)
14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateIdentifyCommand(image_info,reference_filename,
14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & ImportExportValidate) != 0)
14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateImportExportPixels(image_info,reference_filename,
14393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & MontageValidate) != 0)
14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateMontageCommand(image_info,reference_filename,
14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & StreamValidate) != 0)
14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateStreamCommand(image_info,reference_filename,
14453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
144675a2623568540f98985ce5bb1d88687eb9c85d2ecristy          (void) fprintf(stdout,
144775a2623568540f98985ce5bb1d88687eb9c85d2ecristy            "validation suite: %.20g tests; %.20g passed; %.20g failed.\n",
144875a2623568540f98985ce5bb1d88687eb9c85d2ecristy            (double) tests,(double) (tests-fail),(double) fail);
14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) RelinquishUniqueFileResource(output_filename);
14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) RelinquishUniqueFileResource(reference_filename);
14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (exception->severity != UndefinedException)
14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (iterations > 1)
14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      elapsed_time=GetElapsedTime(timer);
14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      user_time=GetUserTime(timer);
14598cd5b3193212b4aebce08c4e7afbb66b09778029cristy      (void) fprintf(stderr,
146075a2623568540f98985ce5bb1d88687eb9c85d2ecristy        "Performance: %.20gi %gips %0.3fu %ld:%02ld.%03ld\n",(double)
14616aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy        iterations,1.0*iterations/elapsed_time,user_time,(long)
14626aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy        (elapsed_time/60.0),(long) ceil(fmod(elapsed_time,60.0)),
14636aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy        (long) (1000.0*(elapsed_time-floor(elapsed_time))));
14648b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy      timer=DestroyTimerInfo(timer);
14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DestroyValidate();
14673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickCoreTerminus();
14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(fail == 0 ? 0 : 1);
14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1470