84 tmp[0]=affine[1]; tmp[1]=affine[2]; tmp[2]=affine[3]; tmp[3]=affine[4];
85 affine[3]=tmp[0]; affine[1]=tmp[1]; affine[4]=tmp[2]; affine[2]=tmp[3];
92 tmp[0]=coeff[3]; tmp[1]=coeff[1]; tmp[2]=coeff[4]; tmp[3]=coeff[2];
93 coeff[1]=tmp[0]; coeff[2]=tmp[1]; coeff[3]=tmp[2]; coeff[4]=tmp[3];
101 inverse[0]=determinant*coeff[4];
102 inverse[1]=determinant*(-coeff[1]);
103 inverse[2]=determinant*(coeff[1]*coeff[5]-coeff[2]*coeff[4]);
104 inverse[3]=determinant*(-coeff[3]);
105 inverse[4]=determinant*coeff[0];
106 inverse[5]=determinant*(coeff[2]*coeff[3]-coeff[0]*coeff[5]);
116 inverse[0]=determinant*(coeff[4]-coeff[7]*coeff[5]);
117 inverse[1]=determinant*(coeff[7]*coeff[2]-coeff[1]);
118 inverse[2]=determinant*(coeff[1]*coeff[5]-coeff[4]*coeff[2]);
119 inverse[3]=determinant*(coeff[6]*coeff[5]-coeff[3]);
120 inverse[4]=determinant*(coeff[0]-coeff[6]*coeff[2]);
121 inverse[5]=determinant*(coeff[3]*coeff[2]-coeff[0]*coeff[5]);
122 inverse[6]=determinant*(coeff[3]*coeff[7]-coeff[6]*coeff[4]);
123 inverse[7]=determinant*(coeff[6]*coeff[1]-coeff[0]*coeff[7]);
148 if ( order < 1 || order > 5 ||
151 return((
size_t) floor((order+1)*(order+2)/2));
158 case 0:
return( 1.0 );
161 case 3:
return( x*y );
162 case 4:
return( x*x );
163 case 5:
return( y*y );
164 case 6:
return( x*x*x );
165 case 7:
return( x*x*y );
166 case 8:
return( x*y*y );
167 case 9:
return( y*y*y );
168 case 10:
return( x*x*x*x );
169 case 11:
return( x*x*x*y );
170 case 12:
return( x*x*y*y );
171 case 13:
return( x*y*y*y );
172 case 14:
return( y*y*y*y );
173 case 15:
return( x*x*x*x*x );
174 case 16:
return( x*x*x*x*y );
175 case 17:
return( x*x*x*y*y );
176 case 18:
return( x*x*y*y*y );
177 case 19:
return( x*y*y*y*y );
178 case 20:
return( y*y*y*y*y );
187 case 1:
return(
"*ii");
188 case 2:
return(
"*jj");
189 case 3:
return(
"*ii*jj");
190 case 4:
return(
"*ii*ii");
191 case 5:
return(
"*jj*jj");
192 case 6:
return(
"*ii*ii*ii");
193 case 7:
return(
"*ii*ii*jj");
194 case 8:
return(
"*ii*jj*jj");
195 case 9:
return(
"*jj*jj*jj");
196 case 10:
return(
"*ii*ii*ii*ii");
197 case 11:
return(
"*ii*ii*ii*jj");
198 case 12:
return(
"*ii*ii*jj*jj");
199 case 13:
return(
"*ii*jj*jj*jj");
200 case 14:
return(
"*jj*jj*jj*jj");
201 case 15:
return(
"*ii*ii*ii*ii*ii");
202 case 16:
return(
"*ii*ii*ii*ii*jj");
203 case 17:
return(
"*ii*ii*ii*jj*jj");
204 case 18:
return(
"*ii*ii*jj*jj*jj");
205 case 19:
return(
"*ii*jj*jj*jj*jj");
206 case 20:
return(
"*jj*jj*jj*jj*jj");
214 case 0:
return( 0.0 );
215 case 1:
return( 1.0 );
216 case 2:
return( 0.0 );
219 case 5:
return( 0.0 );
220 case 6:
return( x*x );
221 case 7:
return( x*y );
222 case 8:
return( y*y );
223 case 9:
return( 0.0 );
224 case 10:
return( x*x*x );
225 case 11:
return( x*x*y );
226 case 12:
return( x*y*y );
227 case 13:
return( y*y*y );
228 case 14:
return( 0.0 );
229 case 15:
return( x*x*x*x );
230 case 16:
return( x*x*x*y );
231 case 17:
return( x*x*y*y );
232 case 18:
return( x*y*y*y );
233 case 19:
return( y*y*y*y );
234 case 20:
return( 0.0 );
242 case 0:
return( 0.0 );
243 case 1:
return( 0.0 );
244 case 2:
return( 1.0 );
246 case 4:
return( 0.0 );
302 distort[0]=affine_matrix->
sx;
303 distort[1]=affine_matrix->
rx;
304 distort[2]=affine_matrix->
ry;
305 distort[3]=affine_matrix->
sy;
306 distort[4]=affine_matrix->
tx;
307 distort[5]=affine_matrix->
ty;
310 return(deskew_image);
368 if ((x-floor(x)) < (ceil(x)-x))
374 DistortMethod *method,
const size_t number_arguments,
const double *arguments,
390 if ( number_values == 0 ) {
406 cp_size = number_values+2;
411 if ( number_arguments < 4*cp_size &&
418 number_coefficients=0;
423 number_coefficients=3*number_values;
428 number_coefficients = 2 + i*number_values;
431 "InvalidArgument",
"%s : '%s'",
"Polynomial",
432 "Invalid order, should be interger 1 to 5, or 1.5");
433 return((
double *) NULL);
435 if ( number_arguments < 1+i*cp_size ) {
437 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
438 "Polynomial", (double) i);
439 return((
double *) NULL);
443 number_coefficients=4*number_values;
449 number_coefficients=10;
455 case QuadraterialDistortion:
456 number_coefficients=19;
460 number_coefficients=1;
463 number_coefficients=5;
469 number_coefficients=6;
473 number_coefficients=8;
477 number_coefficients=9;
481 number_coefficients=10;
484 perror(
"unknown method given");
489 if (coeff == (
double *) NULL)
493 "GenerateCoefficients");
494 return((
double *) NULL);
498 for (i=0; i < number_coefficients; i++)
513 if ( number_arguments%cp_size != 0 ||
514 number_arguments < cp_size ) {
516 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
519 return((
double *) NULL);
522 if ( number_arguments == cp_size ) {
524 if ( cp_values == 0 ) {
527 coeff[2] = arguments[0] - arguments[2];
529 coeff[5] = arguments[1] - arguments[3];
533 for (i=0; i<number_values; i++)
534 coeff[i*3+2] = arguments[cp_values+i];
553 if (matrix == (
double **) NULL || vectors == (
double **) NULL)
560 "%s",
"DistortCoefficients");
561 return((
double *) NULL);
564 for (i=0; i < number_values; i++)
565 vectors[i] = &(coeff[i*3]);
567 for (i=0; i < number_arguments; i+=cp_size) {
568 terms[0] = arguments[i+cp_x];
569 terms[1] = arguments[i+cp_y];
572 &(arguments[i+cp_values]),3UL,number_values);
574 if ( number_arguments == 2*cp_size ) {
579 terms[0] = arguments[cp_x]
580 - ( arguments[cp_size+cp_y] - arguments[cp_y] );
581 terms[1] = arguments[cp_y] +
582 + ( arguments[cp_size+cp_x] - arguments[cp_x] );
584 if ( cp_values == 0 ) {
588 uv2[0] = arguments[0] - arguments[5] + arguments[1];
589 uv2[1] = arguments[1] + arguments[4] - arguments[0];
595 &(arguments[cp_values]),3UL,number_values);
605 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
607 return((
double *) NULL);
628 if (((number_arguments % cp_size) != 0) || (number_arguments < cp_size))
631 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
634 return((
double *) NULL);
640 if (matrix == (
double **) NULL)
646 return((
double *) NULL);
651 vectors[0]=(&(coeff[0]));
652 for (i=0; i < number_arguments; i+=4)
654 terms[0]=arguments[i+0];
655 terms[1]=(-arguments[i+1]);
659 terms[0]=arguments[i+1];
660 terms[1]=arguments[i+0];
674 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
676 return((
double *) NULL);
683 inverse[2]=(-coeff[1]);
708 if (number_arguments != 6) {
711 "InvalidArgument",
"%s : 'Needs 6 coeff values'",
713 return((
double *) NULL);
716 for(i=0; i<6UL; i++ )
717 inverse[i] = arguments[i];
753 x = nx = (double)(image->
columns)/2.0 + (double)image->
page.
x;
754 y = ny = (
double)(image->
rows)/2.0 + (
double)image->
page.
y;
756 switch ( number_arguments ) {
760 "InvalidArgument",
"%s : 'Needs at least 1 argument'",
762 return((
double *) NULL);
767 sx = sy = arguments[0];
771 x = nx = arguments[0];
772 y = ny = arguments[1];
773 switch ( number_arguments ) {
778 sx = sy = arguments[2];
787 sx = sy = arguments[2];
802 "InvalidArgument",
"%s : 'Too Many Arguments (7 or less)'",
804 return((
double *) NULL);
812 "InvalidArgument",
"%s : 'Zero Scale Given'",
814 return((
double *) NULL);
822 coeff[2]=x-nx*coeff[0]-ny*coeff[1];
825 coeff[5]=y-nx*coeff[3]-ny*coeff[4];
871 if ( number_arguments%cp_size != 0 ||
872 number_arguments < cp_size*4 ) {
874 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
877 return((
double *) NULL);
880 vectors[0] = &(coeff[0]);
883 if (matrix == (
double **) NULL) {
887 "%s",
"DistortCoefficients");
888 return((
double *) NULL);
891 for (i=0; i < number_arguments; i+=4) {
892 terms[0]=arguments[i+cp_x];
893 terms[1]=arguments[i+cp_y];
898 terms[6]=-terms[0]*arguments[i+cp_u];
899 terms[7]=-terms[1]*arguments[i+cp_u];
906 terms[3]=arguments[i+cp_x];
907 terms[4]=arguments[i+cp_y];
909 terms[6]=-terms[3]*arguments[i+cp_v];
910 terms[7]=-terms[4]*arguments[i+cp_v];
920 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
922 return((
double *) NULL);
930 coeff[8] = coeff[6]*arguments[cp_x]
931 + coeff[7]*arguments[cp_y] + 1.0;
932 coeff[8] = (coeff[8] < 0.0) ? -1.0 : +1.0;
941 if (number_arguments != 8) {
944 "InvalidArgument",
"%s : 'Needs 8 coefficient values'",
946 return((
double *) NULL);
957 coeff[8] = coeff[6]*arguments[2]
958 + coeff[7]*arguments[5] + 1.0;
959 coeff[8] = (coeff[8] < 0.0) ? -1.0 : +1.0;
989 if ( number_arguments%cp_size != 0 ||
990 number_arguments < cp_size*4 ) {
992 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
995 return((
double *) NULL);
1000 if (matrix == (
double **) NULL || vectors == (
double **) NULL)
1007 "%s",
"DistortCoefficients");
1008 return((
double *) NULL);
1011 for (i=0; i < number_values; i++)
1012 vectors[i] = &(coeff[i*4]);
1014 for (i=0; i < number_arguments; i+=cp_size) {
1015 terms[0] = arguments[i+cp_x];
1016 terms[1] = arguments[i+cp_y];
1017 terms[2] = terms[0]*terms[1];
1020 &(arguments[i+cp_values]),4UL,number_values);
1029 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
1031 return((
double *) NULL);
1073 coeff[8] = coeff[0]*coeff[5] - coeff[1]*coeff[4];
1074 coeff[9] = 2*(coeff[2]*coeff[5] - coeff[1]*coeff[6]);
1079 case QuadrilateralDistortion:
1133 coeff[0] = arguments[0];
1135 nterms = (size_t) coeff[1];
1142 if ((matrix == (
double **) NULL) || (vectors == (
double **) NULL) ||
1143 (terms == (
double *) NULL))
1151 "%s",
"DistortCoefficients");
1152 return((
double *) NULL);
1155 for (i=0; i < number_values; i++)
1156 vectors[i] = &(coeff[2+i*nterms]);
1158 for (i=1; i < number_arguments; i+=cp_size) {
1159 for (j=0; j < (ssize_t) nterms; j++)
1160 terms[j] =
poly_basis_fn(j,arguments[i+cp_x],arguments[i+cp_y]);
1162 &(arguments[i+cp_values]),nterms,number_values);
1172 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
1174 return((
double *) NULL);
1214 if ( number_arguments >= 1 && arguments[0] <
MagickEpsilon ) {
1217 "InvalidArgument",
"%s : 'Arc Angle Too Small'",
1219 return((
double *) NULL);
1221 if ( number_arguments >= 3 && arguments[2] <
MagickEpsilon ) {
1224 "InvalidArgument",
"%s : 'Outer Radius Too Small'",
1226 return((
double *) NULL);
1229 if ( number_arguments >= 1 )
1233 if ( number_arguments >= 2 )
1238 coeff[3] = (double)image->
rows-1;
1239 coeff[2] = (
double)image->
columns/coeff[1] + coeff[3]/2.0;
1240 if ( number_arguments >= 3 ) {
1241 if ( number_arguments >= 4 )
1242 coeff[3] = arguments[2] - arguments[3];
1244 coeff[3] *= arguments[2]/coeff[2];
1245 coeff[2] = arguments[2];
1247 coeff[4] = ((double)image->
columns-1.0)/2.0;
1264 if ( number_arguments == 3
1266 || number_arguments > 8 ) {
1268 OptionError,
"InvalidArgument",
"%s : number of arguments",
1271 return((
double *) NULL);
1274 if ( number_arguments >= 1 )
1275 coeff[0] = arguments[0];
1279 coeff[1] = number_arguments >= 2 ? arguments[1] : 0.0;
1281 if ( number_arguments >= 4 ) {
1282 coeff[2] = arguments[2];
1283 coeff[3] = arguments[3];
1287 coeff[3] = (double)(image->
rows)/2.0+image->
page.
y;
1291 if ( number_arguments >= 5 )
1293 coeff[5] = coeff[4];
1294 if ( number_arguments >= 6 )
1303 fabs(coeff[3]-image->
page.
y));
1307 fabs(coeff[3]-image->
page.
y-image->
rows));
1312 rx = coeff[2]-image->
page.
x;
1313 ry = coeff[3]-image->
page.
y;
1314 coeff[0] = rx*rx+ry*ry;
1315 ry = coeff[3]-image->
page.
y-image->
rows;
1316 coeff[0] =
MagickMax(coeff[0],rx*rx+ry*ry);
1318 coeff[0] =
MagickMax(coeff[0],rx*rx+ry*ry);
1319 ry = coeff[3]-image->
page.
y;
1320 coeff[0] =
MagickMax(coeff[0],rx*rx+ry*ry);
1321 coeff[0] = sqrt(coeff[0]);
1328 "InvalidArgument",
"%s : Invalid Radius",
1331 return((
double *) NULL);
1335 coeff[6]=(double) image->
columns/(coeff[5]-coeff[4]);
1336 coeff[7]=(double) image->
rows/(coeff[0]-coeff[1]);
1339 coeff[6]=(coeff[5]-coeff[4])/image->
columns;
1340 coeff[7]=(coeff[0]-coeff[1])/image->
rows;
1369 if ( arguments[0] <
MagickEpsilon || arguments[0] > 160.0 ) {
1371 "InvalidArgument",
"%s : Invalid FOV Angle",
1374 return((
double *) NULL);
1381 coeff[1] = (double) image->
columns/coeff[0];
1384 coeff[1] = (
double) image->
columns / ( 2 * tan(coeff[0]/2) );
1387 coeff[3] = (double)(image->
rows)/2.0+image->
page.
y;
1388 coeff[4] = coeff[2];
1389 coeff[5] = coeff[3];
1417 if ( (number_arguments < 3) || (number_arguments == 7) ||
1418 (number_arguments == 9) || (number_arguments > 10) )
1422 OptionError,
"InvalidArgument",
"%s : number of arguments",
1424 return((
double *) NULL);
1427 coeff[0] = arguments[0];
1428 coeff[1] = arguments[1];
1429 coeff[2] = arguments[2];
1430 if ((number_arguments == 3) || (number_arguments == 5) )
1431 coeff[3] = 1.0 - coeff[0] - coeff[1] - coeff[2];
1433 coeff[3] = arguments[3];
1435 coeff[0] *= pow(rscale,3.0);
1436 coeff[1] *= rscale*rscale;
1439 if ( number_arguments >= 8 ) {
1440 coeff[4] = arguments[4] * pow(rscale,3.0);
1441 coeff[5] = arguments[5] * rscale*rscale;
1442 coeff[6] = arguments[6] * rscale;
1443 coeff[7] = arguments[7];
1446 coeff[4] = coeff[0];
1447 coeff[5] = coeff[1];
1448 coeff[6] = coeff[2];
1449 coeff[7] = coeff[3];
1452 if ( number_arguments == 5 ) {
1453 coeff[8] = arguments[3];
1454 coeff[9] = arguments[4];
1456 else if ( number_arguments == 6 ) {
1457 coeff[8] = arguments[4];
1458 coeff[9] = arguments[5];
1460 else if ( number_arguments == 10 ) {
1461 coeff[8] = arguments[8];
1462 coeff[9] = arguments[9];
1467 coeff[9] = (
double)image->
rows/2.0 + image->
page.
y;
1478 if ( number_arguments%cp_size != 0 ||
1479 number_arguments < cp_size ) {
1481 "InvalidArgument",
"%s : 'requires CP's (4 numbers each)'",
1484 return((
double *) NULL);
1488 if ( artifact != (
const char *) NULL ) {
1492 OptionError,
"InvalidArgument",
"%s",
"-define shepards:power" );
1494 return((
double *) NULL);
1506 perror(
"no method handler");
1507 return((
double *) NULL);
1548 #define DistortResizeImageTag "Distort/Image" 1566 assert(image != (
const Image *) NULL);
1572 if ((columns == 0) || (rows == 0))
1573 return((
Image *) NULL);
1576 (void) memset(distort_args,0,
sizeof(distort_args));
1577 distort_args[4]=(double) image->
columns;
1578 distort_args[6]=(
double) columns;
1579 distort_args[9]=(double) image->
rows;
1580 distort_args[11]=(
double) rows;
1585 if (tmp_image == (
Image *) NULL)
1586 return((
Image *) NULL);
1599 if (resize_image == (
Image *) NULL)
1600 return((
Image *) NULL);
1620 if (resize_alpha == (
Image *) NULL)
1621 return((
Image *) NULL);
1625 if (tmp_image == (
Image *) NULL)
1626 return((
Image *) NULL);
1632 if (resize_image == (
Image *) NULL)
1635 return((
Image *) NULL);
1651 crop_area.
width=columns;
1656 tmp_image=resize_image;
1657 resize_image=
CropImage(tmp_image,&crop_area,exception);
1659 if (resize_image != (
Image *) NULL)
1664 return(resize_image);
1756 const size_t number_arguments,
const double *arguments,
1759 #define DistortImageTag "Distort/Image" 1777 assert(image != (
Image *) NULL);
1789 if ( number_arguments != 2 )
1792 "InvalidArgument",
"%s : '%s'",
"Resize",
1793 "Invalid number of args: 2 only");
1794 return((
Image *) NULL);
1797 (
size_t)arguments[1], exception);
1798 return(distort_image);
1809 arguments, 0, exception);
1810 if ( coeff == (
double *) NULL )
1811 return((
Image *) NULL);
1836 s.
x=s.
y=min.
x=max.
x=min.
y=max.
y=0.0;
1839 #define InitalBounds(p) \ 1842 min.x = max.x = p.x; \ 1843 min.y = max.y = p.y; \ 1845 #define ExpandBounds(p) \ 1848 min.x = MagickMin(min.x,p.x); \ 1849 max.x = MagickMax(max.x,p.x); \ 1850 min.y = MagickMin(min.y,p.y); \ 1851 max.y = MagickMax(max.y,p.y); \ 1858 {
double inverse[6];
1860 s.
x = (double) image->
page.
x;
1861 s.
y = (
double) image->
page.
y;
1862 d.
x = inverse[0]*s.
x+inverse[1]*s.
y+inverse[2];
1863 d.
y = inverse[3]*s.
x+inverse[4]*s.
y+inverse[5];
1866 s.
y = (
double) image->
page.
y;
1867 d.
x = inverse[0]*s.
x+inverse[1]*s.
y+inverse[2];
1868 d.
y = inverse[3]*s.
x+inverse[4]*s.
y+inverse[5];
1870 s.
x = (double) image->
page.
x;
1872 d.
x = inverse[0]*s.
x+inverse[1]*s.
y+inverse[2];
1873 d.
y = inverse[3]*s.
x+inverse[4]*s.
y+inverse[5];
1877 d.
x = inverse[0]*s.
x+inverse[1]*s.
y+inverse[2];
1878 d.
y = inverse[3]*s.
x+inverse[4]*s.
y+inverse[5];
1883 {
double inverse[8], scale;
1885 s.
x = (double) image->
page.
x;
1886 s.
y = (
double) image->
page.
y;
1887 scale=inverse[6]*s.
x+inverse[7]*s.
y+1.0;
1889 d.
x = scale*(inverse[0]*s.
x+inverse[1]*s.
y+inverse[2]);
1890 d.
y = scale*(inverse[3]*s.
x+inverse[4]*s.
y+inverse[5]);
1893 s.
y = (
double) image->
page.
y;
1894 scale=inverse[6]*s.
x+inverse[7]*s.
y+1.0;
1896 d.
x = scale*(inverse[0]*s.
x+inverse[1]*s.
y+inverse[2]);
1897 d.
y = scale*(inverse[3]*s.
x+inverse[4]*s.
y+inverse[5]);
1899 s.
x = (double) image->
page.
x;
1901 scale=inverse[6]*s.
x+inverse[7]*s.
y+1.0;
1903 d.
x = scale*(inverse[0]*s.
x+inverse[1]*s.
y+inverse[2]);
1904 d.
y = scale*(inverse[3]*s.
x+inverse[4]*s.
y+inverse[5]);
1908 scale=inverse[6]*s.
x+inverse[7]*s.
y+1.0;
1910 d.
x = scale*(inverse[0]*s.
x+inverse[1]*s.
y+inverse[2]);
1911 d.
y = scale*(inverse[3]*s.
x+inverse[4]*s.
y+inverse[5]);
1918 a = coeff[0]-coeff[1]/2; ca = cos(a); sa = sin(a);
1922 d.
x = (coeff[2]-coeff[3])*ca;
1923 d.
y = (coeff[2]-coeff[3])*sa;
1925 a = coeff[0]+coeff[1]/2; ca = cos(a); sa = sin(a);
1929 d.
x = (coeff[2]-coeff[3])*ca;
1930 d.
y = (coeff[2]-coeff[3])*sa;
1934 a<(coeff[0]+coeff[1]/2.0); a+=
MagickPI2 ) {
1935 ca = cos(a); sa = sin(a);
1946 coeff[3] = (double)image->
rows/coeff[3];
1951 if (number_arguments < 2)
1952 coeff[2] = coeff[3] = 0.0;
1953 min.
x = coeff[2]-coeff[0];
1954 max.
x = coeff[2]+coeff[0];
1955 min.
y = coeff[3]-coeff[0];
1956 max.
y = coeff[3]+coeff[0];
1958 coeff[7]=(double) geometry.
height/(coeff[0]-coeff[1]);
1966 geometry.
x = geometry.
y = 0;
1967 geometry.
height = (size_t) ceil(coeff[0]-coeff[1]);
1968 geometry.
width = (size_t)
1969 ceil((coeff[0]-coeff[1])*(coeff[5]-coeff[4])*0.5);
1971 coeff[6]=(coeff[5]-coeff[4])/geometry.
width;
1972 coeff[7]=(coeff[0]-coeff[1])/geometry.
height;
1980 geometry.
x = geometry.
y = 0;
1981 geometry.
width = (size_t) ceil( 2.0*coeff[1]*tan(coeff[0]/2.0) );
1982 geometry.
height = (size_t) ceil( 2.0*coeff[3]/cos(coeff[0]/2.0) );
1984 coeff[4] = (double) geometry.
width/2.0;
1985 coeff[5] = (
double) geometry.
height/2.0;
1993 geometry.
x = geometry.
y = 0;
1994 geometry.
width = (size_t) ceil(coeff[0]*coeff[1]);
1995 geometry.
height = (size_t) (2*coeff[3]);
1997 coeff[4] = (double) geometry.
width/2.0;
1998 coeff[5] = (
double) geometry.
height/2.0;
2006 case QuadrilateralDistortion:
2023 geometry.
x = (ssize_t) floor(min.
x-0.5);
2024 geometry.
y = (ssize_t) floor(min.
y-0.5);
2025 geometry.
width=(size_t) ceil(max.
x-geometry.
x+0.5);
2026 geometry.
height=(size_t) ceil(max.
y-geometry.
y+0.5);
2037 if ( artifact != (
const char *) NULL ) {
2042 "distort:viewport",artifact);
2056 if ( bestfit || viewport_given ) {
2058 " -size %.20gx%.20g -page %+.20g%+.20g xc: +insert \\\n",
2059 (
double) geometry.
width,(double) geometry.
height,(
double) geometry.
x,
2060 (double) geometry.
y);
2061 lookup=
"v.p{xx-v.page.x-0.5,yy-v.page.y-0.5}";
2064 image_gen[0] =
'\0';
2065 lookup =
"p{xx-page.x-0.5,yy-page.y-0.5}";
2077 if (inverse == (
double *) NULL)
2082 return((
Image *) NULL);
2088 " -distort AffineProjection \\\n '");
2089 for (i=0; i < 5; i++)
2095 "Equivalent scale, rotation(deg), translation:\n");
2105 " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n");
2121 if (inverse == (
double *) NULL)
2126 "DistortCoefficients");
2127 return((
Image *) NULL);
2132 " -distort PerspectiveProjection \\\n '");
2133 for (i=0; i < 4; i++)
2146 " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n");
2150 " xx=(%+.*g*ii %+.*g*jj %+.*g)/rr;\n",
2154 " yy=(%+.*g*ii %+.*g*jj %+.*g)/rr;\n",
2158 coeff[8] < 0.0 ?
"<" :
">", lookup);
2166 coeff[0],coeff[1],coeff[2],coeff[3]);
2168 coeff[4],coeff[5],coeff[6],coeff[7]);
2172 coeff[8], coeff[9]);
2175 "BilinearForward Distort, FX Equivelent:\n");
2178 " -fx 'ii=i+page.x%+lf; jj=j+page.y%+lf;\n",0.5-coeff[3],0.5-
2181 coeff[6], -coeff[2], coeff[8]);
2186 " rt=bb*bb %+lf*(%lf*ii%+lf*jj);\n",-2*coeff[9],coeff[4],
2189 " yy=( -bb + sqrt(rt) ) / %lf;\n",coeff[9]);
2193 -coeff[4],coeff[0]);
2195 " xx=(ii %+lf*yy)/(%lf %+lf*yy);\n",-coeff[1],coeff[0],
2197 if ( coeff[9] != 0 )
2210 coeff[3], coeff[0], coeff[1], coeff[2]);
2212 coeff[7], coeff[4], coeff[5], coeff[6]);
2215 "BilinearReverse Distort, FX Equivelent:\n");
2218 " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n");
2220 " xx=%+lf*ii %+lf*jj %+lf*ii*jj %+lf;\n",coeff[0],coeff[1],
2221 coeff[2], coeff[3]);
2223 " yy=%+lf*ii %+lf*jj %+lf*ii*jj %+lf;\n",coeff[4],coeff[5],
2224 coeff[6], coeff[7]);
2230 size_t nterms = (size_t) coeff[1];
2232 "Polynomial (order %lg, terms %lu), FX Equivelent\n",coeff[0],
2233 (
unsigned long) nterms);
2236 " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n");
2238 for (i=0; i < (ssize_t) nterms; i++)
2240 if ((i != 0) && (i%4 == 0))
2246 for (i=0; i < (ssize_t) nterms; i++)
2248 if ((i != 0) && (i%4 == 0))
2259 for (i=0; i < 5; i++)
2261 " c%.20g = %+lf\n",(
double) i,coeff[i]);
2271 " yy=(%lf - hypot(ii,jj)) * %lf;\n",coeff[2],coeff[3]);
2278 for (i=0; i < 8; i++)
2284 " -fx 'ii=i+page.x%+lf; jj=j+page.y%+lf;\n",-coeff[2],-coeff[3]);
2286 -(coeff[4]+coeff[5])/2 );
2291 -coeff[1],coeff[7] );
2298 "DePolar Distort, Internal Coefficents\n");
2299 for (i=0; i < 8; i++)
2305 coeff[6],+coeff[4]);
2307 coeff[7],+coeff[1]);
2318 "Cylinder to Plane Distort, Internal Coefficents\n");
2321 "Cylinder to Plane Distort, FX Equivelent:\n");
2324 " -fx 'ii=i+page.x%+lf+0.5; jj=j+page.y%+lf+0.5;\n",-coeff[4],
2336 "Plane to Cylinder Distort, Internal Coefficents\n");
2339 "Plane to Cylinder Distort, FX Equivelent:\n");
2342 " -fx 'ii=i+page.x%+lf+0.5; jj=j+page.y%+lf+0.5;\n",-coeff[4],
2364 yc=((double)image->
rows-1.0)/2.0+image->
page.
y;
2368 if ( fabs(coeff[8]-xc-0.5) < 0.1 && fabs(coeff[9]-yc-0.5) < 0.1 )
2374 " ii=i-xc; jj=j-yc; rr=hypot(ii,jj);\n");
2376 " ii=ii%s(%lf*rr*rr*rr %+lf*rr*rr %+lf*rr %+lf);\n",
2380 " jj=jj%s(%lf*rr*rr*rr %+lf*rr*rr %+lf*rr %+lf);\n",
2394 {
const char *artifact;
2396 output_scaling = 1.0;
2397 if (artifact != (
const char *) NULL) {
2399 geometry.
width=(size_t) (output_scaling*geometry.
width+0.5);
2400 geometry.
height=(size_t) (output_scaling*geometry.
height+0.5);
2401 geometry.
x=(ssize_t) (output_scaling*geometry.
x+0.5);
2402 geometry.
y=(ssize_t) (output_scaling*geometry.
y+0.5);
2403 if ( output_scaling < 0.1 ) {
2406 "InvalidArgument",
"%s",
"-set option:distort:scale" );
2407 return((
Image *) NULL);
2409 output_scaling = 1/output_scaling;
2412 #define ScaleFilter(F,A,B,C,D) \ 2413 ScaleResampleFilter( (F), \ 2414 output_scaling*(A), output_scaling*(B), \ 2415 output_scaling*(C), output_scaling*(D) ) 2422 if (distort_image == (
Image *) NULL)
2425 return((
Image *) NULL);
2432 return((
Image *) NULL);
2439 distort_image->
page.
x=geometry.
x;
2440 distort_image->
page.
y=geometry.
y;
2471 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2472 #pragma omp parallel for schedule(static) shared(progress,status) \ 2473 magick_number_threads(image,distort_image,distort_image->rows,1) 2475 for (j=0; j < (ssize_t) distort_image->
rows; j++)
2517 coeff[3], coeff[4] );
2530 for (i=0; i < (ssize_t) distort_image->
columns; i++)
2533 d.
x = (double) (geometry.
x+i+0.5)*output_scaling;
2534 d.
y = (double) (geometry.
y+j+0.5)*output_scaling;
2541 s.
x=coeff[0]*d.
x+coeff[1]*d.
y+coeff[2];
2542 s.
y=coeff[3]*d.
x+coeff[4]*d.
y+coeff[5];
2549 p,q,r,abs_r,abs_c6,abs_c7,scale;
2551 p=coeff[0]*d.
x+coeff[1]*d.
y+coeff[2];
2552 q=coeff[3]*d.
x+coeff[4]*d.
y+coeff[5];
2553 r=coeff[6]*d.
x+coeff[7]*d.
y+1.0;
2555 validity = (r*coeff[8] < 0.0) ? 0.0 : 1.0;
2558 abs_c6 = fabs(coeff[6]);
2559 abs_c7 = fabs(coeff[7]);
2560 if ( abs_c6 > abs_c7 ) {
2561 if ( abs_r < abs_c6*output_scaling )
2562 validity = 0.5 - coeff[8]*r/(coeff[6]*output_scaling);
2564 else if ( abs_r < abs_c7*output_scaling )
2565 validity = 0.5 - coeff[8]*r/(coeff[7]*output_scaling);
2567 if ( validity > 0.0 ) {
2575 (r*coeff[0] - p*coeff[6])*scale,
2576 (r*coeff[1] - p*coeff[7])*scale,
2577 (r*coeff[3] - q*coeff[6])*scale,
2578 (r*coeff[4] - q*coeff[7])*scale );
2585 s.
x=coeff[0]*d.
x+coeff[1]*d.
y+coeff[2]*d.
x*d.
y+coeff[3];
2586 s.
y=coeff[4]*d.
x+coeff[5]*d.
y 2587 +coeff[6]*d.
x*d.
y+coeff[7];
2590 coeff[0] + coeff[2]*d.
y,
2591 coeff[1] + coeff[2]*d.
x,
2592 coeff[4] + coeff[6]*d.
y,
2593 coeff[5] + coeff[6]*d.
x );
2601 d.
x -= coeff[3]; d.
y -= coeff[7];
2602 b = coeff[6]*d.
x - coeff[2]*d.
y + coeff[8];
2603 c = coeff[4]*d.
x - coeff[0]*d.
y;
2611 c = b*b - 2*coeff[9]*c;
2615 s.
y = ( -b + sqrt(c) )/coeff[9];
2617 if ( validity > 0.0 )
2618 s.
x = ( d.
x - coeff[1]*s.
y) / ( coeff[0] + coeff[2]*s.
y );
2640 nterms=(ssize_t)coeff[1];
2645 s.
x=s.
y=du.
x=du.
y=dv.
x=dv.
y=0.0;
2646 for(k=0; k < nterms; k++) {
2660 s.
x = (double) ((atan2(d.
y,d.
x) - coeff[0])/
Magick2PI);
2662 s.
y = hypot(d.
x,d.
y);
2671 (
double) (coeff[1]/(
Magick2PI*s.
y)), 0, 0, coeff[3] );
2674 distort_image->
columns*2, 0, 0, coeff[3] );
2677 s.
x = s.
x*coeff[1] + coeff[4] + image->
page.
x +0.5;
2678 s.
y = (coeff[2] - s.
y) * coeff[3] + image->
page.
y;
2685 s.
x = atan2(d.
x,d.
y) - (coeff[4]+coeff[5])/2;
2689 s.
y = hypot(d.
x,d.
y);
2696 (
double) (coeff[6]/(
Magick2PI*s.
y)), 0, 0, coeff[7] );
2699 distort_image->
columns*2, 0, 0, coeff[7] );
2703 s.
y = (s.
y-coeff[1])*coeff[7] + image->
page.
y;
2709 d.
x = ((double)i+0.5)*output_scaling*coeff[6]+coeff[4];
2710 d.
y = ((double)j+0.5)*output_scaling*coeff[7]+coeff[1];
2711 s.
x = d.
y*sin(d.
x) + coeff[2];
2712 s.
y = d.
y*cos(d.
x) + coeff[3];
2720 d.
x -= coeff[4]; d.
y -= coeff[5];
2728 1.0/(1.0+d.
x*d.
x), 0.0, -d.
x*s.
y*cx*cx/coeff[1], s.
y/d.
y );
2730 if ( i == 0 && j == 0 ) {
2731 fprintf(stderr,
"x=%lf y=%lf u=%lf v=%lf\n", d.
x*coeff[1], d.
y, s.
x, s.
y);
2732 fprintf(stderr,
"phi = %lf\n", (
double)(ax * 180.0/
MagickPI) );
2733 fprintf(stderr,
"du/dx=%lf du/dx=%lf dv/dx=%lf dv/dy=%lf\n",
2734 1.0/(1.0+d.
x*d.
x), 0.0, -d.
x*s.
y*cx*cx/coeff[1], s.
y/d.
y );
2738 s.
x += coeff[2]; s.
y += coeff[3];
2744 d.
x -= coeff[4]; d.
y -= coeff[5];
2748 validity = (double) (coeff[1]*
MagickPI2 - fabs(d.
x))/output_scaling + 0.5;
2750 if ( validity > 0.0 ) {
2759 cx*cx, 0.0, s.
y*cx/coeff[1], cx );
2762 if ( d.
x == 0.5 && d.
y == 0.5 ) {
2763 fprintf(stderr,
"x=%lf y=%lf u=%lf v=%lf\n", d.
x*coeff[1], d.
y, s.
x, s.
y);
2764 fprintf(stderr,
"radius = %lf phi = %lf validity = %lf\n",
2765 coeff[1], (
double)(d.
x * 180.0/
MagickPI), validity );
2766 fprintf(stderr,
"du/dx=%lf du/dx=%lf dv/dx=%lf dv/dy=%lf\n",
2767 cx*cx, 0.0, s.
y*cx/coeff[1], cx);
2772 s.
x += coeff[2]; s.
y += coeff[3];
2778 double r,fx,fy,gx,gy;
2782 r = sqrt(d.
x*d.
x+d.
y*d.
y);
2784 fx = ((coeff[0]*r + coeff[1])*r + coeff[2])*r + coeff[3];
2785 fy = ((coeff[4]*r + coeff[5])*r + coeff[6])*r + coeff[7];
2786 gx = ((3*coeff[0]*r + 2*coeff[1])*r + coeff[2])/r;
2787 gy = ((3*coeff[4]*r + 2*coeff[5])*r + coeff[6])/r;
2790 fx = 1/fx; fy = 1/fy;
2791 gx *= -fx*fx; gy *= -fy*fy;
2794 s.
x = d.
x*fx + coeff[8];
2795 s.
y = d.
y*fy + coeff[9];
2797 gx*d.
x*d.
x + fx, gx*d.
x*d.
y,
2798 gy*d.
x*d.
y, gy*d.
y*d.
y + fy );
2809 coeff[3], 0, 0, coeff[7] );
2813 1.0/coeff[3], 0, 0, 1.0/coeff[7] );
2832 denominator = s.
x = s.
y = 0;
2833 for(i=0; i<number_arguments; i+=4) {
2835 ((double)d.
x-arguments[i+2])*((double)d.
x-arguments[i+2])
2836 + ((double)d.
y-arguments[i+3])*((double)d.
y-arguments[i+3]);
2837 weight = pow(weight,coeff[0]);
2838 weight = ( weight < 1.0 ) ? 1.0 : 1.0/weight;
2840 s.
x += (arguments[ i ]-arguments[i+2])*weight;
2841 s.
y += (arguments[i+1]-arguments[i+3])*weight;
2842 denominator += weight;
2861 if ( validity <= 0.0 ) {
2870 if ( validity < 1.0 ) {
2888 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2907 if ( method ==
ArcDistortion && !bestfit && !viewport_given ) {
2908 distort_image->
page.
x = 0;
2909 distort_image->
page.
y = 0;
2912 return(distort_image);
2968 assert(image != (
Image *) NULL);
2974 angle=fmod(degrees,360.0);
2975 while (angle < -45.0)
2977 for (rotations=0; angle > 45.0; rotations++)
2985 if (distort_image == (
Image *) NULL)
2986 return((
Image *) NULL);
2992 return(rotate_image);
3038 #define SparseColorTag "Distort/SparseColor" 3052 assert(image != (
Image *) NULL);
3085 arguments, number_colors, exception);
3086 if ( coeff == (
double *) NULL )
3087 return((
Image *) NULL);
3096 sparse_method = method;
3104 switch (sparse_method) {
3110 (void)
FormatLocaleFile(stderr,
" -channel R -fx '%+lf*i %+lf*j %+lf' \\\n",
3111 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3113 (void)
FormatLocaleFile(stderr,
" -channel G -fx '%+lf*i %+lf*j %+lf' \\\n",
3114 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3116 (void)
FormatLocaleFile(stderr,
" -channel B -fx '%+lf*i %+lf*j %+lf' \\\n",
3117 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3120 (void)
FormatLocaleFile(stderr,
" -channel K -fx '%+lf*i %+lf*j %+lf' \\\n",
3121 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3124 (void)
FormatLocaleFile(stderr,
" -channel A -fx '%+lf*i %+lf*j %+lf' \\\n",
3125 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3133 (void)
FormatLocaleFile(stderr,
" -channel R -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3134 coeff[ x ], coeff[x+1],
3135 coeff[x+2], coeff[x+3]),x+=4;
3137 (void)
FormatLocaleFile(stderr,
" -channel G -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3138 coeff[ x ], coeff[x+1],
3139 coeff[x+2], coeff[x+3]),x+=4;
3141 (void)
FormatLocaleFile(stderr,
" -channel B -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3142 coeff[ x ], coeff[x+1],
3143 coeff[x+2], coeff[x+3]),x+=4;
3146 (void)
FormatLocaleFile(stderr,
" -channel K -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3147 coeff[ x ], coeff[x+1],
3148 coeff[x+2], coeff[x+3]),x+=4;
3151 (void)
FormatLocaleFile(stderr,
" -channel A -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3152 coeff[ x ], coeff[x+1],
3153 coeff[x+2], coeff[x+3]),x+=4;
3169 if (sparse_image == (
Image *) NULL)
3170 return((
Image *) NULL);
3174 return((
Image *) NULL);
3192 #if defined(MAGICKCORE_OPENMP_SUPPORT) 3193 #pragma omp parallel for schedule(static) shared(progress,status) \ 3194 magick_number_threads(image,sparse_image,sparse_image->rows,1) 3196 for (j=0; j < (ssize_t) sparse_image->
rows; j++)
3218 for (i=0; i < (ssize_t) image->
columns; i++)
3221 switch (sparse_method)
3227 pixel.
red = coeff[x]*i +coeff[x+1]*j
3230 pixel.
green = coeff[x]*i +coeff[x+1]*j
3233 pixel.
blue = coeff[x]*i +coeff[x+1]*j
3237 pixel.
black = coeff[x]*i +coeff[x+1]*j
3241 pixel.
alpha = coeff[x]*i +coeff[x+1]*j
3249 pixel.
red = coeff[x]*i + coeff[x+1]*j +
3250 coeff[x+2]*i*j + coeff[x+3], x+=4;
3252 pixel.
green = coeff[x]*i + coeff[x+1]*j +
3253 coeff[x+2]*i*j + coeff[x+3], x+=4;
3255 pixel.
blue = coeff[x]*i + coeff[x+1]*j +
3256 coeff[x+2]*i*j + coeff[x+3], x+=4;
3259 pixel.
black = coeff[x]*i + coeff[x+1]*j +
3260 coeff[x+2]*i*j + coeff[x+3], x+=4;
3263 pixel.
alpha = coeff[x]*i + coeff[x+1]*j +
3264 coeff[x+2]*i*j + coeff[x+3], x+=4;
3288 for(k=0; k<number_arguments; k+=2+number_colors) {
3289 ssize_t x=(ssize_t) k+2;
3291 ((double)i-arguments[ k ])*((double)i-arguments[ k ])
3292 + ((double)j-arguments[k+1])*((double)j-arguments[k+1]);
3293 weight = pow(weight,coeff[0]);
3294 weight = ( weight < 1.0 ) ? 1.0 : 1.0/weight;
3296 pixel.
red += arguments[x++]*weight;
3298 pixel.
green += arguments[x++]*weight;
3300 pixel.
blue += arguments[x++]*weight;
3303 pixel.
black += arguments[x++]*weight;
3306 pixel.
alpha += arguments[x++]*weight;
3307 denominator += weight;
3310 pixel.
red/=denominator;
3312 pixel.
green/=denominator;
3314 pixel.
blue/=denominator;
3317 pixel.
black/=denominator;
3320 pixel.
alpha/=denominator;
3334 for(k=0; k<number_arguments; k+=2+number_colors) {
3336 fabs((
double)i-arguments[ k ])
3337 + fabs((
double)j-arguments[k+1]);
3338 if ( distance < minimum ) {
3339 ssize_t x=(ssize_t) k+2;
3341 pixel.
red=arguments[x++];
3343 pixel.
green=arguments[x++];
3345 pixel.
blue=arguments[x++];
3348 pixel.
black=arguments[x++];
3351 pixel.
alpha=arguments[x++];
3369 for (k=0; k<number_arguments; k+=2+number_colors) {
3371 ((double)i-arguments[ k ])*((double)i-arguments[ k ])
3372 + ((double)j-arguments[k+1])*((double)j-arguments[k+1]);
3373 if ( distance < minimum ) {
3374 ssize_t x=(ssize_t) k+2;
3376 pixel.
red=arguments[x++];
3378 pixel.
green=arguments[x++];
3380 pixel.
blue=arguments[x++];
3383 pixel.
black=arguments[x++];
3386 pixel.
alpha=arguments[x++];
3417 #if defined(MAGICKCORE_OPENMP_SUPPORT) 3431 return(sparse_image);
MagickDoubleType MagickRealType
MagickExport CacheView * DestroyCacheView(CacheView *cache_view)
MagickProgressMonitor progress_monitor
static PixelTrait GetPixelBlackTraits(const Image *magick_restrict image)
static PixelTrait GetPixelRedTraits(const Image *magick_restrict image)
#define ScaleFilter(F, A, B, C, D)
static PixelTrait GetPixelAlphaTraits(const Image *magick_restrict image)
MagickExport MagickBooleanType ResamplePixelColor(ResampleFilter *resample_filter, const double u0, const double v0, PixelInfo *pixel, ExceptionInfo *exception)
MagickExport MagickStatusType ParseAbsoluteGeometry(const char *geometry, RectangleInfo *region_info)
MagickExport Image * SparseColorImage(const Image *image, const SparseColorMethod method, const size_t number_arguments, const double *arguments, ExceptionInfo *exception)
static const char * poly_basis_str(ssize_t n)
MagickExport const char * GetImageArtifact(const Image *image, const char *artifact)
static double poly_basis_fn(ssize_t n, double x, double y)
static double StringToDouble(const char *magick_restrict string, char **magick_restrict sentinal)
MagickExport ssize_t FormatLocaleString(char *magick_restrict string, const size_t length, const char *magick_restrict format,...)
static void SetPixelViaPixelInfo(const Image *magick_restrict image, const PixelInfo *magick_restrict pixel_info, Quantum *magick_restrict pixel)
static MagickBooleanType IsGrayColorspace(const ColorspaceType colorspace)
static void AffineArgsToCoefficients(double *affine)
MagickExport MagickBooleanType CompositeImage(Image *image, const Image *composite, const CompositeOperator compose, const MagickBooleanType clip_to_self, const ssize_t x_offset, const ssize_t y_offset, ExceptionInfo *exception)
static ResampleFilter ** DestroyResampleFilterThreadSet(ResampleFilter **filter)
MagickExport void GetPixelInfo(const Image *image, PixelInfo *pixel)
MagickExport VirtualPixelMethod GetImageVirtualPixelMethod(const Image *image)
MagickExport Image * AffineTransformImage(const Image *image, const AffineMatrix *affine_matrix, ExceptionInfo *exception)
static double * GenerateCoefficients(const Image *image, DistortMethod *method, const size_t number_arguments, const double *arguments, size_t number_values, ExceptionInfo *exception)
#define MagickCoreSignature
MagickExport Quantum * GetCacheViewAuthenticPixels(CacheView *cache_view, const ssize_t x, const ssize_t y, const size_t columns, const size_t rows, ExceptionInfo *exception)
static Quantum ClampPixel(const MagickRealType pixel)
MagickExport ssize_t FormatLocaleFile(FILE *file, const char *magick_restrict format,...)
MagickExport MagickBooleanType SetImageAlphaChannel(Image *image, const AlphaChannelOption alpha_type, ExceptionInfo *exception)
unsigned int MagickStatusType
static double PerceptibleReciprocal(const double x)
MagickExport Image * IntegralRotateImage(const Image *image, size_t rotations, ExceptionInfo *exception)
MagickExport const char * CommandOptionToMnemonic(const CommandOption option, const ssize_t type)
MagickExport void * AcquireQuantumMemory(const size_t count, const size_t quantum)
static void InvertPerspectiveCoefficients(const double *coeff, double *inverse)
static double DegreesToRadians(const double degrees)
static void InvertAffineCoefficients(const double *coeff, double *inverse)
static int GetOpenMPThreadId(void)
static void CoefficientsToAffineArgs(double *coeff)
static double poly_basis_dy(ssize_t n, double x, double y)
MagickExport MagickBooleanType IsStringTrue(const char *value)
static void GetPixelInfoPixel(const Image *magick_restrict image, const Quantum *magick_restrict pixel, PixelInfo *magick_restrict pixel_info)
static ResampleFilter ** AcquireResampleFilterThreadSet(const Image *image, const VirtualPixelMethod method, const MagickBooleanType interpolate, ExceptionInfo *exception)
MagickExport int GetMagickPrecision(void)
#define MagickMaximumValue
MagickExport Quantum * QueueCacheViewAuthenticPixels(CacheView *cache_view, const ssize_t x, const ssize_t y, const size_t columns, const size_t rows, ExceptionInfo *exception)
MagickExport VirtualPixelMethod SetImageVirtualPixelMethod(Image *image, const VirtualPixelMethod virtual_pixel_method, ExceptionInfo *exception)
MagickExport MagickBooleanType ThrowMagickException(ExceptionInfo *exception, const char *module, const char *function, const size_t line, const ExceptionType severity, const char *tag, const char *format,...)
MagickExport MagickBooleanType LogMagickEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
MagickExport Image * RotateImage(const Image *image, const double degrees, ExceptionInfo *exception)
MagickPrivate void LeastSquaresAddTerms(double **, double **, const double *, const double *, const size_t, const size_t)
MagickBooleanType(* MagickProgressMonitor)(const char *, const MagickOffsetType, const MagickSizeType, void *)
static PixelTrait GetPixelGreenTraits(const Image *magick_restrict image)
static double poly_basis_dx(ssize_t n, double x, double y)
MagickExport MagickBooleanType SetImageStorageClass(Image *image, const ClassType storage_class, ExceptionInfo *exception)
MagickExport double ** RelinquishMagickMatrix(double **matrix, const size_t number_rows)
static size_t GetPixelChannels(const Image *magick_restrict image)
static double MagickRound(double x)
char filename[MagickPathExtent]
#define GetMagickModule()
MagickExport void ConformPixelInfo(Image *image, const PixelInfo *source, PixelInfo *destination, ExceptionInfo *exception)
static double RadiansToDegrees(const double radians)
static MagickBooleanType IsPixelInfoGray(const PixelInfo *magick_restrict pixel)
MagickExport double ** AcquireMagickMatrix(const size_t number_rows, const size_t size)
MagickExport MagickBooleanType SetImageColorspace(Image *image, const ColorspaceType colorspace, ExceptionInfo *exception)
MagickExport void * RelinquishMagickMemory(void *memory)
CompositeOperator compose
MagickExport Image * DistortResizeImage(const Image *image, const size_t columns, const size_t rows, ExceptionInfo *exception)
static void CompositePixelInfoBlend(const PixelInfo *p, const double alpha, const PixelInfo *q, const double beta, PixelInfo *composite)
MagickExport MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *magick_restrict cache_view, ExceptionInfo *exception)
MagickExport CacheView * AcquireAuthenticCacheView(const Image *image, ExceptionInfo *exception)
MagickExport Image * DistortImage(const Image *image, DistortMethod method, const size_t number_arguments, const double *arguments, MagickBooleanType bestfit, ExceptionInfo *exception)
static size_t poly_number_terms(double order)
PixelInfo background_color
MagickExport Image * DestroyImage(Image *image)
MagickExport Image * CloneImage(const Image *image, const size_t columns, const size_t rows, const MagickBooleanType detach, ExceptionInfo *exception)
ColorspaceType colorspace
MagickPrivate MagickBooleanType GaussJordanElimination(double **, double **, const size_t, const size_t)
MagickExport MagickBooleanType SetImageProgress(const Image *image, const char *tag, const MagickOffsetType offset, const MagickSizeType extent)
static PixelTrait GetPixelBlueTraits(const Image *magick_restrict image)