validate.c revision 775194c2a1ab7cface73fe0e484cd65c963739a8
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% % 21fe676ee3a9cf43404bdc9ba8b27f597b5e4e28f7cristy% Copyright 1999-2014 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 inline double MagickMin(const double x,const double y) 1338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 1348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (x < y) 1358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(x); 1368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(y); 1378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 1388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1398d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToHSI(const double red,const double green, 1408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *hue,double *saturation,double *intensity) 1418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 1428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 1438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy alpha, 1448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy beta; 1458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *intensity=(QuantumScale*red+QuantumScale*green+QuantumScale*blue)/3.0; 1478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (*intensity <= 0.0) 1488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 1498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue=0.0; 1508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *saturation=0.0; 1518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return; 1528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 1538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *saturation=1.0-MagickMin(QuantumScale*red,MagickMin(QuantumScale*green, 1548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy QuantumScale*blue))/(*intensity); 1558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy alpha=0.5*(2.0*QuantumScale*red-QuantumScale*green-QuantumScale*blue); 1568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy beta=0.8660254037844385*(QuantumScale*green-QuantumScale*blue); 1578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue=atan2(beta,alpha)*(180.0/MagickPI)/360.0; 1588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (*hue < 0.0) 1598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue+=1.0; 1608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 1618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1628d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline double MagickMax(const double x,const double y) 1638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 1648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (x > y) 1658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(x); 1668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(y); 1678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 1688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1698d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertHSVToRGB(const double hue,const double saturation, 1708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double value,double *red,double *green,double *blue) 1718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 1728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 1738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy c, 1748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy h, 1758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy min, 1768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x; 1778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy h=hue*360.0; 1798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy c=value*saturation; 1808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy min=value-c; 1818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy h-=360.0*floor(h/360.0); 1828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy h/=60.0; 1838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x=c*(1.0-fabs(h-2.0*floor(h/2.0)-1.0)); 1848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy switch ((int) floor(h)) 1858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 1868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 0: 1878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 1888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*(min+c); 1898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*(min+x); 1908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*min; 1918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy break; 1928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 1938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 1: 1948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 1958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*(min+x); 1968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*(min+c); 1978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*min; 1988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy break; 1998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 2008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 2: 2018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 2028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*min; 2038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*(min+c); 2048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*(min+x); 2058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy break; 2068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 2078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 3: 2088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 2098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*min; 2108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*(min+x); 2118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*(min+c); 2128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy break; 2138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 2148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 4: 2158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 2168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*(min+x); 2178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*min; 2188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*(min+c); 2198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy break; 2208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 2218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 5: 2228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 2238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*(min+c); 2248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*min; 2258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*(min+x); 2268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy break; 2278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 2288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy default: 2298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 2308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=0.0; 2318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=0.0; 2328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=0.0; 2338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 2348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 2358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 2368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2378d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertRGBToXYZ(const double red,const double green, 2388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *X,double *Y,double *Z) 2398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 2408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 2418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b, 2428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 2438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r; 2448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r=QuantumScale*DecodePixelGamma(red); 2468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g=QuantumScale*DecodePixelGamma(green); 2478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b=QuantumScale*DecodePixelGamma(blue); 2488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *X=0.41239558896741421610*r+0.35758343076371481710*g+0.18049264738170157350*b; 2498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=0.21258623078559555160*r+0.71517030370341084990*g+0.07220049864333622685*b; 2508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Z=0.01929721549174694484*r+0.11918386458084853180*g+0.95049712513157976600*b; 2518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 2528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2538d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToLab(const double X,const double Y,const double Z, 2548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *L,double *a,double *b) 2558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 2568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 2578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x, 2588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y, 2598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy z; 2608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((X/D65X) > CIEEpsilon) 2628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x=pow(X/D65X,1.0/3.0); 2638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 2648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x=(CIEK*X/D65X+16.0)/116.0; 2658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((Y/D65Y) > CIEEpsilon) 2668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y=pow(Y/D65Y,1.0/3.0); 2678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 2688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y=(CIEK*Y/D65Y+16.0)/116.0; 2698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((Z/D65Z) > CIEEpsilon) 2708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy z=pow(Z/D65Z,1.0/3.0); 2718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 2728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy z=(CIEK*Z/D65Z+16.0)/116.0; 2738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *L=((116.0*y)-16.0)/100.0; 2748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *a=(500.0*(x-y))/255.0+0.5; 2758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *b=(200.0*(y-z))/255.0+0.5; 2768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 2778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2788d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToLab(const double red,const double green, 2798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *L,double *a,double *b) 2808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 2818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 2828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy X, 2838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y, 2848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Z; 2858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); 2878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToLab(X,Y,Z,L,a,b); 2888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 2898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2908d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLabToXYZ(const double L,const double a,const double b, 2918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *X,double *Y,double *Z) 2928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 2938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 2948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x, 2958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y, 2968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy z; 2978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y=(L+16.0)/116.0; 2998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x=y+a/500.0; 3008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy z=y-b/200.0; 3018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((x*x*x) > CIEEpsilon) 3028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x=(x*x*x); 3038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 3048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x=(116.0*x-16.0)/CIEK; 3058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((y*y*y) > CIEEpsilon) 3068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y=(y*y*y); 3078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 3088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y=L/CIEK; 3098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((z*z*z) > CIEEpsilon) 3108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy z=(z*z*z); 3118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 3128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy z=(116.0*z-16.0)/CIEK; 3138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *X=D65X*x; 3148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=D65Y*y; 3158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Z=D65Z*z; 3168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3188d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToRGB(const double x,const double y,const double z, 3198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *red,double *green,double *blue) 3208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 3228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b, 3238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 3248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r; 3258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r=3.2406*x-1.5372*y-0.4986*z; 3278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g=(-0.9689*x+1.8758*y+0.0415*z); 3288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b=0.0557*x-0.2040*y+1.0570*z; 3298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=EncodePixelGamma(QuantumRange*r); 3308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=EncodePixelGamma(QuantumRange*g); 3318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=EncodePixelGamma(QuantumRange*b); 3328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3348d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLabToRGB(const double L,const double a, 3358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double b,double *red,double *green,double *blue) 3368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 3388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy X, 3398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y, 3408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Z; 3418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertLabToXYZ(L*100.0,255.0*(a-0.5),255.0*(b-0.5),&X,&Y,&Z); 3438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToRGB(X,Y,Z,red,green,blue); 3448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3468d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYPbPr(const double red,const double green, 3478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *Y,double *Pb,double *Pr) 3488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue); 3508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Pb=QuantumScale*((-0.1687367)*red-0.331264*green+0.5*blue)+0.5; 3518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Pr=QuantumScale*(0.5*red-0.418688*green-0.081312*blue)+0.5; 3528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3548d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYCbCr(const double red,const double green, 3558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *Y,double *Cb,double *Cr) 3568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToYPbPr(red,green,blue,Y,Cb,Cr); 3588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3608d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYPbPrToRGB(const double Y,const double Pb,const double Pr, 3618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *red,double *green,double *blue) 3628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*(0.99999999999914679361*Y-1.2188941887145875e-06*(Pb-0.5)+ 3648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1.4019995886561440468*(Pr-0.5)); 3658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*(0.99999975910502514331*Y-0.34413567816504303521*(Pb-0.5)- 3668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.71413649331646789076*(Pr-0.5)); 3678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*(1.00000124040004623180*Y+1.77200006607230409200*(Pb-0.5)+ 3688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 2.1453384174593273e-06*(Pr-0.5)); 3698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3718d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYCbCrToRGB(const double Y,const double Cb, 3728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double Cr,double *red,double *green,double *blue) 3738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertYPbPrToRGB(Y,Cb,Cr,red,green,blue); 3758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3778d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLCHabToXYZ(const double luma,const double chroma, 3788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double hue,double *X,double *Y,double *Z) 3798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertLabToXYZ(luma,chroma*cos(hue*MagickPI/180.0),chroma* 3818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy sin(hue*MagickPI/180.0),X,Y,Z); 3828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3848d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertLCHabToRGB(const double luma,const double chroma, 3858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double hue,double *red,double *green,double *blue) 3868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 3888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy X, 3898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y, 3908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Z; 3918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3926d897c70de36922ef314127ac8a202e0605bbeadcristy ConvertLCHabToXYZ(luma*100.0,255.0*(chroma-0.5),360.0*hue,&X,&Y,&Z); 3938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToRGB(X,Y,Z,red,green,blue); 3948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 3958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3968d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToHSV(const double red,const double green, 3978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *hue,double *saturation,double *value) 3988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 3998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 4008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy c, 4018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy max, 4028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy min; 4038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy max=MagickMax(QuantumScale*red,MagickMax(QuantumScale*green, 4058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy QuantumScale*blue)); 4068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy min=MagickMin(QuantumScale*red,MagickMin(QuantumScale*green, 4078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy QuantumScale*blue)); 4088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy c=max-min; 4098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *value=max; 4108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (c <= 0.0) 4118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 4128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue=0.0; 4138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *saturation=0.0; 4148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return; 4158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 4168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (max == (QuantumScale*red)) 4178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 4188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue=(QuantumScale*green-QuantumScale*blue)/c; 4198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((QuantumScale*green) < (QuantumScale*blue)) 4208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue+=6.0; 4218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 4228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 4238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (max == (QuantumScale*green)) 4248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue=2.0+(QuantumScale*blue-QuantumScale*red)/c; 4258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 4268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue=4.0+(QuantumScale*red-QuantumScale*green)/c; 4278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue*=60.0/360.0; 4288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *saturation=c/max; 4298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 4308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4318d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToLCHab(const double X,const double Y, 4328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double Z,double *luma,double *chroma,double *hue) 4338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 4348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 4358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy a, 4368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 4378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToLab(X,Y,Z,luma,&a,&b); 439846740b998cb0bf740d221ac20bd53e7fe3acaaccristy *chroma=hypot(255.0*(a-0.5),255.0*(b-0.5))/255.0+0.5; 4406d897c70de36922ef314127ac8a202e0605bbeadcristy *hue=180.0*atan2(255.0*(b-0.5),255.0*(a-0.5))/MagickPI/360.0; 4418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (*hue < 0.0) 4428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *hue+=1.0; 4438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 4448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4458d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToLCHab(const double red,const double green, 4468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *luma,double *chroma,double *hue) 4478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 4488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 4498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy X, 4508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y, 4518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Z; 4528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); 4548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToLCHab(X,Y,Z,luma,chroma,hue); 4558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 4568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4578d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLMSToXYZ(const double L,const double M,const double S, 4588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *X,double *Y,double *Z) 4598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 4608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *X=1.096123820835514*L-0.278869000218287*M+0.182745179382773*S; 4618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=0.454369041975359*L+0.473533154307412*M+0.072097803717229*S; 4628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Z=(-0.009627608738429)*L-0.005698031216113*M+1.015325639954543*S; 4638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 4648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4658d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLMSToRGB(const double L,const double M, 4668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double S,double *red,double *green,double *blue) 4678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 4688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 4698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy X, 4708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y, 4718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Z; 4728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertLMSToXYZ(L,M,S,&X,&Y,&Z); 4748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToRGB(X,Y,Z,red,green,blue); 4758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 4768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4778d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToLMS(const double x,const double y, 4788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double z,double *L,double *M,double *S) 4798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 4808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *L=0.7328*x+0.4296*y-0.1624*z; 4818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *M=(-0.7036*x+1.6975*y+0.0061*z); 4828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *S=0.0030*x+0.0136*y+0.9834*z; 4838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 4848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4858d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToLMS(const double red,const double green, 4868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *L,double *M,double *S) 4878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 4888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 4898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy X, 4908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y, 4918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Z; 4928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); 4948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToLMS(X,Y,Z,L,M,S); 4958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 4968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 4978d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline double PerceptibleReciprocal(const double x) 4988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 4998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 5008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy sign; 5018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy /* 5038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Return 1/x where x is perceptible (not unlimited or infinitesimal). 5048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy */ 5058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy sign=x < 0.0 ? -1.0 : 1.0; 5068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((sign*x) >= MagickEpsilon) 5078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(1.0/x); 5088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(sign/MagickEpsilon); 5098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 5108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5118d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertXYZToLuv(const double X,const double Y,const double Z, 5128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *L,double *u,double *v) 5138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 5148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 5158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy alpha; 5168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((Y/D65Y) > CIEEpsilon) 5188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *L=(double) (116.0*pow(Y/D65Y,1.0/3.0)-16.0); 5198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 5208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *L=CIEK*(Y/D65Y); 5218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy alpha=PerceptibleReciprocal(X+15.0*Y+3.0*Z); 5228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *u=13.0*(*L)*((4.0*alpha*X)-(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))); 5238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *v=13.0*(*L)*((9.0*alpha*Y)-(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z))); 5248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *L/=100.0; 5258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *u=(*u+134.0)/354.0; 5268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *v=(*v+140.0)/262.0; 5278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 5288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5298d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToLuv(const double red,const double green, 5308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *L,double *u,double *v) 5318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 5328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 5338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy X, 5348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y, 5358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Z; 5368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z); 5388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToLuv(X,Y,Z,L,u,v); 5398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 5408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5418d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLuvToXYZ(const double L,const double u,const double v, 5428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *X,double *Y,double *Z) 5438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 5448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if (L > (CIEK*CIEEpsilon)) 5458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=(double) pow((L+16.0)/116.0,3.0); 5468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy else 5478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=L/CIEK; 5488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *X=((*Y*((39.0*L/(v+13.0*L*(9.0*D65Y/(D65X+15.0*D65Y+3.0*D65Z))))-5.0))+ 5498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5.0*(*Y))/((((52.0f*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/ 5508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 3.0)-(-1.0/3.0)); 5518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Z=(*X*(((52.0f*L/(u+13.0*L*(4.0*D65X/(D65X+15.0*D65Y+3.0*D65Z))))-1.0)/3.0))- 5528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5.0*(*Y); 5538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 5548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5558d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic inline void ConvertLuvToRGB(const double L,const double u, 5568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double v,double *red,double *green,double *blue) 5578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 5588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 5598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy X, 5608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y, 5618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Z; 5628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertLuvToXYZ(100.0*L,354.0*u-134.0,262.0*v-140.0,&X,&Y,&Z); 5648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToRGB(X,Y,Z,red,green,blue); 5658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 5668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5678d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYDbDr(const double red,const double green, 5688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *Y,double *Db,double *Dr) 5698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 5708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue); 5718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Db=QuantumScale*(-0.450*red-0.883*green+1.333*blue)+0.5; 5728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Dr=QuantumScale*(-1.333*red+1.116*green+0.217*blue)+0.5; 5738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 5748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5758d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYDbDrToRGB(const double Y,const double Db,const double Dr, 5768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *red,double *green,double *blue) 5778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 5788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*(Y+9.2303716147657e-05*(Db-0.5)-0.52591263066186533* 5798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (Dr-0.5)); 5808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*(Y-0.12913289889050927*(Db-0.5)+0.26789932820759876* 5818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (Dr-0.5)); 5828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*(Y+0.66467905997895482*(Db-0.5)-7.9202543533108e-05* 5838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (Dr-0.5)); 5848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 5858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5868d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYIQ(const double red,const double green, 5878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *Y,double *I,double *Q) 5888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 5898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue); 5908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *I=QuantumScale*(0.595716*red-0.274453*green-0.321263*blue)+0.5; 5918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Q=QuantumScale*(0.211456*red-0.522591*green+0.311135*blue)+0.5; 5928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 5938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 5948d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYIQToRGB(const double Y,const double I,const double Q, 5958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *red,double *green,double *blue) 5968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 5978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*(Y+0.9562957197589482261*(I-0.5)+0.6210244164652610754* 5988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (Q-0.5)); 5998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*(Y-0.2721220993185104464*(I-0.5)-0.6473805968256950427* 6008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (Q-0.5)); 6018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*(Y-1.1069890167364901945*(I-0.5)+1.7046149983646481374* 6028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (Q-0.5)); 6038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 6048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 6058d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertRGBToYUV(const double red,const double green, 6068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy const double blue,double *Y,double *U,double *V) 6078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 6088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue); 6098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *U=QuantumScale*((-0.147)*red-0.289*green+0.436*blue)+0.5; 6108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *V=QuantumScale*(0.615*red-0.515*green-0.100*blue)+0.5; 6118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 6128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 6138d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic void ConvertYUVToRGB(const double Y,const double U,const double V, 6148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double *red,double *green,double *blue) 6158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 6168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *red=QuantumRange*(Y-3.945707070708279e-05*(U-0.5)+1.1398279671717170825* 6178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (V-0.5)); 6188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *green=QuantumRange*(Y-0.3946101641414141437*(U-0.5)-0.5805003156565656797* 6198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (V-0.5)); 6208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy *blue=QuantumRange*(Y+2.0319996843434342537*(U-0.5)-4.813762626262513e-04* 6218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (V-0.5)); 6228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 6238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 6248d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateHSIToRGB() 6258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 6268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 6278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 6288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 6298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 6308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 631b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," HSIToRGB"); 6328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertHSIToRGB(111.244375/360.0,0.295985,0.658734,&r,&g,&b); 6338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 6348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 6358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 6368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 6378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 6388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 6398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 6408d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToHSI() 6418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 6428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 6438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy h, 6448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy i, 6458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy s; 6468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 647b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToHSI"); 6488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToHSI(0.545877*QuantumRange,0.966567*QuantumRange, 6498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&h,&s,&i); 6508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(h-111.244374/360.0) >= ReferenceEpsilon) || 6518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(s-0.295985) >= ReferenceEpsilon) || 6528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(i-0.658734) >= ReferenceEpsilon)) 6538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 6548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 6558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 6568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 6578d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateHSLToRGB() 6588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 6598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 6608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 6618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 6628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 6638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 664b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," HSLToRGB"); 6658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertHSLToRGB(110.200859/360.0,0.882623,0.715163,&r,&g,&b); 6668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 6678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 6688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 6698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 6708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 6718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 6728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 6738d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToHSL() 6748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 6758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 6768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy h, 6778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy l, 6788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy s; 6798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 680b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToHSL"); 6818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToHSL(0.545877*QuantumRange,0.966567*QuantumRange, 6828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&h,&s,&l); 6838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(h-110.200859/360.0) >= ReferenceEpsilon) || 6848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(s-0.882623) >= ReferenceEpsilon) || 6858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(l-0.715163) >= ReferenceEpsilon)) 6868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 6878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 6888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 6898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 6908d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateHSVToRGB() 6918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 6928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 6938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 6948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 6958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 6968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 697b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," HSVToRGB"); 6988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertHSVToRGB(110.200859/360.0,0.520200,0.966567,&r,&g,&b); 6998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 7008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 7018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 7028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 7038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 7048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 7058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 7068d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToHSV() 7078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 7088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 7098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy h, 7108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy s, 7118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy v; 7128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 713b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToHSV"); 7148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToHSV(0.545877*QuantumRange,0.966567*QuantumRange, 7158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&h,&s,&v); 7168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(h-110.200859/360.0) >= ReferenceEpsilon) || 7178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(s-0.520200) >= ReferenceEpsilon) || 7188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(v-0.966567) >= ReferenceEpsilon)) 7198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 7208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 7218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 7228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 7238d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToJPEGYCbCr() 7248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 7258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 7268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Cb, 7278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Cr, 7288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y; 7298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 730b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToJPEGYCbCr"); 7318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToYCbCr(0.545877*QuantumRange,0.966567*QuantumRange, 7328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&Y,&Cb,&Cr); 7338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(Y-0.783460) >= ReferenceEpsilon) || 7348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(Cb-0.319581) >= ReferenceEpsilon) || 7358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(Cr-0.330539) >= ReferenceEpsilon)) 7368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 7378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 7388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 7398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 7408d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateJPEGYCbCrToRGB() 7418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 7428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 7438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 7448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 7458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 7468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 747b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," JPEGYCbCrToRGB"); 7488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertYCbCrToRGB(0.783460,0.319581,0.330539,&r,&g,&b); 7498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 7508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 7518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 7528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 7538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 7548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 7558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 7568d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateLabToRGB() 7578d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 7588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 7598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 7608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 7618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 7628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 763b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," LabToRGB"); 7648d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertLabToRGB(88.456154/100.0,-54.671483/255+0.5,51.662818/255.0+0.5, 7658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy &r,&g,&b); 7668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 7678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 7688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 7698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 7708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 7718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 7728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 7738d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToLab() 7748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 7758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 7768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy a, 7778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b, 7788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy L; 7798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 780b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToLab"); 7818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToLab(0.545877*QuantumRange,0.966567*QuantumRange, 7828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&L,&a,&b); 7838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(L-(88.456154/100.0)) >= ReferenceEpsilon) || 7848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(a-(-54.671483/255.0+0.5)) >= ReferenceEpsilon) || 7858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-(51.662818/255.0+0.5)) >= ReferenceEpsilon)) 7868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 7878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 7888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 7898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 7908d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateLchToRGB() 7918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 7928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 7938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b, 7948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 7958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r; 7968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 797b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," LchToRGB"); 798a44ed133a90ea6d89ed574ecf2db9f033875dd25cristy ConvertLCHabToRGB(88.456154/100.0,75.219797/255.0+0.5,136.620717/360.0, 7998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy &r,&g,&b); 8008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 8018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 8028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 8038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 8048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 8058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 8068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 8078d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToLch() 8088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 8098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 8108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy c, 8118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy h, 8128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy L; 8138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 814b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToLch"); 8158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToLCHab(0.545877*QuantumRange,0.966567*QuantumRange, 8168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&L,&c,&h); 8178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(L-88.456154/100.0) >= ReferenceEpsilon) || 8188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(c-(75.219797/255.0+0.5)) >= ReferenceEpsilon) || 8198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(h-(136.620717/255.0+0.5)) >= ReferenceEpsilon)) 8208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 8218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 8228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 8238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 8248d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToLMS() 8258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 8268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 8278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy L, 8288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy M, 8298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy S; 8308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 831b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToLMS"); 8328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToLMS(0.545877*QuantumRange,0.966567*QuantumRange, 8338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&L,&M,&S); 8348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(L-0.611749) >= ReferenceEpsilon) || 8358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(M-0.910088) >= ReferenceEpsilon) || 8368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(S-0.294880) >= ReferenceEpsilon)) 8378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 8388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 8398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 8408d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 8418d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateLMSToRGB() 8428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 8438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 8448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 8458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 8468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 8478d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 848b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," LMSToRGB"); 8498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertLMSToRGB(0.611749,0.910088,0.294880,&r,&g,&b); 8508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 8518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 8528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 8538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 8548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 8558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 8568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 8578d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToLuv() 8588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 8598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 8608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy l, 8618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy u, 8628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy v; 8638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 864b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToLuv"); 8658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToLuv(0.545877*QuantumRange,0.966567*QuantumRange, 8668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&l,&u,&v); 8678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(l-88.456154/262.0) >= ReferenceEpsilon) || 8688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(u-(-51.330414+134.0)/354.0) >= ReferenceEpsilon) || 8698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(v-(76.405526+140.0)/262.0) >= ReferenceEpsilon)) 8708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 8718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 8728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 8738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 8748d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateLuvToRGB() 8758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 8768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 8778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 8788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 8798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 8808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 881b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," LuvToRGB"); 8828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertLuvToRGB(88.456154/100.0,(-51.330414+134.0)/354.0, 8838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (76.405526+140.0)/262.0,&r,&g,&b); 8848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 8858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 8868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 8878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 8888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 8898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 8908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 8918d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToXYZ() 8928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 8938d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 8948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy x, 8958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y, 8968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy z; 8978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 898b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToXYZ"); 8998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToXYZ(0.545877*QuantumRange,0.966567*QuantumRange, 9008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&x,&y,&z); 9018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(x-0.470646) >= ReferenceEpsilon) || 9028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(y-0.730178) >= ReferenceEpsilon) || 9038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(z-0.288324) >= ReferenceEpsilon)) 9048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 9058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 9068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 9078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 9088d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateXYZToRGB() 9098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 9108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 9118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 9128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 9138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 9148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 915b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," XYZToRGB"); 9168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertXYZToRGB(0.470646,0.730178,0.288324,&r,&g,&b); 9178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 9188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 9198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 9208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 9218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 9228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 9238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 9248d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateYDbDrToRGB() 9258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 9268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 9278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 9288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 9298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 9308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 931b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," YDbDrToRGB"); 9328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertYDbDrToRGB(0.783460,-0.480932+0.5,0.451670+0.5,&r,&g,&b); 9338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 9348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 9358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 9368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 9378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 9388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 9398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 9408d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToYDbDr() 9418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 9428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 9438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Db, 9448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Dr, 9458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y; 9468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 947b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToYDbDr"); 9488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToYDbDr(0.545877*QuantumRange,0.966567*QuantumRange, 9498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&Y,&Db,&Dr); 9508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(Y-0.783460) >= ReferenceEpsilon) || 9518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(Db-(-0.480932)) >= ReferenceEpsilon) || 9528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(Dr-0.451670) >= ReferenceEpsilon)) 9538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 9548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 9558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 9568d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 9578d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToYIQ() 9588d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 9598d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 9608d24e06b1c11f778ec1e95f97eb230f40476dae1cristy i, 9618d24e06b1c11f778ec1e95f97eb230f40476dae1cristy q, 9628d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y; 9638d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 964b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToYIQ"); 9658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToYIQ(0.545877*QuantumRange,0.966567*QuantumRange, 9668d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&y,&i,&q); 9678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(y-0.783460) >= ReferenceEpsilon) || 9688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(i-(-0.089078)) >= ReferenceEpsilon) || 9698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(q-(-0.245399)) >= ReferenceEpsilon)) 9708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 9718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 9728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 9738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 9748d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateYIQToRGB() 9758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 9768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 9778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 9788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 9798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 9808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 981b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," YIQToRGB"); 9828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertYIQToRGB(0.783460,-0.089078+0.5,-0.245399+0.5,&r,&g,&b); 9838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 9848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 9858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 9868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 9878d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 9888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 9898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 9908d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToYPbPr() 9918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 9928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 9934ae2e76b21b83f50574ba536540f9cd3c88188bdcristy Pb, 9944ae2e76b21b83f50574ba536540f9cd3c88188bdcristy Pr, 9958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy y; 9968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 997b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToYPbPr"); 9988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToYPbPr(0.545877*QuantumRange,0.966567*QuantumRange, 9994ae2e76b21b83f50574ba536540f9cd3c88188bdcristy 0.463759*QuantumRange,&y,&Pb,&Pr); 10008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(y-0.783460) >= ReferenceEpsilon) || 10014ae2e76b21b83f50574ba536540f9cd3c88188bdcristy (fabs(Pb-(-0.180419)) >= ReferenceEpsilon) || 10024ae2e76b21b83f50574ba536540f9cd3c88188bdcristy (fabs(Pr-(-0.169461)) >= ReferenceEpsilon)) 10038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 10048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 10058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 10068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 10078d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateYPbPrToRGB() 10088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 10098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 10108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 10118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 10128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 10138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1014b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," YPbPrToRGB"); 10158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertYPbPrToRGB(0.783460,-0.180419+0.5,-0.169461+0.5,&r,&g,&b); 10168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 10178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 10188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 10198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 10208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 10218d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 10228d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 10238d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateRGBToYUV() 10248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 10258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 10268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy U, 10278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy V, 10288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y; 10298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1030b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," RGBToYUV"); 10318d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertRGBToYUV(0.545877*QuantumRange,0.966567*QuantumRange, 10328d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 0.463759*QuantumRange,&Y,&U,&V); 10338d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(Y-0.783460) >= ReferenceEpsilon) || 10348d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(U-(-0.157383)) >= ReferenceEpsilon) || 10358d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(V-(-0.208443)) >= ReferenceEpsilon)) 10368d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 10378d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 10388d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 10398d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 10408d24e06b1c11f778ec1e95f97eb230f40476dae1cristystatic MagickBooleanType ValidateYUVToRGB() 10418d24e06b1c11f778ec1e95f97eb230f40476dae1cristy{ 10428d24e06b1c11f778ec1e95f97eb230f40476dae1cristy double 10438d24e06b1c11f778ec1e95f97eb230f40476dae1cristy r, 10448d24e06b1c11f778ec1e95f97eb230f40476dae1cristy g, 10458d24e06b1c11f778ec1e95f97eb230f40476dae1cristy b; 10468d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1047b8588ab056bf28af990771e35d8eaf525f995183cristy (void) FormatLocaleFile(stdout," YUVToRGB"); 10488d24e06b1c11f778ec1e95f97eb230f40476dae1cristy ConvertYUVToRGB(0.783460,-0.157383+0.5,-0.208443+0.5,&r,&g,&b); 10498d24e06b1c11f778ec1e95f97eb230f40476dae1cristy if ((fabs(r-0.545877*QuantumRange) >= ReferenceEpsilon) || 10508d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(g-0.966567*QuantumRange) >= ReferenceEpsilon) || 10518d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (fabs(b-0.463759*QuantumRange) >= ReferenceEpsilon)) 10528d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickFalse); 10538d24e06b1c11f778ec1e95f97eb230f40476dae1cristy return(MagickTrue); 10548d24e06b1c11f778ec1e95f97eb230f40476dae1cristy} 10558d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 1056572e097d004eac4b9767c11eec49d054e413ab00cristystatic size_t ValidateColorspaces(ImageInfo *image_info,size_t *fail, 105780e870e307fe251f8756b5cf8a528ff5331a1d2bcristy ExceptionInfo *exception) 105880e870e307fe251f8756b5cf8a528ff5331a1d2bcristy{ 105980e870e307fe251f8756b5cf8a528ff5331a1d2bcristy MagickBooleanType 106080e870e307fe251f8756b5cf8a528ff5331a1d2bcristy status; 106180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy 106280e870e307fe251f8756b5cf8a528ff5331a1d2bcristy size_t 106380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy test; 106480e870e307fe251f8756b5cf8a528ff5331a1d2bcristy 10658d24e06b1c11f778ec1e95f97eb230f40476dae1cristy /* 106692e5cea4a87c0f3752e09aecf1477d705f64a998cristy Reference: https://code.google.com/p/chroma. 10678d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 10688d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Illuminant = D65 10698d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Observer = 2° (1931) 10708d24e06b1c11f778ec1e95f97eb230f40476dae1cristy 10718d24e06b1c11f778ec1e95f97eb230f40476dae1cristy XYZ 0.470645, 0.730177, 0.288323 10728d24e06b1c11f778ec1e95f97eb230f40476dae1cristy sRGB 0.545877, 0.966567, 0.463759 10738d24e06b1c11f778ec1e95f97eb230f40476dae1cristy CAT02 LMS 0.611749, 0.910088, 0.294880 10748d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y'DbDr 0.783460, -0.480932, 0.451670 10758d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y'IQ 0.783460, -0.089078, -0.245399 10768d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y'PbPr 0.783460, -0.180419, -0.169461 10778d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y'UV 0.783460, -0.157383, -0.208443 10788d24e06b1c11f778ec1e95f97eb230f40476dae1cristy JPEG-Y'CbCr 0.783460, 0.319581, 0.330539 10798d24e06b1c11f778ec1e95f97eb230f40476dae1cristy L*u*v* 88.456154, -51.330414, 76.405526 10808d24e06b1c11f778ec1e95f97eb230f40476dae1cristy L*a*b* 88.456154, -54.671483, 51.662818 10818d24e06b1c11f778ec1e95f97eb230f40476dae1cristy L*C*H* 88.456154, 75.219797, 136.620717 10828d24e06b1c11f778ec1e95f97eb230f40476dae1cristy HSV 110.200859, 0.520200, 0.966567 10838d24e06b1c11f778ec1e95f97eb230f40476dae1cristy HSL 110.200859, 0.882623, 0.715163 10848d24e06b1c11f778ec1e95f97eb230f40476dae1cristy HSI 111.244375, 0.295985, 0.658734 10858d24e06b1c11f778ec1e95f97eb230f40476dae1cristy Y'CbCr 187.577791, 87.586330, 90.040886 10868d24e06b1c11f778ec1e95f97eb230f40476dae1cristy */ 108780e870e307fe251f8756b5cf8a528ff5331a1d2bcristy (void) FormatLocaleFile(stdout,"validate colorspaces:\n"); 10888d24e06b1c11f778ec1e95f97eb230f40476dae1cristy for (test=0; test < 26; test++) 10898d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 10908d24e06b1c11f778ec1e95f97eb230f40476dae1cristy CatchException(exception); 10918d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (void) FormatLocaleFile(stdout," test %.20g: ",(double) test); 10928d24e06b1c11f778ec1e95f97eb230f40476dae1cristy switch (test) 109380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy { 10948d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 0: status=ValidateHSIToRGB(); break; 10958d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 1: status=ValidateRGBToHSI(); break; 10968d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 2: status=ValidateHSLToRGB(); break; 10978d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 3: status=ValidateRGBToHSL(); break; 10988d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 4: status=ValidateHSVToRGB(); break; 10998d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 5: status=ValidateRGBToHSV(); break; 11008d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 6: status=ValidateJPEGYCbCrToRGB(); break; 11018d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 7: status=ValidateRGBToJPEGYCbCr(); break; 11028d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 8: status=ValidateLabToRGB(); break; 11038d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 9: status=ValidateRGBToLab(); break; 11048d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 10: status=ValidateLchToRGB(); break; 11058d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 11: status=ValidateRGBToLch(); break; 11068d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 12: status=ValidateLMSToRGB(); break; 11078d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 13: status=ValidateRGBToLMS(); break; 11088d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 14: status=ValidateLuvToRGB(); break; 11098d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 15: status=ValidateRGBToLuv(); break; 11108d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 16: status=ValidateXYZToRGB(); break; 11118d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 17: status=ValidateRGBToXYZ(); break; 11128d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 18: status=ValidateYDbDrToRGB(); break; 11138d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 19: status=ValidateRGBToYDbDr(); break; 11148d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 20: status=ValidateYIQToRGB(); break; 11158d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 21: status=ValidateRGBToYIQ(); break; 11168d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 22: status=ValidateYPbPrToRGB(); break; 11178d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 23: status=ValidateRGBToYPbPr(); break; 11188d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 24: status=ValidateYUVToRGB(); break; 11198d24e06b1c11f778ec1e95f97eb230f40476dae1cristy case 25: status=ValidateRGBToYUV(); break; 11208d24e06b1c11f778ec1e95f97eb230f40476dae1cristy default: status=MagickFalse; 112180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy } 1122b8588ab056bf28af990771e35d8eaf525f995183cristy if (status == MagickFalse) 11238d24e06b1c11f778ec1e95f97eb230f40476dae1cristy { 11248d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 11258d24e06b1c11f778ec1e95f97eb230f40476dae1cristy GetMagickModule()); 11268d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (*fail)++; 11278d24e06b1c11f778ec1e95f97eb230f40476dae1cristy continue; 11288d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 11298d24e06b1c11f778ec1e95f97eb230f40476dae1cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 11308d24e06b1c11f778ec1e95f97eb230f40476dae1cristy } 113180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy (void) FormatLocaleFile(stdout, 113280e870e307fe251f8756b5cf8a528ff5331a1d2bcristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 113380e870e307fe251f8756b5cf8a528ff5331a1d2bcristy (double) (test-(*fail)),(double) *fail); 113480e870e307fe251f8756b5cf8a528ff5331a1d2bcristy return(test); 113580e870e307fe251f8756b5cf8a528ff5331a1d2bcristy} 113680e870e307fe251f8756b5cf8a528ff5331a1d2bcristy 113780e870e307fe251f8756b5cf8a528ff5331a1d2bcristy/* 113880e870e307fe251f8756b5cf8a528ff5331a1d2bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 113980e870e307fe251f8756b5cf8a528ff5331a1d2bcristy% % 114080e870e307fe251f8756b5cf8a528ff5331a1d2bcristy% % 114180e870e307fe251f8756b5cf8a528ff5331a1d2bcristy% % 11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% V a l i d a t e C o m p a r e C o m m a n d % 11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateCompareCommand() validates the ImageMagick compare command line 11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% program and returns the number of validation tests that passed and failed. 11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateCompareCommand method is: 11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1153bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateCompareCommand(ImageInfo *image_info, 11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 1155bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1170bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateCompareCommand(ImageInfo *image_info, 11710d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 11720d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **arguments, 11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy command[MaxTextExtent]; 11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_arguments; 11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1184bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1188bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test; 11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 1192b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"validate compare command line program:\n"); 11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; compare_options[i] != (char *) NULL; i++) 11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 1196b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout," test %.20g: %s",(double) (test++), 11976aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy compare_options[i]); 1198b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s %s", 11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compare_options[i],reference_filename,reference_filename,output_filename); 12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=StringToArgv(command,&number_arguments); 12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (arguments == (char **) NULL) 12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12031e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 12041e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12088a9106f4d81487da0f318bd13b4caa4cd24f23afcristy status=CompareImagesCommand(image_info,number_arguments,arguments, 12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char **) NULL,exception); 1210e42f658533644aecb733785ffd91b286d6778deacristy for (j=0; j < (ssize_t) number_arguments; j++) 12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments[j]=DestroyString(arguments[j]); 12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=(char **) RelinquishMagickMemory(arguments); 12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status != MagickFalse) 12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12151e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 12161e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1220b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1222b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 122375a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 122475a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% V a l i d a t e C o m p o s i t e C o m m a n d % 12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateCompositeCommand() validates the ImageMagick composite command line 12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% program and returns the number of validation tests that passed and failed. 12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateCompositeCommand method is: 12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1244bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateCompositeCommand(ImageInfo *image_info, 12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 1246bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1261bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateCompositeCommand(ImageInfo *image_info, 12620d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 12630d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **arguments, 12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy command[MaxTextExtent]; 12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_arguments; 12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1275bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1279bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test; 12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 1283b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"validate composite command line program:\n"); 12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; composite_options[i] != (char *) NULL; i++) 12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 1287b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout," test %.20g: %s",(double) (test++), 12886aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy composite_options[i]); 1289b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s %s", 12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_filename,composite_options[i],reference_filename, 12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename); 12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=StringToArgv(command,&number_arguments); 12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (arguments == (char **) NULL) 12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12951e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 12961e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=CompositeImageCommand(image_info,number_arguments,arguments, 13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char **) NULL,exception); 1302e42f658533644aecb733785ffd91b286d6778deacristy for (j=0; j < (ssize_t) number_arguments; j++) 13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments[j]=DestroyString(arguments[j]); 13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=(char **) RelinquishMagickMemory(arguments); 13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status != MagickFalse) 13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13071e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 13081e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1312b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1314b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 131575a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 131675a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% V a l i d a t e C o n v e r t C o m m a n d % 13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateConvertCommand() validates the ImageMagick convert command line 13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% program and returns the number of validation tests that passed and failed. 13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateConvertCommand method is: 13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1336bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateConvertCommand(ImageInfo *image_info, 13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 1338bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 13513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1353bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateConvertCommand(ImageInfo *image_info, 13540d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 13550d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 13583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **arguments, 13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy command[MaxTextExtent]; 13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_arguments; 13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 13663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1367bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1371bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test; 13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 1375b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"validate convert command line program:\n"); 13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; convert_options[i] != (char *) NULL; i++) 13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 1379b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout," test %.20g: %s",(double) test++, 13806aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy convert_options[i]); 1381b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s %s", 13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_filename,convert_options[i],reference_filename,output_filename); 13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=StringToArgv(command,&number_arguments); 13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (arguments == (char **) NULL) 13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13861e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 13871e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=ConvertImageCommand(image_info,number_arguments,arguments, 13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char **) NULL,exception); 1393e42f658533644aecb733785ffd91b286d6778deacristy for (j=0; j < (ssize_t) number_arguments; j++) 13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments[j]=DestroyString(arguments[j]); 13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=(char **) RelinquishMagickMemory(arguments); 13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status != MagickFalse) 13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13981e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 13991e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1403b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1405b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 140675a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 140775a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% V a l i d a t e I d e n t i f y C o m m a n d % 14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateIdentifyCommand() validates the ImageMagick identify command line 14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% program and returns the number of validation tests that passed and failed. 14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateIdentifyCommand method is: 14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1427bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateIdentifyCommand(ImageInfo *image_info, 14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 1429bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1444bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateIdentifyCommand(ImageInfo *image_info, 14450d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 14460d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **arguments, 14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy command[MaxTextExtent]; 14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_arguments; 14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1458bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 14603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 14613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1462bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 14633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test; 14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) output_filename; 14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 1467b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"validate identify command line program:\n"); 14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; identify_options[i] != (char *) NULL; i++) 14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 1471b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout," test %.20g: %s",(double) test++, 14726aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy identify_options[i]); 1473b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(command,MaxTextExtent,"%s %s", 14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy identify_options[i],reference_filename); 14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=StringToArgv(command,&number_arguments); 14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (arguments == (char **) NULL) 14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14781e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 14791e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=IdentifyImageCommand(image_info,number_arguments,arguments, 14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char **) NULL,exception); 1485e42f658533644aecb733785ffd91b286d6778deacristy for (j=0; j < (ssize_t) number_arguments; j++) 14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments[j]=DestroyString(arguments[j]); 14873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=(char **) RelinquishMagickMemory(arguments); 14883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status != MagickFalse) 14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14901e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 14911e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1495b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1497b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 149875a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 149975a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 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 % 15093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 15103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 15113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateImageFormatsInMemory() validates the ImageMagick image formats in 15153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% memory and returns the number of validation tests that passed and failed. 15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateImageFormatsInMemory method is: 15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1519bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateImageFormatsInMemory(ImageInfo *image_info, 15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 1521bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 15364084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp 1537725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy/* 1538725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy Enable this to count remaining $TMPDIR/magick-* files. Note that the count 1539725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy includes any files left over from other runs. 1540725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy*/ 1541725833f85ca9f80f97d8e120888d7a8ac0f01cc1cristy#undef MagickCountTempFiles 15424084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp 1543bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImageFormatsInMemory(ImageInfo *image_info, 15440d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 15450d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 15484084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#ifdef MagickCountTempFiles 15494084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp path[MaxTextExtent], 155077b33baacfae08c3794dd19df1862fb645ebe265cristy SystemCommand[MaxTextExtent], 15514084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#endif 15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size[MaxTextExtent]; 15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const MagickInfo 15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *magick_info; 15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy double 15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy distortion, 15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fuzz; 15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 15623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *difference_image, 15632c404226c827fe0799858fc345a1bea11f2cb546cristy *ping_image, 15646b9ae3f81646d1b6a7d25f7125cb0ff943bad750cristy *reconstruct_image, 1565100b8d9c4f78f07a52dac4aec46abfe4c2013196cristy *reference_image; 15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1570bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 1575100b8d9c4f78f07a52dac4aec46abfe4c2013196cristy length, 1576100b8d9c4f78f07a52dac4aec46abfe4c2013196cristy test; 15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *blob; 15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 1582b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"validate image formats in memory:\n"); 15834084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp 15844084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#ifdef MagickCountTempFiles 15854084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp (void)GetPathTemplate(path); 158633fb803e515438f6df0286aeceb21caa07849613glennrp /* Remove file template except for the leading "/path/to/magick-" */ 15874084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp path[strlen(path)-17]='\0'; 15884084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp (void) FormatLocaleFile(stdout," tmp path is '%s*'\n",path); 15894084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#endif 15904084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp 15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; reference_formats[i].magick != (char *) NULL; i++) 15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magick_info=GetMagickInfo(reference_formats[i].magick,exception); 15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((magick_info == (const MagickInfo *) NULL) || 15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (magick_info->decoder == (DecodeImageHandler *) NULL) || 15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (magick_info->encoder == (EncodeImageHandler *) NULL)) 15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 15985f1c1fff2a55c4d8756556e78c1f307d352ed1b8cristy for (j=0; reference_types[j].type != UndefinedType; j++) 15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Generate reference image. 16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 16041e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout," test %.20g: %s/%s/%s/%.20g-bits", 16051e604812fad85bb96f757a2393015ae3d061c39acristy (double) (test++),reference_formats[i].magick,CommandOptionToMnemonic( 16067998e5fecd99cd9838e7a960168f48b92d38bbfccristy MagickCompressOptions,reference_formats[i].compression), 1607042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy CommandOptionToMnemonic(MagickTypeOptions,reference_types[j].type), 160875a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) reference_types[j].depth); 16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(image_info->filename,reference_filename, 16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MaxTextExtent); 16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=ReadImage(image_info,exception); 1612775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (reference_image == (Image *) NULL || 1613775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16151e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 16161e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1617775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write reference image. 16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1624b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g", 162575a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) reference_image->columns,(double) reference_image->rows); 16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloneString(&image_info->size,size); 16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->depth=reference_types[j].depth; 1628b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(reference_image->filename,MaxTextExtent,"%s:%s", 16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_formats[i].magick,output_filename); 1630018f07f7333b25743d0afff892450cebdb905c1acristy status=SetImageType(reference_image,reference_types[j].type,exception); 1631775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16331e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 16341e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1635775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16408a11cb146177680bfc1b7d89a8cd0c8f2befe468cristy status=SetImageDepth(reference_image,reference_types[j].depth,exception); 1641775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16431e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 16441e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1645775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16507998e5fecd99cd9838e7a960168f48b92d38bbfccristy reference_image->compression=reference_formats[i].compression; 16516f9e0d38526c24e02e6207b1d494fa8fad072b9ccristy status=WriteImage(image_info,reference_image,exception); 16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 1653775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 16543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16551e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 16561e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1657775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 16583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 16593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 16622c404226c827fe0799858fc345a1bea11f2cb546cristy Ping reference image. 16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1664b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", 16653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_formats[i].magick,output_filename); 16662c404226c827fe0799858fc345a1bea11f2cb546cristy ping_image=PingImage(image_info,exception); 1667775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (ping_image == (Image *) NULL || 1668775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 16692c404226c827fe0799858fc345a1bea11f2cb546cristy { 16702c404226c827fe0799858fc345a1bea11f2cb546cristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 16712c404226c827fe0799858fc345a1bea11f2cb546cristy GetMagickModule()); 1672775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 16732c404226c827fe0799858fc345a1bea11f2cb546cristy (*fail)++; 16742c404226c827fe0799858fc345a1bea11f2cb546cristy continue; 16752c404226c827fe0799858fc345a1bea11f2cb546cristy } 16762c404226c827fe0799858fc345a1bea11f2cb546cristy ping_image=DestroyImage(ping_image); 16772c404226c827fe0799858fc345a1bea11f2cb546cristy /* 16782c404226c827fe0799858fc345a1bea11f2cb546cristy Read reference image. 16792c404226c827fe0799858fc345a1bea11f2cb546cristy */ 16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=ReadImage(image_info,exception); 1681775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (reference_image == (Image *) NULL || 1682775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16841e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 16851e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1686775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write reference image. 16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1693b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(reference_image->filename,MaxTextExtent,"%s:%s", 16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_formats[i].magick,output_filename); 16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(image_info->magick,reference_formats[i].magick, 16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MaxTextExtent); 16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image->depth=reference_types[j].depth; 16987998e5fecd99cd9838e7a960168f48b92d38bbfccristy reference_image->compression=reference_formats[i].compression; 16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=8192; 17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=ImageToBlob(image_info,reference_image,&length,exception); 1701775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (blob == (unsigned char *) NULL || 1702775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17041e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 17051e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1706775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 17122c404226c827fe0799858fc345a1bea11f2cb546cristy Ping reference blob. 17132c404226c827fe0799858fc345a1bea11f2cb546cristy */ 17142c404226c827fe0799858fc345a1bea11f2cb546cristy ping_image=PingBlob(image_info,blob,length,exception); 1715775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (ping_image == (Image *) NULL || 1716775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 17172c404226c827fe0799858fc345a1bea11f2cb546cristy { 17182c404226c827fe0799858fc345a1bea11f2cb546cristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 17192c404226c827fe0799858fc345a1bea11f2cb546cristy GetMagickModule()); 1720775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 17212c404226c827fe0799858fc345a1bea11f2cb546cristy (*fail)++; 17222c404226c827fe0799858fc345a1bea11f2cb546cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 17232c404226c827fe0799858fc345a1bea11f2cb546cristy continue; 17242c404226c827fe0799858fc345a1bea11f2cb546cristy } 17252c404226c827fe0799858fc345a1bea11f2cb546cristy ping_image=DestroyImage(ping_image); 17262c404226c827fe0799858fc345a1bea11f2cb546cristy /* 17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read reconstruct image. 17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1729b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", 17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_formats[i].magick,output_filename); 17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reconstruct_image=BlobToImage(image_info,blob,length,exception); 17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 1733775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (reconstruct_image == (Image *) NULL || 1734775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17361e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 17371e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1738775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Compare reference to reconstruct image. 17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 174693540abc1bce255b53806eb43f37362281968d66cristy fuzz=0.003; /* grayscale */ 17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (reference_formats[i].fuzz != 0.0) 17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fuzz=reference_formats[i].fuzz; 17498a9106f4d81487da0f318bd13b4caa4cd24f23afcristy difference_image=CompareImages(reference_image,reconstruct_image, 1750864c6a8f0dbf656fcc51e2f526c6a7c7a4d46c81cristy RootMeanSquaredErrorMetric,&distortion,exception); 17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reconstruct_image=DestroyImage(reconstruct_image); 17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 1753775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (difference_image == (Image *) NULL || 1754775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17561e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 17571e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1758775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy difference_image=DestroyImage(difference_image); 176314154224e937198c540f38d146528c0cdc45d24dcristy if ((QuantumScale*distortion) > fuzz) 17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1765b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n", 176614154224e937198c540f38d146528c0cdc45d24dcristy QuantumScale*distortion); 17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17704084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#ifdef MagickCountTempFiles 17714084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp (void) FormatLocaleFile(stdout,"... pass, "); 17724084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp (void) fflush(stdout); 17734084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp SystemCommand[0]='\0'; 177477b33baacfae08c3794dd19df1862fb645ebe265cristy (void) strncat(SystemCommand,"echo `ls ",9); 177577b33baacfae08c3794dd19df1862fb645ebe265cristy (void) strncat(SystemCommand,path,MaxTextExtent-31); 177677b33baacfae08c3794dd19df1862fb645ebe265cristy (void) strncat(SystemCommand,"* | wc -w` tmp files.",20); 177777b33baacfae08c3794dd19df1862fb645ebe265cristy (void) system(SystemCommand); 17784084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp (void) fflush(stdout); 17794084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#else 17804084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp (void) FormatLocaleFile(stdout,"... pass\n"); 17814084cda465bf1f01d00c2f6e4a6d6f446889cad4glennrp#endif 17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1784b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 178575a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 178675a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 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 % 17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateImageFormatsOnDisk() validates the ImageMagick image formats on disk 18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% and returns the number of validation tests that passed and failed. 18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateImageFormatsOnDisk method is: 18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1806bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateImageFormatsOnDisk(ImageInfo *image_info, 18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 1808bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 18093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1823bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImageFormatsOnDisk(ImageInfo *image_info, 18240d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 18250d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size[MaxTextExtent]; 18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const MagickInfo 18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *magick_info; 18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy double 18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy distortion, 18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fuzz; 18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *difference_image, 18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *reference_image, 18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *reconstruct_image; 18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1845bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1849bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test; 18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 1853b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"validate image formats on disk:\n"); 18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; reference_formats[i].magick != (char *) NULL; i++) 18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magick_info=GetMagickInfo(reference_formats[i].magick,exception); 18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((magick_info == (const MagickInfo *) NULL) || 18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (magick_info->decoder == (DecodeImageHandler *) NULL) || 18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (magick_info->encoder == (EncodeImageHandler *) NULL)) 18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 18615f1c1fff2a55c4d8756556e78c1f307d352ed1b8cristy for (j=0; reference_types[j].type != UndefinedType; j++) 18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Generate reference image. 18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 18671e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout," test %.20g: %s/%s/%s/%.20g-bits", 18681e604812fad85bb96f757a2393015ae3d061c39acristy (double) (test++),reference_formats[i].magick,CommandOptionToMnemonic( 18697998e5fecd99cd9838e7a960168f48b92d38bbfccristy MagickCompressOptions,reference_formats[i].compression), 1870042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy CommandOptionToMnemonic(MagickTypeOptions,reference_types[j].type), 187175a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) reference_types[j].depth); 18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(image_info->filename,reference_filename, 18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MaxTextExtent); 18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=ReadImage(image_info,exception); 1875775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (reference_image == (Image *) NULL || 1876775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18781e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 18791e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1880775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write reference image. 18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1887b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(size,MaxTextExtent,"%.20gx%.20g", 188875a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) reference_image->columns,(double) reference_image->rows); 18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloneString(&image_info->size,size); 18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->depth=reference_types[j].depth; 1891b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(reference_image->filename,MaxTextExtent,"%s:%s", 18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_formats[i].magick,output_filename); 1893018f07f7333b25743d0afff892450cebdb905c1acristy status=SetImageType(reference_image,reference_types[j].type,exception); 1894775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18961e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 18971e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1898775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 18993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19038a11cb146177680bfc1b7d89a8cd0c8f2befe468cristy status=SetImageDepth(reference_image,reference_types[j].depth,exception); 1904775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19061e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 19071e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1908775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19137998e5fecd99cd9838e7a960168f48b92d38bbfccristy reference_image->compression=reference_formats[i].compression; 19146f9e0d38526c24e02e6207b1d494fa8fad072b9ccristy status=WriteImage(image_info,reference_image,exception); 19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 1916775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 19173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19181e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 19191e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1920775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 19213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 19223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 19253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read reference image. 19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1927b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", 19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_formats[i].magick,output_filename); 19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=ReadImage(image_info,exception); 1930775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (reference_image == (Image *) NULL || 1931775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 19323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19331e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 19341e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1935775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 19363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 19373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 19383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write reference image. 19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1942b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(reference_image->filename,MaxTextExtent,"%s:%s", 19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_formats[i].magick,output_filename); 19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image->depth=reference_types[j].depth; 19457998e5fecd99cd9838e7a960168f48b92d38bbfccristy reference_image->compression=reference_formats[i].compression; 19466f9e0d38526c24e02e6207b1d494fa8fad072b9ccristy status=WriteImage(image_info,reference_image,exception); 1947775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse ||exception->severity >= ErrorException) 19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19491e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 19501e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1951775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 19533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 19543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 19553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 19573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read reconstruct image. 19583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1959b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(image_info->filename,MaxTextExtent,"%s:%s", 19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_formats[i].magick,output_filename); 19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reconstruct_image=ReadImage(image_info,exception); 1962775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (reconstruct_image == (Image *) NULL || 1963775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 19643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19651e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 19661e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1967775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Compare reference to reconstruct image. 19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 197593540abc1bce255b53806eb43f37362281968d66cristy fuzz=0.003; /* grayscale */ 19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (reference_formats[i].fuzz != 0.0) 19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fuzz=reference_formats[i].fuzz; 19788a9106f4d81487da0f318bd13b4caa4cd24f23afcristy difference_image=CompareImages(reference_image,reconstruct_image, 1979864c6a8f0dbf656fcc51e2f526c6a7c7a4d46c81cristy RootMeanSquaredErrorMetric,&distortion,exception); 19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reconstruct_image=DestroyImage(reconstruct_image); 19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 1982775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (difference_image == (Image *) NULL || 1983775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 19843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19851e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 19861e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 1987775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy difference_image=DestroyImage(difference_image); 199214154224e937198c540f38d146528c0cdc45d24dcristy if ((QuantumScale*distortion) > fuzz) 19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1994b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n", 199514154224e937198c540f38d146528c0cdc45d24dcristy QuantumScale*distortion); 19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1999b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2002b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 200375a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 200475a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 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 % 20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateImportExportPixels() validates the pixel import and export methods. 20203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% It returns the number of validation tests that passed and failed. 20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateImportExportPixels method is: 20233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 2024bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateImportExportPixels(ImageInfo *image_info, 20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 2026bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 20393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 2041bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateImportExportPixels(ImageInfo *image_info, 20420d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 20430d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 20443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy double 20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy distortion; 20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *difference_image, 20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *reference_image, 20513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *reconstruct_image; 20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 20543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 20553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2056bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 20573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 20583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 20593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 20613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 20623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 20643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 20653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2066bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 20673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test; 20683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) output_filename; 20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 20711e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout, 20721e604812fad85bb96f757a2393015ae3d061c39acristy "validate the import and export of image pixels:\n"); 20733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; reference_map[i] != (char *) NULL; i++) 20743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (j=0; reference_storage[j].type != UndefinedPixel; j++) 20763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Generate reference image. 20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 2081b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout," test %.20g: %s/%s",(double) (test++), 2082042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy reference_map[i],CommandOptionToMnemonic(MagickStorageOptions, 20833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_storage[j].type)); 20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(image_info->filename,reference_filename, 20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MaxTextExtent); 20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=ReadImage(image_info,exception); 2087775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (reference_image == (Image *) NULL || 2088775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 20893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20901e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 20911e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 2092775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 20933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 20943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 20953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare(reference_map[i],"cmy",3) == 0) 20972c404226c827fe0799858fc345a1bea11f2cb546cristy (void) SetImageColorspace(reference_image,CMYKColorspace,exception); 20983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=strlen(reference_map[i])*reference_image->columns* 20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image->rows*reference_storage[j].quantum; 21003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) AcquireQuantumMemory(length,sizeof(*pixels)); 2101775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (pixels == (unsigned char *) NULL || 2102775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 21033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21041e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 21051e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 2106775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 21083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(pixels,0,length*sizeof(*pixels)); 21123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=ExportImagePixels(reference_image,0,0,reference_image->columns, 21133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image->rows,reference_map[i],reference_storage[j].type,pixels, 21143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 2115775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21171e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 21181e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 2119775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 21203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 21213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) RelinquishMagickMemory(pixels); 21223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 21233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 21243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2125d55c935b7c710346ac55d202ac08409d037a0166cristy (void) SetImageBackgroundColor(reference_image,exception); 21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=ImportImagePixels(reference_image,0,0,reference_image->columns, 21273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image->rows,reference_map[i],reference_storage[j].type, 2128018f07f7333b25743d0afff892450cebdb905c1acristy pixels,exception); 2129775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21311e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 21321e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 2133775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 21343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 21353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) RelinquishMagickMemory(pixels); 21363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 21373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read reconstruct image. 21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 21429950d57e1124b73f684fb5946e206994cefda628cristy reconstruct_image=AcquireImage(image_info,exception); 21433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageExtent(reconstruct_image,reference_image->columns, 2144655a8d1b809f9feb6926d06f03b3bd477da53ccacristy reference_image->rows,exception); 2145655a8d1b809f9feb6926d06f03b3bd477da53ccacristy (void) SetImageColorspace(reconstruct_image,reference_image->colorspace, 2146655a8d1b809f9feb6926d06f03b3bd477da53ccacristy exception); 2147d55c935b7c710346ac55d202ac08409d037a0166cristy (void) SetImageBackgroundColor(reconstruct_image,exception); 21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=ImportImagePixels(reconstruct_image,0,0,reconstruct_image->columns, 21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reconstruct_image->rows,reference_map[i],reference_storage[j].type, 2150018f07f7333b25743d0afff892450cebdb905c1acristy pixels,exception); 21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) RelinquishMagickMemory(pixels); 2152775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (status == MagickFalse || exception->severity >= ErrorException) 21533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21541e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 21551e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 2156775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 21573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 21603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 21623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Compare reference to reconstruct image. 21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 21648a9106f4d81487da0f318bd13b4caa4cd24f23afcristy difference_image=CompareImages(reference_image,reconstruct_image, 2165864c6a8f0dbf656fcc51e2f526c6a7c7a4d46c81cristy RootMeanSquaredErrorMetric,&distortion,exception); 21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reconstruct_image=DestroyImage(reconstruct_image); 21673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 2168775194c2a1ab7cface73fe0e484cd65c963739a8dirk if (difference_image == (Image *) NULL || 2169775194c2a1ab7cface73fe0e484cd65c963739a8dirk exception->severity >= ErrorException) 21703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21711e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 21721e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 2173775194c2a1ab7cface73fe0e484cd65c963739a8dirk CatchException(exception); 21743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 21753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 21763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy difference_image=DestroyImage(difference_image); 217814154224e937198c540f38d146528c0cdc45d24dcristy if ((QuantumScale*distortion) > 0.0) 21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2180b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... fail (with distortion %g).\n", 218114154224e937198c540f38d146528c0cdc45d24dcristy QuantumScale*distortion); 21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 21843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2185b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 21863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2188b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 218975a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 219075a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 21943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 21953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 21963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 21993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% V a l i d a t e M o n t a g e C o m m a n d % 22003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateMontageCommand() validates the ImageMagick montage command line 22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% program and returns the number of validation tests that passed and failed. 22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateMontageCommand method is: 22093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 2210bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateMontageCommand(ImageInfo *image_info, 22113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 2212bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 22133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 22173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 22253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 2227bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateMontageCommand(ImageInfo *image_info, 22280d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 22290d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **arguments, 22333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy command[MaxTextExtent]; 22343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_arguments; 22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2241bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 22433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2245bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 22463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test; 22473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 2249b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"validate montage command line program:\n"); 22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; montage_options[i] != (char *) NULL; i++) 22513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 2253b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout," test %.20g: %s",(double) (test++), 22546aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy montage_options[i]); 2255b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s %s", 22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_filename,montage_options[i],reference_filename, 22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename); 22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=StringToArgv(command,&number_arguments); 22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (arguments == (char **) NULL) 22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22611e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 22621e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MontageImageCommand(image_info,number_arguments,arguments, 22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char **) NULL,exception); 2268e42f658533644aecb733785ffd91b286d6778deacristy for (j=0; j < (ssize_t) number_arguments; j++) 22693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments[j]=DestroyString(arguments[j]); 22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=(char **) RelinquishMagickMemory(arguments); 22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status != MagickFalse) 22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22731e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 22741e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 22763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2278b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2280b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 228175a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 228275a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 22873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% V a l i d a t e S t r e a m C o m m a n d % 22923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 22953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 22973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ValidateStreamCommand() validates the ImageMagick stream command line 22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% program and returns the number of validation tests that passed and failed. 22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ValidateStreamCommand method is: 23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 2302bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t ValidateStreamCommand(ImageInfo *image_info, 23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% const char *reference_filename,const char *output_filename, 2304bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t *fail,ExceptionInfo *exception) 23053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 23093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o reference_filename: the reference image filename. 23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o output_filename: the output image filename. 23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o fail: return the number of validation tests that pass. 23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 23173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 2319bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t ValidateStreamCommand(ImageInfo *image_info, 23200d772eda43795018942c81aac81ac0c8b3d92018cristy const char *reference_filename,const char *output_filename,size_t *fail, 23210d772eda43795018942c81aac81ac0c8b3d92018cristy ExceptionInfo *exception) 23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **arguments, 23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy command[MaxTextExtent]; 23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_arguments; 23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2333bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2337bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test; 23393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy test=0; 2341b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"validate stream command line program:\n"); 23423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; stream_options[i] != (char *) NULL; i++) 23433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 2345b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout," test %.20g: %s",(double) (test++), 23466aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy stream_options[i]); 2347b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleString(command,MaxTextExtent,"%s %s %s", 23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy stream_options[i],reference_filename,output_filename); 23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=StringToArgv(command,&number_arguments); 23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (arguments == (char **) NULL) 23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23521e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 23531e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=StreamImageCommand(image_info,number_arguments,arguments, 23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char **) NULL,exception); 2359e42f658533644aecb733785ffd91b286d6778deacristy for (j=0; j < (ssize_t) number_arguments; j++) 23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments[j]=DestroyString(arguments[j]); 23613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy arguments=(char **) RelinquishMagickMemory(arguments); 23623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status != MagickFalse) 23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23641e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"... fail @ %s/%s/%lu.\n", 23651e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickModule()); 23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*fail)++; 23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2369b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"... pass.\n"); 23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2371b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 237275a2623568540f98985ce5bb1d88687eb9c85d2ecristy " summary: %.20g subtests; %.20g passed; %.20g failed.\n",(double) test, 237375a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) (test-(*fail)),(double) *fail); 23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(test); 23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 23763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 23803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 23813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 23823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M a i n % 23833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType ValidateUsage(void) 23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy **p; 23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy static const char 23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *miscellaneous[]= 23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "-debug events display copious debugging information", 24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "-help print program options", 24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "-log format format of debugging information", 24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "-validate type validation type", 24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "-version print version information", 24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) NULL 24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *settings[]= 24073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "-regard-warnings pay attention to warning messages", 24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "-verbose print detailed information about the image", 24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) NULL 24113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2413bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL)); 24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("Copyright: %s\n\n",GetMagickCopyright()); 2415b28d64742e55a8b565085faf37e9aead51f89a83cristy (void) printf("Features: %s\n",GetMagickFeatures()); 24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("Usage: %s [options ...] reference-file\n",GetClientName()); 24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("\nValidate Settings:\n"); 24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=settings; *p != (char *) NULL; p++) 24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf(" %s\n",*p); 24203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("\nMiscellaneous Options:\n"); 24213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=miscellaneous; *p != (char *) NULL; p++) 24223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf(" %s\n",*p); 24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristyint main(int argc,char **argv) 24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DestroyValidate() \ 24293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ \ 24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info=DestroyImageInfo(image_info); \ 24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception=DestroyExceptionInfo(exception); \ 24323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ThrowValidateException(asperity,tag,option) \ 24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ \ 24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \ 24363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy option); \ 24373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); \ 24383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy DestroyValidate(); \ 24393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); \ 24403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename[MaxTextExtent], 24443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_filename[MaxTextExtent], 24453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *option; 24463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy double 24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy elapsed_time, 24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy user_time; 24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ExceptionInfo 24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *exception; 24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *reference_image; 24563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 24583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image_info; 24593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy regard_warnings, 24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24649cafe595c0aaff879d99b073d73645866b418cd4cristy MagickSizeType 24659cafe595c0aaff879d99b073d73645866b418cd4cristy memory_resource, 24669cafe595c0aaff879d99b073d73645866b418cd4cristy map_resource; 24679cafe595c0aaff879d99b073d73645866b418cd4cristy 2468bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy TimerInfo 24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *timer; 24733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2474bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fail, 24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy iterations, 24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests; 24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ValidateType 24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type; 24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Validate the ImageMagick image processing suite. 24843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2485b4d552cbf0187d092fc9f83fdca1ef6ce90206fbcristy MagickCoreGenesis(*argv,MagickTrue); 2486ef2fdc6877747fd39d628c1300fbd21ecca8ddf0cristy (void) setlocale(LC_ALL,""); 2487ef2fdc6877747fd39d628c1300fbd21ecca8ddf0cristy (void) setlocale(LC_NUMERIC,"C"); 24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy iterations=1; 24893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MagickFalse; 24903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type=AllValidate; 24913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy regard_warnings=MagickFalse; 2492d886290b2a32bf23bbdc19b883f32cd4d364b310cristy (void) regard_warnings; 24933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception=AcquireExceptionInfo(); 24943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info=AcquireImageInfo(); 24953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(image_info->filename,ReferenceFilename,MaxTextExtent); 2496bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=1; i < (ssize_t) argc; i++) 24973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy option=argv[i]; 2499042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy if (IsCommandOption(option) == MagickFalse) 25003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(image_info->filename,option,MaxTextExtent); 25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (*(option+1)) 25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'b': 25073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare("bench",option+1) == 0) 25093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2510e27293e706ca05b6b121e9512a83b16f7ad887f2cristy iterations=StringToUnsignedLong(argv[++i]); 25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"UnrecognizedOption",option) 25143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'd': 25163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare("debug",option+1) == 0) 25183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetLogEventMask(argv[++i]); 25203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"UnrecognizedOption",option) 25233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'h': 25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare("help",option+1) == 0) 25273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ValidateUsage(); 25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); 25303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"UnrecognizedOption",option) 25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'l': 25343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare("log",option+1) == 0) 25363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*option != '+') 25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetLogFormat(argv[i+1]); 25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"UnrecognizedOption",option) 25423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'r': 25443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare("regard-warnings",option+1) == 0) 25463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy regard_warnings=MagickTrue; 25483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"UnrecognizedOption",option) 25513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'v': 25533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare("validate",option+1) == 0) 25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2556bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy validate; 25583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*option == '+') 25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i++; 2562e81f552f8ca2fc16632bd9830db3f93af07d514ccristy if (i >= (ssize_t) argc) 25633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"MissingArgument",option); 2564042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy validate=ParseCommandOption(MagickValidateOptions,MagickFalse, 25653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy argv[i]); 25663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (validate < 0) 25673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"UnrecognizedValidateType", 25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy argv[i]); 25693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type=(ValidateType) validate; 25703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((LocaleCompare("version",option+1) == 0) || 25733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (LocaleCompare("-version",option+1) == 0)) 25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2575b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"Version: %s\n", 2576bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy GetMagickVersion((size_t *) NULL)); 25771e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"Copyright: %s\n\n", 25781e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickCopyright()); 25791e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout,"Features: %s\n\n", 25801e604812fad85bb96f757a2393015ae3d061c39acristy GetMagickFeatures()); 25813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); 25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"UnrecognizedOption",option) 25843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 25863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowValidateException(OptionError,"UnrecognizedOption",option) 25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2589205e21f9b7ffdf5b0e48642ba0981b239959f8a9cristy timer=(TimerInfo *) NULL; 25908b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy if (iterations > 1) 25918b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy timer=AcquireTimerInfo(); 25923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=ReadImage(image_info,exception); 25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests=0; 25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fail=0; 25953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (reference_image == (Image *) NULL) 25963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fail++; 25973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 25983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->filename,ReferenceFilename) == 0) 26003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(reference_image->magick,ReferenceImageFormat, 26013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MaxTextExtent); 26023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(reference_filename); 26033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(output_filename); 26043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(reference_image->filename,reference_filename, 26053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MaxTextExtent); 26066f9e0d38526c24e02e6207b1d494fa8fad072b9ccristy status=WriteImage(image_info,reference_image,exception); 26073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_image=DestroyImage(reference_image); 26083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 26093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fail++; 26103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 26113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2612b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"Version: %s\n", 2613bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy GetMagickVersion((size_t *) NULL)); 2614b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout,"Copyright: %s\n\n", 26153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickCopyright()); 26161e604812fad85bb96f757a2393015ae3d061c39acristy (void) FormatLocaleFile(stdout, 26171e604812fad85bb96f757a2393015ae3d061c39acristy "ImageMagick Validation Suite (%s)\n\n",CommandOptionToMnemonic( 26181e604812fad85bb96f757a2393015ae3d061c39acristy MagickValidateOptions,(ssize_t) type)); 261980e870e307fe251f8756b5cf8a528ff5331a1d2bcristy if ((type & ColorspaceValidate) != 0) 2620572e097d004eac4b9767c11eec49d054e413ab00cristy tests+=ValidateColorspaces(image_info,&fail,exception); 26213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((type & CompareValidate) != 0) 26223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests+=ValidateCompareCommand(image_info,reference_filename, 26233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename,&fail,exception); 26243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((type & CompositeValidate) != 0) 26253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests+=ValidateCompositeCommand(image_info,reference_filename, 26263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename,&fail,exception); 26273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((type & ConvertValidate) != 0) 26283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests+=ValidateConvertCommand(image_info,reference_filename, 26293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename,&fail,exception); 2630247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy if ((type & FormatsDiskValidate) != 0) 2631f044a4d421741ac56005ed3a37eb537de94423aacristy { 26329cafe595c0aaff879d99b073d73645866b418cd4cristy memory_resource=SetMagickResourceLimit(MemoryResource,0); 2633247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy map_resource=SetMagickResourceLimit(MapResource,0); 2634247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy (void) FormatLocaleFile(stdout,"[pixel-cache: disk] "); 2635f044a4d421741ac56005ed3a37eb537de94423aacristy tests+=ValidateImageFormatsInMemory(image_info,reference_filename, 2636f044a4d421741ac56005ed3a37eb537de94423aacristy output_filename,&fail,exception); 2637f044a4d421741ac56005ed3a37eb537de94423aacristy (void) FormatLocaleFile(stdout,"[pixel-cache: disk] "); 2638247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy tests+=ValidateImageFormatsOnDisk(image_info,reference_filename, 2639f044a4d421741ac56005ed3a37eb537de94423aacristy output_filename,&fail,exception); 26409cafe595c0aaff879d99b073d73645866b418cd4cristy (void) SetMagickResourceLimit(MemoryResource,memory_resource); 26419cafe595c0aaff879d99b073d73645866b418cd4cristy (void) SetMagickResourceLimit(MapResource,map_resource); 2642f044a4d421741ac56005ed3a37eb537de94423aacristy } 2643247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy if ((type & FormatsMapValidate) != 0) 2644bda201a1b108a687bb6889cb94b525e8fa5af79ccristy { 2645247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy memory_resource=SetMagickResourceLimit(MemoryResource,0); 2646247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy (void) FormatLocaleFile(stdout,"[pixel-cache: memory-mapped] "); 2647247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy tests+=ValidateImageFormatsInMemory(image_info,reference_filename, 2648bda201a1b108a687bb6889cb94b525e8fa5af79ccristy output_filename,&fail,exception); 264934c290f63ae56e219a57b0bae229f48b51364aeacristy (void) FormatLocaleFile(stdout,"[pixel-cache: memory-mapped] "); 2650bda201a1b108a687bb6889cb94b525e8fa5af79ccristy tests+=ValidateImageFormatsOnDisk(image_info,reference_filename, 2651bda201a1b108a687bb6889cb94b525e8fa5af79ccristy output_filename,&fail,exception); 2652247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy (void) SetMagickResourceLimit(MemoryResource,memory_resource); 2653247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy } 2654247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy if ((type & FormatsMemoryValidate) != 0) 2655247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy { 2656247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy (void) FormatLocaleFile(stdout,"[pixel-cache: memory] "); 2657247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy tests+=ValidateImageFormatsInMemory(image_info,reference_filename, 2658247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy output_filename,&fail,exception); 2659247eebde3abe0b3cd9d9572e88a8ebef993f1ff5cristy (void) FormatLocaleFile(stdout,"[pixel-cache: memory] "); 2660bda201a1b108a687bb6889cb94b525e8fa5af79ccristy tests+=ValidateImageFormatsOnDisk(image_info,reference_filename, 2661bda201a1b108a687bb6889cb94b525e8fa5af79ccristy output_filename,&fail,exception); 2662bda201a1b108a687bb6889cb94b525e8fa5af79ccristy } 26633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((type & IdentifyValidate) != 0) 26643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests+=ValidateIdentifyCommand(image_info,reference_filename, 26653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename,&fail,exception); 26663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((type & ImportExportValidate) != 0) 26673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests+=ValidateImportExportPixels(image_info,reference_filename, 26683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename,&fail,exception); 26693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((type & MontageValidate) != 0) 26703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests+=ValidateMontageCommand(image_info,reference_filename, 26713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename,&fail,exception); 26723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((type & StreamValidate) != 0) 26733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tests+=ValidateStreamCommand(image_info,reference_filename, 26743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy output_filename,&fail,exception); 2675b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stdout, 267675a2623568540f98985ce5bb1d88687eb9c85d2ecristy "validation suite: %.20g tests; %.20g passed; %.20g failed.\n", 267775a2623568540f98985ce5bb1d88687eb9c85d2ecristy (double) tests,(double) (tests-fail),(double) fail); 26783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(output_filename); 26803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(reference_filename); 26813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (exception->severity != UndefinedException) 26833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CatchException(exception); 26843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (iterations > 1) 26853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy elapsed_time=GetElapsedTime(timer); 26873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy user_time=GetUserTime(timer); 2688b51dff5c0d16a4c1b69ff683e786cb3b4c467694cristy (void) FormatLocaleFile(stderr, 268975a2623568540f98985ce5bb1d88687eb9c85d2ecristy "Performance: %.20gi %gips %0.3fu %ld:%02ld.%03ld\n",(double) 26906aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy iterations,1.0*iterations/elapsed_time,user_time,(long) 26916aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy (elapsed_time/60.0),(long) ceil(fmod(elapsed_time,60.0)), 26926aa47adc8b43dfdf8d1c2b6323c0bb1f57a5f011cristy (long) (1000.0*(elapsed_time-floor(elapsed_time)))); 26938b76e556a4f5e2cdd916c1c52a9af375a57ca4a6cristy timer=DestroyTimerInfo(timer); 26943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy DestroyValidate(); 26963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickCoreTerminus(); 26973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(fail == 0 ? 0 : 1); 26983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 2699