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