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                                 %
17de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                  Cristy                                     %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                               March 2001                                    %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
217ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 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>
48e2605743ebaef9ed4a20bc581898aa6e7e113b60cristy#include <locale.h>
499883b4524275800ecb55867d94952449dc519444cristy#include "MagickWand/MagickWand.h"
50510d06a3f7063e91993e13d546d5685048248074cristy#include "MagickCore/colorspace-private.h"
51775194c2a1ab7cface73fe0e484cd65c963739a8dirk#include "MagickCore/gem.h"
524084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#include "MagickCore/resource_.h"
539883b4524275800ecb55867d94952449dc519444cristy#include "MagickCore/string-private.h"
543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "validate.h"
553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  Define declarations.
588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy*/
598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy#define CIEEpsilon  (216.0/24389.0)
608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy#define CIEK  (24389.0/27.0)
618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy#define D65X  0.950456
628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy#define D65Y  1.0
638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy#define D65Z  1.088754
64a7230ee76e9fe2b012baebcad1fcce0c2143ac95cristy#define ReferenceEpsilon  (QuantumRange*1.0e-2)
658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy/*
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
71572e097d004eac4b9767c11eec49d054e413ab00cristy%   V a l i d a t e C o l o r s p a c e s                                     %
7280e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%                                                                             %
7380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%                                                                             %
7480e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%                                                                             %
7580e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7680e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%
77572e097d004eac4b9767c11eec49d054e413ab00cristy%  ValidateColorspaces() validates the ImageMagick colorspaces and returns the
78572e097d004eac4b9767c11eec49d054e413ab00cristy%  number of validation tests that passed and failed.
7980e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%
80572e097d004eac4b9767c11eec49d054e413ab00cristy%  The format of the ValidateColorspaces method is:
8180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%
82572e097d004eac4b9767c11eec49d054e413ab00cristy%      size_t ValidateColorspaces(ImageInfo *image_info,size_t *fail,
83572e097d004eac4b9767c11eec49d054e413ab00cristy%        ExceptionInfo *exception)
8480e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%
8580e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%  A description of each parameter follows:
8680e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%
8780e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%    o image_info: the image info.
8880e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%
8980e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%    o fail: return the number of validation tests that pass.
9080e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%
9180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%    o exception: return any errors or warnings in this structure.
9280e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%
9380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy*/
948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
958d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertHSIToRGB(const double hue,const double saturation,
968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double intensity,double *red,double *green,double *blue)
978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    h;
1008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
1018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  h=360.0*hue;
1028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  h-=360.0*floor(h/360.0);
1038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if (h < 120.0)
1048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
1058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *blue=intensity*(1.0-saturation);
1068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *red=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
1078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        (MagickPI/180.0)));
1088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *green=3.0*intensity-*red-*blue;
1098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
1108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
1118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    if (h < 240.0)
1128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      {
1138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        h-=120.0;
1148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        *red=intensity*(1.0-saturation);
1158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        *green=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
1168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy          (MagickPI/180.0)));
1178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        *blue=3.0*intensity-*red-*green;
1188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      }
1198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    else
1208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      {
1218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        h-=240.0;
1228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        *green=intensity*(1.0-saturation);
1238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        *blue=intensity*(1.0+saturation*cos(h*(MagickPI/180.0))/cos((60.0-h)*
1248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy          (MagickPI/180.0)));
1258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        *red=3.0*intensity-*green-*blue;
1268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      }
1278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *red*=QuantumRange;
1288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *green*=QuantumRange;
1298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *blue*=QuantumRange;
1308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
1318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
1328d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToHSI(const double red,const double green,
1338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *hue,double *saturation,double *intensity)
1348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
1358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
1368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    alpha,
1378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    beta;
1388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
1398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *intensity=(QuantumScale*red+QuantumScale*green+QuantumScale*blue)/3.0;
1408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if (*intensity <= 0.0)
1418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
1428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *hue=0.0;
1438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *saturation=0.0;
1448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      return;
1458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
1468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *saturation=1.0-MagickMin(QuantumScale*red,MagickMin(QuantumScale*green,
1478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    QuantumScale*blue))/(*intensity);
1488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  alpha=0.5*(2.0*QuantumScale*red-QuantumScale*green-QuantumScale*blue);
1498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  beta=0.8660254037844385*(QuantumScale*green-QuantumScale*blue);
1508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *hue=atan2(beta,alpha)*(180.0/MagickPI)/360.0;
1518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if (*hue < 0.0)
1528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    *hue+=1.0;
1538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
1548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
1558d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertHSVToRGB(const double hue,const double saturation,
1568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double value,double *red,double *green,double *blue)
1578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
1588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
1598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    c,
1608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    h,
1618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    min,
1628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    x;
1638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
1648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  h=hue*360.0;
1658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  c=value*saturation;
1668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  min=value-c;
1678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  h-=360.0*floor(h/360.0);
1688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  h/=60.0;
1698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  x=c*(1.0-fabs(h-2.0*floor(h/2.0)-1.0));
1708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  switch ((int) floor(h))
1718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  {
1728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    case 0:
1738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
1748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *red=QuantumRange*(min+c);
1758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *green=QuantumRange*(min+x);
1768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *blue=QuantumRange*min;
1778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      break;
1788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
1798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    case 1:
1808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
1818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *red=QuantumRange*(min+x);
1828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *green=QuantumRange*(min+c);
1838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *blue=QuantumRange*min;
1848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      break;
1858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
1868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    case 2:
1878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
1888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *red=QuantumRange*min;
1898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *green=QuantumRange*(min+c);
1908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *blue=QuantumRange*(min+x);
1918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      break;
1928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
1938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    case 3:
1948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
1958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *red=QuantumRange*min;
1968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *green=QuantumRange*(min+x);
1978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *blue=QuantumRange*(min+c);
1988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      break;
1998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
2008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    case 4:
2018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
2028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *red=QuantumRange*(min+x);
2038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *green=QuantumRange*min;
2048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *blue=QuantumRange*(min+c);
2058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      break;
2068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
2078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    case 5:
2088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
2098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *red=QuantumRange*(min+c);
2108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *green=QuantumRange*min;
2118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *blue=QuantumRange*(min+x);
2128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      break;
2138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
2148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    default:
2158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
2168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *red=0.0;
2178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *green=0.0;
2188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *blue=0.0;
2198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
2208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  }
2218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
2228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
2238d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertRGBToXYZ(const double red,const double green,
2248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *X,double *Y,double *Z)
2258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
2268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
2278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b,
2288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
2298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r;
2308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
2318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  r=QuantumScale*DecodePixelGamma(red);
2328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  g=QuantumScale*DecodePixelGamma(green);
2338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  b=QuantumScale*DecodePixelGamma(blue);
2348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *X=0.41239558896741421610*r+0.35758343076371481710*g+0.18049264738170157350*b;
2358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Y=0.21258623078559555160*r+0.71517030370341084990*g+0.07220049864333622685*b;
2368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Z=0.01929721549174694484*r+0.11918386458084853180*g+0.95049712513157976600*b;
2378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
2388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
2398d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToLab(const double X,const double Y,const double Z,
2408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *L,double *a,double *b)
2418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
2428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
2438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    x,
2448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y,
2458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    z;
2468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
2478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((X/D65X) > CIEEpsilon)
2488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    x=pow(X/D65X,1.0/3.0);
2498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
2508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    x=(CIEK*X/D65X+16.0)/116.0;
2518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((Y/D65Y) > CIEEpsilon)
2528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y=pow(Y/D65Y,1.0/3.0);
2538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
2548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y=(CIEK*Y/D65Y+16.0)/116.0;
2558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((Z/D65Z) > CIEEpsilon)
2568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    z=pow(Z/D65Z,1.0/3.0);
2578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
2588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    z=(CIEK*Z/D65Z+16.0)/116.0;
2598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *L=((116.0*y)-16.0)/100.0;
2608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *a=(500.0*(x-y))/255.0+0.5;
2618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *b=(200.0*(y-z))/255.0+0.5;
2628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
2638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
2648d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToLab(const double red,const double green,
2658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *L,double *a,double *b)
2668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
2678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
2688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    X,
2698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y,
2708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Z;
2718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
2728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
2738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToLab(X,Y,Z,L,a,b);
2748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
2758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
2768d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLabToXYZ(const double L,const double a,const double b,
2778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *X,double *Y,double *Z)
2788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
2798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
2808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    x,
2818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y,
2828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    z;
2838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
2848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  y=(L+16.0)/116.0;
2858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  x=y+a/500.0;
2868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  z=y-b/200.0;
2878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((x*x*x) > CIEEpsilon)
2888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    x=(x*x*x);
2898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
2908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    x=(116.0*x-16.0)/CIEK;
2918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((y*y*y) > CIEEpsilon)
2928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y=(y*y*y);
2938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
2948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y=L/CIEK;
2958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((z*z*z) > CIEEpsilon)
2968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    z=(z*z*z);
2978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
2988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    z=(116.0*z-16.0)/CIEK;
2998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *X=D65X*x;
3008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Y=D65Y*y;
3018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Z=D65Z*z;
3028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3048d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToRGB(const double x,const double y,const double z,
3058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *red,double *green,double *blue)
3068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
3088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b,
3098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
3108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r;
3118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  r=3.2406*x-1.5372*y-0.4986*z;
3138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  g=(-0.9689*x+1.8758*y+0.0415*z);
3148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  b=0.0557*x-0.2040*y+1.0570*z;
3158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *red=EncodePixelGamma(QuantumRange*r);
3168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *green=EncodePixelGamma(QuantumRange*g);
3178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *blue=EncodePixelGamma(QuantumRange*b);
3188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3208d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLabToRGB(const double L,const double a,
3218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double b,double *red,double *green,double *blue)
3228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
3248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    X,
3258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y,
3268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Z;
3278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertLabToXYZ(L*100.0,255.0*(a-0.5),255.0*(b-0.5),&X,&Y,&Z);
3298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToRGB(X,Y,Z,red,green,blue);
3308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3328d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYPbPr(const double red,const double green,
3338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *Y,double *Pb,double *Pr)
3348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
3368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Pb=QuantumScale*((-0.1687367)*red-0.331264*green+0.5*blue)+0.5;
3378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Pr=QuantumScale*(0.5*red-0.418688*green-0.081312*blue)+0.5;
3388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3408d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYCbCr(const double red,const double green,
3418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *Y,double *Cb,double *Cr)
3428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToYPbPr(red,green,blue,Y,Cb,Cr);
3448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3468d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYPbPrToRGB(const double Y,const double Pb,const double Pr,
3478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *red,double *green,double *blue)
3488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *red=QuantumRange*(0.99999999999914679361*Y-1.2188941887145875e-06*(Pb-0.5)+
3508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    1.4019995886561440468*(Pr-0.5));
3518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *green=QuantumRange*(0.99999975910502514331*Y-0.34413567816504303521*(Pb-0.5)-
3528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.71413649331646789076*(Pr-0.5));
3538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *blue=QuantumRange*(1.00000124040004623180*Y+1.77200006607230409200*(Pb-0.5)+
3548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    2.1453384174593273e-06*(Pr-0.5));
3558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3578d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYCbCrToRGB(const double Y,const double Cb,
3588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double Cr,double *red,double *green,double *blue)
3598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertYPbPrToRGB(Y,Cb,Cr,red,green,blue);
3618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3638d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLCHabToXYZ(const double luma,const double chroma,
3648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double hue,double *X,double *Y,double *Z)
3658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertLabToXYZ(luma,chroma*cos(hue*MagickPI/180.0),chroma*
3678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    sin(hue*MagickPI/180.0),X,Y,Z);
3688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3708d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertLCHabToRGB(const double luma,const double chroma,
3718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double hue,double *red,double *green,double *blue)
3728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
3748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    X,
3758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y,
3768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Z;
3778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3786d897c70de36922ef314127ac8a202e0605bbeadcristy  ConvertLCHabToXYZ(luma*100.0,255.0*(chroma-0.5),360.0*hue,&X,&Y,&Z);
3798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToRGB(X,Y,Z,red,green,blue);
3808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
3818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3828d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToHSV(const double red,const double green,
3838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *hue,double *saturation,double *value)
3848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
3858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
3868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    c,
3878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    max,
3888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    min;
3898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
3908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  max=MagickMax(QuantumScale*red,MagickMax(QuantumScale*green,
3918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    QuantumScale*blue));
3928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  min=MagickMin(QuantumScale*red,MagickMin(QuantumScale*green,
3938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    QuantumScale*blue));
3948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  c=max-min;
3958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *value=max;
3968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if (c <= 0.0)
3978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
3988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *hue=0.0;
3998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *saturation=0.0;
4008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      return;
4018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
4028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if (max == (QuantumScale*red))
4038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    {
4048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *hue=(QuantumScale*green-QuantumScale*blue)/c;
4058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      if ((QuantumScale*green) < (QuantumScale*blue))
4068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        *hue+=6.0;
4078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    }
4088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
4098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    if (max == (QuantumScale*green))
4108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *hue=2.0+(QuantumScale*blue-QuantumScale*red)/c;
4118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    else
4128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      *hue=4.0+(QuantumScale*red-QuantumScale*green)/c;
4138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *hue*=60.0/360.0;
4148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *saturation=c/max;
4158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
4168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4178d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToLCHab(const double X,const double Y,
4188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double Z,double *luma,double *chroma,double *hue)
4198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
4208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
4218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    a,
4228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
4238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToLab(X,Y,Z,luma,&a,&b);
425846740b998cb0bf740d221ac20bd53e7fe3acaaccristy  *chroma=hypot(255.0*(a-0.5),255.0*(b-0.5))/255.0+0.5;
4266d897c70de36922ef314127ac8a202e0605bbeadcristy  *hue=180.0*atan2(255.0*(b-0.5),255.0*(a-0.5))/MagickPI/360.0;
4278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if (*hue < 0.0)
4288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    *hue+=1.0;
4298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
4308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4318d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToLCHab(const double red,const double green,
4328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *luma,double *chroma,double *hue)
4338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
4348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
4358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    X,
4368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y,
4378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Z;
4388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
4408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToLCHab(X,Y,Z,luma,chroma,hue);
4418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
4428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4438d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLMSToXYZ(const double L,const double M,const double S,
4448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *X,double *Y,double *Z)
4458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
4468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *X=1.096123820835514*L-0.278869000218287*M+0.182745179382773*S;
4478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Y=0.454369041975359*L+0.473533154307412*M+0.072097803717229*S;
4488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Z=(-0.009627608738429)*L-0.005698031216113*M+1.015325639954543*S;
4498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
4508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4518d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLMSToRGB(const double L,const double M,
4528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double S,double *red,double *green,double *blue)
4538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
4548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
4558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    X,
4568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y,
4578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Z;
4588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertLMSToXYZ(L,M,S,&X,&Y,&Z);
4608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToRGB(X,Y,Z,red,green,blue);
4618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
4628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4638d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToLMS(const double x,const double y,
4648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double z,double *L,double *M,double *S)
4658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
4668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *L=0.7328*x+0.4296*y-0.1624*z;
4678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *M=(-0.7036*x+1.6975*y+0.0061*z);
4688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *S=0.0030*x+0.0136*y+0.9834*z;
4698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
4708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4718d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToLMS(const double red,const double green,
4728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *L,double *M,double *S)
4738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
4748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
4758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    X,
4768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y,
4778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Z;
4788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
4808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToLMS(X,Y,Z,L,M,S);
4818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
4828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4838d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToLuv(const double X,const double Y,const double Z,
4848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *L,double *u,double *v)
4858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
4868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
4878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    alpha;
4888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
4898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((Y/D65Y) > CIEEpsilon)
4908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    *L=(double) (116.0*pow(Y/D65Y,1.0/3.0)-16.0);
4918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
4928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    *L=CIEK*(Y/D65Y);
4938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  alpha=PerceptibleReciprocal(X+15.0*Y+3.0*Z);
4948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *u=13.0*(*L)*((4.0*alpha*X)-(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z)));
4958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *v=13.0*(*L)*((9.0*alpha*Y)-(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z)));
4968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *L/=100.0;
4978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *u=(*u+134.0)/354.0;
4988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *v=(*v+140.0)/262.0;
4998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5018d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToLuv(const double red,const double green,
5028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *L,double *u,double *v)
5038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
5058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    X,
5068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y,
5078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Z;
5088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
5108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToLuv(X,Y,Z,L,u,v);
5118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5138d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLuvToXYZ(const double L,const double u,const double v,
5148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *X,double *Y,double *Z)
5158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if (L > (CIEK*CIEEpsilon))
5178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    *Y=(double) pow((L+16.0)/116.0,3.0);
5188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  else
5198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    *Y=L/CIEK;
5208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *X=((*Y*((39.0*L/(v+13.0*L*(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z))))-5.0))+
5218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    5.0*(*Y))/((((52.0f*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/
5228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    3.0)-(-1.0/3.0));
5238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Z=(*X*(((52.0f*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/3.0))-
5248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    5.0*(*Y);
5258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5278d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLuvToRGB(const double L,const double u,
5288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double v,double *red,double *green,double *blue)
5298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
5318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    X,
5328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y,
5338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Z;
5348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertLuvToXYZ(100.0*L,354.0*u-134.0,262.0*v-140.0,&X,&Y,&Z);
5368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToRGB(X,Y,Z,red,green,blue);
5378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5398d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYDbDr(const double red,const double green,
5408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *Y,double *Db,double *Dr)
5418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
5438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Db=QuantumScale*(-0.450*red-0.883*green+1.333*blue)+0.5;
5448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Dr=QuantumScale*(-1.333*red+1.116*green+0.217*blue)+0.5;
5458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5478d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYDbDrToRGB(const double Y,const double Db,const double Dr,
5488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *red,double *green,double *blue)
5498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *red=QuantumRange*(Y+9.2303716147657e-05*(Db-0.5)-0.52591263066186533*
5518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (Dr-0.5));
5528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *green=QuantumRange*(Y-0.12913289889050927*(Db-0.5)+0.26789932820759876*
5538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (Dr-0.5));
5548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *blue=QuantumRange*(Y+0.66467905997895482*(Db-0.5)-7.9202543533108e-05*
5558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (Dr-0.5));
5568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5588d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYIQ(const double red,const double green,
5598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *Y,double *I,double *Q)
5608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
5628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *I=QuantumScale*(0.595716*red-0.274453*green-0.321263*blue)+0.5;
5638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Q=QuantumScale*(0.211456*red-0.522591*green+0.311135*blue)+0.5;
5648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5668d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYIQToRGB(const double Y,const double I,const double Q,
5678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *red,double *green,double *blue)
5688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *red=QuantumRange*(Y+0.9562957197589482261*(I-0.5)+0.6210244164652610754*
5708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (Q-0.5));
5718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *green=QuantumRange*(Y-0.2721220993185104464*(I-0.5)-0.6473805968256950427*
5728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (Q-0.5));
5738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *blue=QuantumRange*(Y-1.1069890167364901945*(I-0.5)+1.7046149983646481374*
5748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (Q-0.5));
5758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5778d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYUV(const double red,const double green,
5788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  const double blue,double *Y,double *U,double *V)
5798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
5818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *U=QuantumScale*((-0.147)*red-0.289*green+0.436*blue)+0.5;
5828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *V=QuantumScale*(0.615*red-0.515*green-0.100*blue)+0.5;
5838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5858d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYUVToRGB(const double Y,const double U,const double V,
5868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double *red,double *green,double *blue)
5878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *red=QuantumRange*(Y-3.945707070708279e-05*(U-0.5)+1.1398279671717170825*
5898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (V-0.5));
5908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *green=QuantumRange*(Y-0.3946101641414141437*(U-0.5)-0.5805003156565656797*
5918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (V-0.5));
5928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  *blue=QuantumRange*(Y+2.0319996843434342537*(U-0.5)-4.813762626262513e-04*
5938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (V-0.5));
5948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
5958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
5968d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateHSIToRGB()
5978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
5988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
5998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
6008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
6018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
6028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
603b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  HSIToRGB");
6048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertHSIToRGB(111.244375/360.0,0.295985,0.658734,&r,&g,&b);
6058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
6068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
6078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
6088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
6098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
6108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
6118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
6128d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToHSI()
6138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
6148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
6158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    h,
6168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    i,
6178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    s;
6188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
619b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToHSI");
6208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToHSI(0.545877*QuantumRange,0.966567*QuantumRange,
6218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&h,&s,&i);
6228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(h-111.244374/360.0) >= ReferenceEpsilon) ||
6238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(s-0.295985) >= ReferenceEpsilon) ||
6248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(i-0.658734) >= ReferenceEpsilon))
6258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
6268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
6278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
6288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
6298d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateHSLToRGB()
6308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
6318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
6328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
6338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
6348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
6358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
636b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  HSLToRGB");
6378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertHSLToRGB(110.200859/360.0,0.882623,0.715163,&r,&g,&b);
6388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
6398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
6408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
6418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
6428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
6438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
6448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
6458d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToHSL()
6468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
6478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
6488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    h,
6498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    l,
6508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    s;
6518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
652b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToHSL");
6538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToHSL(0.545877*QuantumRange,0.966567*QuantumRange,
6548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&h,&s,&l);
6558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(h-110.200859/360.0) >= ReferenceEpsilon) ||
6568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(s-0.882623) >= ReferenceEpsilon) ||
6578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(l-0.715163) >= ReferenceEpsilon))
6588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
6598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
6608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
6618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
6628d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateHSVToRGB()
6638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
6648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
6658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
6668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
6678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
6688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
669b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  HSVToRGB");
6708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertHSVToRGB(110.200859/360.0,0.520200,0.966567,&r,&g,&b);
6718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
6728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
6738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
6748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
6758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
6768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
6778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
6788d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToHSV()
6798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
6808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
6818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    h,
6828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    s,
6838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    v;
6848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
685b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToHSV");
6868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToHSV(0.545877*QuantumRange,0.966567*QuantumRange,
6878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&h,&s,&v);
6888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(h-110.200859/360.0) >= ReferenceEpsilon) ||
6898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(s-0.520200) >= ReferenceEpsilon) ||
6908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(v-0.966567) >= ReferenceEpsilon))
6918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
6928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
6938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
6948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
6958d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToJPEGYCbCr()
6968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
6978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
6988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Cb,
6998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Cr,
7008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y;
7018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
702b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToJPEGYCbCr");
7038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToYCbCr(0.545877*QuantumRange,0.966567*QuantumRange,
7048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&Y,&Cb,&Cr);
7058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(Y-0.783460) >= ReferenceEpsilon) ||
7068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(Cb-0.319581) >= ReferenceEpsilon) ||
7078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(Cr-0.330539) >= ReferenceEpsilon))
7088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
7098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
7108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
7118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
7128d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateJPEGYCbCrToRGB()
7138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
7148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
7158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
7168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
7178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
7188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
719b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  JPEGYCbCrToRGB");
7208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertYCbCrToRGB(0.783460,0.319581,0.330539,&r,&g,&b);
7218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
7228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
7238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
7248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
7258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
7268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
7278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
7288d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateLabToRGB()
7298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
7308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
7318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
7328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
7338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
7348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
735b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  LabToRGB");
7368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertLabToRGB(88.456154/100.0,-54.671483/255+0.5,51.662818/255.0+0.5,
7378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    &r,&g,&b);
7388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
7398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
7408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
7418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
7428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
7438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
7448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
7458d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToLab()
7468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
7478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
7488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    a,
7498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b,
7508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    L;
7518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
752b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToLab");
7538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToLab(0.545877*QuantumRange,0.966567*QuantumRange,
7548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&L,&a,&b);
7558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(L-(88.456154/100.0)) >= ReferenceEpsilon) ||
7568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(a-(-54.671483/255.0+0.5)) >= ReferenceEpsilon) ||
7578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-(51.662818/255.0+0.5)) >= ReferenceEpsilon))
7588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
7598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
7608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
7618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
7628d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateLchToRGB()
7638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
7648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
7658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b,
7668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
7678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r;
7688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
769b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  LchToRGB");
770a44ed133a90ea6d89ed574ecf2db9f033875dd25cristy  ConvertLCHabToRGB(88.456154/100.0,75.219797/255.0+0.5,136.620717/360.0,
7718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    &r,&g,&b);
7728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
7738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
7748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
7758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
7768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
7778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
7788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
7798d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToLch()
7808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
7818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
7828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    c,
7838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    h,
7848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    L;
7858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
786b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToLch");
7878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToLCHab(0.545877*QuantumRange,0.966567*QuantumRange,
7888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&L,&c,&h);
7898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(L-88.456154/100.0) >= ReferenceEpsilon) ||
7908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(c-(75.219797/255.0+0.5)) >= ReferenceEpsilon) ||
7918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(h-(136.620717/255.0+0.5)) >= ReferenceEpsilon))
7928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
7938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
7948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
7958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
7968d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToLMS()
7978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
7988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
7998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    L,
8008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    M,
8018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    S;
8028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
803b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToLMS");
8048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToLMS(0.545877*QuantumRange,0.966567*QuantumRange,
8058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&L,&M,&S);
8068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(L-0.611749) >= ReferenceEpsilon) ||
8078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(M-0.910088) >= ReferenceEpsilon) ||
8088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(S-0.294880) >= ReferenceEpsilon))
8098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
8108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
8118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
8128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
8138d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateLMSToRGB()
8148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
8158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
8168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
8178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
8188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
8198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
820b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  LMSToRGB");
8218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertLMSToRGB(0.611749,0.910088,0.294880,&r,&g,&b);
8228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
8238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
8248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
8258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
8268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
8278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
8288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
8298d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToLuv()
8308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
8318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
8328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    l,
8338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    u,
8348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    v;
8358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
836b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToLuv");
8378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToLuv(0.545877*QuantumRange,0.966567*QuantumRange,
8388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&l,&u,&v);
8398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(l-88.456154/262.0) >= ReferenceEpsilon) ||
8408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(u-(-51.330414+134.0)/354.0) >= ReferenceEpsilon) ||
8418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(v-(76.405526+140.0)/262.0) >= ReferenceEpsilon))
8428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
8438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
8448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
8458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
8468d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateLuvToRGB()
8478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
8488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
8498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
8508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
8518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
8528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
853b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  LuvToRGB");
8548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertLuvToRGB(88.456154/100.0,(-51.330414+134.0)/354.0,
8558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (76.405526+140.0)/262.0,&r,&g,&b);
8568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
8578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
8588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
8598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
8608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
8618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
8628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
8638d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToXYZ()
8648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
8658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
8668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    x,
8678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y,
8688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    z;
8698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
870b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToXYZ");
8718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToXYZ(0.545877*QuantumRange,0.966567*QuantumRange,
8728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&x,&y,&z);
8738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(x-0.470646) >= ReferenceEpsilon) ||
8748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(y-0.730178) >= ReferenceEpsilon) ||
8758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(z-0.288324) >= ReferenceEpsilon))
8768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
8778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
8788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
8798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
8808d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateXYZToRGB()
8818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
8828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
8838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
8848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
8858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
8868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
887b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  XYZToRGB");
8888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertXYZToRGB(0.470646,0.730178,0.288324,&r,&g,&b);
8898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
8908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
8918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
8928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
8938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
8948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
8958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
8968d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateYDbDrToRGB()
8978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
8988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
8998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
9008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
9018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
9028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
903b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  YDbDrToRGB");
9048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertYDbDrToRGB(0.783460,-0.480932+0.5,0.451670+0.5,&r,&g,&b);
9058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
9068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
9078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
9088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
9098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
9108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
9118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
9128d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToYDbDr()
9138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
9148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
9158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Db,
9168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Dr,
9178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y;
9188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
919b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToYDbDr");
9208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToYDbDr(0.545877*QuantumRange,0.966567*QuantumRange,
9218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&Y,&Db,&Dr);
9228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(Y-0.783460) >= ReferenceEpsilon) ||
9238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(Db-(-0.480932)) >= ReferenceEpsilon) ||
9248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(Dr-0.451670) >= ReferenceEpsilon))
9258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
9268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
9278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
9288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
9298d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToYIQ()
9308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
9318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
9328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    i,
9338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    q,
9348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y;
9358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
936b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToYIQ");
9378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToYIQ(0.545877*QuantumRange,0.966567*QuantumRange,
9388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&y,&i,&q);
9398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(y-0.783460) >= ReferenceEpsilon) ||
9408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(i-(-0.089078)) >= ReferenceEpsilon) ||
9418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(q-(-0.245399)) >= ReferenceEpsilon))
9428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
9438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
9448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
9458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
9468d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateYIQToRGB()
9478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
9488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
9498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
9508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
9518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
9528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
953b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  YIQToRGB");
9548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertYIQToRGB(0.783460,-0.089078+0.5,-0.245399+0.5,&r,&g,&b);
9558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
9568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
9578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
9588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
9598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
9608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
9618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
9628d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToYPbPr()
9638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
9648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
9654ae2e76b21b83f50574ba536540f9cd3c88188bdcristy    Pb,
9664ae2e76b21b83f50574ba536540f9cd3c88188bdcristy    Pr,
9678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    y;
9688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
969b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToYPbPr");
9708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToYPbPr(0.545877*QuantumRange,0.966567*QuantumRange,
9714ae2e76b21b83f50574ba536540f9cd3c88188bdcristy    0.463759*QuantumRange,&y,&Pb,&Pr);
9728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(y-0.783460) >= ReferenceEpsilon) ||
9734ae2e76b21b83f50574ba536540f9cd3c88188bdcristy      (fabs(Pb-(-0.180419)) >= ReferenceEpsilon) ||
9744ae2e76b21b83f50574ba536540f9cd3c88188bdcristy      (fabs(Pr-(-0.169461)) >= ReferenceEpsilon))
9758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
9768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
9778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
9788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
9798d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateYPbPrToRGB()
9808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
9818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
9828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
9838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
9848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
9858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
986b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  YPbPrToRGB");
9878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertYPbPrToRGB(0.783460,-0.180419+0.5,-0.169461+0.5,&r,&g,&b);
9888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
9898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
9908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
9918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
9928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
9938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
9948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
9958d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToYUV()
9968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
9978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
9988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    U,
9998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    V,
10008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    Y;
10018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
1002b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  RGBToYUV");
10038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertRGBToYUV(0.545877*QuantumRange,0.966567*QuantumRange,
10048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    0.463759*QuantumRange,&Y,&U,&V);
10058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(Y-0.783460) >= ReferenceEpsilon) ||
10068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(U-(-0.157383)) >= ReferenceEpsilon) ||
10078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(V-(-0.208443)) >= ReferenceEpsilon))
10088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
10098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
10108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
10118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
10128d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateYUVToRGB()
10138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{
10148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  double
10158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    r,
10168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    g,
10178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    b;
10188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
1019b8588ab056bf28af990771e35d8eaf525f995183cristy  (void) FormatLocaleFile(stdout,"  YUVToRGB");
10208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  ConvertYUVToRGB(0.783460,-0.157383+0.5,-0.208443+0.5,&r,&g,&b);
10218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) ||
10228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) ||
10238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon))
10248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    return(MagickFalse);
10258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  return(MagickTrue);
10268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy}
10278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
1028572e097d004eac4b9767c11eec49d054e413ab00cristystatic size_t ValidateColorspaces(ImageInfo *image_info,size_t *fail,
102980e870e307fe251f8756b5cf8a528ff5331a1d2bcristy  ExceptionInfo *exception)
103080e870e307fe251f8756b5cf8a528ff5331a1d2bcristy{
103180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy  MagickBooleanType
103280e870e307fe251f8756b5cf8a528ff5331a1d2bcristy    status;
103380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy
103480e870e307fe251f8756b5cf8a528ff5331a1d2bcristy  size_t
103580e870e307fe251f8756b5cf8a528ff5331a1d2bcristy    test;
103680e870e307fe251f8756b5cf8a528ff5331a1d2bcristy
10378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  /*
103892e5cea4a87c0f3752e09aecf1477d705f64a998cristy     Reference: https://code.google.com/p/chroma.
10398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
10408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     Illuminant =  D65
10418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     Observer   =  2° (1931)
10428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy
10438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     XYZ            0.470645,   0.730177,   0.288323
10448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     sRGB           0.545877,   0.966567,   0.463759
10458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     CAT02 LMS      0.611749,   0.910088,   0.294880
10468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     Y'DbDr         0.783460,  -0.480932,   0.451670
10478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     Y'IQ           0.783460,  -0.089078,  -0.245399
10488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     Y'PbPr         0.783460,  -0.180419,  -0.169461
10498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     Y'UV           0.783460,  -0.157383,  -0.208443
10508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     JPEG-Y'CbCr    0.783460,   0.319581,   0.330539
10518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     L*u*v*        88.456154, -51.330414,  76.405526
10528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     L*a*b*        88.456154, -54.671483,  51.662818
10538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     L*C*H*        88.456154,  75.219797, 136.620717
10548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     HSV          110.200859,   0.520200,   0.966567
10558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     HSL          110.200859,   0.882623,   0.715163
10568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     HSI          111.244375,   0.295985,   0.658734
10578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy     Y'CbCr       187.577791,  87.586330,  90.040886
10588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  */
105980e870e307fe251f8756b5cf8a528ff5331a1d2bcristy  (void) FormatLocaleFile(stdout,"validate colorspaces:\n");
10608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  for (test=0; test < 26; test++)
10618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  {
10628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    CatchException(exception);
10638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (void) FormatLocaleFile(stdout,"  test %.20g: ",(double) test);
10648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    switch (test)
106580e870e307fe251f8756b5cf8a528ff5331a1d2bcristy    {
10668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  0: status=ValidateHSIToRGB(); break;
10678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  1: status=ValidateRGBToHSI(); break;
10688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  2: status=ValidateHSLToRGB(); break;
10698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  3: status=ValidateRGBToHSL(); break;
10708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  4: status=ValidateHSVToRGB(); break;
10718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  5: status=ValidateRGBToHSV(); break;
10728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  6: status=ValidateJPEGYCbCrToRGB(); break;
10738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  7: status=ValidateRGBToJPEGYCbCr(); break;
10748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  8: status=ValidateLabToRGB(); break;
10758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case  9: status=ValidateRGBToLab(); break;
10768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 10: status=ValidateLchToRGB(); break;
10778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 11: status=ValidateRGBToLch(); break;
10788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 12: status=ValidateLMSToRGB(); break;
10798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 13: status=ValidateRGBToLMS(); break;
10808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 14: status=ValidateLuvToRGB(); break;
10818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 15: status=ValidateRGBToLuv(); break;
10828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 16: status=ValidateXYZToRGB(); break;
10838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 17: status=ValidateRGBToXYZ(); break;
10848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 18: status=ValidateYDbDrToRGB(); break;
10858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 19: status=ValidateRGBToYDbDr(); break;
10868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 20: status=ValidateYIQToRGB(); break;
10878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 21: status=ValidateRGBToYIQ(); break;
10888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 22: status=ValidateYPbPrToRGB(); break;
10898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 23: status=ValidateRGBToYPbPr(); break;
10908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 24: status=ValidateYUVToRGB(); break;
10918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      case 25: status=ValidateRGBToYUV(); break;
10928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      default: status=MagickFalse;
109380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy    }
1094b8588ab056bf28af990771e35d8eaf525f995183cristy    if (status == MagickFalse)
10958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      {
10968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
10978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy          GetMagickModule());
10988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        (*fail)++;
10998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy        continue;
11008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy      }
11018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy    (void) FormatLocaleFile(stdout,"... pass.\n");
11028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy  }
110380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy  (void) FormatLocaleFile(stdout,
110480e870e307fe251f8756b5cf8a528ff5331a1d2bcristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
110580e870e307fe251f8756b5cf8a528ff5331a1d2bcristy    (double) (test-(*fail)),(double) *fail);
110680e870e307fe251f8756b5cf8a528ff5331a1d2bcristy  return(test);
110780e870e307fe251f8756b5cf8a528ff5331a1d2bcristy}
110880e870e307fe251f8756b5cf8a528ff5331a1d2bcristy
110980e870e307fe251f8756b5cf8a528ff5331a1d2bcristy/*
111080e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%                                                                             %
111280e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%                                                                             %
111380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%                                                                             %
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e C o m p a r e C o m m a n d                               %
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateCompareCommand() validates the ImageMagick compare command line
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateCompareCommand method is:
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1125bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateCompareCommand(ImageInfo *image_info,
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1127bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1142bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateCompareCommand(ImageInfo *image_info,
11430d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
11440d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
1148151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    command[MagickPathExtent];
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1156bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1160bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
1164b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,"validate compare command line program:\n");
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; compare_options[i] != (char *) NULL; i++)
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
1168b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"  test %.20g: %s",(double) (test++),
11696aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      compare_options[i]);
1170151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(command,MagickPathExtent,"%s %s %s %s",
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      compare_options[i],reference_filename,reference_filename,output_filename);
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11751e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
11761e604812fad85bb96f757a2393015ae3d061c39acristy          GetMagickModule());
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11808a9106f4d81487da0f318bd13b4caa4cd24f23afcristy    status=CompareImagesCommand(image_info,number_arguments,arguments,
11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
1182e42f658533644aecb733785ffd91b286d6778deacristy    for (j=0; j < (ssize_t) number_arguments; j++)
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
11853589219a2c7a9a59bfa63dd5171a27b1c9424cf1cristy    if (status == MagickFalse)
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11871e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
11881e604812fad85bb96f757a2393015ae3d061c39acristy          GetMagickModule());
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1192b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"... pass.\n");
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
1194b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
119575a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
119675a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e C o m p o s i t e C o m m a n d                           %
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateCompositeCommand() validates the ImageMagick composite command line
12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateCompositeCommand method is:
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1216bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateCompositeCommand(ImageInfo *image_info,
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1218bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1233bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateCompositeCommand(ImageInfo *image_info,
12340d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
12350d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
1239151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    command[MagickPathExtent];
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1247bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1251bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
1255b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,"validate composite command line program:\n");
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; composite_options[i] != (char *) NULL; i++)
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
1259b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"  test %.20g: %s",(double) (test++),
12606aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      composite_options[i]);
1261151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(command,MagickPathExtent,"%s %s %s %s",
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_filename,composite_options[i],reference_filename,
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      output_filename);
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12671e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
12681e604812fad85bb96f757a2393015ae3d061c39acristy          GetMagickModule());
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=CompositeImageCommand(image_info,number_arguments,arguments,
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
1274e42f658533644aecb733785ffd91b286d6778deacristy    for (j=0; j < (ssize_t) number_arguments; j++)
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
12773589219a2c7a9a59bfa63dd5171a27b1c9424cf1cristy    if (status == MagickFalse)
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12791e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
12801e604812fad85bb96f757a2393015ae3d061c39acristy          GetMagickModule());
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1284b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"... pass.\n");
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
1286b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
128775a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
128875a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e C o n v e r t C o m m a n d                               %
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateConvertCommand() validates the ImageMagick convert command line
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateConvertCommand method is:
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1308bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateConvertCommand(ImageInfo *image_info,
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1310bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1325bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateConvertCommand(ImageInfo *image_info,
13260d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
13270d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
1331151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    command[MagickPathExtent];
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1339bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1343bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
1347b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,"validate convert command line program:\n");
13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; convert_options[i] != (char *) NULL; i++)
13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
1351b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"  test %.20g: %s",(double) test++,
13526aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      convert_options[i]);
1353151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(command,MagickPathExtent,"%s %s %s %s",
13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_filename,convert_options[i],reference_filename,output_filename);
13553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
13573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13581e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
13591e604812fad85bb96f757a2393015ae3d061c39acristy          GetMagickModule());
13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
13613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=ConvertImageCommand(image_info,number_arguments,arguments,
13643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
1365e42f658533644aecb733785ffd91b286d6778deacristy    for (j=0; j < (ssize_t) number_arguments; j++)
13663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
13683589219a2c7a9a59bfa63dd5171a27b1c9424cf1cristy    if (status == MagickFalse)
13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
13701e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
13711e604812fad85bb96f757a2393015ae3d061c39acristy          GetMagickModule());
13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1375b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"... pass.\n");
13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
1377b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
137875a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
137975a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e I d e n t i f y C o m m a n d                             %
13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateIdentifyCommand() validates the ImageMagick identify command line
13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateIdentifyCommand method is:
13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1399bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateIdentifyCommand(ImageInfo *image_info,
14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1401bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1416bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateIdentifyCommand(ImageInfo *image_info,
14170d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
14180d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
1422151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    command[MagickPathExtent];
14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1430bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1434bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) output_filename;
14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
1439b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,"validate identify command line program:\n");
14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; identify_options[i] != (char *) NULL; i++)
14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
1443b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"  test %.20g: %s",(double) test++,
14446aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      identify_options[i]);
1445151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(command,MagickPathExtent,"%s %s",
14463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      identify_options[i],reference_filename);
14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
14501e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
14511e604812fad85bb96f757a2393015ae3d061c39acristy          GetMagickModule());
14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=IdentifyImageCommand(image_info,number_arguments,arguments,
14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
1457e42f658533644aecb733785ffd91b286d6778deacristy    for (j=0; j < (ssize_t) number_arguments; j++)
14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
14603589219a2c7a9a59bfa63dd5171a27b1c9424cf1cristy    if (status == MagickFalse)
14613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
14621e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
14631e604812fad85bb96f757a2393015ae3d061c39acristy          GetMagickModule());
14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1467b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"... pass.\n");
14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
1469b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
147075a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
147175a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   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                   %
14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateImageFormatsInMemory() validates the ImageMagick image formats in
14873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  memory and returns the number of validation tests that passed and failed.
14883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateImageFormatsInMemory method is:
14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1491bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateImageFormatsInMemory(ImageInfo *image_info,
14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1493bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
15084084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp
1509725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy/*
1510725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy  Enable this to count remaining $TMPDIR/magick-* files.  Note that the count
1511725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy  includes any files left over from other runs.
1512725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy*/
1513725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy#undef MagickCountTempFiles
15144084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp
1515bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImageFormatsInMemory(ImageInfo *image_info,
15160d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
15170d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
15204084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#ifdef MagickCountTempFiles
1521151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    path[MagickPathExtent],
1522151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    SystemCommand[MagickPathExtent],
15234084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#endif
1524151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    size[MagickPathExtent];
15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickInfo
15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magick_info;
15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distortion,
15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fuzz;
15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *difference_image,
15352c404226c827fe0799858fc345a1bea11f2cb546cristy    *ping_image,
15366b9ae3f81646d1b6a7d25f7125cb0ff943bad750cristy    *reconstruct_image,
1537100b8d9c4f78f07a52dac4aec46abfe4c2013196cristy    *reference_image;
15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1542bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
15443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
1547100b8d9c4f78f07a52dac4aec46abfe4c2013196cristy    length,
1548100b8d9c4f78f07a52dac4aec46abfe4c2013196cristy    test;
15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *blob;
15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
1554b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,"validate image formats in memory:\n");
15554084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp
15564084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#ifdef MagickCountTempFiles
15574084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp  (void)GetPathTemplate(path);
155833fb803e515438f6df0286aeceb21caa07849613glennrp  /* Remove file template except for the leading "/path/to/magick-" */
15594084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp  path[strlen(path)-17]='\0';
15604084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp  (void) FormatLocaleFile(stdout," tmp path is '%s*'\n",path);
15614084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#endif
15624084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp
15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; reference_formats[i].magick != (char *) NULL; i++)
15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
15653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magick_info=GetMagickInfo(reference_formats[i].magick,exception);
15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((magick_info == (const MagickInfo *) NULL) ||
15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (magick_info->decoder == (DecodeImageHandler *) NULL) ||
15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (magick_info->encoder == (EncodeImageHandler *) NULL))
15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
15705f1c1fff2a55c4d8756556e78c1f307d352ed1b8cristy    for (j=0; reference_types[j].type != UndefinedType; j++)
15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Generate reference image.
15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      CatchException(exception);
15761e604812fad85bb96f757a2393015ae3d061c39acristy      (void) FormatLocaleFile(stdout,"  test %.20g: %s/%s/%s/%.20g-bits",
15771e604812fad85bb96f757a2393015ae3d061c39acristy        (double) (test++),reference_formats[i].magick,CommandOptionToMnemonic(
15787998e5fecd99cd9838e7a960168f48b92d38bbfccristy        MagickCompressOptions,reference_formats[i].compression),
1579042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy        CommandOptionToMnemonic(MagickTypeOptions,reference_types[j].type),
158075a2623568540f98985ce5bb1d88687eb9c85d2ecristy        (double) reference_types[j].depth);
15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,reference_filename,
1582151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        MagickPathExtent);
15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
1584775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (reference_image == (Image *) NULL ||
1585775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
15871e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
15881e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1589775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Write reference image.
15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1596151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(size,MagickPathExtent,"%.20gx%.20g",
159775a2623568540f98985ce5bb1d88687eb9c85d2ecristy        (double) reference_image->columns,(double) reference_image->rows);
15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CloneString(&image_info->size,size);
15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->depth=reference_types[j].depth;
1600151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(reference_image->filename,MagickPathExtent,"%s:%s",
16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
1602018f07f7333b25743d0afff892450cebdb905c1acristy      status=SetImageType(reference_image,reference_types[j].type,exception);
1603775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
16051e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
16061e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1607775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
16128a11cb146177680bfc1b7d89a8cd0c8f2befe468cristy      status=SetImageDepth(reference_image,reference_types[j].depth,exception);
1613775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
16151e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
16161e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1617775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
16227998e5fecd99cd9838e7a960168f48b92d38bbfccristy      reference_image->compression=reference_formats[i].compression;
16236f9e0d38526c24e02e6207b1d494fa8fad072b9ccristy      status=WriteImage(image_info,reference_image,exception);
16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
1625775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
16271e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
16281e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1629775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
16342c404226c827fe0799858fc345a1bea11f2cb546cristy        Ping reference image.
16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1636151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(image_info->filename,MagickPathExtent,"%s:%s",
16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
16382c404226c827fe0799858fc345a1bea11f2cb546cristy      ping_image=PingImage(image_info,exception);
1639775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (ping_image == (Image *) NULL ||
1640775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
16412c404226c827fe0799858fc345a1bea11f2cb546cristy        {
16422c404226c827fe0799858fc345a1bea11f2cb546cristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
16432c404226c827fe0799858fc345a1bea11f2cb546cristy            GetMagickModule());
1644775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
16452c404226c827fe0799858fc345a1bea11f2cb546cristy          (*fail)++;
16462c404226c827fe0799858fc345a1bea11f2cb546cristy          continue;
16472c404226c827fe0799858fc345a1bea11f2cb546cristy        }
16482c404226c827fe0799858fc345a1bea11f2cb546cristy      ping_image=DestroyImage(ping_image);
16492c404226c827fe0799858fc345a1bea11f2cb546cristy      /*
16502c404226c827fe0799858fc345a1bea11f2cb546cristy        Read reference image.
16512c404226c827fe0799858fc345a1bea11f2cb546cristy      */
16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
1653775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (reference_image == (Image *) NULL ||
1654775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
16553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
16561e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
16571e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1658775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
16593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
16623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Write reference image.
16643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1665151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(reference_image->filename,MagickPathExtent,"%s:%s",
16663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
16673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->magick,reference_formats[i].magick,
1668151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        MagickPathExtent);
16693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image->depth=reference_types[j].depth;
16707998e5fecd99cd9838e7a960168f48b92d38bbfccristy      reference_image->compression=reference_formats[i].compression;
16713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=8192;
16723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      blob=ImageToBlob(image_info,reference_image,&length,exception);
1673775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (blob == (unsigned char *) NULL ||
1674775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
16753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
16761e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
16771e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1678775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
16842c404226c827fe0799858fc345a1bea11f2cb546cristy        Ping reference blob.
16852c404226c827fe0799858fc345a1bea11f2cb546cristy      */
16862c404226c827fe0799858fc345a1bea11f2cb546cristy      ping_image=PingBlob(image_info,blob,length,exception);
1687775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (ping_image == (Image *) NULL ||
1688775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
16892c404226c827fe0799858fc345a1bea11f2cb546cristy        {
16902c404226c827fe0799858fc345a1bea11f2cb546cristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
16912c404226c827fe0799858fc345a1bea11f2cb546cristy            GetMagickModule());
1692775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
16932c404226c827fe0799858fc345a1bea11f2cb546cristy          (*fail)++;
16942c404226c827fe0799858fc345a1bea11f2cb546cristy          blob=(unsigned char *) RelinquishMagickMemory(blob);
16952c404226c827fe0799858fc345a1bea11f2cb546cristy          continue;
16962c404226c827fe0799858fc345a1bea11f2cb546cristy        }
16972c404226c827fe0799858fc345a1bea11f2cb546cristy      ping_image=DestroyImage(ping_image);
16982c404226c827fe0799858fc345a1bea11f2cb546cristy      /*
16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reconstruct image.
17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1701151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(image_info->filename,MagickPathExtent,"%s:%s",
17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=BlobToImage(image_info,blob,length,exception);
17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      blob=(unsigned char *) RelinquishMagickMemory(blob);
1705775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (reconstruct_image == (Image *) NULL ||
1706775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
17081e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
17091e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1710775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Compare reference to reconstruct image.
17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
171893540abc1bce255b53806eb43f37362281968d66cristy      fuzz=0.003;  /* grayscale */
17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_formats[i].fuzz != 0.0)
17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fuzz=reference_formats[i].fuzz;
17218a9106f4d81487da0f318bd13b4caa4cd24f23afcristy      difference_image=CompareImages(reference_image,reconstruct_image,
1722864c6a8f0dbf656fcc51e2f526c6a7c7a4d46c81cristy        RootMeanSquaredErrorMetric,&distortion,exception);
17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=DestroyImage(reconstruct_image);
17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
1725775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (difference_image == (Image *) NULL ||
1726775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
17281e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
17291e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1730775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=DestroyImage(difference_image);
173514154224e937198c540f38d146528c0cdc45d24dcristy      if ((QuantumScale*distortion) > fuzz)
17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1737b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n",
173814154224e937198c540f38d146528c0cdc45d24dcristy            QuantumScale*distortion);
17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
17424084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#ifdef MagickCountTempFiles
17434084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp      (void) FormatLocaleFile(stdout,"... pass, ");
17444084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp      (void) fflush(stdout);
17454084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp      SystemCommand[0]='\0';
174677b33baacfae08c3794dd19df1862fb645ebe265cristy      (void) strncat(SystemCommand,"echo `ls ",9);
1747151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) strncat(SystemCommand,path,MagickPathExtent-31);
174877b33baacfae08c3794dd19df1862fb645ebe265cristy      (void) strncat(SystemCommand,"* | wc -w` tmp files.",20);
174977b33baacfae08c3794dd19df1862fb645ebe265cristy      (void) system(SystemCommand);
17504084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp      (void) fflush(stdout);
17514084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#else
17524084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp      (void) FormatLocaleFile(stdout,"... pass\n");
17534084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#endif
17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
1756b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
175775a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
175875a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   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                       %
17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateImageFormatsOnDisk() validates the ImageMagick image formats on disk
17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and returns the number of validation tests that passed and failed.
17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateImageFormatsOnDisk method is:
17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1778bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateImageFormatsOnDisk(ImageInfo *image_info,
17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1780bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1795bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImageFormatsOnDisk(ImageInfo *image_info,
17960d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
17970d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
1800151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    size[MagickPathExtent];
18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickInfo
18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *magick_info;
18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distortion,
18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fuzz;
18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
18103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *difference_image,
18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reference_image,
18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reconstruct_image;
18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1817bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1821bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
1825b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,"validate image formats on disk:\n");
18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; reference_formats[i].magick != (char *) NULL; i++)
18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    magick_info=GetMagickInfo(reference_formats[i].magick,exception);
18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((magick_info == (const MagickInfo *) NULL) ||
18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (magick_info->decoder == (DecodeImageHandler *) NULL) ||
18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (magick_info->encoder == (EncodeImageHandler *) NULL))
18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
18335f1c1fff2a55c4d8756556e78c1f307d352ed1b8cristy    for (j=0; reference_types[j].type != UndefinedType; j++)
18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Generate reference image.
18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      CatchException(exception);
18391e604812fad85bb96f757a2393015ae3d061c39acristy      (void) FormatLocaleFile(stdout,"  test %.20g: %s/%s/%s/%.20g-bits",
18401e604812fad85bb96f757a2393015ae3d061c39acristy        (double) (test++),reference_formats[i].magick,CommandOptionToMnemonic(
18417998e5fecd99cd9838e7a960168f48b92d38bbfccristy        MagickCompressOptions,reference_formats[i].compression),
1842042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy        CommandOptionToMnemonic(MagickTypeOptions,reference_types[j].type),
184375a2623568540f98985ce5bb1d88687eb9c85d2ecristy        (double) reference_types[j].depth);
18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,reference_filename,
1845151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        MagickPathExtent);
18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
1847775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (reference_image == (Image *) NULL ||
1848775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
18501e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
18511e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1852775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Write reference image.
18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1859151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(size,MagickPathExtent,"%.20gx%.20g",
186075a2623568540f98985ce5bb1d88687eb9c85d2ecristy        (double) reference_image->columns,(double) reference_image->rows);
18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CloneString(&image_info->size,size);
18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->depth=reference_types[j].depth;
1863151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(reference_image->filename,MagickPathExtent,"%s:%s",
18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
1865018f07f7333b25743d0afff892450cebdb905c1acristy      status=SetImageType(reference_image,reference_types[j].type,exception);
1866775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
18681e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
18691e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1870775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
18758a11cb146177680bfc1b7d89a8cd0c8f2befe468cristy      status=SetImageDepth(reference_image,reference_types[j].depth,exception);
1876775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
18781e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
18791e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1880775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
18857998e5fecd99cd9838e7a960168f48b92d38bbfccristy      reference_image->compression=reference_formats[i].compression;
18866f9e0d38526c24e02e6207b1d494fa8fad072b9ccristy      status=WriteImage(image_info,reference_image,exception);
18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
1888775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
18901e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
18911e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1892775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
18973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reference image.
18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1899151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(image_info->filename,MagickPathExtent,"%s:%s",
19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
1902775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (reference_image == (Image *) NULL ||
1903775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
19051e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
19061e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1907775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Write reference image.
19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1914151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(reference_image->filename,MagickPathExtent,"%s:%s",
19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
19163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image->depth=reference_types[j].depth;
19177998e5fecd99cd9838e7a960168f48b92d38bbfccristy      reference_image->compression=reference_formats[i].compression;
19186f9e0d38526c24e02e6207b1d494fa8fad072b9ccristy      status=WriteImage(image_info,reference_image,exception);
1919775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse ||exception->severity >= ErrorException)
19203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
19211e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
19221e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1923775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
19253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
19273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reconstruct image.
19303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1931151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(image_info->filename,MagickPathExtent,"%s:%s",
19323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_formats[i].magick,output_filename);
19333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=ReadImage(image_info,exception);
1934775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (reconstruct_image == (Image *) NULL ||
1935775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
19363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
19371e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
19381e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1939775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
19423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Compare reference to reconstruct image.
19463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
194793540abc1bce255b53806eb43f37362281968d66cristy      fuzz=0.003;  /* grayscale */
19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (reference_formats[i].fuzz != 0.0)
19493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fuzz=reference_formats[i].fuzz;
19508a9106f4d81487da0f318bd13b4caa4cd24f23afcristy      difference_image=CompareImages(reference_image,reconstruct_image,
1951864c6a8f0dbf656fcc51e2f526c6a7c7a4d46c81cristy        RootMeanSquaredErrorMetric,&distortion,exception);
19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=DestroyImage(reconstruct_image);
19533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
1954775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (difference_image == (Image *) NULL ||
1955775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
19563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
19571e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
19581e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
1959775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
19623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
19633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=DestroyImage(difference_image);
196414154224e937198c540f38d146528c0cdc45d24dcristy      if ((QuantumScale*distortion) > fuzz)
19653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1966b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n",
196714154224e937198c540f38d146528c0cdc45d24dcristy            QuantumScale*distortion);
19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1971b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(stdout,"... pass.\n");
19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
1974b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
197575a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
197675a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
19793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   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                       %
19863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateImportExportPixels() validates the pixel import and export methods.
19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  It returns the number of validation tests that passed and failed.
19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateImportExportPixels method is:
19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1996bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateImportExportPixels(ImageInfo *image_info,
19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
1998bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
19993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2013bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImportExportPixels(ImageInfo *image_info,
20140d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
20150d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    distortion;
20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *difference_image,
20223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reference_image,
20233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reconstruct_image;
20243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
20263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2028bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2038bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
20393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) output_filename;
20423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
20431e604812fad85bb96f757a2393015ae3d061c39acristy  (void) FormatLocaleFile(stdout,
20441e604812fad85bb96f757a2393015ae3d061c39acristy    "validate the import and export of image pixels:\n");
20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; reference_map[i] != (char *) NULL; i++)
20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; reference_storage[j].type != UndefinedPixel; j++)
20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Generate reference image.
20513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      CatchException(exception);
2053b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(stdout,"  test %.20g: %s/%s",(double) (test++),
2054042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy        reference_map[i],CommandOptionToMnemonic(MagickStorageOptions,
20553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_storage[j].type));
20563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(image_info->filename,reference_filename,
2057151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        MagickPathExtent);
20583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=ReadImage(image_info,exception);
2059775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (reference_image == (Image *) NULL ||
2060775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
20613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
20621e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
20631e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
2064775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
20653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
20673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
20683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleNCompare(reference_map[i],"cmy",3) == 0)
20692c404226c827fe0799858fc345a1bea11f2cb546cristy        (void) SetImageColorspace(reference_image,CMYKColorspace,exception);
20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=strlen(reference_map[i])*reference_image->columns*
20713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_image->rows*reference_storage[j].quantum;
20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels));
2073775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (pixels == (unsigned char *) NULL ||
2074775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
20753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
20761e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
20771e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
2078775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
20813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
20823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
20833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ResetMagickMemory(pixels,0,length*sizeof(*pixels));
20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=ExportImagePixels(reference_image,0,0,reference_image->columns,
20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_image->rows,reference_map[i],reference_storage[j].type,pixels,
20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        exception);
2087775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
20883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
20891e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
20901e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
2091775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
20923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
20933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixels=(unsigned char *) RelinquishMagickMemory(pixels);
20943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
20953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
20963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2097d55c935b7c710346ac55d202ac08409d037a0166cristy      (void) SetImageBackgroundColor(reference_image,exception);
20983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=ImportImagePixels(reference_image,0,0,reference_image->columns,
20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_image->rows,reference_map[i],reference_storage[j].type,
2100018f07f7333b25743d0afff892450cebdb905c1acristy        pixels,exception);
2101775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
21023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
21031e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
21041e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
2105775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           pixels=(unsigned char *) RelinquishMagickMemory(pixels);
21083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
21113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
21123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read reconstruct image.
21133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
21149950d57e1124b73f684fb5946e206994cefda628cristy      reconstruct_image=AcquireImage(image_info,exception);
21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) SetImageExtent(reconstruct_image,reference_image->columns,
2116655a8d1b809f9feb6926d06f03b3bd477da53ccacristy        reference_image->rows,exception);
2117655a8d1b809f9feb6926d06f03b3bd477da53ccacristy      (void) SetImageColorspace(reconstruct_image,reference_image->colorspace,
2118655a8d1b809f9feb6926d06f03b3bd477da53ccacristy        exception);
2119d55c935b7c710346ac55d202ac08409d037a0166cristy      (void) SetImageBackgroundColor(reconstruct_image,exception);
21203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=ImportImagePixels(reconstruct_image,0,0,reconstruct_image->columns,
21213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reconstruct_image->rows,reference_map[i],reference_storage[j].type,
2122018f07f7333b25743d0afff892450cebdb905c1acristy        pixels,exception);
21233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels=(unsigned char *) RelinquishMagickMemory(pixels);
2124775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (status == MagickFalse || exception->severity >= ErrorException)
21253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
21261e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
21271e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
2128775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          reference_image=DestroyImage(reference_image);
21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
21343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Compare reference to reconstruct image.
21353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
21368a9106f4d81487da0f318bd13b4caa4cd24f23afcristy      difference_image=CompareImages(reference_image,reconstruct_image,
2137864c6a8f0dbf656fcc51e2f526c6a7c7a4d46c81cristy        RootMeanSquaredErrorMetric,&distortion,exception);
21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reconstruct_image=DestroyImage(reconstruct_image);
21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
2140775194c2a1ab7cface73fe0e484cd65c963739a8dirk      if (difference_image == (Image *) NULL ||
2141775194c2a1ab7cface73fe0e484cd65c963739a8dirk          exception->severity >= ErrorException)
21423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
21431e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
21441e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
2145775194c2a1ab7cface73fe0e484cd65c963739a8dirk          CatchException(exception);
21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
21473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      difference_image=DestroyImage(difference_image);
215014154224e937198c540f38d146528c0cdc45d24dcristy      if ((QuantumScale*distortion) > 0.0)
21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2152b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n",
215314154224e937198c540f38d146528c0cdc45d24dcristy            QuantumScale*distortion);
21543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (*fail)++;
21553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
21563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2157b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(stdout,"... pass.\n");
21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2160b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
216175a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
216275a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
21643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
21673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e M o n t a g e C o m m a n d                               %
21723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
21753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateMontageCommand() validates the ImageMagick montage command line
21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateMontageCommand method is:
21813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2182bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateMontageCommand(ImageInfo *image_info,
21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
2184bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
21853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
21873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
21893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
21953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2199bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateMontageCommand(ImageInfo *image_info,
22000d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
22010d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
22043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
2205151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    command[MagickPathExtent];
22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
22093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
22113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
22123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2213bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2217bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
2221b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,"validate montage command line program:\n");
22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; montage_options[i] != (char *) NULL; i++)
22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
2225b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"  test %.20g: %s",(double) (test++),
22266aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      montage_options[i]);
2227151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(command,MagickPathExtent,"%s %s %s %s",
22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_filename,montage_options[i],reference_filename,
22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      output_filename);
22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
22331e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
22341e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=MontageImageCommand(image_info,number_arguments,arguments,
22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
2240e42f658533644aecb733785ffd91b286d6778deacristy    for (j=0; j < (ssize_t) number_arguments; j++)
22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
22433589219a2c7a9a59bfa63dd5171a27b1c9424cf1cristy    if (status == MagickFalse)
22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
22451e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
22461e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
22473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2250b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"... pass.\n");
22513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2252b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
225375a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
225475a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
22553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   V a l i d a t e S t r e a m C o m m a n d                                 %
22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ValidateStreamCommand() validates the ImageMagick stream command line
22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  program and returns the number of validation tests that passed and failed.
22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ValidateStreamCommand method is:
22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2274bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t ValidateStreamCommand(ImageInfo *image_info,
22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const char *reference_filename,const char *output_filename,
2276bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%        size_t *fail,ExceptionInfo *exception)
22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o reference_filename: the reference image filename.
22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o output_filename: the output image filename.
22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o fail: return the number of validation tests that pass.
22873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
22893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
22903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2291bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateStreamCommand(ImageInfo *image_info,
22920d772eda43795018942c81aac81ac0c8b3d92018cristy  const char *reference_filename,const char *output_filename,size_t *fail,
22930d772eda43795018942c81aac81ac0c8b3d92018cristy  ExceptionInfo *exception)
22943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
22953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **arguments,
2297151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    command[MagickPathExtent];
22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_arguments;
23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
23043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2305bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2309bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    test;
23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  test=0;
2313b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,"validate stream command line program:\n");
23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; stream_options[i] != (char *) NULL; i++)
23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
2317b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"  test %.20g: %s",(double) (test++),
23186aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy      stream_options[i]);
2319151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(command,MagickPathExtent,"%s %s %s",
23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      stream_options[i],reference_filename,output_filename);
23213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=StringToArgv(command,&number_arguments);
23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (arguments == (char **) NULL)
23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
23241e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
23251e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=StreamImageCommand(image_info,number_arguments,arguments,
23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char **) NULL,exception);
2331e42f658533644aecb733785ffd91b286d6778deacristy    for (j=0; j < (ssize_t) number_arguments; j++)
23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      arguments[j]=DestroyString(arguments[j]);
23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    arguments=(char **) RelinquishMagickMemory(arguments);
23343589219a2c7a9a59bfa63dd5171a27b1c9424cf1cristy    if (status == MagickFalse)
23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
23361e604812fad85bb96f757a2393015ae3d061c39acristy        (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n",
23371e604812fad85bb96f757a2393015ae3d061c39acristy            GetMagickModule());
23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (*fail)++;
23393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2341b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy    (void) FormatLocaleFile(stdout,"... pass.\n");
23423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2343b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy  (void) FormatLocaleFile(stdout,
234475a2623568540f98985ce5bb1d88687eb9c85d2ecristy    "  summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test,
234575a2623568540f98985ce5bb1d88687eb9c85d2ecristy    (double) (test-(*fail)),(double) *fail);
23463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(test);
23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  M a i n                                                                    %
23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
23613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
23623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType ValidateUsage(void)
23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
23653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **p;
23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
23693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *miscellaneous[]=
23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-debug events        display copious debugging information",
23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-help                print program options",
23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-log format          format of debugging information",
23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-validate type       validation type",
23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-version             print version information",
23763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL
23773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
23783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *settings[]=
23793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-regard-warnings     pay attention to warning messages",
23813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "-verbose             print detailed information about the image",
23823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (char *) NULL
23833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2385bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) printf("Copyright: %s\n\n",GetMagickCopyright());
2387b28d64742e55a8b565085faf37e9aead51f89a83cristy  (void) printf("Features: %s\n",GetMagickFeatures());
23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) printf("Usage: %s [options ...] reference-file\n",GetClientName());
23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) printf("\nValidate Settings:\n");
23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=settings; *p != (char *) NULL; p++)
23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) printf("  %s\n",*p);
23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) printf("\nMiscellaneous Options:\n");
23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (p=miscellaneous; *p != (char *) NULL; p++)
23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) printf("  %s\n",*p);
23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristyint main(int argc,char **argv)
23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DestroyValidate() \
24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ \
24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image_info=DestroyImageInfo(image_info); \
24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=DestroyExceptionInfo(exception); \
24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ThrowValidateException(asperity,tag,option) \
24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ \
24073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    option); \
24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  CatchException(exception); \
24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DestroyValidate(); \
24113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse); \
24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
2415151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    output_filename[MagickPathExtent],
2416151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    reference_filename[MagickPathExtent],
24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *option;
24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
24203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    elapsed_time,
24213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    user_time;
24223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *reference_image;
24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ImageInfo
24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image_info;
24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    regard_warnings,
24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24369cafe595c0aaff879d99b073d73645866b418cd4cristy  MagickSizeType
24379cafe595c0aaff879d99b073d73645866b418cd4cristy    memory_resource,
24389cafe595c0aaff879d99b073d73645866b418cd4cristy    map_resource;
24399cafe595c0aaff879d99b073d73645866b418cd4cristy
2440bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
24423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  TimerInfo
24443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *timer;
24453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2446bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fail,
24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    iterations,
24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    tests;
24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ValidateType
24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Validate the ImageMagick image processing suite.
24563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2457b4d552cbf0187d092fc9f83fdca1ef6ce90206fbcristy  MagickCoreGenesis(*argv,MagickTrue);
2458ef2fdc6877747fd39d628c1300fbd21ecca8ddf0cristy  (void) setlocale(LC_ALL,"");
2459ef2fdc6877747fd39d628c1300fbd21ecca8ddf0cristy  (void) setlocale(LC_NUMERIC,"C");
24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  iterations=1;
24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickFalse;
24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  type=AllValidate;
24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  regard_warnings=MagickFalse;
2464d886290b2a32bf23bbdc19b883f32cd4d364b310cristy  (void) regard_warnings;
24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=AcquireExceptionInfo();
24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image_info=AcquireImageInfo();
2467151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(image_info->filename,ReferenceFilename,MagickPathExtent);
2468bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=1; i < (ssize_t) argc; i++)
24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    option=argv[i];
2471042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy    if (IsCommandOption(option) == MagickFalse)
24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2473151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) CopyMagickString(image_info->filename,option,MagickPathExtent);
24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    switch (*(option+1))
24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'b':
24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("bench",option+1) == 0)
24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2482e27293e706ca05b6b121e9512a83b16f7ad887f2cristy            iterations=StringToUnsignedLong(argv[++i]);
24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
24843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
24853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
24863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'd':
24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("debug",option+1) == 0)
24903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
24913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) SetLogEventMask(argv[++i]);
24923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
24933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
24943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
24953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'h':
24973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("help",option+1) == 0)
24993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
25003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) ValidateUsage();
25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return(0);
25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'l':
25063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("log",option+1) == 0)
25083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
25093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (*option != '+')
25103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) SetLogFormat(argv[i+1]);
25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
25143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'r':
25163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("regard-warnings",option+1) == 0)
25183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
25193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            regard_warnings=MagickTrue;
25203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
25213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
25233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      case 'v':
25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
25263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare("validate",option+1) == 0)
25273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2528bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            ssize_t
25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              validate;
25303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (*option == '+')
25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            i++;
2534e81f552f8ca2fc16632bd9830db3f93af07d514ccristy            if (i >= (ssize_t) argc)
25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ThrowValidateException(OptionError,"MissingArgument",option);
2536042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy            validate=ParseCommandOption(MagickValidateOptions,MagickFalse,
25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              argv[i]);
25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (validate < 0)
25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ThrowValidateException(OptionError,"UnrecognizedValidateType",
25403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                argv[i]);
25413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            type=(ValidateType) validate;
25423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
25433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((LocaleCompare("version",option+1) == 0) ||
25453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (LocaleCompare("-version",option+1) == 0))
25463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2547b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy            (void) FormatLocaleFile(stdout,"Version: %s\n",
2548bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              GetMagickVersion((size_t *) NULL));
25491e604812fad85bb96f757a2393015ae3d061c39acristy            (void) FormatLocaleFile(stdout,"Copyright: %s\n\n",
25501e604812fad85bb96f757a2393015ae3d061c39acristy              GetMagickCopyright());
25511e604812fad85bb96f757a2393015ae3d061c39acristy            (void) FormatLocaleFile(stdout,"Features: %s\n\n",
25521e604812fad85bb96f757a2393015ae3d061c39acristy              GetMagickFeatures());
25533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return(0);
25543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
25563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      default:
25583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowValidateException(OptionError,"UnrecognizedOption",option)
25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2561205e21f9b7ffdf5b0e48642ba0981b239959f8a9cristy  timer=(TimerInfo *) NULL;
25628b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy  if (iterations > 1)
25638b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy    timer=AcquireTimerInfo();
25643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  reference_image=ReadImage(image_info,exception);
25653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  tests=0;
25663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  fail=0;
25673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (reference_image == (Image *) NULL)
25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    fail++;
25693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
25703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
25713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (LocaleCompare(image_info->filename,ReferenceFilename) == 0)
25723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) CopyMagickString(reference_image->magick,ReferenceImageFormat,
2573151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          MagickPathExtent);
25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) AcquireUniqueFilename(reference_filename);
25753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) AcquireUniqueFilename(output_filename);
25763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(reference_image->filename,reference_filename,
2577151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        MagickPathExtent);
25786f9e0d38526c24e02e6207b1d494fa8fad072b9ccristy      status=WriteImage(image_info,reference_image,exception);
25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_image=DestroyImage(reference_image);
25803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
25813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        fail++;
25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
25833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2584b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(stdout,"Version: %s\n",
2585bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            GetMagickVersion((size_t *) NULL));
2586b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(stdout,"Copyright: %s\n\n",
25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            GetMagickCopyright());
25881e604812fad85bb96f757a2393015ae3d061c39acristy          (void) FormatLocaleFile(stdout,
25891e604812fad85bb96f757a2393015ae3d061c39acristy            "ImageMagick Validation Suite (%s)\n\n",CommandOptionToMnemonic(
25901e604812fad85bb96f757a2393015ae3d061c39acristy            MagickValidateOptions,(ssize_t) type));
259180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy          if ((type & ColorspaceValidate) != 0)
2592572e097d004eac4b9767c11eec49d054e413ab00cristy            tests+=ValidateColorspaces(image_info,&fail,exception);
25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & CompareValidate) != 0)
25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateCompareCommand(image_info,reference_filename,
25953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
25963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & CompositeValidate) != 0)
25973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateCompositeCommand(image_info,reference_filename,
25983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
25993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & ConvertValidate) != 0)
26003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateConvertCommand(image_info,reference_filename,
26013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
2602247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy          if ((type & FormatsDiskValidate) != 0)
2603f044a4d421741ac56005ed3a37eb537de94423aacristy            {
26049cafe595c0aaff879d99b073d73645866b418cd4cristy              memory_resource=SetMagickResourceLimit(MemoryResource,0);
2605247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              map_resource=SetMagickResourceLimit(MapResource,0);
2606247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              (void) FormatLocaleFile(stdout,"[pixel-cache: disk] ");
2607f044a4d421741ac56005ed3a37eb537de94423aacristy              tests+=ValidateImageFormatsInMemory(image_info,reference_filename,
2608f044a4d421741ac56005ed3a37eb537de94423aacristy                output_filename,&fail,exception);
2609f044a4d421741ac56005ed3a37eb537de94423aacristy              (void) FormatLocaleFile(stdout,"[pixel-cache: disk] ");
2610247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              tests+=ValidateImageFormatsOnDisk(image_info,reference_filename,
2611f044a4d421741ac56005ed3a37eb537de94423aacristy                output_filename,&fail,exception);
26129cafe595c0aaff879d99b073d73645866b418cd4cristy              (void) SetMagickResourceLimit(MemoryResource,memory_resource);
26139cafe595c0aaff879d99b073d73645866b418cd4cristy              (void) SetMagickResourceLimit(MapResource,map_resource);
2614f044a4d421741ac56005ed3a37eb537de94423aacristy            }
2615247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy          if ((type & FormatsMapValidate) != 0)
2616bda201a1b108a687bb6889cb94b525e8fa5af79ccristy            {
2617247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              memory_resource=SetMagickResourceLimit(MemoryResource,0);
2618247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              (void) FormatLocaleFile(stdout,"[pixel-cache: memory-mapped] ");
2619247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              tests+=ValidateImageFormatsInMemory(image_info,reference_filename,
2620bda201a1b108a687bb6889cb94b525e8fa5af79ccristy                output_filename,&fail,exception);
262134c290f63ae56e219a57b0bae229f48b51364aeacristy              (void) FormatLocaleFile(stdout,"[pixel-cache: memory-mapped] ");
2622bda201a1b108a687bb6889cb94b525e8fa5af79ccristy              tests+=ValidateImageFormatsOnDisk(image_info,reference_filename,
2623bda201a1b108a687bb6889cb94b525e8fa5af79ccristy                output_filename,&fail,exception);
2624247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              (void) SetMagickResourceLimit(MemoryResource,memory_resource);
2625247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy            }
2626247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy          if ((type & FormatsMemoryValidate) != 0)
2627247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy            {
2628247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              (void) FormatLocaleFile(stdout,"[pixel-cache: memory] ");
2629247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              tests+=ValidateImageFormatsInMemory(image_info,reference_filename,
2630247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy                output_filename,&fail,exception);
2631247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy              (void) FormatLocaleFile(stdout,"[pixel-cache: memory] ");
2632bda201a1b108a687bb6889cb94b525e8fa5af79ccristy              tests+=ValidateImageFormatsOnDisk(image_info,reference_filename,
2633bda201a1b108a687bb6889cb94b525e8fa5af79ccristy                output_filename,&fail,exception);
2634bda201a1b108a687bb6889cb94b525e8fa5af79ccristy            }
26353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & IdentifyValidate) != 0)
26363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateIdentifyCommand(image_info,reference_filename,
26373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
26383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & ImportExportValidate) != 0)
26393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateImportExportPixels(image_info,reference_filename,
26403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
26413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & MontageValidate) != 0)
26423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateMontageCommand(image_info,reference_filename,
26433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
26443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if ((type & StreamValidate) != 0)
26453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            tests+=ValidateStreamCommand(image_info,reference_filename,
26463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              output_filename,&fail,exception);
2647b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy          (void) FormatLocaleFile(stdout,
264875a2623568540f98985ce5bb1d88687eb9c85d2ecristy            "validation suite: %.20g tests; %.20g passed; %.20g failed.\n",
264975a2623568540f98985ce5bb1d88687eb9c85d2ecristy            (double) tests,(double) (tests-fail),(double) fail);
26503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
26513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) RelinquishUniqueFileResource(output_filename);
26523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) RelinquishUniqueFileResource(reference_filename);
26533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
26543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (exception->severity != UndefinedException)
26553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CatchException(exception);
26563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (iterations > 1)
26573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
26583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      elapsed_time=GetElapsedTime(timer);
26593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      user_time=GetUserTime(timer);
2660b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy      (void) FormatLocaleFile(stderr,
266175a2623568540f98985ce5bb1d88687eb9c85d2ecristy        "Performance: %.20gi %gips %0.3fu %ld:%02ld.%03ld\n",(double)
26626aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy        iterations,1.0*iterations/elapsed_time,user_time,(long)
26636aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy        (elapsed_time/60.0),(long) ceil(fmod(elapsed_time,60.0)),
26646aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy        (long) (1000.0*(elapsed_time-floor(elapsed_time))));
26658b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy      timer=DestroyTimerInfo(timer);
26663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
26673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DestroyValidate();
26683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickCoreTerminus();
26693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(fail == 0 ? 0 : 1);
26703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2671