83 tmp[0]=affine[1]; tmp[1]=affine[2]; tmp[2]=affine[3]; tmp[3]=affine[4];
84 affine[3]=tmp[0]; affine[1]=tmp[1]; affine[4]=tmp[2]; affine[2]=tmp[3];
91 tmp[0]=coeff[3]; tmp[1]=coeff[1]; tmp[2]=coeff[4]; tmp[3]=coeff[2];
92 coeff[1]=tmp[0]; coeff[2]=tmp[1]; coeff[3]=tmp[2]; coeff[4]=tmp[3];
100 inverse[0]=determinant*coeff[4];
101 inverse[1]=determinant*(-coeff[1]);
102 inverse[2]=determinant*(coeff[1]*coeff[5]-coeff[2]*coeff[4]);
103 inverse[3]=determinant*(-coeff[3]);
104 inverse[4]=determinant*coeff[0];
105 inverse[5]=determinant*(coeff[2]*coeff[3]-coeff[0]*coeff[5]);
115 inverse[0]=determinant*(coeff[4]-coeff[7]*coeff[5]);
116 inverse[1]=determinant*(coeff[7]*coeff[2]-coeff[1]);
117 inverse[2]=determinant*(coeff[1]*coeff[5]-coeff[4]*coeff[2]);
118 inverse[3]=determinant*(coeff[6]*coeff[5]-coeff[3]);
119 inverse[4]=determinant*(coeff[0]-coeff[6]*coeff[2]);
120 inverse[5]=determinant*(coeff[3]*coeff[2]-coeff[0]*coeff[5]);
121 inverse[6]=determinant*(coeff[3]*coeff[7]-coeff[6]*coeff[4]);
122 inverse[7]=determinant*(coeff[6]*coeff[1]-coeff[0]*coeff[7]);
147 if ( order < 1 || order > 5 ||
150 return((
size_t) floor((order+1)*(order+2)/2));
157 case 0:
return( 1.0 );
160 case 3:
return( x*y );
161 case 4:
return( x*x );
162 case 5:
return( y*y );
163 case 6:
return( x*x*x );
164 case 7:
return( x*x*y );
165 case 8:
return( x*y*y );
166 case 9:
return( y*y*y );
167 case 10:
return( x*x*x*x );
168 case 11:
return( x*x*x*y );
169 case 12:
return( x*x*y*y );
170 case 13:
return( x*y*y*y );
171 case 14:
return( y*y*y*y );
172 case 15:
return( x*x*x*x*x );
173 case 16:
return( x*x*x*x*y );
174 case 17:
return( x*x*x*y*y );
175 case 18:
return( x*x*y*y*y );
176 case 19:
return( x*y*y*y*y );
177 case 20:
return( y*y*y*y*y );
186 case 1:
return(
"*ii");
187 case 2:
return(
"*jj");
188 case 3:
return(
"*ii*jj");
189 case 4:
return(
"*ii*ii");
190 case 5:
return(
"*jj*jj");
191 case 6:
return(
"*ii*ii*ii");
192 case 7:
return(
"*ii*ii*jj");
193 case 8:
return(
"*ii*jj*jj");
194 case 9:
return(
"*jj*jj*jj");
195 case 10:
return(
"*ii*ii*ii*ii");
196 case 11:
return(
"*ii*ii*ii*jj");
197 case 12:
return(
"*ii*ii*jj*jj");
198 case 13:
return(
"*ii*jj*jj*jj");
199 case 14:
return(
"*jj*jj*jj*jj");
200 case 15:
return(
"*ii*ii*ii*ii*ii");
201 case 16:
return(
"*ii*ii*ii*ii*jj");
202 case 17:
return(
"*ii*ii*ii*jj*jj");
203 case 18:
return(
"*ii*ii*jj*jj*jj");
204 case 19:
return(
"*ii*jj*jj*jj*jj");
205 case 20:
return(
"*jj*jj*jj*jj*jj");
213 case 0:
return( 0.0 );
214 case 1:
return( 1.0 );
215 case 2:
return( 0.0 );
218 case 5:
return( 0.0 );
219 case 6:
return( x*x );
220 case 7:
return( x*y );
221 case 8:
return( y*y );
222 case 9:
return( 0.0 );
223 case 10:
return( x*x*x );
224 case 11:
return( x*x*y );
225 case 12:
return( x*y*y );
226 case 13:
return( y*y*y );
227 case 14:
return( 0.0 );
228 case 15:
return( x*x*x*x );
229 case 16:
return( x*x*x*y );
230 case 17:
return( x*x*y*y );
231 case 18:
return( x*y*y*y );
232 case 19:
return( y*y*y*y );
233 case 20:
return( 0.0 );
241 case 0:
return( 0.0 );
242 case 1:
return( 0.0 );
243 case 2:
return( 1.0 );
245 case 4:
return( 0.0 );
301 distort[0]=affine_matrix->
sx;
302 distort[1]=affine_matrix->
rx;
303 distort[2]=affine_matrix->
ry;
304 distort[3]=affine_matrix->
sy;
305 distort[4]=affine_matrix->
tx;
306 distort[5]=affine_matrix->
ty;
309 return(deskew_image);
367 if ((x-floor(x)) < (ceil(x)-x))
373 DistortMethod *method,
const size_t number_arguments,
const double *arguments,
389 if ( number_values == 0 ) {
405 cp_size = number_values+2;
410 if ( number_arguments < 4*cp_size &&
417 number_coefficients=0;
422 number_coefficients=3*number_values;
427 number_coefficients = 2 + i*number_values;
430 "InvalidArgument",
"%s : '%s'",
"Polynomial",
431 "Invalid order, should be interger 1 to 5, or 1.5");
432 return((
double *) NULL);
434 if ( number_arguments < 1+i*cp_size ) {
436 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
437 "Polynomial", (double) i);
438 return((
double *) NULL);
442 number_coefficients=4*number_values;
448 number_coefficients=10;
454 case QuadraterialDistortion:
455 number_coefficients=19;
459 number_coefficients=1;
462 number_coefficients=5;
468 number_coefficients=6;
472 number_coefficients=8;
476 number_coefficients=9;
480 number_coefficients=10;
483 perror(
"unknown method given");
488 if (coeff == (
double *) NULL)
492 "GenerateCoefficients");
493 return((
double *) NULL);
497 for (i=0; i < number_coefficients; i++)
512 if ( number_arguments%cp_size != 0 ||
513 number_arguments < cp_size ) {
515 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
518 return((
double *) NULL);
521 if ( number_arguments == cp_size ) {
523 if ( cp_values == 0 ) {
526 coeff[2] = arguments[0] - arguments[2];
528 coeff[5] = arguments[1] - arguments[3];
532 for (i=0; i<number_values; i++)
533 coeff[i*3+2] = arguments[cp_values+i];
552 if (matrix == (
double **) NULL || vectors == (
double **) NULL)
559 "%s",
"DistortCoefficients");
560 return((
double *) NULL);
563 for (i=0; i < number_values; i++)
564 vectors[i] = &(coeff[i*3]);
566 for (i=0; i < number_arguments; i+=cp_size) {
567 terms[0] = arguments[i+cp_x];
568 terms[1] = arguments[i+cp_y];
571 &(arguments[i+cp_values]),3UL,number_values);
573 if ( number_arguments == 2*cp_size ) {
578 terms[0] = arguments[cp_x]
579 - ( arguments[cp_size+cp_y] - arguments[cp_y] );
580 terms[1] = arguments[cp_y] +
581 + ( arguments[cp_size+cp_x] - arguments[cp_x] );
583 if ( cp_values == 0 ) {
587 uv2[0] = arguments[0] - arguments[5] + arguments[1];
588 uv2[1] = arguments[1] + arguments[4] - arguments[0];
594 &(arguments[cp_values]),3UL,number_values);
604 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
606 return((
double *) NULL);
627 if (((number_arguments % cp_size) != 0) || (number_arguments < cp_size))
630 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
633 return((
double *) NULL);
639 if (matrix == (
double **) NULL)
645 return((
double *) NULL);
650 vectors[0]=(&(coeff[0]));
651 for (i=0; i < number_arguments; i+=4)
653 terms[0]=arguments[i+0];
654 terms[1]=(-arguments[i+1]);
658 terms[0]=arguments[i+1];
659 terms[1]=arguments[i+0];
673 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
675 return((
double *) NULL);
682 inverse[2]=(-coeff[1]);
707 if (number_arguments != 6) {
710 "InvalidArgument",
"%s : 'Needs 6 coeff values'",
712 return((
double *) NULL);
715 for(i=0; i<6UL; i++ )
716 inverse[i] = arguments[i];
752 x = nx = (double)(image->
columns)/2.0 + (double)image->
page.
x;
753 y = ny = (
double)(image->
rows)/2.0 + (
double)image->
page.
y;
755 switch ( number_arguments ) {
759 "InvalidArgument",
"%s : 'Needs at least 1 argument'",
761 return((
double *) NULL);
766 sx = sy = arguments[0];
770 x = nx = arguments[0];
771 y = ny = arguments[1];
772 switch ( number_arguments ) {
777 sx = sy = arguments[2];
786 sx = sy = arguments[2];
801 "InvalidArgument",
"%s : 'Too Many Arguments (7 or less)'",
803 return((
double *) NULL);
811 "InvalidArgument",
"%s : 'Zero Scale Given'",
813 return((
double *) NULL);
821 coeff[2]=x-nx*coeff[0]-ny*coeff[1];
824 coeff[5]=y-nx*coeff[3]-ny*coeff[4];
870 if ( number_arguments%cp_size != 0 ||
871 number_arguments < cp_size*4 ) {
873 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
876 return((
double *) NULL);
879 vectors[0] = &(coeff[0]);
882 if (matrix == (
double **) NULL) {
886 "%s",
"DistortCoefficients");
887 return((
double *) NULL);
890 for (i=0; i < number_arguments; i+=4) {
891 terms[0]=arguments[i+cp_x];
892 terms[1]=arguments[i+cp_y];
897 terms[6]=-terms[0]*arguments[i+cp_u];
898 terms[7]=-terms[1]*arguments[i+cp_u];
905 terms[3]=arguments[i+cp_x];
906 terms[4]=arguments[i+cp_y];
908 terms[6]=-terms[3]*arguments[i+cp_v];
909 terms[7]=-terms[4]*arguments[i+cp_v];
919 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
921 return((
double *) NULL);
929 coeff[8] = coeff[6]*arguments[cp_x]
930 + coeff[7]*arguments[cp_y] + 1.0;
931 coeff[8] = (coeff[8] < 0.0) ? -1.0 : +1.0;
940 if (number_arguments != 8) {
943 "InvalidArgument",
"%s : 'Needs 8 coefficient values'",
945 return((
double *) NULL);
956 coeff[8] = coeff[6]*arguments[2]
957 + coeff[7]*arguments[5] + 1.0;
958 coeff[8] = (coeff[8] < 0.0) ? -1.0 : +1.0;
988 if ( number_arguments%cp_size != 0 ||
989 number_arguments < cp_size*4 ) {
991 "InvalidArgument",
"%s : 'require at least %.20g CPs'",
994 return((
double *) NULL);
999 if (matrix == (
double **) NULL || vectors == (
double **) NULL)
1006 "%s",
"DistortCoefficients");
1007 return((
double *) NULL);
1010 for (i=0; i < number_values; i++)
1011 vectors[i] = &(coeff[i*4]);
1013 for (i=0; i < number_arguments; i+=cp_size) {
1014 terms[0] = arguments[i+cp_x];
1015 terms[1] = arguments[i+cp_y];
1016 terms[2] = terms[0]*terms[1];
1019 &(arguments[i+cp_values]),4UL,number_values);
1028 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
1030 return((
double *) NULL);
1072 coeff[8] = coeff[0]*coeff[5] - coeff[1]*coeff[4];
1073 coeff[9] = 2*(coeff[2]*coeff[5] - coeff[1]*coeff[6]);
1078 case QuadrilateralDistortion:
1132 coeff[0] = arguments[0];
1134 nterms = (size_t) coeff[1];
1141 if ((matrix == (
double **) NULL) || (vectors == (
double **) NULL) ||
1142 (terms == (
double *) NULL))
1150 "%s",
"DistortCoefficients");
1151 return((
double *) NULL);
1154 for (i=0; i < number_values; i++)
1155 vectors[i] = &(coeff[2+i*nterms]);
1157 for (i=1; i < number_arguments; i+=cp_size) {
1158 for (j=0; j < (ssize_t) nterms; j++)
1159 terms[j] =
poly_basis_fn(j,arguments[i+cp_x],arguments[i+cp_y]);
1161 &(arguments[i+cp_values]),nterms,number_values);
1171 "InvalidArgument",
"%s : 'Unsolvable Matrix'",
1173 return((
double *) NULL);
1213 if ( number_arguments >= 1 && arguments[0] <
MagickEpsilon ) {
1216 "InvalidArgument",
"%s : 'Arc Angle Too Small'",
1218 return((
double *) NULL);
1220 if ( number_arguments >= 3 && arguments[2] <
MagickEpsilon ) {
1223 "InvalidArgument",
"%s : 'Outer Radius Too Small'",
1225 return((
double *) NULL);
1228 if ( number_arguments >= 1 )
1232 if ( number_arguments >= 2 )
1237 coeff[3] = (double)image->
rows-1;
1238 coeff[2] = (
double)image->
columns/coeff[1] + coeff[3]/2.0;
1239 if ( number_arguments >= 3 ) {
1240 if ( number_arguments >= 4 )
1241 coeff[3] = arguments[2] - arguments[3];
1243 coeff[3] *= arguments[2]/coeff[2];
1244 coeff[2] = arguments[2];
1246 coeff[4] = ((double)image->
columns-1.0)/2.0;
1263 if ( number_arguments == 3
1265 || number_arguments > 8 ) {
1267 OptionError,
"InvalidArgument",
"%s : number of arguments",
1270 return((
double *) NULL);
1273 if ( number_arguments >= 1 )
1274 coeff[0] = arguments[0];
1278 coeff[1] = number_arguments >= 2 ? arguments[1] : 0.0;
1280 if ( number_arguments >= 4 ) {
1281 coeff[2] = arguments[2];
1282 coeff[3] = arguments[3];
1286 coeff[3] = (double)(image->
rows)/2.0+image->
page.
y;
1290 if ( number_arguments >= 5 )
1292 coeff[5] = coeff[4];
1293 if ( number_arguments >= 6 )
1302 fabs(coeff[3]-image->
page.
y));
1306 fabs(coeff[3]-image->
page.
y-image->
rows));
1311 rx = coeff[2]-image->
page.
x;
1312 ry = coeff[3]-image->
page.
y;
1313 coeff[0] = rx*rx+ry*ry;
1314 ry = coeff[3]-image->
page.
y-image->
rows;
1315 coeff[0] =
MagickMax(coeff[0],rx*rx+ry*ry);
1317 coeff[0] =
MagickMax(coeff[0],rx*rx+ry*ry);
1318 ry = coeff[3]-image->
page.
y;
1319 coeff[0] =
MagickMax(coeff[0],rx*rx+ry*ry);
1320 coeff[0] = sqrt(coeff[0]);
1327 "InvalidArgument",
"%s : Invalid Radius",
1330 return((
double *) NULL);
1334 coeff[6]=(double) image->
columns/(coeff[5]-coeff[4]);
1335 coeff[7]=(double) image->
rows/(coeff[0]-coeff[1]);
1338 coeff[6]=(coeff[5]-coeff[4])/image->
columns;
1339 coeff[7]=(coeff[0]-coeff[1])/image->
rows;
1368 if ( arguments[0] <
MagickEpsilon || arguments[0] > 160.0 ) {
1370 "InvalidArgument",
"%s : Invalid FOV Angle",
1373 return((
double *) NULL);
1380 coeff[1] = (double) image->
columns/coeff[0];
1383 coeff[1] = (
double) image->
columns / ( 2 * tan(coeff[0]/2) );
1386 coeff[3] = (double)(image->
rows)/2.0+image->
page.
y;
1387 coeff[4] = coeff[2];
1388 coeff[5] = coeff[3];
1416 if ( (number_arguments < 3) || (number_arguments == 7) ||
1417 (number_arguments == 9) || (number_arguments > 10) )
1421 OptionError,
"InvalidArgument",
"%s : number of arguments",
1423 return((
double *) NULL);
1426 coeff[0] = arguments[0];
1427 coeff[1] = arguments[1];
1428 coeff[2] = arguments[2];
1429 if ((number_arguments == 3) || (number_arguments == 5) )
1430 coeff[3] = 1.0 - coeff[0] - coeff[1] - coeff[2];
1432 coeff[3] = arguments[3];
1434 coeff[0] *= pow(rscale,3.0);
1435 coeff[1] *= rscale*rscale;
1438 if ( number_arguments >= 8 ) {
1439 coeff[4] = arguments[4] * pow(rscale,3.0);
1440 coeff[5] = arguments[5] * rscale*rscale;
1441 coeff[6] = arguments[6] * rscale;
1442 coeff[7] = arguments[7];
1445 coeff[4] = coeff[0];
1446 coeff[5] = coeff[1];
1447 coeff[6] = coeff[2];
1448 coeff[7] = coeff[3];
1451 if ( number_arguments == 5 ) {
1452 coeff[8] = arguments[3];
1453 coeff[9] = arguments[4];
1455 else if ( number_arguments == 6 ) {
1456 coeff[8] = arguments[4];
1457 coeff[9] = arguments[5];
1459 else if ( number_arguments == 10 ) {
1460 coeff[8] = arguments[8];
1461 coeff[9] = arguments[9];
1466 coeff[9] = (
double)image->
rows/2.0 + image->
page.
y;
1477 if ( number_arguments%cp_size != 0 ||
1478 number_arguments < cp_size ) {
1480 "InvalidArgument",
"%s : 'requires CP's (4 numbers each)'",
1483 return((
double *) NULL);
1487 if ( artifact != (
const char *) NULL ) {
1491 OptionError,
"InvalidArgument",
"%s",
"-define shepards:power" );
1493 return((
double *) NULL);
1505 perror(
"no method handler");
1506 return((
double *) NULL);
1547 #define DistortResizeImageTag "Distort/Image" 1565 assert(image != (
const Image *) NULL);
1571 if ((columns == 0) || (rows == 0))
1572 return((
Image *) NULL);
1575 (void) memset(distort_args,0,
sizeof(distort_args));
1576 distort_args[4]=(double) image->
columns;
1577 distort_args[6]=(
double) columns;
1578 distort_args[9]=(double) image->
rows;
1579 distort_args[11]=(
double) rows;
1584 if (tmp_image == (
Image *) NULL)
1585 return((
Image *) NULL);
1598 if (resize_image == (
Image *) NULL)
1599 return((
Image *) NULL);
1619 if (resize_alpha == (
Image *) NULL)
1620 return((
Image *) NULL);
1624 if (tmp_image == (
Image *) NULL)
1625 return((
Image *) NULL);
1631 if (resize_image == (
Image *) NULL)
1634 return((
Image *) NULL);
1650 crop_area.
width=columns;
1655 tmp_image=resize_image;
1656 resize_image=
CropImage(tmp_image,&crop_area,exception);
1658 if (resize_image != (
Image *) NULL)
1663 return(resize_image);
1755 const size_t number_arguments,
const double *arguments,
1758 #define DistortImageTag "Distort/Image" 1776 assert(image != (
Image *) NULL);
1787 if ( number_arguments != 2 )
1790 "InvalidArgument",
"%s : '%s'",
"Resize",
1791 "Invalid number of args: 2 only");
1792 return((
Image *) NULL);
1795 (
size_t)arguments[1], exception);
1796 return(distort_image);
1807 arguments, 0, exception);
1808 if ( coeff == (
double *) NULL )
1809 return((
Image *) NULL);
1834 s.
x=s.
y=min.
x=max.
x=min.
y=max.
y=0.0;
1837 #define InitalBounds(p) \ 1840 min.x = max.x = p.x; \ 1841 min.y = max.y = p.y; \ 1843 #define ExpandBounds(p) \ 1846 min.x = MagickMin(min.x,p.x); \ 1847 max.x = MagickMax(max.x,p.x); \ 1848 min.y = MagickMin(min.y,p.y); \ 1849 max.y = MagickMax(max.y,p.y); \ 1856 {
double inverse[6];
1858 s.
x = (double) image->
page.
x;
1859 s.
y = (
double) image->
page.
y;
1860 d.
x = inverse[0]*s.
x+inverse[1]*s.
y+inverse[2];
1861 d.
y = inverse[3]*s.
x+inverse[4]*s.
y+inverse[5];
1864 s.
y = (
double) image->
page.
y;
1865 d.
x = inverse[0]*s.
x+inverse[1]*s.
y+inverse[2];
1866 d.
y = inverse[3]*s.
x+inverse[4]*s.
y+inverse[5];
1868 s.
x = (double) image->
page.
x;
1870 d.
x = inverse[0]*s.
x+inverse[1]*s.
y+inverse[2];
1871 d.
y = inverse[3]*s.
x+inverse[4]*s.
y+inverse[5];
1875 d.
x = inverse[0]*s.
x+inverse[1]*s.
y+inverse[2];
1876 d.
y = inverse[3]*s.
x+inverse[4]*s.
y+inverse[5];
1881 {
double inverse[8], scale;
1883 s.
x = (double) image->
page.
x;
1884 s.
y = (
double) image->
page.
y;
1885 scale=inverse[6]*s.
x+inverse[7]*s.
y+1.0;
1887 d.
x = scale*(inverse[0]*s.
x+inverse[1]*s.
y+inverse[2]);
1888 d.
y = scale*(inverse[3]*s.
x+inverse[4]*s.
y+inverse[5]);
1891 s.
y = (
double) image->
page.
y;
1892 scale=inverse[6]*s.
x+inverse[7]*s.
y+1.0;
1894 d.
x = scale*(inverse[0]*s.
x+inverse[1]*s.
y+inverse[2]);
1895 d.
y = scale*(inverse[3]*s.
x+inverse[4]*s.
y+inverse[5]);
1897 s.
x = (double) image->
page.
x;
1899 scale=inverse[6]*s.
x+inverse[7]*s.
y+1.0;
1901 d.
x = scale*(inverse[0]*s.
x+inverse[1]*s.
y+inverse[2]);
1902 d.
y = scale*(inverse[3]*s.
x+inverse[4]*s.
y+inverse[5]);
1906 scale=inverse[6]*s.
x+inverse[7]*s.
y+1.0;
1908 d.
x = scale*(inverse[0]*s.
x+inverse[1]*s.
y+inverse[2]);
1909 d.
y = scale*(inverse[3]*s.
x+inverse[4]*s.
y+inverse[5]);
1916 a = coeff[0]-coeff[1]/2; ca = cos(a); sa = sin(a);
1920 d.
x = (coeff[2]-coeff[3])*ca;
1921 d.
y = (coeff[2]-coeff[3])*sa;
1923 a = coeff[0]+coeff[1]/2; ca = cos(a); sa = sin(a);
1927 d.
x = (coeff[2]-coeff[3])*ca;
1928 d.
y = (coeff[2]-coeff[3])*sa;
1932 a<(coeff[0]+coeff[1]/2.0); a+=
MagickPI2 ) {
1933 ca = cos(a); sa = sin(a);
1944 coeff[3] = (double)image->
rows/coeff[3];
1949 if (number_arguments < 2)
1950 coeff[2] = coeff[3] = 0.0;
1951 min.
x = coeff[2]-coeff[0];
1952 max.
x = coeff[2]+coeff[0];
1953 min.
y = coeff[3]-coeff[0];
1954 max.
y = coeff[3]+coeff[0];
1956 coeff[7]=(double) geometry.
height/(coeff[0]-coeff[1]);
1964 geometry.
x = geometry.
y = 0;
1965 geometry.
height = (size_t) ceil(coeff[0]-coeff[1]);
1966 geometry.
width = (size_t) ceil((coeff[0]-coeff[1])*
1967 (coeff[5]-coeff[4])*0.5);
1978 geometry.
x = geometry.
y = 0;
1979 geometry.
width = (size_t) ceil( 2.0*coeff[1]*tan(coeff[0]/2.0) );
1980 geometry.
height = (size_t) ceil( 2.0*coeff[3]/cos(coeff[0]/2.0) );
1982 coeff[4] = (double) geometry.
width/2.0;
1983 coeff[5] = (
double) geometry.
height/2.0;
1991 geometry.
x = geometry.
y = 0;
1992 geometry.
width = (size_t) ceil(coeff[0]*coeff[1]);
1993 geometry.
height = (size_t) (2*coeff[3]);
1995 coeff[4] = (double) geometry.
width/2.0;
1996 coeff[5] = (
double) geometry.
height/2.0;
2004 case QuadrilateralDistortion:
2021 geometry.
x = (ssize_t) floor(min.
x-0.5);
2022 geometry.
y = (ssize_t) floor(min.
y-0.5);
2023 geometry.
width=(size_t) ceil(max.
x-geometry.
x+0.5);
2024 geometry.
height=(size_t) ceil(max.
y-geometry.
y+0.5);
2035 if ( artifact != (
const char *) NULL ) {
2040 "distort:viewport",artifact);
2054 if ( bestfit || viewport_given ) {
2056 " -size %.20gx%.20g -page %+.20g%+.20g xc: +insert \\\n",
2057 (
double) geometry.
width,(double) geometry.
height,(
double) geometry.
x,
2058 (double) geometry.
y);
2059 lookup=
"v.p{xx-v.page.x-0.5,yy-v.page.y-0.5}";
2062 image_gen[0] =
'\0';
2063 lookup =
"p{xx-page.x-0.5,yy-page.y-0.5}";
2075 if (inverse == (
double *) NULL)
2080 return((
Image *) NULL);
2086 " -distort AffineProjection \\\n '");
2087 for (i=0; i < 5; i++)
2093 "Equivalent scale, rotation(deg), translation:\n");
2103 " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n");
2119 if (inverse == (
double *) NULL)
2124 "DistortCoefficients");
2125 return((
Image *) NULL);
2130 " -distort PerspectiveProjection \\\n '");
2131 for (i=0; i < 4; i++)
2144 " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n");
2148 " xx=(%+.*g*ii %+.*g*jj %+.*g)/rr;\n",
2152 " yy=(%+.*g*ii %+.*g*jj %+.*g)/rr;\n",
2156 coeff[8] < 0.0 ?
"<" :
">", lookup);
2164 coeff[0],coeff[1],coeff[2],coeff[3]);
2166 coeff[4],coeff[5],coeff[6],coeff[7]);
2170 coeff[8], coeff[9]);
2173 "BilinearForward Distort, FX Equivelent:\n");
2176 " -fx 'ii=i+page.x%+lf; jj=j+page.y%+lf;\n",0.5-coeff[3],0.5-
2179 coeff[6], -coeff[2], coeff[8]);
2184 " rt=bb*bb %+lf*(%lf*ii%+lf*jj);\n",-2*coeff[9],coeff[4],
2187 " yy=( -bb + sqrt(rt) ) / %lf;\n",coeff[9]);
2191 -coeff[4],coeff[0]);
2193 " xx=(ii %+lf*yy)/(%lf %+lf*yy);\n",-coeff[1],coeff[0],
2195 if ( coeff[9] != 0 )
2208 coeff[3], coeff[0], coeff[1], coeff[2]);
2210 coeff[7], coeff[4], coeff[5], coeff[6]);
2213 "BilinearReverse Distort, FX Equivelent:\n");
2216 " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n");
2218 " xx=%+lf*ii %+lf*jj %+lf*ii*jj %+lf;\n",coeff[0],coeff[1],
2219 coeff[2], coeff[3]);
2221 " yy=%+lf*ii %+lf*jj %+lf*ii*jj %+lf;\n",coeff[4],coeff[5],
2222 coeff[6], coeff[7]);
2228 size_t nterms = (size_t) coeff[1];
2230 "Polynomial (order %lg, terms %lu), FX Equivelent\n",coeff[0],
2231 (
unsigned long) nterms);
2234 " -fx 'ii=i+page.x+0.5; jj=j+page.y+0.5;\n");
2236 for (i=0; i < (ssize_t) nterms; i++)
2238 if ((i != 0) && (i%4 == 0))
2244 for (i=0; i < (ssize_t) nterms; i++)
2246 if ((i != 0) && (i%4 == 0))
2257 for (i=0; i < 5; i++)
2259 " c%.20g = %+lf\n",(
double) i,coeff[i]);
2269 " yy=(%lf - hypot(ii,jj)) * %lf;\n",coeff[2],coeff[3]);
2276 for (i=0; i < 8; i++)
2282 " -fx 'ii=i+page.x%+lf; jj=j+page.y%+lf;\n",-coeff[2],-coeff[3]);
2284 -(coeff[4]+coeff[5])/2 );
2289 -coeff[1],coeff[7] );
2296 "DePolar Distort, Internal Coefficents\n");
2297 for (i=0; i < 8; i++)
2303 coeff[6],+coeff[4]);
2305 coeff[7],+coeff[1]);
2316 "Cylinder to Plane Distort, Internal Coefficents\n");
2319 "Cylinder to Plane Distort, FX Equivelent:\n");
2322 " -fx 'ii=i+page.x%+lf+0.5; jj=j+page.y%+lf+0.5;\n",-coeff[4],
2334 "Plane to Cylinder Distort, Internal Coefficents\n");
2337 "Plane to Cylinder Distort, FX Equivelent:\n");
2340 " -fx 'ii=i+page.x%+lf+0.5; jj=j+page.y%+lf+0.5;\n",-coeff[4],
2362 yc=((double)image->
rows-1.0)/2.0+image->
page.
y;
2366 if ( fabs(coeff[8]-xc-0.5) < 0.1 && fabs(coeff[9]-yc-0.5) < 0.1 )
2372 " ii=i-xc; jj=j-yc; rr=hypot(ii,jj);\n");
2374 " ii=ii%s(%lf*rr*rr*rr %+lf*rr*rr %+lf*rr %+lf);\n",
2378 " jj=jj%s(%lf*rr*rr*rr %+lf*rr*rr %+lf*rr %+lf);\n",
2392 {
const char *artifact;
2394 output_scaling = 1.0;
2395 if (artifact != (
const char *) NULL) {
2397 geometry.
width=(size_t) (output_scaling*geometry.
width+0.5);
2398 geometry.
height=(size_t) (output_scaling*geometry.
height+0.5);
2399 geometry.
x=(ssize_t) (output_scaling*geometry.
x+0.5);
2400 geometry.
y=(ssize_t) (output_scaling*geometry.
y+0.5);
2401 if ( output_scaling < 0.1 ) {
2404 "InvalidArgument",
"%s",
"-set option:distort:scale" );
2405 return((
Image *) NULL);
2407 output_scaling = 1/output_scaling;
2410 #define ScaleFilter(F,A,B,C,D) \ 2411 ScaleResampleFilter( (F), \ 2412 output_scaling*(A), output_scaling*(B), \ 2413 output_scaling*(C), output_scaling*(D) ) 2420 if (distort_image == (
Image *) NULL)
2423 return((
Image *) NULL);
2430 return((
Image *) NULL);
2437 distort_image->
page.
x=geometry.
x;
2438 distort_image->
page.
y=geometry.
y;
2469 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2470 #pragma omp parallel for schedule(static) shared(progress,status) \ 2471 magick_number_threads(image,distort_image,distort_image->rows,1) 2473 for (j=0; j < (ssize_t) distort_image->
rows; j++)
2515 coeff[3], coeff[4] );
2528 for (i=0; i < (ssize_t) distort_image->
columns; i++)
2531 d.
x = (double) (geometry.
x+i+0.5)*output_scaling;
2532 d.
y = (double) (geometry.
y+j+0.5)*output_scaling;
2539 s.
x=coeff[0]*d.
x+coeff[1]*d.
y+coeff[2];
2540 s.
y=coeff[3]*d.
x+coeff[4]*d.
y+coeff[5];
2547 p,n,r,abs_r,abs_c6,abs_c7,scale;
2549 p=coeff[0]*d.
x+coeff[1]*d.
y+coeff[2];
2550 n=coeff[3]*d.
x+coeff[4]*d.
y+coeff[5];
2551 r=coeff[6]*d.
x+coeff[7]*d.
y+1.0;
2553 validity = (r*coeff[8] < 0.0) ? 0.0 : 1.0;
2556 abs_c6 = fabs(coeff[6]);
2557 abs_c7 = fabs(coeff[7]);
2558 if ( abs_c6 > abs_c7 ) {
2559 if ( abs_r < abs_c6*output_scaling )
2560 validity = 0.5 - coeff[8]*r/(coeff[6]*output_scaling);
2562 else if ( abs_r < abs_c7*output_scaling )
2563 validity = 0.5 - coeff[8]*r/(coeff[7]*output_scaling);
2565 if ( validity > 0.0 ) {
2573 (r*coeff[0] - p*coeff[6])*scale,
2574 (r*coeff[1] - p*coeff[7])*scale,
2575 (r*coeff[3] - n*coeff[6])*scale,
2576 (r*coeff[4] - n*coeff[7])*scale );
2583 s.
x=coeff[0]*d.
x+coeff[1]*d.
y+coeff[2]*d.
x*d.
y+coeff[3];
2584 s.
y=coeff[4]*d.
x+coeff[5]*d.
y 2585 +coeff[6]*d.
x*d.
y+coeff[7];
2588 coeff[0] + coeff[2]*d.
y,
2589 coeff[1] + coeff[2]*d.
x,
2590 coeff[4] + coeff[6]*d.
y,
2591 coeff[5] + coeff[6]*d.
x );
2599 d.
x -= coeff[3]; d.
y -= coeff[7];
2600 b = coeff[6]*d.
x - coeff[2]*d.
y + coeff[8];
2601 c = coeff[4]*d.
x - coeff[0]*d.
y;
2609 c = b*b - 2*coeff[9]*c;
2613 s.
y = ( -b + sqrt(c) )/coeff[9];
2615 if ( validity > 0.0 )
2616 s.
x = ( d.
x - coeff[1]*s.
y) / ( coeff[0] + coeff[2]*s.
y );
2638 nterms=(ssize_t)coeff[1];
2643 s.
x=s.
y=du.
x=du.
y=dv.
x=dv.
y=0.0;
2644 for(k=0; k < nterms; k++) {
2658 s.
x = (double) ((atan2(d.
y,d.
x) - coeff[0])/
Magick2PI);
2660 s.
y = hypot(d.
x,d.
y);
2669 (
double) (coeff[1]/(
Magick2PI*s.
y)), 0, 0, coeff[3] );
2672 distort_image->
columns*2, 0, 0, coeff[3] );
2675 s.
x = s.
x*coeff[1] + coeff[4] + image->
page.
x +0.5;
2676 s.
y = (coeff[2] - s.
y) * coeff[3] + image->
page.
y;
2683 s.
x = atan2(d.
x,d.
y) - (coeff[4]+coeff[5])/2;
2687 s.
y = hypot(d.
x,d.
y);
2694 (
double) (coeff[6]/(
Magick2PI*s.
y)), 0, 0, coeff[7] );
2697 distort_image->
columns*2, 0, 0, coeff[7] );
2701 s.
y = (s.
y-coeff[1])*coeff[7] + image->
page.
y;
2707 d.
x = ((double)i+0.5)*output_scaling*coeff[6]+coeff[4];
2708 d.
y = ((double)j+0.5)*output_scaling*coeff[7]+coeff[1];
2709 s.
x = d.
y*sin(d.
x) + coeff[2];
2710 s.
y = d.
y*cos(d.
x) + coeff[3];
2718 d.
x -= coeff[4]; d.
y -= coeff[5];
2726 1.0/(1.0+d.
x*d.
x), 0.0, -d.
x*s.
y*cx*cx/coeff[1], s.
y/d.
y );
2728 if ( i == 0 && j == 0 ) {
2729 fprintf(stderr,
"x=%lf y=%lf u=%lf v=%lf\n", d.
x*coeff[1], d.
y, s.
x, s.
y);
2730 fprintf(stderr,
"phi = %lf\n", (
double)(ax * 180.0/
MagickPI) );
2731 fprintf(stderr,
"du/dx=%lf du/dx=%lf dv/dx=%lf dv/dy=%lf\n",
2732 1.0/(1.0+d.
x*d.
x), 0.0, -d.
x*s.
y*cx*cx/coeff[1], s.
y/d.
y );
2736 s.
x += coeff[2]; s.
y += coeff[3];
2742 d.
x -= coeff[4]; d.
y -= coeff[5];
2746 validity = (double) (coeff[1]*
MagickPI2 - fabs(d.
x))/output_scaling + 0.5;
2748 if ( validity > 0.0 ) {
2757 cx*cx, 0.0, s.
y*cx/coeff[1], cx );
2760 if ( d.
x == 0.5 && d.
y == 0.5 ) {
2761 fprintf(stderr,
"x=%lf y=%lf u=%lf v=%lf\n", d.
x*coeff[1], d.
y, s.
x, s.
y);
2762 fprintf(stderr,
"radius = %lf phi = %lf validity = %lf\n",
2763 coeff[1], (
double)(d.
x * 180.0/
MagickPI), validity );
2764 fprintf(stderr,
"du/dx=%lf du/dx=%lf dv/dx=%lf dv/dy=%lf\n",
2765 cx*cx, 0.0, s.
y*cx/coeff[1], cx);
2770 s.
x += coeff[2]; s.
y += coeff[3];
2776 double r,fx,fy,gx,gy;
2780 r = sqrt(d.
x*d.
x+d.
y*d.
y);
2782 fx = ((coeff[0]*r + coeff[1])*r + coeff[2])*r + coeff[3];
2783 fy = ((coeff[4]*r + coeff[5])*r + coeff[6])*r + coeff[7];
2784 gx = ((3*coeff[0]*r + 2*coeff[1])*r + coeff[2])/r;
2785 gy = ((3*coeff[4]*r + 2*coeff[5])*r + coeff[6])/r;
2788 fx = 1/fx; fy = 1/fy;
2789 gx *= -fx*fx; gy *= -fy*fy;
2792 s.
x = d.
x*fx + coeff[8];
2793 s.
y = d.
y*fy + coeff[9];
2795 gx*d.
x*d.
x + fx, gx*d.
x*d.
y,
2796 gy*d.
x*d.
y, gy*d.
y*d.
y + fy );
2807 coeff[3], 0, 0, coeff[7] );
2811 1.0/coeff[3], 0, 0, 1.0/coeff[7] );
2831 denominator = s.
x = s.
y = 0;
2832 for(k=0; k<number_arguments; k+=4) {
2834 ((double)d.
x-arguments[k+2])*((double)d.
x-arguments[k+2])
2835 + ((double)d.
y-arguments[k+3])*((double)d.
y-arguments[k+3]);
2836 weight = pow(weight,coeff[0]);
2837 weight = ( weight < 1.0 ) ? 1.0 : 1.0/weight;
2839 s.
x += (arguments[ k ]-arguments[k+2])*weight;
2840 s.
y += (arguments[k+1]-arguments[k+3])*weight;
2841 denominator += weight;
2860 if ( validity <= 0.0 ) {
2869 if ( validity < 1.0 ) {
2887 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2906 if ( method ==
ArcDistortion && !bestfit && !viewport_given ) {
2907 distort_image->
page.
x = 0;
2908 distort_image->
page.
y = 0;
2911 return(distort_image);
2967 assert(image != (
Image *) NULL);
2973 angle=fmod(degrees,360.0);
2974 while (angle < -45.0)
2976 for (rotations=0; angle > 45.0; rotations++)
2984 if (distort_image == (
Image *) NULL)
2985 return((
Image *) NULL);
2991 return(rotate_image);
3037 #define SparseColorTag "Distort/SparseColor" 3051 assert(image != (
Image *) NULL);
3084 arguments, number_colors, exception);
3085 if ( coeff == (
double *) NULL )
3086 return((
Image *) NULL);
3095 sparse_method = method;
3103 switch (sparse_method) {
3109 (void)
FormatLocaleFile(stderr,
" -channel R -fx '%+lf*i %+lf*j %+lf' \\\n",
3110 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3112 (void)
FormatLocaleFile(stderr,
" -channel G -fx '%+lf*i %+lf*j %+lf' \\\n",
3113 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3115 (void)
FormatLocaleFile(stderr,
" -channel B -fx '%+lf*i %+lf*j %+lf' \\\n",
3116 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3119 (void)
FormatLocaleFile(stderr,
" -channel K -fx '%+lf*i %+lf*j %+lf' \\\n",
3120 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3123 (void)
FormatLocaleFile(stderr,
" -channel A -fx '%+lf*i %+lf*j %+lf' \\\n",
3124 coeff[x], coeff[x+1], coeff[x+2]),x+=3;
3132 (void)
FormatLocaleFile(stderr,
" -channel R -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3133 coeff[ x ], coeff[x+1],
3134 coeff[x+2], coeff[x+3]),x+=4;
3136 (void)
FormatLocaleFile(stderr,
" -channel G -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3137 coeff[ x ], coeff[x+1],
3138 coeff[x+2], coeff[x+3]),x+=4;
3140 (void)
FormatLocaleFile(stderr,
" -channel B -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3141 coeff[ x ], coeff[x+1],
3142 coeff[x+2], coeff[x+3]),x+=4;
3145 (void)
FormatLocaleFile(stderr,
" -channel K -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3146 coeff[ x ], coeff[x+1],
3147 coeff[x+2], coeff[x+3]),x+=4;
3150 (void)
FormatLocaleFile(stderr,
" -channel A -fx '%+lf*i %+lf*j %+lf*i*j %+lf;\n",
3151 coeff[ x ], coeff[x+1],
3152 coeff[x+2], coeff[x+3]),x+=4;
3168 if (sparse_image == (
Image *) NULL)
3169 return((
Image *) NULL);
3173 return((
Image *) NULL);
3191 #if defined(MAGICKCORE_OPENMP_SUPPORT) 3192 #pragma omp parallel for schedule(static) shared(progress,status) \ 3193 magick_number_threads(image,sparse_image,sparse_image->rows,1) 3195 for (j=0; j < (ssize_t) sparse_image->
rows; j++)
3217 for (i=0; i < (ssize_t) image->
columns; i++)
3220 switch (sparse_method)
3226 pixel.
red = coeff[x]*i +coeff[x+1]*j
3229 pixel.
green = coeff[x]*i +coeff[x+1]*j
3232 pixel.
blue = coeff[x]*i +coeff[x+1]*j
3236 pixel.
black = coeff[x]*i +coeff[x+1]*j
3240 pixel.
alpha = coeff[x]*i +coeff[x+1]*j
3248 pixel.
red = coeff[x]*i + coeff[x+1]*j +
3249 coeff[x+2]*i*j + coeff[x+3], x+=4;
3251 pixel.
green = coeff[x]*i + coeff[x+1]*j +
3252 coeff[x+2]*i*j + coeff[x+3], x+=4;
3254 pixel.
blue = coeff[x]*i + coeff[x+1]*j +
3255 coeff[x+2]*i*j + coeff[x+3], x+=4;
3258 pixel.
black = coeff[x]*i + coeff[x+1]*j +
3259 coeff[x+2]*i*j + coeff[x+3], x+=4;
3262 pixel.
alpha = coeff[x]*i + coeff[x+1]*j +
3263 coeff[x+2]*i*j + coeff[x+3], x+=4;
3287 for(k=0; k<number_arguments; k+=2+number_colors) {
3288 ssize_t x=(ssize_t) k+2;
3290 ((double)i-arguments[ k ])*((double)i-arguments[ k ])
3291 + ((double)j-arguments[k+1])*((double)j-arguments[k+1]);
3292 weight = pow(weight,coeff[0]);
3293 weight = ( weight < 1.0 ) ? 1.0 : 1.0/weight;
3295 pixel.
red += arguments[x++]*weight;
3297 pixel.
green += arguments[x++]*weight;
3299 pixel.
blue += arguments[x++]*weight;
3302 pixel.
black += arguments[x++]*weight;
3305 pixel.
alpha += arguments[x++]*weight;
3306 denominator += weight;
3309 pixel.
red/=denominator;
3311 pixel.
green/=denominator;
3313 pixel.
blue/=denominator;
3316 pixel.
black/=denominator;
3319 pixel.
alpha/=denominator;
3333 for(k=0; k<number_arguments; k+=2+number_colors) {
3335 fabs((
double)i-arguments[ k ])
3336 + fabs((
double)j-arguments[k+1]);
3337 if ( distance < minimum ) {
3338 ssize_t x=(ssize_t) k+2;
3340 pixel.
red=arguments[x++];
3342 pixel.
green=arguments[x++];
3344 pixel.
blue=arguments[x++];
3347 pixel.
black=arguments[x++];
3350 pixel.
alpha=arguments[x++];
3368 for (k=0; k<number_arguments; k+=2+number_colors) {
3370 ((double)i-arguments[ k ])*((double)i-arguments[ k ])
3371 + ((double)j-arguments[k+1])*((double)j-arguments[k+1]);
3372 if ( distance < minimum ) {
3373 ssize_t x=(ssize_t) k+2;
3375 pixel.
red=arguments[x++];
3377 pixel.
green=arguments[x++];
3379 pixel.
blue=arguments[x++];
3382 pixel.
black=arguments[x++];
3385 pixel.
alpha=arguments[x++];
3416 #if defined(MAGICKCORE_OPENMP_SUPPORT) 3430 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)
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)
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)
MagickExport MagickBooleanType IsEventLogging(void)
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)
static double StringToDouble(const char *magick_restrict string, char *magick_restrict *sentinal)
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
static ResampleFilter ** AcquireResampleFilterTLS(const Image *image, const VirtualPixelMethod method, const MagickBooleanType interpolate, ExceptionInfo *exception)
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)
static ResampleFilter ** DestroyResampleFilterTLS(ResampleFilter **filter)